Coverage for narrative_harm_classifier/core/config.py: 100%

34 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-07-20 13:25 +0000

1""" 

2core/config.py — Application settings loaded from environment variables. 

3All Azure service bindings, model settings, and classification parameters live here. 

4""" 

5 

6from pydantic_settings import BaseSettings 

7from functools import lru_cache 

8from pathlib import Path 

9 

10 

11class Settings(BaseSettings): 

12 # --- App --- 

13 app_name: str = "Narrative Harm Classifier" 

14 app_version: str = "1.0.0" 

15 debug: bool = False 

16 

17 # --- Azure --- 

18 azure_text_analytics_endpoint: str = "" 

19 azure_text_analytics_key: str = "" 

20 azure_storage_connection_string: str = "" 

21 azure_storage_container: str = "classifications" 

22 azure_function_app_name: str = "" 

23 

24 # --- Database (Azure SQL or PostgreSQL) --- 

25 database_url: str = "sqlite:///./dev.db" # override with Azure SQL/Postgres in prod 

26 

27 # --- Escalation tracking --- 

28 tracking_db_url: str = "" # defaults to database_url when unset 

29 

30 # --- Classification --- 

31 taxonomy_config_path: str = str( 

32 Path(__file__).parent.parent / "data" / "taxonomy_v1.yaml" 

33 ) 

34 benchmark_templates_path: str = str( 

35 Path(__file__).parent.parent / "data" / "benchmark_templates.yaml" 

36 ) 

37 patterns_dir: str = str(Path(__file__).parent.parent / "data" / "patterns") 

38 dogwhistles_path: str = str(Path(__file__).parent.parent / "data" / "dogwhistles.yaml") 

39 i18n_smoke_tests_path: str = str(Path(__file__).parent.parent / "data" / "i18n_smoke_tests.yaml") 

40 taxonomy_version: str = "1.0.0" 

41 default_confidence_threshold: float = 0.65 

42 context_window_tokens: int = 256 

43 max_text_length: int = 10000 

44 

45 # --- Logging --- 

46 log_level: str = "INFO" 

47 log_format: str = "json" 

48 

49 class Config: 

50 env_file = ".env" 

51 case_sensitive = False 

52 

53 @property 

54 def effective_tracking_db_url(self) -> str: 

55 return self.tracking_db_url or self.database_url 

56 

57 

58@lru_cache() 

59def get_settings() -> Settings: 

60 return Settings()