feat: утилита генерации ссылок на сообщения#113
feat: утилита генерации ссылок на сообщения#113Pankovea wants to merge 6 commits intolove-apples:mainfrom
Conversation
There was a problem hiding this comment.
Pull request overview
PR добавляет утилиты для работы с внутренними идентификаторами сообщений MAX (mid) и генерации публичных ссылок на сообщения (для использования в веб-интерфейсе).
Changes:
- Добавлены конвертеры
mid ↔ (chat_id, seq)с учётом signed int64 дляchat_id(two’s complement) и uint64 дляseq. - Добавлена генерация ссылки на сообщение
https://max.ru/c/{chat_id}/{seq_b64}с URL-safe Base64 без padding.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Привет, @Pankovea! Посмотрел PR подробнее — накидываю пачкой всё, что нашёл сверх ревью Copilot. Список выглядит длинным, но половина — это мелочь «на минуту», и если тебе удобнее — я могу сам запушить фиксы в твою ветку (скажи — сделаю), либо готов скинуть готовые сниппеты/тесты, выбирай как удобнее. Идея утилиты классная, хочется чтобы она доехала до merge без регрессий. Блокеры (функция в текущем виде не запускается)
Несогласованность примера в описании PR
Семантика и устойчивость
Тесты
Мелочь
Архитектурный вопрос к @love-apples
@Pankovea, ещё раз: пунктов много, но почти все тривиальные — если хочешь, могу пушнуть фикс-коммит прямо в твою ветку (тогда с тебя остаётся только review + ответ на п.13–14). Или скину |
|
Спасибо за ревью. Назначение.
Правки внесу. |
|
Почему-то не получается запустить тесты локально |
|
Попробуем тут прогнать тесты. |
|
Привет, @Pankovea! Спасибо, что быстро раскатал правки — почти всё закрыто, осталось немного, что мешает CI стать зелёным. Локально прогнал ещё раз, группирую по приоритетам с точными местами и почему так. 1. Блокер: circular import — ломается весь пакет, не только новый кодИменно по этой причине у тебя локально не стартует conftest с
Воспроизводимо на твоей ветке: Т.е. сейчас Самый чистый вариант фикса — вынести четыре новые функции в отдельный файл
Так Альтернатива попроще — вернуть 2. Блокер: тесты валидации ждут сообщения, которых в коде уже нетВо 2-м коммите ты схлопнул три проверки mid в один regex ( if not re.fullmatch(r'mid\.[0-9a-fA-F]{32}', mid):
raise ValueError('mid должен быть в формате "mid." + 32 hex-символа')Решение правильное — это закрывает и длину, и префикс, и hex-дырку с
Проще всего поправить тесты под текущий код: в первых 7 строчках — Ещё один смежный кейс — with pytest.raises(ValueError, match="Ошибка декодирования base64"):
link_to_chatid_seq("https://max.ru/c/123/!!!")До
3. Мелочи (не блокеры, но по практике Olegt0rr обычно просит)
4. Открытый архитектурный вопрос — к @love-applesПока повисло с первого прохода: у Как и раньше — если хочешь, соберу патч-коммитом всё по пунктам 1–3 и кину тебе PR в ветку |
|
@Pankovea проперти функцию сделай пж у Message для получения ссылки |
Отличное предложение. Но в утилитах на мой взгляд надо всё равно оставить. |
|
Настроил всё же запуск тестов. Отрабатывают все кроме интеграционных. Я сделал message.url_link потому что message.link уже используется в edit_message и тесты падали. Спасибо за терпение. Это очень продуктивный опыт для меня. |
|
@Pankovea огромный прогресс за эти сутки — circular import закрыт через вынос в 1. Блокер:
|
|
ОК. Спасибо. Нужен совет. Теперь мы расширяем это свойство. Я бы не добавлял отдельный url_link - что может запутать пользователя |
|
Ну да, хороший вариант |
|
С pydantic помогла разобраться нейронка. После model_dump возвращает только то что было получено от сервера. |
|
Видимо надо опять rebase сделать... Или не нужно? Файлы вроде разные затронуты. |
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.
Pull request overview
This PR adds a dedicated utility for working with MAX message identifiers (mid) and generating/parsing public message links, and integrates this into the Message model via a computed url property while preserving the raw API-provided URL.
Changes:
- Added
maxapi.utils.message_linkwith converters (mid⇄(chat_id, seq)) and link helpers (mid→ URL, URL →(chat_id, seq)). - Updated
Messageto store the raw API URL asurl_api(alias"url") and expose a computedurlproperty that generates/c/{chat_id}/{seq_b64}when needed. - Added comprehensive tests for the new utility and for the
Message.urlbehavior.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
maxapi/utils/message_link.py |
New utility module implementing mid parsing/encoding and link building/parsing. |
maxapi/utils/__init__.py |
Exposes the new utility functions via maxapi.utils. |
maxapi/types/message.py |
Adds url_api (alias url) + computed url property that falls back to generated links. |
tests/test_utils/test_message_link.py |
New test suite for mid/link conversions, edge cases, and validation errors. |
tests/test_message_url.py |
New tests ensuring Message.url prioritizes API URL and generates fallback links. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
* build_message_link
* Конвертаци:
mid_to_chatid_seq
chatid_seq_to_mid
add: Валидация функций
add: link_to_chatid_seq - обратное преобразование
* Валидация mid перенесена в функцию mid_to_chatid_seq
add: Тесты на реальных данных проходят успешно.
add: docstrings
* API для каналов * Вычисленное для групповых и приватных чатов * Более реальные примеры в тестах add: tests message.url refactor: ruff
e99eb84 to
52d39b3
Compare
|
Внёс ruff правки |
|
Olegt0rr, мне не очень понятно что ещё нужно изменить. |
|
@Pankovea во вкладке с кодом есть тонны комментариев от copilot - нужно изучить все. Там, где исправлено - написать, что оно исправлено. Там, где ИИ галлюционирует - написать что так делать не надо и почему. После этого тегнуть меня - я пробегу оперативно и позакрываю. Например вижу, что замечания по форматированию были поправлены - их можно позакрывать самостоятельно. Мы же хотим принести функциональность ничего не сломав и ничего не ухудшив? ) |
|
Olegt0rr, всё пробежался. Там пару мест с орфографическими ошибками. Всё подправил. |
There was a problem hiding this comment.
Pull request overview
Добавляет утилиты для преобразования внутренних идентификаторов сообщений MAX (mid) ↔︎ (chat_id, seq) и генерации/парсинга публичных ссылок на сообщения, а также дополняет модель Message вычисляемым URL.
Changes:
- Добавлен модуль
maxapi.utils.message_linkс конвертерамиmid/(chat_id, seq)и функциямиbuild_message_link+link_to_chatid_seq. - В
Messageдобавлено полеurl_api(alias"url") и свойствоurl, которое при отсутствииurl_apiгенерирует ссылку изbody.mid. - Добавлены тесты на конвертацию и URL-логику (
tests/test_utils/test_message_link.py,tests/test_message_url.py).
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| maxapi/utils/message_link.py | Реализация конвертеров mid↔︎(chat_id, seq) и генерации/парсинга ссылок. |
| maxapi/utils/init.py | Экспорт новых утилит через __all__. |
| maxapi/types/message.py | Добавляет url_api (alias "url") и property url с генерацией ссылки из mid. |
| tests/test_utils/test_message_link.py | Полное покрытие: roundtrip, edge cases, валидация ошибок, ссылки. |
| tests/test_message_url.py | Тесты поведения Message.url/url_api и сериализации. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| match = re.escape('mid должен быть в формате "mid." + 32 hex-символа') | ||
|
|
There was a problem hiding this comment.
Повторяющаяся строка с re.escape(...) здесь тоже выглядит длиннее 79 символов и может упасть по Ruff E501. Если вынести это значение в одну константу/фикстуру (и при необходимости разбить на части), исчезнут и дублирование, и проблема с длиной строки.
There was a problem hiding this comment.
-
Здесь 78 символов. Укладывается в ограничения. Ruff не ругается локально.
-
Никак не могу заставить ruff локально найти исправления. Говорит что всё чётко.
$ uv run ruff format ./tests/test_utils/test_message_link.py
1 file left unchanged
$ uv run ruff format ./maxapi/utils/message_link.py
1 file left unchanged
Проверил версии. Всё сходится с CI
$ uv --version
uv 0.11.8 (0e961dd9a 2026-04-27 x86_64-pc-windows-msvc)
$ uv run python --version
Python 3.11.15
python 3.10 тоже не показывает исправлений.
There was a problem hiding this comment.
понял в чём дело. Ты сделал коммит по совету второго пилота, но эти правки как раз и приводят к тому что ruff не пропускает.
uv run ruff format ./tests/test_utils/test_message_link.py
1 file reformatted
uv run ruff format --diff ./tests/test_utils/test_message_link.py
--- tests\test_utils\test_message_link.py
+++ tests\test_utils\test_message_link.py
@@ -178,10 +178,7 @@
mid_to_chatid_seq(12345) # type: ignore
def test_mid_wrong_values(self):
- match = re.escape(
- 'mid должен быть в формате "mid." + '
- "32 hex-символа"
- )
+ match = re.escape('mid должен быть в формате "mid." + 32 hex-символа')
# missing prefix
with pytest.raises(ValueError, match=match):В общем сейчас сделаю force push с моими правками с учётом ruff
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Отлично! Остался последний комментарий. |
c27bda0 to
8780d7b
Compare
Реализация инструментов для работы с идентификаторами сообщений (mid)
Описание:
Добавлены вспомогательные методы для корректной обработки внутренних идентификаторов сообщений MAX (mid) и генерации публичных ссылок на сообщения.
Для чего это нужно:
Изменения:
build_message_link:
Добавлена генерация прямой ссылки на сообщение в формате https://max.ru/c/{chat_id}/{seq_b64}.
Реализовано кодирование seq в URL-safe Base64 без padding-символов (=).
Добавлена валидация входного параметра mid (проверка префикса, длины и hex-формата).
mid_to_chatid_seq:
Реализован декодер строки mid в пару (chat_id, seq).
Учтена специфика хранения chat_id как signed 64-bit integer при hex-кодировании (корректная обработка отрицательных значений через two's complement).
seq интерпретируется как unsigned 64-bit integer.
chatid_seq_to_mid:
Реализован обратный конвертер из (chat_id, seq) в строковый формат mid.
Гарантируется фиксированная длина hex-строк (по 16 символов на компонент) и корректное битовое маскирование для отрицательных chat_id.
Пример использования:
Для тестовых данных:
Конвертация работает следующим образом:
Тестирование:
Работа ссылок проверена на реальном проекте - ссылки работают.