"""Application configuration loader. Reads environment variables (with .env file support) and provides a typed, validated Settings object used throughout the application. """ from functools import lru_cache from pathlib import Path from dotenv import load_dotenv from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict # Load .env file from project root _env_path = Path(__file__).resolve().parent.parent / ".env" load_dotenv(_env_path) class Settings(BaseSettings): """Typed application settings loaded from environment variables. Attributes: admin_username: Admin login username (from ADMIN_USERNAME env var). admin_password: Admin login password (from ADMIN_PASSWORD env var). app_env: Runtime environment — 'development' or 'production'. app_host: Host address to bind the server to. app_port: Port number for the server. app_log_level: Minimum log level for structlog output. database_url: SQLite connection string. """ admin_username: str admin_password: str app_env: str = "development" app_host: str = "0.0.0.0" app_port: int = 8000 app_log_level: str = "info" database_url: str = "sqlite:///data/sneakyswole.db" model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", ) @lru_cache(maxsize=1) def get_settings() -> Settings: """Return a cached Settings instance (singleton pattern). Returns: The application Settings object. """ return Settings()