Преглед на файлове

Mémoire : surnoms reconnus au singulier et en gras

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Johnounet преди 2 дни
родител
ревизия
2bfaa9f0c5
променени са 3 файла, в които са добавени 18 реда и са изтрити 3 реда
  1. 5 3
      bot/memory.py
  2. 2 0
      changelog.txt
  3. 11 0
      tests/test_memory.py

+ 5 - 3
bot/memory.py

@@ -20,8 +20,9 @@ logger = logging.getLogger("chatbot.memory")
 SERVER_FILE = "serveur.md"
 MEMBER_FILE = re.compile(r"^membres/(\d+)\.md$")
 # Ligne d'une fiche (la première, en principe) avec les surnoms du membre, repris dans la liste des
-# membres. Une puce en tête (« - Surnoms : … ») est acceptée.
-NICKNAMES_LINE = re.compile(r"^(?:[-*•]\s*)?surnoms\s*:\s*(.*)$", re.IGNORECASE)
+# membres. Une puce en tête (« - Surnoms : … »), le singulier et le gras (« **Surnom :** … »), que
+# Claude écrit volontiers, sont acceptés.
+NICKNAMES_LINE = re.compile(r"^(?:[-*•]\s*)?\**\s*surnoms?\s*\**\s*:\s*\**\s*(.*)$", re.IGNORECASE)
 # Surnoms repris dans la liste : peu nombreux et courts (comme un pseudo Discord), pour qu'une
 # ligne « Surnoms » ne puisse pas glisser un long texte dans le prompt système.
 MAX_NICKNAMES = 5
@@ -127,7 +128,8 @@ class MemoryStore:
         for line in content.splitlines():
             if match := NICKNAMES_LINE.match(line.strip()):
                 for name in re.split(r"[,;]", match.group(1)):
-                    if 0 < len(name := name.strip()) <= MAX_NICKNAME_LENGTH:
+                    # Astérisques d'un gras qui englobe toute la ligne (« **Surnoms : Bobby, B** »).
+                    if 0 < len(name := name.strip(" *")) <= MAX_NICKNAME_LENGTH:
                         names.setdefault(name.casefold(), name)
         return list(names.values())[:MAX_NICKNAMES]
 

+ 2 - 0
changelog.txt

@@ -73,6 +73,8 @@ Corrections
   n'est pas la première de sa fiche (ajoutée à la fin, ou fiche
   modifiée à la main), avec ou sans puce ; plusieurs lignes « Surnoms »
   sont regroupées. Avant, elles étaient ignorées sans rien dire.
+  « Surnom : … » au singulier et « **Surnoms :** … » en gras sont
+  aussi reconnus.
 - Mémoire : le chemin « memories/membres/… » (sans « / » au début) est
   accepté par l'outil, comme « /memories/membres/… ».
 - Mémoire : en désactivant la mémoire, un membre ne peut plus vider le

+ 11 - 0
tests/test_memory.py

@@ -59,6 +59,17 @@ class NicknamesTest(MemoryTestCase):
         self.write(f"membres/{MEMBER_ID}.md", "Surnoms : Bobby\nhabite à Lyon\nsurnoms : bobby ; B")
         self.assertEqual(self.store.nicknames(MEMBER_ID), ["Bobby", "B"])
 
+    async def test_singular_and_bold_recognized(self):
+        for line in ["Surnom : Bobby", "**Surnoms :** Bobby", "**Surnoms** : Bobby", "- **Surnom :** Bobby",
+                     "*Surnoms :* Bobby", "**Surnoms : Bobby**"]:
+            with self.subTest(line=line):
+                self.write(f"membres/{MEMBER_ID}.md", f"habite à Lyon\n{line}")
+                self.assertEqual(self.store.nicknames(MEMBER_ID), ["Bobby"])
+
+    async def test_other_lines_ignored(self):
+        self.write(f"membres/{MEMBER_ID}.md", "Surnommé Bobby par Alice : à éviter\nSurnoms donnés : aucun")
+        self.assertEqual(self.store.nicknames(MEMBER_ID), [])
+
     async def test_short_nickname_kept(self):
         name = "x" * MAX_NICKNAME_LENGTH
         self.write(f"membres/{MEMBER_ID}.md", f"Surnoms : {name}")