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

1import os 

2from dataclasses import dataclass 

3 

4from dotenv import load_dotenv 

5 

6load_dotenv() 

7 

8 

9@dataclass(frozen=True) 

10class Settings: 

11 alpaca_api_key: str 

12 alpaca_api_secret: str 

13 alpaca_feed: str = "iex" 

14 

15 

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") 

19 

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") 

25 

26 if missing: 

27 raise RuntimeError(f"Missing required credentials: {', '.join(missing)}") 

28 

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 )