""" Global configurations: import settings, app_configs Classes: - CustomBaseSettings - Base class to be used by all modules for loading configs """ from typing import Any from urllib import parse from pydantic_settings import BaseSettings, SettingsConfigDict from pydantic import SecretStr from src.constants import Environment class CustomBaseSettings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore" ) class Config(CustomBaseSettings): APP_VERSION: str = "0.1" ENVIRONMENT: Environment = Environment.PRODUCTION SECRET_KEY: SecretStr = "" CORS_ORIGINS: list[str] = ["*"] CORS_ORIGINS_REGEX: str | None = None CORS_HEADERS: list[str] = ["*"] DATABASE_NAME: str = "fastapi-exp" DATABASE_PORT: str = "5432" DATABASE_HOSTNAME: str = "localhost" DATABASE_CREDENTIALS: SecretStr = "" settings = Config() DATABASE_NAME = settings.DATABASE_NAME DATABASE_PORT = settings.DATABASE_PORT DATABASE_HOSTNAME = settings.DATABASE_HOSTNAME DATABASE_CREDENTIALS = settings.DATABASE_CREDENTIALS.get_secret_value() # this will support special chars for credentials _DATABASE_CREDENTIAL_USER, _DATABASE_CREDENTIAL_PASSWORD = str(DATABASE_CREDENTIALS).split(":") _QUOTED_DATABASE_PASSWORD = parse.quote_plus(str(_DATABASE_CREDENTIAL_PASSWORD)) SQLALCHEMY_DATABASE_URI = SecretStr(f"postgresql+psycopg://{_DATABASE_CREDENTIAL_USER}:{_QUOTED_DATABASE_PASSWORD}@{DATABASE_HOSTNAME}:{DATABASE_PORT}/{DATABASE_NAME}") app_configs: dict[str, Any] = {"title": "App API"} if settings.ENVIRONMENT.is_deployed: app_configs["root_path"] = f"/v{settings.APP_VERSION}" if not settings.ENVIRONMENT.is_debug: app_configs["openapi_url"] = None # hide docs