9d9a55ed40
test+docs(M4): tests get_lessons/get_homeworks + repli unique + doc sync
...
Tests:
- test_pronote_client : get_lessons/get_homeworks success + error
propagation, ENT resolution, factory parent/student, mode dégradé
messages/informations (ConnectionError, TimeoutError)
- test_fallback : repli unique ICAL→pronotepy et PRONOTEPY→iCal,
filtre target_date, fetch_messages log + re-raise sans secrets,
aucune source configurée → PipelineCriticalError
- 59 tests passent (16 client + 17 fallback + 26 iCal)
Documentation:
- TODO.md : 7 items M4 cochés, contrat repli corrigé (unique, non
réciproque) selon décision D4
- GUIDE_DEV_PYTHON.md : get_agenda_fallback → get_lessons/get_homeworks,
pronote_url/account_type ajoutés au modèle + env vars + .env.example,
AgendaSource StrEnum, §5.1.8 fallback contract mis à jour (repli unique)
Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid >
Co-authored-by: opencode/tech-writer <tech-writer@agents.invalid >
2026-09-06 15:36:42 +02:00
1b550aa818
fix(M4): pronote_url + account_type et parsing iCal (STATUS:CANCELLED + blocs multi-dates)
...
Configuration (D1+D3) :
- PronoteSettings : ajout pronote_url (str | None) et account_type
(Literal student/parent, défaut parent)
Parsing iCal (Fix 4+7) :
- parse_ical : détection STATUS:CANCELLED en plus de CATEGORIES
- parse_body : list[tuple[date, str]] au lieu de dict[date, str]
pour préserver les blocs multiples à la même date
- parse_homework_blocks : adapté aux listes
Co-authored-by: opencode/coder <coder@agents.invalid >
2026-09-06 15:23:34 +02:00
e0cd073f9a
test(M4): tests unitaires iCal, client pronotepy et repli
...
- test_ical.py : 20 tests (fetch file://, parsing VEVENT, détection
cours annulé, collect_homeworks avec déduplication, normalisation,
génération d'ID déterministe, redaction des erreurs)
- test_pronote_client.py : 9 tests (Protocol, messages mockés,
informations, agenda fallback, credentials manquants, sécurité
mot de passe)
- test_fallback.py : 16 tests (modes ICAL/PRONOTEPY/AUTO, repli,
PipelineCriticalError si les deux sources échouent, redaction
des erreurs)
- pre-commit : ajout de responses et pytest-mock au hook mypy
- Total : 42 nouveaux tests M4 (122 tests au total sur le projet)
Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid >
2026-09-06 14:10:16 +02:00
292aef4f5b
fix(M3): immuabilité et validation des modèles — correction des écarts FIXME_M3
...
Immuabilité :
- Collections des modèles frozen : list → tuple (Lesson, TheoreticalLesson,
SchoolEvent, AgendaDiff, Homework, XmppMessage, ExternalInfo)
- Gel de HomeworkBlock et ExternalInfo (sous-modèles imbriqués dans contrats)
- Valeurs par défaut immuables : Field(default=(), ...)
Validation de domaine :
- TheoreticalLesson.day_of_week : Field(ge=0, le=6)
- Lesson/TheoreticalLesson : start < end (validateur de modèle)
- SchoolEvent : from_date <= to_date
- AgendaChange : cohérence type/payload (ADDED/MODIFIED → lesson,
REMOVED → theoretical_lesson)
- CalDAVSyncResult : compteurs Field(ge=0) sur added/updated/removed
Tests : 66 tests (construction/sérialisation, immuabilité, invariants)
couvrant le gel, la mutabilité légitime, et les cas invalides par invariant.
Co-authored-by: opencode/coder <coder@agents.invalid >
Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid >
2026-09-06 12:36:27 +02:00
2f6184df0b
fix(M2): configuration, secrets et rédaction — correction des écarts FIXME_M2
...
Sécurité :
- ical_url : str → SecretStr | None (masquage dans str/repr/model_dump_json)
- En-têtes Authorization/Proxy-Authorization : masquage complet de la valeur
- _URL_PATTERN : insensible à la casse (HTTPS:// reconnu)
- redact_url() : masquage du nom d'utilisateur (userinfo complet)
Configuration :
- Sous-configs : Field(default_factory=...) pour rechargement à chaque appel
- Suppression du singleton settings (injection de dépendances)
- .env.example : ajout AI_PROVIDER et CALDAV_CALENDAR_PATH
- Guide : BLOG_RSS_ENABLED → BLOG_ENABLED, AI_MODEL=None par défaut
- .secrets.baseline : ligne décalée 5112 → 5117 (faux positif audité)
- pre-commit : ajout de pytest aux additional_dependencies du hook mypy
Tests : 15 tests (config + redaction) couvrant rechargement, masquage
SecretStr, en-têtes Authorization, URL auth intégrée et casse variable.
Co-authored-by: opencode/coder <coder@agents.invalid >
Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid >
2026-09-06 12:35:55 +02:00
a0ac75cec6
fix(M1): correction des écarts d'audit FIXME_M1
...
- requires-python : >=3.13 → >=3.13.5 (alignement sur le contrat TODO.md)
- test de fumée : ajout de tests/unit/test_smoke.py (pytest sort code 0)
- .gitignore : ajout de la règle *.tmp.ics pour les artefacts iCal temporaires
- .secrets.baseline : audit du faux positif GUIDE_DEV_PYTHON.md:5112
(is_secret: false, is_verified: true → VERIFIED_FALSE)
Co-authored-by: opencode/coder <coder@agents.invalid >
Co-authored-by: opencode/verifier <verifier@agents.invalid >
2026-09-06 11:59:50 +02:00