| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """Common utilities for data pipeline tools.""" |
| import contextlib |
| import datetime |
| import logging |
| import shutil |
| import tempfile |
| import time |
| from typing import Optional |
|
|
|
|
| @contextlib.contextmanager |
| def tmpdir_manager(base_dir: Optional[str] = None): |
| """Context manager that deletes a temporary directory on exit.""" |
| tmpdir = tempfile.mkdtemp(dir=base_dir) |
| try: |
| yield tmpdir |
| finally: |
| shutil.rmtree(tmpdir, ignore_errors=True) |
|
|
|
|
| @contextlib.contextmanager |
| def timing(msg: str): |
| logging.info("Started %s", msg) |
| tic = time.perf_counter() |
| yield |
| toc = time.perf_counter() |
| logging.info("Finished %s in %.3f seconds", msg, toc - tic) |
|
|
|
|
| def to_date(s: str): |
| return datetime.datetime( |
| year=int(s[:4]), month=int(s[5:7]), day=int(s[8:10]) |
| ) |
|
|