import sys from typing import Any, Dict, List, Optional from pydantic import BaseSettings, HttpUrl, PostgresDsn, validator from pydantic.networks import AnyHttpUrl class Settings(BaseSettings): PROJECT_NAME: str = "QueryX" SENTRY_DSN: Optional[HttpUrl] = None API_PATH: str = "/api/v1" ACCESS_TOKEN_EXPIRE_MINUTES: int = 7 * 24 * 60 # 7 days BACKEND_CORS_ORIGINS: List[AnyHttpUrl] = [ "http://0.0.0.0:9000", "http://0.0.0.0:8000", ] # The following variables need to be defined in environment TEST_DATABASE_URL: Optional[PostgresDsn] DATABASE_URL: PostgresDsn ASYNC_DATABASE_URL: Optional[PostgresDsn] @validator("DATABASE_URL", pre=True) def build_test_database_url(cls, v: Optional[str], values: Dict[str, Any]): """Overrides DATABASE_URL with TEST_DATABASE_URL in test environment.""" url = v if "pytest" in sys.modules: if not values.get("TEST_DATABASE_URL"): raise Exception( "pytest detected, but TEST_DATABASE_URL is not set in environment" ) url = values["TEST_DATABASE_URL"] if url: return url.replace("postgres://", "postgresql://") return url @validator("ASYNC_DATABASE_URL") def build_async_database_url(cls, v: Optional[str], values: Dict[str, Any]): """Builds ASYNC_DATABASE_URL from DATABASE_URL.""" v = values["DATABASE_URL"] return v.replace("postgresql", "postgresql+asyncpg", 1) if v else v SECRET_KEY: str # END: required environment variables settings = Settings()