Исходный код core.configs

"""Сборка всех разделов настроек в единственный синглтон ``settings``.

Настройки инстанцируются на импорте модуля: читается ``.env`` и проверяются
обязательные ``STATION__*``. Диска импорт не трогает — рабочие директории и
файловые обработчики логов поднимает ``configure_runtime()``, который зовут
из ``main()``."""

import logging
import os

from pydantic_settings import BaseSettings, SettingsConfigDict

from core.configs.antenna import AntennaSettings
from core.configs.api import APISettings
from core.configs.flowgraph import FlowgraphSettings
from core.configs.health import HealthSettings
from core.configs.job import JobSettings
from core.configs.log import LoggingSettings
from core.configs.mqtt import MqttSettings
from core.configs.observation import ObservationSettings
from core.configs.path import PathSettings
from core.configs.scheduler import SchedulerSettings
from core.configs.sdr import SdrSettings
from core.configs.station import StationSettings
from core.configs.url import URLSettings
from core.configs.waterfall import WaterfallSettings


[документация] class Settings(BaseSettings): """Корневая модель настроек. Разделы адресуются через ``__`` в именах переменных окружения: ``STATION__TOKEN``, ``ANTENNA__ROTATOR__MODE``. """ model_config = SettingsConfigDict( # По умолчанию — ``.env`` рядом с рабочей директорией, как и раньше. # ``SONIKS_ENV_FILE`` позволяет указать другой файл: тестам нужно # запускаться, не подхватывая ``.env`` живой станции разработчика. env_file=os.getenv("SONIKS_ENV_FILE", ".env"), case_sensitive=False, env_nested_delimiter="__", ) antenna: AntennaSettings = AntennaSettings() url: URLSettings = URLSettings() api: APISettings = APISettings() flowgraph: FlowgraphSettings = FlowgraphSettings() health: HealthSettings = HealthSettings() log: LoggingSettings = LoggingSettings() mqtt: MqttSettings = MqttSettings() observation: ObservationSettings = ObservationSettings() paths: PathSettings = PathSettings() station: StationSettings jobs: JobSettings = JobSettings() waterfall: WaterfallSettings = WaterfallSettings() scheduler: SchedulerSettings = SchedulerSettings() sdr: SdrSettings = SdrSettings()
settings = Settings() # Именованные логгеры берутся бесплатно и без обработчиков: ``logging`` # возвращает те же самые объекты, которые донастроит ``configure_runtime()``. # Поэтому импортёрам ``logger``/``raw_logger`` менять ничего не нужно. logger = logging.getLogger("app") raw_logger = logging.getLogger("row_logs")
[документация] def configure_runtime() -> None: """Поднять то, что трогает диск: обработчики логов и рабочие директории. Вызывается один раз при старте приложения. Вынесено из импорта, чтобы ``import`` чего угодно из ``src/`` не создавал каталоги и файл лога. """ settings.log.configure_logger() settings.log.configure_raw_logger() settings.paths.create_directories()