Skip to content

fix: корректный тип payload для share-вложения (closes #108)#109

Merged
love-apples merged 1 commit intolove-apples:mainfrom
bish-x:fix/share-attachment-payload
Apr 14, 2026
Merged

fix: корректный тип payload для share-вложения (closes #108)#109
love-apples merged 1 commit intolove-apples:mainfrom
bish-x:fix/share-attachment-payload

Conversation

@bish-x
Copy link
Copy Markdown
Contributor

@bish-x bish-x commented Apr 14, 2026

Что делает PR

Фикс для #108. Входящий attachment с type="share" теперь десериализуется с payload типа ShareAttachmentPayload вместо OtherAttachmentPayload (который по докстрингу «для файлов»), так что пользователь может делать pattern-matching:

match att.payload:
    case ShareAttachmentPayload(): ...      # теперь работает
    case PhotoAttachmentPayload(): ...
    case OtherAttachmentPayload(): ...      # файлы/аудио/видео

Root cause

  • Attachments union (maxapi/types/attachments/__init__.py) — discriminated по type, поэтому сам attachment корректно резолвится в Share.
  • Share.payload наследовался от базового Attachment, а в его union (attachment.py) не было ShareAttachmentPayload. OtherAttachmentPayload = {url, token | None} — суперсет для payload share-а, pydantic smart-union (2.x) выбирал его первым.

Что меняется

  1. Добавлен класс ShareAttachmentPayload с url: str, token: str в maxapi/types/attachments/attachment.py.
  2. Share переопределяет payload: ShareAttachmentPayload | None = None. Это ключевая правка — она локализует фикс именно в Share, не затрагивая payload у File / Audio / Video (они продолжают работать через OtherAttachmentPayload).
  3. ShareAttachmentPayload также добавлен в базовый Attachment.payload-union после OtherAttachmentPayload — чтобы явная сборка Attachment(type=SHARE, payload=ShareAttachmentPayload(...)) была типобезопасна, без регрессии на File/Audio/Video.
  4. ShareAttachmentPayload экспортирован из maxapi.types.

Тесты

Локальный прогон: tests/test_serialization_models.py — все 7 тестов зелёные, полный прогон (кроме test_webhook, где нет опциональных зависимостей, и test_dispatcher, где нет aresponses) — 494 passed.

Нотки

  • Совместимо: ничего не ломается для существующих пользователей OtherAttachmentPayload — они у файлов/аудио/видео остаются прежними.
  • Сценарий из issue воспроизведён на чистом PyPI maxapi==0.9.18, фикс проверен на ветке.

Входящий attachment с type="share" теперь десериализуется
с payload типа ShareAttachmentPayload вместо OtherAttachmentPayload,
так что пользовательский pattern-matching на типе payload работает
как ожидается.

- Добавлен класс ShareAttachmentPayload ({url, token})
- Share.payload переопределён как ShareAttachmentPayload | None
- ShareAttachmentPayload экспортирован из maxapi.types
- Регрессионные тесты: share корректно резолвится, File/Audio/Video
  продолжают использовать OtherAttachmentPayload

Closes love-apples#108
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 14, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@love-apples love-apples merged commit 815908c into love-apples:main Apr 14, 2026
13 checks passed
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.

2 participants