Исправление обработки неизвестных обновлений в webhook/polling#50
Исправление обработки неизвестных обновлений в webhook/polling#50Olegt0rr wants to merge 8 commits intolove-apples:mainfrom
Conversation
…обработке неизвестных обновлений, добавлено покрытие
|
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Pull request overview
PR повышает отказоустойчивость обработки входящих обновлений MAX API: неизвестные/неподдерживаемые типы обновлений больше не должны ломать polling/webhook, а должны корректно логироваться и пропускаться.
Changes:
- Перевод построения моделей обновлений на discriminated union (
UpdateUnion+TypeAdapter) и пропуск неизвестных обновлений с warning-логированием. - Для webhook добавлено гарантированное
200 OKпри неизвестном обновлении (без падения обработки). - Добавлены фикстуры и тесты на распознавание/покрытие типов обновлений, а также проверка соответствия фикстур
UpdateUnion.
Reviewed changes
Copilot reviewed 25 out of 26 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| maxapi/dispatcher.py | Возврат 200 OK и warning-лог при None из process_update_webhook (неизвестное обновление). |
| maxapi/methods/types/getted_updates.py | Парсинг обновлений через UpdateUnionAdapter, пропуск/логирование неизвестных событий в polling. |
| maxapi/types/updates/init.py | Введены UNKNOWN_UPDATE_DISCLAIMER, UpdateUnion (discriminator по update_type) и UpdateUnionAdapter. |
| maxapi/types/updates/base_update.py | Переименование базовой модели обновления на BaseUpdate. |
| maxapi/types/updates/bot_added.py | Переход на BaseUpdate, добавлен update_type: Literal[...] для discriminator union. |
| maxapi/types/updates/bot_removed.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/bot_started.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/bot_stopped.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/chat_title_changed.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/dialog_cleared.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/dialog_muted.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/dialog_removed.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/dialog_unmuted.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/message_callback.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/message_chat_created.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/message_created.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/message_edited.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/message_removed.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/user_added.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| maxapi/types/updates/user_removed.py | Переход на BaseUpdate, добавлен update_type: Literal[...]. |
| pyproject.toml | Обновлён список игнорируемых правил Ruff (добавлен G004). |
| tests/conftest.py | Подключение плагина фикстур обновлений и параметризованная фикстура update. |
| tests/fixtures/updates.py | Добавлены фикстуры pydantic-моделей для всех типов обновлений из UpdateUnion. |
| tests/test_fixtures_update_mapping.py | Тест на полноту покрытия UpdateUnion фикстурами. |
| tests/test_getted_updates.py | Тесты для get_update_model/process_update_request/process_update_webhook. |
Comments suppressed due to low confidence (1)
maxapi/types/updates/base_update.py:16
- Переименование базового класса обновления с
UpdateнаBaseUpdate(и отсутствиеmaxapi/types/updates/update.pyв текущем дереве) выглядит как потенциально ломающая смена публичного API: документация в репозитории ссылается на модульmaxapi.types.updates.update. Чтобы сохранить обратную совместимость, стоит оставить алиасUpdate = BaseUpdateи/или вернуть модуль-обёрткуupdate.py, реэкспортирующий класс.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Имя теста test_process_update_request_propagates_errors не соответствует проверяемому поведению: тест ожидает, что неизвестное обновление будет пропущено и залогировано, а не что ошибка «пробрасывается». Лучше переименовать тест (и при необходимости докстринг), чтобы он отражал фактическое требование. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Имя теста test_get_update_model_raises_value_error_for_unknown_type вводит в заблуждение: по новой логике функция не должна бросать ValueError, а возвращает None. Переименуйте тест (например, в ...returns_none...) чтобы он не противоречил ожиданиям и докстрингу. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
… маршрута для вебхуков
|
@codecov-commenter update |
|
@love-apples, обрати внимание, что codecov ругается на интеграцию по токену и просит интегрироваться через новый способ - приложение: https://github.com/apps/codecov |
Closes #48
Кратко
Что изменилось
В maxapi/dispatcher.py:
Причина доработки
Новые или повреждённые типы обновлений не должны останавливать работу бота или блокировать дальнейшую обработку. Единое логирование и стабильные ответы повышают наблюдаемость и надёжность.
Риски и совместимость
Обратная совместимость сохранена; изменяется только обработка ошибок для неизвестных обновлений.
Нет изменений в публичном API или механике регистрации обработчиков.
Тестирование