feat(M6): agenda théorique JSON avec parité des semaines et vacances scolaires
Implémentation complète de la source d'agenda théorique : - model.py : modèles Pydantic de parsing JSON (TheoreticalLessonEntry, TheoreticalAgendaFile) avec validation des formats d'heure et de l'ordre début/fin. - parity.py : WeekParityService déterministe calculant la parité d'une semaine (paire/impaire) à partir d'une date de référence. - holidays.py : SchoolHolidayCalendar lisant un fichier JSON de vacances scolaires (zone A) avec bornes inclusives. - provider.py : protocole TheoreticalAgendaProvider (get_lessons, get_lessons_for_range). - file.py : JsonTheoreticalAgendaProvider implémentant le protocole : filtrage par parité et vacances, génération d'IDs déterministes incluant le type de semaine, validation de l'unicité des IDs, tri stable par identifiant. - __init__.py : factory get_theoretical_provider câblant la configuration (None si désactivé, erreur si config de parité partielle). - Fixtures : theoretical.json (9 leçons all/even/odd) et school_holidays.json (zone A, 4 périodes). - 57 tests unitaires couvrant parsing, parité, vacances, provider, factory, déduplication de range, collisions d'IDs. - Guide : §8 et §12 alignés avec le format JSON. Co-authored-by: opencode/coder <coder@agents.invalid> Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid>
This commit is contained in:
44
pronote_sync/sources/theoretical/provider.py
Normal file
44
pronote_sync/sources/theoretical/provider.py
Normal file
@@ -0,0 +1,44 @@
|
||||
"""Protocole pour les fournisseurs d'agenda théorique.
|
||||
|
||||
Ce module définit :class:`TheoreticalAgendaProvider`, le contrat que
|
||||
tous les fournisseurs d'agenda théorique doivent respecter pour exposer
|
||||
les cours théoriques (emploi du temps attendu) par date ou plage de
|
||||
dates.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import date
|
||||
from typing import Protocol, runtime_checkable
|
||||
|
||||
from pronote_sync.models.agenda import TheoreticalLesson
|
||||
|
||||
|
||||
@runtime_checkable
|
||||
class TheoreticalAgendaProvider(Protocol):
|
||||
"""Protocole pour un fournisseur d'agenda théorique.
|
||||
|
||||
Un fournisseur d'agenda théorique expose les cours théoriques
|
||||
(emploi du temps attendu) pour une date ou une plage de dates.
|
||||
L'implémentation encapsule la logique de filtrage par parité de
|
||||
semaine et par vacances scolaires.
|
||||
"""
|
||||
|
||||
def get_lessons(self, target_date: date) -> list[TheoreticalLesson]:
|
||||
"""Retourne les cours théoriques applicables à la date donnée.
|
||||
|
||||
:param target_date: Date cible.
|
||||
:return: Liste des cours théoriques triée par identifiant.
|
||||
:rtype: list[TheoreticalLesson]
|
||||
"""
|
||||
...
|
||||
|
||||
def get_lessons_for_range(self, start_date: date, end_date: date) -> list[TheoreticalLesson]:
|
||||
"""Retourne les cours théoriques pour une plage de dates (inclusives).
|
||||
|
||||
:param start_date: Date de début (inclusive).
|
||||
:param end_date: Date de fin (inclusive).
|
||||
:return: Liste des cours théoriques triée par identifiant.
|
||||
:rtype: list[TheoreticalLesson]
|
||||
"""
|
||||
...
|
||||
Reference in New Issue
Block a user