"""Application configuration from environment variables.""" import os from pathlib import Path SQL_DIR = Path(__file__).parent / "sql" class Settings: """Application settings loaded from environment variables. Configure via DATABASE_URL (single connection string) or individual POSTGRES_* variables. """ POSTGRES_HOST: str = os.getenv("POSTGRES_HOST", "localhost") POSTGRES_PORT: int = int(os.getenv("POSTGRES_PORT", "5432")) POSTGRES_USER: str = os.getenv("POSTGRES_USER", "postgres") POSTGRES_PASSWORD: str = os.getenv("POSTGRES_PASSWORD", "postgres") POSTGRES_DB: str = os.getenv("POSTGRES_DB", "postgres") LISTINGS_SCHEMA: str = os.getenv("LISTINGS_SCHEMA", "marts") LISTINGS_TABLE: str = os.getenv("LISTINGS_TABLE", "funda_listings") ELO_SCHEMA: str = os.getenv("ELO_SCHEMA", "elo") IMAGES_SCHEMA: str = os.getenv("IMAGES_SCHEMA", "raw_funda") IMAGES_TABLE: str = os.getenv("IMAGES_TABLE", "listing_details") K_FACTOR: float = float(os.getenv("ELO_K_FACTOR", "32")) DEFAULT_ELO: float = float(os.getenv("ELO_DEFAULT_RATING", "1500")) @property def database_url(self) -> str: url = os.getenv("DATABASE_URL") if url: return url return ( f"postgresql+psycopg2://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}" f"@{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DB}" ) settings = Settings() def load_sql(name: str) -> str: """Load a SQL template from the sql/ directory and inject schema/table names.""" raw = (SQL_DIR / name).read_text() replacements = { "listings_schema": settings.LISTINGS_SCHEMA, "listings_table": settings.LISTINGS_TABLE, "elo_schema": settings.ELO_SCHEMA, "images_schema": settings.IMAGES_SCHEMA, "images_table": settings.IMAGES_TABLE, } for key, value in replacements.items(): raw = raw.replace("{{ " + key + " }}", value) return raw