|
| 1 | +""" |
| 2 | +A module for settings in the pipeline.config package. |
| 3 | +""" |
| 4 | + |
| 5 | +from functools import lru_cache |
| 6 | + |
| 7 | +from pydantic import ( |
| 8 | + AnyHttpUrl, |
| 9 | + NegativeFloat, |
| 10 | + NonNegativeInt, |
| 11 | + PositiveFloat, |
| 12 | + PositiveInt, |
| 13 | + PostgresDsn, |
| 14 | + field_validator, |
| 15 | +) |
| 16 | +from pydantic_core import MultiHostUrl |
| 17 | +from pydantic_core.core_schema import ValidationInfo |
| 18 | +from pydantic_extra_types.coordinate import Latitude, Longitude |
| 19 | +from pydantic_settings import BaseSettings, SettingsConfigDict |
| 20 | + |
| 21 | + |
| 22 | +class Settings(BaseSettings): |
| 23 | + """ |
| 24 | + Settings class based on Pydantic Base Settings for environment variables |
| 25 | + """ |
| 26 | + |
| 27 | + model_config = SettingsConfigDict( |
| 28 | + env_file=".env", |
| 29 | + env_file_encoding="utf-8", |
| 30 | + case_sensitive=True, |
| 31 | + extra="allow", |
| 32 | + ) |
| 33 | + |
| 34 | + API_URL: AnyHttpUrl |
| 35 | + PATH_PARAMETER: str |
| 36 | + ID_PATH_PARAMETER: str |
| 37 | + API_KEY: str |
| 38 | + DEFAULT_LAT: Latitude |
| 39 | + DEFAULT_LNG: Longitude |
| 40 | + RATE_LIMIT_THRESHOLD: PositiveInt = 120 # requests per minute |
| 41 | + RATE_LIMIT_RESET_TIME: PositiveInt = 60 # seconds |
| 42 | + PREFIX: str = "https://" # prefix used for mounting the HTTP session |
| 43 | + MAX_RETRIES: PositiveInt = 3 |
| 44 | + POOL_CONNECTIONS: PositiveInt = 10 # connections pools to cache in terms |
| 45 | + # of endpoints |
| 46 | + POOL_MAXSIZE: PositiveInt = 20 # max connections to cache in the pool |
| 47 | + RETRY_BACKOFF_FACTOR: PositiveFloat = 0.5 # delay between retries [seconds] |
| 48 | + BACKOFF_MAX: PositiveInt = 60 # maximum delay between retries [seconds] |
| 49 | + RETRY_STATUS_FORCE_LIST: list[PositiveInt] = [ |
| 50 | + 429, |
| 51 | + 502, |
| 52 | + 503, |
| 53 | + 504, |
| 54 | + ] |
| 55 | + |
| 56 | + POSTGRES_SCHEME: str |
| 57 | + POSTGRES_USER: str |
| 58 | + POSTGRES_PASSWORD: str |
| 59 | + POSTGRES_HOST: str |
| 60 | + POSTGRES_PORT: PositiveInt |
| 61 | + POSTGRES_DB: str |
| 62 | + SQLALCHEMY_DATABASE_URI: PostgresDsn | None = None |
| 63 | + |
| 64 | + @field_validator("SQLALCHEMY_DATABASE_URI", mode="before") |
| 65 | + def assemble_postgresql_connection( |
| 66 | + cls, |
| 67 | + v: str | None, |
| 68 | + info: ValidationInfo, |
| 69 | + ) -> PostgresDsn: |
| 70 | + """ |
| 71 | + Assemble the database connection as URI string |
| 72 | + :param v: Variables to consider |
| 73 | + :type v: str | NoneType |
| 74 | + :param info: The field validation info |
| 75 | + :type info: ValidationInfo |
| 76 | + :return: SQLAlchemy URI |
| 77 | + :rtype: PostgresDsn |
| 78 | + """ |
| 79 | + if info.config is None: |
| 80 | + raise ValueError("info.config cannot be None") |
| 81 | + uri: MultiHostUrl = MultiHostUrl.build( |
| 82 | + scheme=info.data.get("POSTGRES_SCHEME", "postgres"), |
| 83 | + username=info.data.get("POSTGRES_USER"), |
| 84 | + password=info.data.get("POSTGRES_PASSWORD"), |
| 85 | + host=info.data.get("POSTGRES_HOST"), |
| 86 | + port=info.data.get("POSTGRES_PORT"), |
| 87 | + path=info.data.get("POSTGRES_DB"), |
| 88 | + ) |
| 89 | + return PostgresDsn(f"{uri}") |
| 90 | + |
| 91 | + LOWEST_TEMP: NegativeFloat |
| 92 | + HIGHEST_TEMP: PositiveFloat |
| 93 | + HIGHEST_RAIN_DEPTH: PositiveFloat |
| 94 | + LOWEST_HUMIDITY: NonNegativeInt |
| 95 | + HIGHEST_HUMIDITY: PositiveInt |
| 96 | + HIGHEST_EVAPORATION: PositiveFloat |
| 97 | + HIGHEST_SUNSHINE: PositiveFloat |
| 98 | + HIGHEST_WIND_SPEED: PositiveInt |
| 99 | + LOWEST_PRESSURE: PositiveFloat |
| 100 | + HIGHEST_PRESSURE: PositiveFloat |
| 101 | + HIGHEST_CLOUD_SCALE: PositiveInt |
| 102 | + |
| 103 | + HIGHEST_CLOUDINESS_PCT: PositiveFloat |
| 104 | + HIGHEST_WIND_DEGREES: PositiveInt |
| 105 | + |
| 106 | + |
| 107 | +@lru_cache |
| 108 | +def get_settings() -> Settings: |
| 109 | + """ |
| 110 | + Get settings cached |
| 111 | + :return: The settings instance |
| 112 | + :rtype: Settings |
| 113 | + """ |
| 114 | + return Settings() |
| 115 | + |
| 116 | + |
| 117 | +settings: Settings = get_settings() |
0 commit comments