Преглед изворни кода

Registre des membres : fichier enregistré avec BOM accepté

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Johnounet пре 2 дана
родитељ
комит
25c5209242
3 измењених фајлова са 14 додато и 2 уклоњено
  1. 2 1
      bot/members.py
  2. 3 1
      changelog.txt
  3. 9 0
      tests/test_members.py

+ 2 - 1
bot/members.py

@@ -102,7 +102,8 @@ class MemberRegistry:
         if not self.file_path.exists():
             return {}
         try:
-            raw = json.loads(self.file_path.read_text(encoding="utf-8"))
+            # -sig : BOM laissé par certains éditeurs Windows (Bloc-notes) après une correction à la main.
+            raw = json.loads(self.file_path.read_text(encoding="utf-8-sig"))
             if not isinstance(raw, dict) or not isinstance(raw.get("members"), dict):
                 raise ValueError("« members » absent ou n'est pas un dictionnaire")
             return {key: self._sanitize(key, value) for key, value in raw["members"].items()}

+ 3 - 1
changelog.txt

@@ -69,7 +69,9 @@ Corrections
   modifié à la main) : la mémoire des membres est coupée jusqu'à sa
   réparation, au lieu de repartir d'un registre vide qui réactivait la
   mémoire de ceux qui l'avaient désactivée. Le fichier n'est plus mis
-  de côté ni réécrit ; le log et /memoire signalent la panne.
+  de côté ni réécrit ; le log et /memoire signalent la panne. Un
+  registre corrigé à la main et enregistré avec BOM (Bloc-notes)
+  reste lisible.
 - Les surnoms d'un membre sont reconnus même si la ligne « Surnoms : … »
   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 »

+ 9 - 0
tests/test_members.py

@@ -64,6 +64,15 @@ class BrokenRegistryTest(unittest.IsolatedAsyncioTestCase):
         await registry.see(222, "alice", "Alice")
         self.assertIn("222", json.loads(self.path.read_text(encoding="utf-8"))["members"])
 
+    async def test_file_with_bom(self):
+        # Registre corrigé à la main puis enregistré avec BOM (Bloc-notes) : toujours lisible.
+        self.path.write_text(json.dumps({"version": 1, "members": {"111": ENTRY}}), encoding="utf-8-sig")
+        registry = MemberRegistry(self.path)
+        self.assertIsNone(registry.broken)
+        self.assertFalse(registry.memory_enabled(111))
+        await registry.see(222, "alice", "Alice")
+        self.assertIn("222", json.loads(self.path.read_text(encoding="utf-8"))["members"])  # réécrit sans BOM
+
     async def test_missing_file(self):
         registry = MemberRegistry(self.path)
         self.assertIsNone(registry.broken)