from __future__ import annotations import json import logging from pathlib import Path from typing import Any from src.config import ( DATA_PROCESSED, DATA_RAW_FRED, DATA_RAW_POLY, DATA_RAW_YAHOO, FIGURES, LOGS, TABLES, ) def setup_logging(name: str) -> logging.Logger: LOGS.mkdir(parents=True, exist_ok=True) logger = logging.getLogger(name) logger.setLevel(logging.INFO) if not logger.handlers: fh = logging.FileHandler(LOGS / f"{name}.log") fh.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) logger.addHandler(fh) sh = logging.StreamHandler() sh.setFormatter(logging.Formatter("%(levelname)s %(message)s")) logger.addHandler(sh) return logger def ensure_dirs() -> None: for d in [ DATA_RAW_POLY, DATA_RAW_FRED, DATA_RAW_YAHOO, DATA_PROCESSED, FIGURES, TABLES, LOGS, ]: d.mkdir(parents=True, exist_ok=True) def save_json(data: Any, path: Path) -> None: path.parent.mkdir(parents=True, exist_ok=True) with open(path, "w") as f: json.dump(data, f, indent=2, default=str) def load_json(path: Path) -> Any: with open(path) as f: return json.load(f)