6d1a7a649f
feat(M5): source blog RSS — fetch, parsing, déduplication et état persistant
...
Implémentation complète de la source blog RSS du collège :
- BlogRSSClient (sources/blog/rss.py) : client sans état récupérant et
parsant le flux via feedparser, avec déduplication par ensemble de
GUIDs connus, cache HTTP conditionnel (ETag/Last-Modified), conversion
HTML→texte (BeautifulSoup), tri déterministe (date desc puis id asc),
et mode dégradé (flux invalide/erreur → warning expurgé + liste vide).
- BlogRSSFetchResult (sources/blog/result.py) : résultat immuable
contenant articles, en-têtes de cache et indicateur not_modified.
- BlogRSSState (sources/blog/state.py) : persistance JSON tolérante
(GUIDs triés, version, ETag, Last-Modified) avec redaction des chemins
dans les logs.
- Fixture tests/fixtures/blog_rss.xml : flux RSS 2.0 anonymisé, 3
articles, dates fixes, ordre non chronologique.
- 38 tests unitaires (22 client + 16 state) couvrant parsing nominal,
déduplication intra-flux, 304, bozo, erreurs réseau, non-fuite de
secrets, tri secondaire, persistance d'état et tolérance aux fichiers
corrompus.
- Documentation : TODO.md M5 coché, GUIDE_DEV_PYTHON.md §5 bis aligné
avec l'API livrée (known_guids, BlogRSSFetchResult, BlogRSSState).
- Configuration : feedparser ajouté aux additional_dependencies du hook
mypy pre-commit pour aligner l'environnement isolé avec le .venv.
Co-authored-by: opencode/coder <coder@agents.invalid >
Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid >
2026-09-06 20:23:49 +02:00
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
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