Corriger l'étape 1 du pipeline et ajouter le tag de langage au bloc de code

2026-09-08 18:08:04 +02:00
parent f93eb42f88
commit 2123c67347
2 changed files with 40 additions and 76 deletions

@@ -1,50 +0,0 @@
# Architecture
## Vue d'ensemble
`pronote-sync` est un pipeline qui synchronise les données de **Pronote** vers **CalDAV** (agendas) et **XMPP** (notifications). Le flux principal est : **Pronote (iCal/pronotepy) → normalisation → comparaison avec l'agenda théorique → synchronisation CalDAV → synthèse IA (optionnelle) → notification XMPP**. Les sources sont **iCal** (primaire) et `pronotepy` (repli), avec trois modes de source : `auto`, `ical` et `pronotepy`.
## Pipeline
1. Récupération Pronote (iCal + pronotepy) — agenda, devoirs, messages
1. Normalisation et parsing — parsing iCal → modèles Pydantic, déduplication, normalisation des UID
1. Récupération du blog (RSS) — `feedparser`, déduplication par GUID, cache HTTP
1. Comparaison avec l'agenda théorique — matching déterministe, détection des changements
1. Synchronisation CalDAV — sync différentielle et idempotente, UID stables, conservation des annulés
1. Synthèse IA (optionnelle) — synthèse des changements, mode dégradé si échec
1. Envoi XMPP — message structuré (synthèse + devoirs bruts)
## Modules
```
pronote_sync/
├── config/ Configuration (Pydantic Settings)
├── models/ Modèles de données (Pydantic v2)
├── sources/ Connecteurs (Pronote iCal/pronotepy, blog RSS, agenda théorique)
├── sync/ Synchronisation CalDAV et comparaison
├── synthesis/ Synthèse IA (OpenAI, litellm, openai-compatible)
├── channels/ Canaux de sortie (XMPP)
├── pipeline/ Orchestration (composition root, PipelineRunner)
├── utils/ Utilitaires (redaction, logging, UID)
└── cli/ Interface en ligne de commande
```
## Injection de dépendances
Le projet utilise `typing.Protocol` et une **composition root** dans `pipeline/run.py`. Aucun singleton global n'est autorisé. Le `PipelineRunner` reçoit toutes ses dépendances via **injection par constructeur** : `PronoteFetcher`, `CalDAVClient`, `AgendaComparator`, `SynthesisProvider`, `Channel`.
## Sources de données
Les modes de source sont les suivants :
- `auto` : essaie d'abord iCal, puis bascule vers `pronotepy` **uniquement** si iCal lève une exception.
- `ical` : utilise **uniquement** iCal, sans bascule silencieuse.
- `pronotepy` : utilise **uniquement** `pronotepy`, sans bascule silencieuse.
- En mode `auto`, si iCal **et** `pronotepy` échouent → erreur critique explicite.
- Une liste vide est un **succès valide**, pas une panne.
- `PRONOTE_URL` (connexion API) et `PRONOTE_ICAL_URL` (flux iCal) sont deux paramètres **distincts**.
- Les messages ne sont disponibles que via `pronotepy` (absents du flux iCal).
## Flux de données
Le flux de données suit ce chemin : données brutes (iCal/`pronotepy`) → modèles Pydantic (`Lesson`, `Homework`, `Message`, etc.) → `PronoteData` (agrégé) → `AgendaDiff` (comparaison) → `CalDavSyncResult``SynthesisInput`/`SynthesisResult``XmppMessage` → envoi via le canal XMPP.

@@ -1,36 +1,50 @@
# pronote-sync # Architecture
`pronote-sync` est un pipeline Python qui synchronise les données de **Pronote** (agenda et devoirs) vers un calendrier **CalDAV** et envoie des notifications via **XMPP**. Ce wiki s'adresse aux utilisateurs, administrateurs et contributeurs du projet. ## Vue d'ensemble
## Documentation `pronote-sync` est un pipeline qui synchronise les données de **Pronote** vers **CalDAV** (agendas) et **XMPP** (notifications). Le flux principal est : **Pronote (iCal/pronotepy) → normalisation → comparaison avec l'agenda théorique → synchronisation CalDAV → synthèse IA (optionnelle) → notification XMPP**. Les sources sont **iCal** (primaire) et `pronotepy` (repli), avec trois modes de source : `auto`, `ical` et `pronotepy`.
- [Architecture](Architecture) — Pipeline, modules et flux de données ## Pipeline
- [Configuration](Configuration) — Variables d'environnement et paramètres
- [Déploiement](Déploiement) — systemd, timer, logrotate et vérification des secrets
- [Sécurité](Sécurité) — Rédaction, `SecretStr`, `check_secrets` et bonnes pratiques
## Démarrage rapide 1. Récupération Pronote — agenda et devoirs via iCal ou `pronotepy` ; messages et informations via `pronotepy` uniquement
1. Normalisation et parsing — parsing iCal → modèles Pydantic, déduplication, normalisation des UID
1. Récupération du blog (RSS) — `feedparser`, déduplication par GUID, cache HTTP
1. Comparaison avec l'agenda théorique — matching déterministe, détection des changements
1. Synchronisation CalDAV — sync différentielle et idempotente, UID stables, conservation des annulés
1. Synthèse IA (optionnelle) — synthèse des changements, mode dégradé si échec
1. Envoi XMPP — message structuré (synthèse + devoirs bruts)
```bash ## Modules
git clone https://git.antoineve.me/AntoineVe/college-infos
cd college-infos ```text
python3.13 -m venv .venv pronote_sync/
source .venv/bin/activate ├── config/ Configuration (Pydantic Settings)
pip install -e ".[dev]" ├── models/ Modèles de données (Pydantic v2)
cp .env.example .env ├── sources/ Connecteurs (Pronote iCal/pronotepy, blog RSS, agenda théorique)
# Éditer .env et renseigner les URL et identifiants requis ├── sync/ Synchronisation CalDAV et comparaison
pronote-sync --dry-run --log-level DEBUG ├── synthesis/ Synthèse IA (OpenAI, litellm, openai-compatible)
├── channels/ Canaux de sortie (XMPP)
├── pipeline/ Orchestration (composition root, PipelineRunner)
├── utils/ Utilitaires (redaction, logging, UID)
└── cli/ Interface en ligne de commande
``` ```
## Utilisation ## Injection de dépendances
```bash Le projet utilise `typing.Protocol` et une **composition root** dans `pipeline/run.py`. Aucun singleton global n'est autorisé. Le `PipelineRunner` reçoit toutes ses dépendances via **injection par constructeur** : `PronoteFetcher`, `CalDAVClient`, `AgendaComparator`, `SynthesisProvider`, `Channel`.
pronote-sync # Exécute la synchronisation
pronote-sync --dry-run # Simulation sans écriture
pronote-sync --log-level DEBUG # Verbosité des journaux
```
## Communauté ## Sources de données
- [Signaler un problème ou proposer une évolution](https://git.antoineve.me/AntoineVe/college-infos/issues) Les modes de source sont les suivants :
- Licence : MIT
- `auto` : essaie d'abord iCal, puis bascule vers `pronotepy` **uniquement** si iCal lève une exception.
- `ical` : utilise **uniquement** iCal, sans bascule silencieuse.
- `pronotepy` : utilise **uniquement** `pronotepy`, sans bascule silencieuse.
- En mode `auto`, si iCal **et** `pronotepy` échouent → erreur critique explicite.
- Une liste vide est un **succès valide**, pas une panne.
- `PRONOTE_URL` (connexion API) et `PRONOTE_ICAL_URL` (flux iCal) sont deux paramètres **distincts**.
- Les messages ne sont disponibles que via `pronotepy` (absents du flux iCal).
## Flux de données
Le flux de données suit ce chemin : données brutes (iCal/`pronotepy`) → modèles Pydantic (`Lesson`, `Homework`, `Message`, etc.) → `PronoteData` (agrégé) → `AgendaDiff` (comparaison) → `CalDavSyncResult``SynthesisInput`/`SynthesisResult``XmppMessage` → envoi via le canal XMPP.