Files
python_parser/python_parser/SCHEMA_INTEGRATION.md
2025-09-01 20:54:31 +03:00

5.9 KiB
Raw Blame History

Интеграция схем Pydantic с парсерами

Обзор

Этот документ описывает решение для устранения дублирования логики между схемами Pydantic и парсерами. Теперь схемы Pydantic являются единым источником правды для определения параметров парсеров.

Проблема

Ранее в парсерах дублировалась информация о параметрах:

# В парсере
self.register_getter(
    name="single_og",
    method=self._get_single_og,
    required_params=["id", "codes", "columns"],  # Дублирование
    optional_params=["search"],                  # Дублирование
    description="Получение данных по одному ОГ"
)

# В схеме
class SvodkaPMSingleOGRequest(BaseModel):
    id: OGID = Field(...)           # Обязательное поле
    codes: List[int] = Field(...)   # Обязательное поле
    columns: List[str] = Field(...) # Обязательное поле
    search: Optional[str] = Field(None)  # Необязательное поле

Решение

1. Утилиты для работы со схемами

Создан модуль core/schema_utils.py с функциями:

  • get_required_fields_from_schema() - извлекает обязательные поля
  • get_optional_fields_from_schema() - извлекает необязательные поля
  • register_getter_from_schema() - регистрирует геттер с использованием схемы
  • validate_params_with_schema() - валидирует параметры с помощью схемы

2. Обновленные парсеры

Теперь парсеры используют схемы как единый источник правды:

def _register_default_getters(self):
    """Регистрация геттеров по умолчанию"""
    # Используем схемы Pydantic как единый источник правды
    register_getter_from_schema(
        parser_instance=self,
        getter_name="single_og",
        method=self._get_single_og,
        schema_class=SvodkaPMSingleOGRequest,
        description="Получение данных по одному ОГ"
    )

3. Валидация параметров

Методы геттеров теперь автоматически валидируют параметры:

def _get_single_og(self, params: dict):
    """Получение данных по одному ОГ"""
    # Валидируем параметры с помощью схемы Pydantic
    validated_params = validate_params_with_schema(params, SvodkaPMSingleOGRequest)
    
    og_id = validated_params["id"]
    codes = validated_params["codes"]
    columns = validated_params["columns"]
    search = validated_params.get("search")
    
    # ... остальная логика

Преимущества

  1. Единый источник правды - информация о параметрах хранится только в схемах Pydantic
  2. Автоматическая валидация - параметры автоматически валидируются с помощью Pydantic
  3. Синхронизация - изменения в схемах автоматически отражаются в парсерах
  4. Типобезопасность - использование типов Pydantic обеспечивает типобезопасность
  5. Документация - Swagger документация автоматически генерируется из схем

Совместимость

Решение работает с:

  • Pydantic v1 (через __fields__)
  • Pydantic v2 (через model_fields и is_required())

Использование

Для новых парсеров

  1. Создайте схему Pydantic с нужными полями
  2. Используйте register_getter_from_schema() для регистрации геттера
  3. Используйте validate_params_with_schema() в методах геттеров

Для существующих парсеров

  1. Убедитесь, что у вас есть соответствующая схема Pydantic
  2. Замените ручную регистрацию геттеров на register_getter_from_schema()
  3. Добавьте валидацию параметров в методы геттеров

Примеры

Схема с обязательными и необязательными полями

class ExampleRequest(BaseModel):
    required_field: str = Field(..., description="Обязательное поле")
    optional_field: Optional[str] = Field(None, description="Необязательное поле")

Регистрация геттера

register_getter_from_schema(
    parser_instance=self,
    getter_name="example_getter",
    method=self._example_method,
    schema_class=ExampleRequest,
    description="Пример геттера"
)

Валидация в методе

def _example_method(self, params: dict):
    validated_params = validate_params_with_schema(params, ExampleRequest)
    # validated_params содержит валидированные данные

Заключение

Это решение устраняет дублирование кода и обеспечивает единообразие между API схемами и парсерами. Теперь изменения в схемах автоматически отражаются в парсерах, что упрощает поддержку и развитие системы.