feat: добавлен ClipboardButton#105
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Чистая работа! Discriminator на Literal[ButtonType.X] для всех кнопок — отличное архитектурное улучшение, не только новая кнопка.
Пара мыслей:
-
Unknown button type в ответах API. С
Field(discriminator="type")наInlineButtonUnion, если MAX API в будущем вернёт новый тип кнопки (например,"type": "payment"), pydantic выброситValidationErrorпри десериализации всего сообщения. Может стоит добавить fallback — например, genericButtonкак catch-all в union, илиmodel_config = ConfigDict(extra="ignore")+ тест на unknown type? В aiogram подобные ситуации обрабатываются graceful degradation. -
payload: strобязательный. При парсинге входящих обновлений (не при создании кнопки) может ли API вернутьClipboardButtonбезpayload? Если да —payload: str | None = Noneбудет безопаснее. -
Поле
intent— уCallbackButtonестьintent: Intent = Intent.DEFAULT. Поддерживает ли MAX API intent для clipboard? Если да, стоит добавить для консистентности.
Ни одно из этого не блокирует мерж — всё можно доработать отдельным PR.
There was a problem hiding this comment.
Pull request overview
PR добавляет новый тип инлайн-кнопки ClipboardButton (копирование текста в буфер обмена) и обеспечивает корректную (де)сериализацию кнопок через discriminator по полю type в ButtonsPayload, закрывая issue #104.
Changes:
- Добавлен
ClipboardButtonи новый enum-типButtonType.CLIPBOARD. - Переведён
InlineButtonUnionна discriminated union (Field(discriminator="type")), а кнопки — наtype: Literal[...]для корректного выбора модели приmodel_validate. - Обновлены тесты и документация (mkdocs nav + гайд по клавиатурам + новая страница типа).
Reviewed changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| tests/test_utils/test_keyboard_builder.py | Добавлен ClipboardButton в проверку сборки клавиатуры. |
| tests/test_types.py | Добавлен unit-тест на модель ClipboardButton. |
| tests/test_serialization_models.py | Добавлен тест, что ButtonsPayload десериализует кнопки по discriminator type (включая clipboard). |
| mkdocs.yml | Добавлена страница ClipboardButton в навигацию документации. |
| maxapi/types/attachments/buttons/request_geo_location_button.py | type уточнён до Literal[...] для discriminated union. |
| maxapi/types/attachments/buttons/request_contact.py | type уточнён до Literal[...] для discriminated union. |
| maxapi/types/attachments/buttons/open_app_button.py | type уточнён до Literal[...] для discriminated union. |
| maxapi/types/attachments/buttons/message_button.py | type уточнён до Literal[...] для discriminated union. |
| maxapi/types/attachments/buttons/link_button.py | type уточнён до Literal[...] для discriminated union. |
| maxapi/types/attachments/buttons/clipboard_button.py | Новая модель кнопки: ClipboardButton с payload для копирования. |
| maxapi/types/attachments/buttons/chat_button.py | type уточнён до Literal[...] для discriminated union. |
| maxapi/types/attachments/buttons/callback_button.py | type уточнён до Literal[...] для discriminated union. |
| maxapi/types/attachments/buttons/init.py | InlineButtonUnion сделан discriminated union по полю type + добавлен ClipboardButton. |
| maxapi/types/init.py | ClipboardButton экспортирован в публичный API. |
| maxapi/enums/button_type.py | Добавлен CLIPBOARD в ButtonType. |
| docs/types/attachments/buttons/clipboard_button.md | Новая страница API-документации для ClipboardButton. |
| docs/guides/keyboards.md | Документация обновлена: пример и список типов кнопок дополнены ClipboardButton. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Подтянуты PR из upstream: love-apples#93 (FSM), love-apples#96 (download_file), love-apples#101 (fetch user/chat), love-apples#105 (ClipboardButton), love-apples#109 (share payload), love-apples#110 (webhook secret warning). Конфликт в tests/test_types.py: принят upstream-стиль (явный update_type, разнесённые assert). Сохранены доп. тесты test_get_ids_ignores_inviter_id / test_get_ids_ignores_admin_id — их purpose именно цель PR love-apples#94 (не путать inviter_id/admin_id с user.user_id).
closes #104