From f82e79360b2fe24295d79baa5c28477fef3f9bf7 Mon Sep 17 00:00:00 2001 From: Antoine Van Elstraete Date: Sun, 6 Sep 2026 13:20:24 +0200 Subject: [PATCH] =?UTF-8?q?feat(M4):=20hi=C3=A9rarchie=20d'erreurs,=20fixt?= =?UTF-8?q?ure=20iCal=20et=20correction=20TODO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - pronote_sync/errors.py : PronoteSyncError (base) + PipelineCriticalError - tests/fixtures/pronote-4e.ics : fixture anonymisée (3 VEVENTs : cours normal avec devoirs, cours annulé, événement scolaire) - TODO.md ligne 82 : normalize_uid → normalize_pronote_uid (alignement sur le code existant dans utils/uid.py) Co-authored-by: opencode/coder Co-authored-by: opencode/test-engineer --- TODO.md | 2 +- pronote_sync/errors.py | 33 ++++++++++++++++++++ tests/fixtures/pronote-4e.ics | 57 +++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 pronote_sync/errors.py create mode 100644 tests/fixtures/pronote-4e.ics diff --git a/TODO.md b/TODO.md index 290088c..2db2b4a 100644 --- a/TODO.md +++ b/TODO.md @@ -79,7 +79,7 @@ Récupérer et normaliser l'agenda, les devoirs et les messages Pronote, avec re - [ ] Créer `sources/pronote/client.py` : client `pronotepy` (messages, informations, discussions, sondages, et devoirs en repli) avec masquage des erreurs. - [ ] Créer `sources/pronote/fallback.py` : sélection de source selon `PRONOTE_*_SOURCE` (auto/ical/pronotepy) et `PronoteFetcher` unifiant `fetch_agenda`/`fetch_homework`/`fetch_messages`. - [ ] Implémenter le repli : iCal échoue → pronotepy ; pronotepy échoue → iCal ; les deux échouent → `PipelineCriticalError`. -- [ ] Normaliser les UID via `utils/uid.normalize_uid` pour la stabilité des événements. +- [ ] Normaliser les UID via `utils/uid.normalize_pronote_uid` pour la stabilité des événements. ### Critères d'acceptation - `fetch_ical` parse `tests/fixtures/pronote-4e.ics` en leçons/devoirs/événements corrects (cours annulé détecté). diff --git a/pronote_sync/errors.py b/pronote_sync/errors.py new file mode 100644 index 0000000..e1f17f0 --- /dev/null +++ b/pronote_sync/errors.py @@ -0,0 +1,33 @@ +"""Hiérarchie d'erreurs transversale du projet pronote-sync.""" + +from __future__ import annotations + + +class PronoteSyncError(Exception): + """Erreur de base pour toutes les exceptions du projet pronote-sync. + + Toutes les exceptions métier héritent de cette classe pour permettre + une interception unifiée des erreurs applicatives. + """ + + def __init__(self, message: str) -> None: + """Initialise l'erreur avec un message descriptif. + + :param message: Message décrivant la cause de l'erreur. + """ + super().__init__(message) + + +class PipelineCriticalError(PronoteSyncError): + """Erreur critique du pipeline, levée quand aucune récupération n'est possible. + + Par exemple : échec simultané des sources iCal et pronotepy, + rendant impossible toute synchronisation. + """ + + def __init__(self, message: str) -> None: + """Initialise l'erreur critique avec un message descriptif. + + :param message: Message décrivant la cause de l'erreur critique. + """ + super().__init__(message) diff --git a/tests/fixtures/pronote-4e.ics b/tests/fixtures/pronote-4e.ics new file mode 100644 index 0000000..80a48ff --- /dev/null +++ b/tests/fixtures/pronote-4e.ics @@ -0,0 +1,57 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Index Education//Pronote//FR +X-WR-CALNAME:Classe de 4e +BEGIN:VEVENT +UID:Edt_12345@index-education.net-20260905T120000Z-Index-Education +DTSTAMP:20260905T120000Z +DTSTART:20260905T080000Z +DTEND:20260905T090000Z +SUMMARY:Mathématiques +CATEGORIES:Cours +DESCRIPTION:
+ Matière : Mathématiques + Professeur : M. Dupont + Salle : 204 + Groupe : Classe entière + + Contenu pédagogique : + + Résoudre des équations du second degré. + Pour le 10/09/2026 : + + Exercices 1 à 5 page 42. + Donné le 05/09/2026 : + + Exercices 1 à 5 page 42. +
+END:VEVENT +BEGIN:VEVENT +UID:Edt_67890@index-education.net-20260905T120000Z-Index-Education +DTSTAMP:20260905T120000Z +DTSTART:20260905T090000Z +DTEND:20260905T100000Z +SUMMARY:Français +CATEGORIES:Cours - Cours annulé +STATUS:CANCELLED +DESCRIPTION:
+ Matière : Français + Professeur : Mme Martin + Salle : 205 + Groupe : Classe entière + + Contenu pédagogique : + + Étude d'un texte littéraire. +
+END:VEVENT +BEGIN:VEVENT +UID:Edt_11111@index-education.net-20260905T120000Z-Index-Education +DTSTAMP:20260905T120000Z +DTSTART;VALUE=DATE:20261020 +DTEND;VALUE=DATE:20261021 +SUMMARY:Vacances de la Toussaint +CATEGORIES:Congés +DESCRIPTION:Période de vacances scolaires. +END:VEVENT +END:VCALENDAR