Python 56.2%
TeX 43.7%
1from __future__ import annotations23import json4import logging5from pathlib import Path6from typing import Any78from src.config import (9 DATA_PROCESSED,10 DATA_RAW_FRED,11 DATA_RAW_POLY,12 DATA_RAW_YAHOO,13 FIGURES,14 LOGS,15 TABLES,16)171819def setup_logging(name: str) -> logging.Logger:20 LOGS.mkdir(parents=True, exist_ok=True)21 logger = logging.getLogger(name)22 logger.setLevel(logging.INFO)23 if not logger.handlers:24 fh = logging.FileHandler(LOGS / f"{name}.log")25 fh.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s"))26 logger.addHandler(fh)27 sh = logging.StreamHandler()28 sh.setFormatter(logging.Formatter("%(levelname)s %(message)s"))29 logger.addHandler(sh)30 return logger313233def ensure_dirs() -> None:34 for d in [35 DATA_RAW_POLY, DATA_RAW_FRED, DATA_RAW_YAHOO,36 DATA_PROCESSED, FIGURES, TABLES, LOGS,37 ]:38 d.mkdir(parents=True, exist_ok=True)394041def save_json(data: Any, path: Path) -> None:42 path.parent.mkdir(parents=True, exist_ok=True)43 with open(path, "w") as f:44 json.dump(data, f, indent=2, default=str)454647def load_json(path: Path) -> Any:48 with open(path) as f:49 return json.load(f)50