Coverage for src/finbot/config.py: 100%
20 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 17:12 +0000
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 17:12 +0000
1import os
2from dataclasses import dataclass
4from dotenv import load_dotenv
6load_dotenv()
9@dataclass(frozen=True)
10class Settings:
11 alpaca_api_key: str
12 alpaca_api_secret: str
13 alpaca_feed: str = "iex"
16def load_settings(*, api_key: str | None = None, api_secret: str | None = None) -> Settings:
17 resolved_api_key = api_key or os.getenv("APCA_API_KEY_ID")
18 resolved_api_secret = api_secret or os.getenv("APCA_API_SECRET_KEY")
20 missing = []
21 if not resolved_api_key:
22 missing.append("APCA_API_KEY_ID")
23 if not resolved_api_secret:
24 missing.append("APCA_API_SECRET_KEY")
26 if missing:
27 raise RuntimeError(f"Missing required credentials: {', '.join(missing)}")
29 return Settings(
30 alpaca_api_key=resolved_api_key, # type: ignore[arg-type]
31 alpaca_api_secret=resolved_api_secret, # type: ignore[arg-type]
32 alpaca_feed=os.getenv("ALPACA_FEED", "iex"),
33 )