Coverage for app/core/config.py: 94%

33 statements  

« prev     ^ index     » next       coverage.py v7.6.10, created at 2026-06-04 22:29 +0000

1from pathlib import Path 

2from typing import Literal 

3 

4from pydantic import HttpUrl, computed_field, field_validator 

5from pydantic_settings import BaseSettings 

6 

7 

8class Settings(BaseSettings): 

9 PROJECT_NAME: str = "pypacktrends" 

10 ENVIRONMENT: Literal["dev", "ci", "prod"] = "dev" 

11 SENTRY_DSN: HttpUrl | None = None 

12 POSTHOG_API_KEY: str | None = None 

13 POSTHOG_HOST: str = "https://us.i.posthog.com" 

14 ENABLE_SERVER_ANALYTICS: bool = False 

15 SQLITE_DB_PATH: Path = ( 

16 Path(__file__).parent.resolve() / "../../../data/pypacktrends.db" 

17 ) 

18 

19 @field_validator("SENTRY_DSN", mode="before") 

20 @classmethod 

21 def validate_sentry_dsn(cls, v: str | None) -> str | None: 

22 if not v or v.strip() == "": 

23 return None 

24 return v 

25 

26 @field_validator("POSTHOG_API_KEY", mode="before") 

27 @classmethod 

28 def validate_posthog_api_key(cls, v: str | None) -> str | None: 

29 if not v or v.strip() == "": 

30 return None 

31 return v 

32 

33 @computed_field # type: ignore 

34 @property 

35 def SQLALCHEMY_DATABASE_URI(self) -> str: 

36 if not self.SQLITE_DB_PATH.parent.exists(): 

37 self.SQLITE_DB_PATH.parent.mkdir(parents=True, exist_ok=True) 

38 

39 if not self.SQLITE_DB_PATH.exists(): 

40 self.SQLITE_DB_PATH.touch() 

41 

42 return f"sqlite:///file:{self.SQLITE_DB_PATH}?uri=true" 

43 

44 

45settings = Settings()