Coverage for app/core/config.py: 100%
21 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-16 20:06 +0000
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-16 20:06 +0000
1import os
2from typing import Literal
4from pydantic import SecretStr, computed_field
5from pydantic_settings import BaseSettings, SettingsConfigDict
7ENV_FILES = {
8 "dev": ".env",
9 "test": ".env.test",
10 "prod": ".env.prod",
11}
14class Settings(BaseSettings):
15 DB_HOST: str
16 DB_PORT: int
17 DB_USER: str
18 DB_PASSWORD: SecretStr
19 DB_NAME: str
20 APP_PORT: int
21 ADMINER_PORT: int
22 ENV: Literal["dev", "test", "prod"]
24 GRAFANA_ADMIN_USER: str = "admin"
25 GRAFANA_ADMIN_USER_PASSWORD: SecretStr = SecretStr("admin")
27 @computed_field(repr=False)
28 def DATABASE_URL(self) -> str:
29 return (
30 f"postgresql+asyncpg://{self.DB_USER}:{self.DB_PASSWORD.get_secret_value()}"
31 f"@{self.DB_HOST}:5432/{self.DB_NAME}"
32 )
34 model_config = SettingsConfigDict(
35 env_file=ENV_FILES.get(os.getenv("ENV", "dev"), ".env"),
36 env_file_encoding="utf-8",
37 )
40settings = Settings() # type: ignore