Browse Source

Registre des membres : fichier enregistré avec BOM accepté

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Johnounet 2 days ago
parent
commit
25c5209242
3 changed files with 14 additions and 2 deletions
  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():
         if not self.file_path.exists():
             return {}
             return {}
         try:
         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):
             if not isinstance(raw, dict) or not isinstance(raw.get("members"), dict):
                 raise ValueError("« members » absent ou n'est pas un dictionnaire")
                 raise ValueError("« members » absent ou n'est pas un dictionnaire")
             return {key: self._sanitize(key, value) for key, value in raw["members"].items()}
             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
   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
   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
   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 : … »
 - 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
   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 »
   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")
         await registry.see(222, "alice", "Alice")
         self.assertIn("222", json.loads(self.path.read_text(encoding="utf-8"))["members"])
         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):
     async def test_missing_file(self):
         registry = MemberRegistry(self.path)
         registry = MemberRegistry(self.path)
         self.assertIsNone(registry.broken)
         self.assertIsNone(registry.broken)