# [FILE] src/core/settings.py # [REFACTORING_NOTE] Этот файл заменяет старый src/config.py, используя Pydantic. # ANCHOR: Configuration_Module # Семантика: Этот модуль является единственным источником истины для всех # конфигурационных параметров приложения. Использует Pydantic для типизации и валидации. from pathlib import Path from pydantic import BaseModel, Field class ScraperSelectors(BaseModel): """ [CONTRACT] @description: Определяет CSS-селекторы для парсинга как строгий, типизированный контракт. @invariant: Все поля являются обязательными строками. """ # [CONFIG] Используем Field с alias, чтобы Pydantic мог инициализировать # модель из словаря с ключами в верхнем регистре, как было раньше. catalog_product_link: str = Field(..., alias='CATALOG_PRODUCT_LINK') variant_list_item: str = Field(..., alias='VARIANT_LIST_ITEM') product_page_name: str = Field(..., alias='PRODUCT_PAGE_NAME') active_volume: str = Field(..., alias='ACTIVE_VOLUME') price_block: str = Field(..., alias='PRICE_BLOCK') class Settings(BaseModel): """ [MAIN-CONTRACT] @description: Главный класс конфигурации приложения. Собирает все настройки в одном месте. """ # [CONFIG] Основные настройки парсера base_url: str = 'https://elixirpeptide.ru' catalog_url: str = 'https://elixirpeptide.ru/catalog/' headers: dict = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } # [CONFIG] Настройки вывода output_dir: Path = Path('price_data_final') save_to_csv: bool = True save_to_db: bool = True # [CONFIG] Настройки логирования log_to_db: bool = True # [CONFIG] Вложенная модель с селекторами # Мы инициализируем ее прямо здесь, передавая словарь со значениями. selectors: ScraperSelectors = ScraperSelectors( CATALOG_PRODUCT_LINK='.product-card h4 a.product-link', VARIANT_LIST_ITEM='.product-version-select li', PRODUCT_PAGE_NAME='h1.product-h1', ACTIVE_VOLUME='.product-version-select li.active', PRICE_BLOCK='.product-sale-box .price span', ) @property def db_path(self) -> Path: """ [HELPER] Вычисляемое свойство для пути к базе данных. Гарантирует, что путь всегда будет актуальным, если изменится output_dir. """ return self.output_dir / 'parser_data.db' # [SINGLETON] Создаем единственный экземпляр настроек, который будет использоваться # во всем приложении. Это стандартная практика для работы с конфигурацией. settings = Settings() # [REFACTORING_COMPLETE] Этот модуль готов к использованию.