f82e79360b
feat(M4): hiérarchie d'erreurs, fixture iCal et correction TODO
...
- 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 <coder@agents.invalid >
Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid >
2026-09-06 13:20:24 +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
a2efd61c4e
Scaffold: préparation du projet pronote-sync
...
- Guide de développement (GUIDE_DEV_PYTHON.md) : spécification complète
- TODO.md : 15 jalons de développement (M1-M15) avec étapes et critères d'acceptation
- AGENTS.md : guide de contribution pour agents et développeurs
- pyproject.toml : configuration projet (dépendances, ruff, mypy strict, pytest)
- .gitignore : exclusion venv, bytecode, .env, caches, state files
- .env.example : template des variables d'environnement (placeholders)
- Structure du package pronote_sync/ (14 sous-packages avec __init__.py)
- tests/ avec conftest.py et fixtures/
- Environnement virtuel .venv/ (Python 3.14)
2026-09-05 18:45:43 +02:00