diff --git a/docs_src/source/melnikova.rst b/docs_src/source/melnikova.rst new file mode 100644 index 00000000..2a5b59f5 --- /dev/null +++ b/docs_src/source/melnikova.rst @@ -0,0 +1,131 @@ +Melnikova_Alisa +========= + +Start +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Данный код реализует систему валидации данных для маркетплейса с использованием **Pydantic v2**. +Модели обеспечивают строгую типизацию, валидацию бизнес-правил и автоматическую документацию. + + +UserSpec +~~~~~~~~~~ +Базовая модель пользователя маркетплейса. + +**Атрибуты:** +- ``user_id``: Уникальный идентификатор пользователя (int) +- ``username``: Имя пользователя на русском языке (RussianStr) +- ``surname``: Фамилия пользователя на русском языке (RussianStr) +- ``second_name``: Отчество пользователя, опционально (RussianStr) +- ``email``: Email в валидном формате (EmailStr) +- ``status``: Статус пользователя - "active" или "non-active" (Literal) + +**Конфигурация:** +- Запрещены дополнительные поля (``extra="forbid"``) + +ProfileSpec +~~~~~~~~~~ + +Расширенная модель профиля пользователя, наследуется от UserSpec. + +**Дополнительные атрибуты:** +- ``bio``: Биография пользователя на русском языке (RussianStr) +- ``url``: URL страницы профиля в валидном формате (HttpUrl) + +ItemSpec +~~~~~~~~~~ + +Модель товара в маркетплейсе. + +**Атрибуты:** +- ``item_id``: Уникальный идентификатор товара (int) +- ``name``: Название товара на русском языке (RussianStr) +- ``desc``: Описание товара на русском языке (RussianStr) +- ``price``: Цена товара, должна быть > 0 (float) + +ServiceSpec +~~~~~~~~~~ + +Модель услуги в маркетплейсе. + +**Атрибуты:** +- ``service_id``: Уникальный идентификатор услуги (int) +- ``name``: Название услуги на русском языке (RussianStr) +- ``desc``: Описание услуги на русском языке (RussianStr) +- ``price``: Цена услуги, должна быть > 0 (float) + +OrderLineSpec +~~~~~~~~~~ + +Модель строки заказа, содержащей товар или услугу. + +**Атрибуты:** +- ``order_id``: Идентификатор заказа (int) +- ``order_line_id``: Идентификатор строки заказа (int) +- ``item_line``: Товар или услуга (Union[ItemSpec, ServiceSpec]) +- ``quantity``: Количество, должно быть > 0 (float) +- ``line_price``: Стоимость строки, должна быть > 0 (float) + +**Валидатор:** +- ``check_line_price()`` - проверяет соответствие ``line_price`` произведению цены на количество + +OrderSpec +~~~~~~~~~~ + +Модель полного заказа. + +**Атрибуты:** +- ``order_id``: Уникальный идентификатор заказа (int) +- ``user_info``: Информация о пользователе (ProfileSpec) +- ``items_line``: Список строк заказа (List[OrderLineSpec]) + +**Валидатор:** +- ``check_unique_order_lines()`` - проверяет уникальность ``order_line_id`` в рамках заказа + +**OrdersSpec** + +Коллекция всех заказов маркетплейса. + +**Атрибуты:** +- ``market_place_orders``: Список всех заказов (List[OrderSpec]) + +**Валидатор:** +- ``check_global_uniques()`` - проверяет глобальную уникальность всех идентификаторов + +Дополнительно +~~~~~~~~~~ + +**RussianStr** + +Аннотированный тип для русскоязычных строк: + +.. code-block:: python + + RussianStr = Annotated[str, Field(pattern=r'^[А-Яа-яЁё\s\-]+$')] + +**Проверяет:** +- Только русские буквы (А-Я, а-я, Ёё) +- Пробелы и дефисы +- Запрещает латинские буквы, цифры, специальные символы + +**Функции** + +load_orders_from_yaml() + + +Загружает и валидирует заказы из YAML файла. + +**Параметры:** +- ``file_path``: Путь к YAML файлу + +**Возвращает:** +- ``OrdersSpec``: Валидированные данные заказов +- ``None``: В случае ошибки + +**Исключения:** +- ``FileNotFoundError``: Если файл не найден +- ``yaml.YAMLError``: При ошибках парсинга YAML +- ``ValidationError``: При ошибках валидации Pydantic + + +Документация сгенерирована автоматически с использованием Sphinx и доступна в HTML формате. \ No newline at end of file diff --git a/students_folder/melnikova/lab2.py b/students_folder/melnikova/lab2.py index 813b1010..917c3e03 100644 --- a/students_folder/melnikova/lab2.py +++ b/students_folder/melnikova/lab2.py @@ -7,6 +7,17 @@ class UserSpec(BaseModel): + """ + Базовая модель пользователя. + + Attributes: + user_id: Уникальный идентификатор пользователя + username: Имя пользователя + surname: Фамилия + second_name: Отчество (опционально) + email: Email адрес + status: Статус пользователя ('active' или 'non-active') + """ user_id: int username: str surname: str @@ -24,6 +35,13 @@ class UserSpec(BaseModel): class ProfileSpec(UserSpec): + """ + Расширенный профиль пользователя. + + Наследует все поля UserSpec и добавляет: + bio: Краткая биография пользователя + url: Валидный URL адрес профиля + """ bio: str url: HttpUrl @@ -37,6 +55,15 @@ class ProfileSpec(UserSpec): model_config = ConfigDict(extra='forbid') class ItemSpec(BaseModel): + """ + Модель товара/продукта. + + Attributes: + item_id: Уникальный идентификатор товара + name: Название товара (только русские буквы) + desc: Описание товара (только русские буквы) + price: Цена товара (должна быть больше 0) + """ item_id: int name: str = Field(..., pattern=RUS_RE) desc: str = Field(..., pattern=RUS_RE) @@ -53,6 +80,20 @@ class ItemSpec(BaseModel): class ServiceSpec(BaseModel): + """ + Модель услуги/сервиса. + + Attributes: + service_id: Уникальный идентификатор услуги + name: Название услуги + desc: Описание услуги + price: Стоимость услуги + order_id: ID заказа + order_line_id: ID строки заказа + item_line: Связанный товар + quantity: Количество + line_price: Итоговая цена строки (автоматически рассчитывается) + """ service_id: int name: str = Field(..., pattern=RUS_RE) desc: str = Field(..., pattern=RUS_RE) @@ -78,6 +119,17 @@ class ServiceSpec(BaseModel): class OrdersSpec(BaseModel): + """ + Модель заказов. + + Attributes: + market_place_orders: Список услуг/сервисов в заказе + + Validators: + Проверяет, что список не пустой + Проверяет уникальность order_line_id + Проверяет соответствие order_id + """ market_place_orders: List[ServiceSpec] model_config = ConfigDict(extra='forbid')