refactor(render): этап 2 — футер merged-групп из настоящего Message, выпил конвертера (#29)
Docker Image CI / build (pull_request) Has been cancelled

Убрал обратный ход данных: merged-группы больше не конвертируют отрендеренный
dict обратно в мок-Message (processed_message_to_tg_message удалён, −84 строки).
Футер рендерится прямо из реального главного Message группы. main_message (dict)
по-прежнему выбирается тем же критерием-индексом → title/date/author байт-в-байт.

Реестр §3:
- §3.6 custom-emoji реакции merged-футера — отдельный span на каждую (через
  реальный _reactions_views_links), а не агрегированная « N»;
- §3.7 дата merged-футера из naive-local реального Message (не UTC-мок); в
  UTC-голдене не видна → выделенный не-UTC тест (TZ=Europe/Moscow);
- §3.8 порядок флагов merged-поста детерминирован (first-seen через
  dict.fromkeys вместо hash-ordered list(set)); временная сортировка флагов
  снята из оракула (golden_replay нормализатор убран, normalize_html теперь
  identity); проверено — оракул стабилен на PYTHONHASHSEED 0/1/42;
- §3.15 пустой reactions-объект больше не даёт ведущий разделитель (и одиночные).

Golden обновлён строго по §3: span +2 (§3.6 сплит custom-реакции), reorder
флагов только на merged-постах (§3.8), снят ведущий разделитель на одиночном
poll-посте (§3.15). Оракул зелёный и детерминированный (2 прогона идентичны).
Полный сюит 353 passed (+6 тестов этапа 2).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-06 17:39:49 +03:00
parent 53da67eacf
commit d8af0aeb44
13 changed files with 279 additions and 141 deletions
+10 -10
View File
@@ -7,7 +7,7 @@
<docs>http://www.rssboard.org/rss-specification</docs>
<generator>python-feedgen</generator>
<language>ru</language>
<lastBuildDate>Mon, 06 Jul 2026 04:36:27 +0000</lastBuildDate>
<lastBuildDate>Mon, 06 Jul 2026 14:33:41 +0000</lastBuildDate>
<item>
<title>Интересно при чтении нехудожественных книг...</title>
<link>https://t.me/embedoka/1337</link>
@@ -114,7 +114,7 @@
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">⭐ 2&nbsp;&nbsp;</span><span class="reaction">❤ 41&nbsp;&nbsp;</span><span class="reaction">🔥 10&nbsp;&nbsp;</span><span class="reaction">😭 7&nbsp;&nbsp;</span><span class="reaction">🤪 4&nbsp;&nbsp;</span><span class="reaction">👍 3&nbsp;&nbsp;</span><span class="reaction">🎉 2&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4253 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">06/03/25, 18:05:55</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1341</span><br><a href="tg://resolve?domain=embedoka&amp;post=1341">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1341">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>]]></content:encoded>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 merged </div></div>]]></content:encoded>
<guid isPermaLink="true">https://t.me/embedoka/1341</guid>
<pubDate>Thu, 06 Mar 2025 18:05:55 +0000</pubDate>
</item>
@@ -236,7 +236,7 @@
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">🤯 11&nbsp;&nbsp;</span><span class="reaction">🤔 5&nbsp;&nbsp;</span><span class="reaction">🤷‍♂ 2&nbsp;&nbsp;</span><span class="reaction">👍 2&nbsp;&nbsp;</span><span class="reaction">🌚 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4720 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">10/04/25, 08:45:12</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1350</span><br><a href="tg://resolve?domain=embedoka&amp;post=1350">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1350">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>]]></content:encoded>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 merged </div></div>]]></content:encoded>
<guid isPermaLink="true">https://t.me/embedoka/1350</guid>
<pubDate>Thu, 10 Apr 2025 08:45:12 +0000</pubDate>
</item>
@@ -434,7 +434,7 @@
<div class="message-poll">📊 Poll: Стоит ли выкладывать копии релевантных видео в канал (для участников, у которых ограничен доступ к ютьюб)? И вообще дублировать какой-либо контент в тг, доступ к которому может быть ограничен?<br>1. да<br>2. нет<br>3. всё равно<br>4. напишу в комментариях<br><br>→ Vote in Telegram 🔗<br></div>
</div><br></div>
<div class="message-footer"><br>
&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3822 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">05/05/25, 17:21:14</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1363</span><br><a href="tg://resolve?domain=embedoka&amp;post=1363">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1363">Open in Web</a>
<span class="views">3822 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">05/05/25, 17:21:14</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1363</span><br><a href="tg://resolve?domain=embedoka&amp;post=1363">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1363">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image 🏷 poll </div></div>]]></description>
<guid isPermaLink="true">https://t.me/embedoka/1363</guid>
<pubDate>Mon, 05 May 2025 17:21:14 +0000</pubDate>
@@ -559,7 +559,7 @@
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">🔥 35&nbsp;&nbsp;</span><span class="reaction">👍 13&nbsp;&nbsp;</span><span class="reaction">👏 3&nbsp;&nbsp;</span><span class="reaction">🤔 3&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4838 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">22/05/25, 07:49:49</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1370</span><br><a href="tg://resolve?domain=embedoka&amp;post=1370">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1370">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>]]></content:encoded>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 merged </div></div>]]></content:encoded>
<guid isPermaLink="true">https://t.me/embedoka/1370</guid>
<pubDate>Thu, 22 May 2025 07:49:49 +0000</pubDate>
</item>
@@ -1097,7 +1097,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">❤ 6&nbsp;&nbsp;</span><span class="reaction">🤣 4&nbsp;&nbsp;</span><span class="reaction">👍 3&nbsp;&nbsp;</span><span class="reaction">🤔 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">🔥 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3573 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/08/25, 08:10:58</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1400</span><br><a href="tg://resolve?domain=embedoka&amp;post=1400">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1400">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>]]></content:encoded>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 merged </div></div>]]></content:encoded>
<guid isPermaLink="true">https://t.me/embedoka/1400</guid>
<pubDate>Thu, 14 Aug 2025 08:10:58 +0000</pubDate>
</item>
@@ -1218,7 +1218,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">⭐ 2&nbsp;&nbsp;</span><span class="reaction">👍 29&nbsp;&nbsp;</span><span class="reaction">✍ 4&nbsp;&nbsp;</span><span class="reaction">❤ 3&nbsp;&nbsp;</span><span class="reaction">🔥 1&nbsp;&nbsp;</span><span class="reaction">🤔 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">6052 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">02/09/25, 10:40:26</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1411</span><br><a href="tg://resolve?domain=embedoka&amp;post=1411">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1411">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>]]></content:encoded>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 merged </div></div>]]></content:encoded>
<guid isPermaLink="true">https://t.me/embedoka/1411</guid>
<pubDate>Tue, 02 Sep 2025 10:40:26 +0000</pubDate>
</item>
@@ -1506,8 +1506,8 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<br>
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">🔥 13&nbsp;&nbsp;</span><span class="reaction">❓ 6&nbsp;&nbsp;</span><span class="reaction">😁 3&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3365 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">10/04/26, 09:13:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1428</span><br><a href="tg://resolve?domain=embedoka&amp;post=1428">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1428">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>]]></content:encoded>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">🔥 13&nbsp;&nbsp;</span><span class="reaction">❓ 4&nbsp;&nbsp;</span><span class="reaction">😁 3&nbsp;&nbsp;</span><span class="reaction">❓ 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3365 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">10/04/26, 09:13:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1428</span><br><a href="tg://resolve?domain=embedoka&amp;post=1428">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1428">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 merged </div></div>]]></content:encoded>
<guid isPermaLink="true">https://t.me/embedoka/1428</guid>
<pubDate>Fri, 10 Apr 2026 09:13:01 +0000</pubDate>
</item>
@@ -1569,7 +1569,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">👏 11&nbsp;&nbsp;</span><span class="reaction">🤯 6&nbsp;&nbsp;</span><span class="reaction">👍 5&nbsp;&nbsp;</span><span class="reaction">🔥 2&nbsp;&nbsp;</span><span class="reaction">❓ 2&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3233 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">04/05/26, 14:04:48</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1433</span><br><a href="tg://resolve?domain=embedoka&amp;post=1433">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1433">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>]]></content:encoded>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 merged </div></div>]]></content:encoded>
<guid isPermaLink="true">https://t.me/embedoka/1433</guid>
<pubDate>Mon, 04 May 2026 14:04:48 +0000</pubDate>
</item>