"""Central configuration loader. This loader reads configuration exclusively from `config.toml` located in the current working directory. It intentionally does NOT read environment variables (per project configuration choice) to avoid implicit overrides. Expected TOML structure: [kokoro] endpoint = "https://..." api_key = "..." """ from __future__ import annotations import logging from pathlib import Path from typing import Any logger = logging.getLogger(__name__) # Defaults (used when keys are missing in TOML) _DEFAULTS: dict[str, Any] = { "KOKORO_ENDPOINT": None, "KOKORO_API_KEY": None, } def _load_toml(path: Path) -> dict[str, Any]: try: import tomllib with path.open("rb") as fh: data = tomllib.load(fh) return data if isinstance(data, dict) else {} except FileNotFoundError: return {} except Exception: logger.exception("Error leyendo config TOML: %s", path) return {} # Look for ./config.toml only (no environment-based path resolution) _config_path = Path.cwd() / "config.toml" _TOML: dict[str, Any] if _config_path.exists(): _TOML = _load_toml(_config_path) else: _TOML = {} def _toml_get(*keys: str, default: Any = None) -> Any: node = _TOML for k in keys: if not isinstance(node, dict): return default node = node.get(k, {}) return node or default # Public config values read exclusively from TOML (TOML > defaults) KOKORO_ENDPOINT = ( _toml_get( "kokoro", "endpoint", default=_DEFAULTS["KOKORO_ENDPOINT"], ) or None ) KOKORO_API_KEY = ( _toml_get( "kokoro", "api_key", default=_DEFAULTS["KOKORO_API_KEY"], ) or None ) __all__ = ["KOKORO_ENDPOINT", "KOKORO_API_KEY"]