from __future__ import annotations from dataclasses import dataclass from pathlib import Path import os @dataclass(frozen=True) class AppConfig: project_key: str app_mode: str root_dir: Path data_dir: Path sqlite_path: Path artifact_dir: Path cache_dir: Path model_registry_path: Path def _env_path(name: str, default: str) -> Path: return Path(os.environ.get(name, default)).expanduser().resolve() def load_app_config(project_key: str = 'p1', data_subdir: str | None = None) -> AppConfig: root_dir = Path(os.environ.get('APP_ROOT_DIR', Path.cwd())).resolve() data_root = _env_path('DATA_DIR', str(root_dir / 'data')) if data_subdir: data_dir = (data_root / data_subdir).resolve() else: data_dir = data_root sqlite_path = Path(os.environ.get('SQLITE_PATH', data_dir / 'sqlite' / f'{project_key}.sqlite3')).expanduser().resolve() artifact_dir = Path(os.environ.get('ARTIFACT_DIR', data_dir / 'artifacts' / project_key)).expanduser().resolve() cache_dir = _env_path('MODEL_CACHE_DIR', str(root_dir / 'models')) model_registry_path = _env_path('MODEL_REGISTRY_PATH', str(root_dir / 'configs' / 'model_registry.yaml')) app_mode = os.environ.get('APP_MODE', 'dev') return AppConfig( project_key=project_key, app_mode=app_mode, root_dir=root_dir, data_dir=data_dir, sqlite_path=sqlite_path, artifact_dir=artifact_dir, cache_dir=cache_dir, model_registry_path=model_registry_path, )