from functools import lru_cache from pydantic import Field, model_validator from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict(env_prefix="MONITOR_", env_file=".env", extra="ignore") log_level: str = "INFO" total_timeout_seconds: float = Field(10.0, gt=0, le=60) connect_timeout_seconds: float = Field(3.0, gt=0, le=30) read_timeout_seconds: float = Field(5.0, gt=0, le=30) max_redirects: int = Field(5, ge=0, le=10) user_agent: str = "endpoint-monitor/0.1" @model_validator(mode="after") def timeout_parts_fit(self) -> "Settings": if self.connect_timeout_seconds > self.total_timeout_seconds: raise ValueError("connect timeout cannot exceed total timeout") if self.read_timeout_seconds > self.total_timeout_seconds: raise ValueError("read timeout cannot exceed total timeout") return self @lru_cache def get_settings() -> Settings: return Settings()