Files
college-infos/.pre-commit-config.yaml
Antoine Van Elstraete 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

61 lines
1.8 KiB
YAML

# Hooks pre-commit pour pronote-sync
# Installation : pre-commit install
# Exécution manuelle : pre-commit run --all-files
default_language_version:
python: python3
repos:
# Outils du venv (ruff, mypy, bandit) — exécutés dans l'environnement géré par pre-commit
- repo: local
hooks:
- id: ruff-check
name: ruff check
entry: ruff check
language: python
additional_dependencies: ["ruff>=0.4.0"]
types: [python]
- id: ruff-format
name: ruff format
entry: ruff format
language: python
additional_dependencies: ["ruff>=0.4.0"]
types: [python]
- id: mypy
name: mypy
entry: mypy
language: python
additional_dependencies: ["mypy>=1.10.0", "pydantic>=2.0.0", "pydantic-settings>=2.0.0", "pytest>=8.0.0", "types-requests>=2.31.0", "icalendar>=5.0.0", "pronotepy>=2.15.0", "responses>=0.25.0", "pytest-mock>=3.10.0", "feedparser>=6.0.0"]
types: [python]
pass_filenames: true
- id: bandit
name: bandit
entry: bandit
args: [-c, pyproject.toml, -r]
language: python
additional_dependencies: ["bandit>=1.7.0"]
types: [python]
# Hooks standard de pre-commit
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: trailing-whitespace
exclude: 'GUIDE_DEV_PYTHON\.md'
- id: end-of-file-fixer
exclude: 'GUIDE_DEV_PYTHON\.md'
- id: check-yaml
- id: check-added-large-files
args: [--maxkb=500]
exclude: 'GUIDE_DEV_PYTHON\.md'
- id: check-merge-conflict
# Détection de secrets
- repo: https://github.com/Yelp/detect-secrets
rev: v1.5.0
hooks:
- id: detect-secrets
args: [--baseline, .secrets.baseline]