# [FILE] src/core/models.py # ANCHOR: Core_Models_Module # Семантика: Определяет Pydantic-модели для структурированного представления данных # в приложении (продукты, логи). # [CONTRACT]: Все модели наследуются от `BaseModel` и обеспечивают типизацию и валидацию. # [COHERENCE]: Согласованы со схемами данных, используемыми в БД и экспортах. from pydantic import BaseModel, Field, HttpUrl, ValidationError from datetime import datetime from typing import Optional class ProductVariant(BaseModel): """ [CONTRACT] @description: Модель данных для варианта продукта. @invariant: `name`, `price`, `url` являются обязательными. `price` всегда `int`. """ name: str = Field(..., description="Название продукта.") volume: str = Field(..., description="Объем или вариант продукта (например, '50мл', '10 капсул').") price: int = Field(..., description="Цена продукта в числовом формате.") url: HttpUrl = Field(..., description="Полный URL страницы варианта продукта.", examples=["https://elixirpeptide.ru/product/?product=123"]) # [VALIDATOR] Пример пост-валидации, если нужно. # @validator('price') # def price_must_be_positive(cls, v): # if v < 0: # raise ValueError('Price must be a positive integer') # return v class Config: json_schema_extra = { "example": { "name": "Peptide X", "volume": "30ml", "price": 1500, "url": "https://elixirpeptide.ru/catalog/peptide-x/?product=variant1" } } class LogRecordModel(BaseModel): """ [CONTRACT] @description: Модель данных для записи лога, используемая при сохранении логов в БД. @invariant: Все поля являются обязательными. `timestamp` хранится как ISO-строка. """ run_id: str = Field(..., description="Уникальный идентификатор текущего запуска парсера.") timestamp: datetime = Field(..., description="Время создания лог-записи.") level: str = Field(..., description="Уровень логирования (e.g., INFO, ERROR, DEBUG).") message: str = Field(..., description="Текст лог-сообщения.") # Pydantic автоматически обработает datetime в JSON и другие форматы. # Для SQLite, timestamp будет храниться как TEXT в ISO-формате. class Config: json_schema_extra = { "example": { "run_id": "20231027-123456", "timestamp": "2023-10-27T12:34:56.789Z", "level": "INFO", "message": "Парсинг начат." } } # [COHERENCE_CHECK_PASSED] Все основные модели данных определены и типизированы.