Skip to content

feat: добавлен ClipboardButton#105

Merged
love-apples merged 1 commit intomainfrom
feat/button-clipboard
Apr 12, 2026
Merged

feat: добавлен ClipboardButton#105
love-apples merged 1 commit intomainfrom
feat/button-clipboard

Conversation

@love-apples
Copy link
Copy Markdown
Owner

closes #104

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 10, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@love-apples love-apples requested a review from Olegt0rr April 10, 2026 22:29
Copy link
Copy Markdown
Contributor

@bish-x bish-x left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Чистая работа! Discriminator на Literal[ButtonType.X] для всех кнопок — отличное архитектурное улучшение, не только новая кнопка.

Пара мыслей:

  1. Unknown button type в ответах API. С Field(discriminator="type") на InlineButtonUnion, если MAX API в будущем вернёт новый тип кнопки (например, "type": "payment"), pydantic выбросит ValidationError при десериализации всего сообщения. Может стоит добавить fallback — например, generic Button как catch-all в union, или model_config = ConfigDict(extra="ignore") + тест на unknown type? В aiogram подобные ситуации обрабатываются graceful degradation.

  2. payload: str обязательный. При парсинге входящих обновлений (не при создании кнопки) может ли API вернуть ClipboardButton без payload? Если да — payload: str | None = None будет безопаснее.

  3. Поле intent — у CallbackButton есть intent: Intent = Intent.DEFAULT. Поддерживает ли MAX API intent для clipboard? Если да, стоит добавить для консистентности.

Ни одно из этого не блокирует мерж — всё можно доработать отдельным PR.

@love-apples love-apples merged commit fc7d72d into main Apr 12, 2026
13 checks passed
@Olegt0rr Olegt0rr requested a review from Copilot April 12, 2026 18:43
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@love-apples love-apples deleted the feat/button-clipboard branch April 13, 2026 20:23
bish-x added a commit to bish-x/maxapi that referenced this pull request Apr 14, 2026
Подтянуты 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).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Добавить тип кнопки clipboard

3 participants