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
« prev ^ index » next coverage.py v7.6.10, created at 2026-06-04 22:29 +0000
1from pathlib import Path
2from typing import Literal
4from pydantic import HttpUrl, computed_field, field_validator
5from pydantic_settings import BaseSettings
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 )
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
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
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)
39 if not self.SQLITE_DB_PATH.exists():
40 self.SQLITE_DB_PATH.touch()
42 return f"sqlite:///file:{self.SQLITE_DB_PATH}?uri=true"
45settings = Settings()