Phase 2 : parseur de l'annexe sec10 — 52 textes, 12 affaires CC
Briques réutilisables : - dates_fr : lit les formes réelles du corpus (« 23 avr. 2026 (JO 24 avr.) », « 1er juill. », « 24.07.2026 ») et distingue une date exacte d'une échéance prévisionnelle (« Fin août 2026 » → situé au 25, libellé conservé, jamais présenté comme un fait) - markdown : découpage des tableaux (barres échappées, lignes courtes), nettoyage, extraction des marqueurs [^dim07-24^] / [^phase5-3.1^] Parseur sec10 : - 27 lois promulguées + 21 lignes simples + 2 lignes éclatées en 4 textes = 52 - éclatement justifié : les lignes « accords Kazakhstan et Colombie » et « MACF » décrivent chacune deux textes de statuts différents - migration 002 : regime_libertes stocké à part, faute de savoir quel public la cotation globale du rapport vise — dérouler « droits+ » sur les trois publics aurait inventé une ventilation absente de la source - migration 003 : la facette « devant le CC » couvre aussi les saisines sans numéro d'affaire (programmation militaire), sinon 6 textes au lieu de 7 Trois pièges du corpus, corrigés et couverts par des tests : - « eau » matchait comme sous-chaîne dans réseaux / drapeau / Retailleau - une décision citée sans saisine créait une fausse saisine (loi Philippine) - la date de saisine était pêchée dans la colonne « échéance », datant la saisine de l'aide à mourir du mois suivant 72 tests, 90 % de couverture sur pipeline/. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
31d3935bce
commit
c36b8dc631
@@ -0,0 +1,51 @@
|
||||
"""Fixtures partagées.
|
||||
|
||||
Le corpus de `data/input/` est lu tel quel : c'est la seule façon de garantir
|
||||
que les parseurs suivent le format réel, et non une idée qu'on s'en fait. Les
|
||||
tests ne l'écrivent jamais.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import sqlite3
|
||||
from collections.abc import Iterator
|
||||
|
||||
import pytest
|
||||
|
||||
from pipeline import chemins, db
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def annexe() -> str:
|
||||
"""Contenu de `sec10.md`, l'annexe récapitulative."""
|
||||
return chemins.chapitre(10).read_text(encoding="utf-8")
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def textes_annexe():
|
||||
"""Textes extraits de l'annexe, analysés une seule fois pour la session."""
|
||||
from pipeline.parseurs.tableaux_sec10 import parser
|
||||
|
||||
return parser(chemins.chapitre(10).read_text(encoding="utf-8"))
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def par_identifiant(textes_annexe) -> dict:
|
||||
return {texte.id: texte for texte in textes_annexe.textes}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def base(tmp_path) -> Iterator[sqlite3.Connection]:
|
||||
"""Base SQLite éphémère, migrée, propre à chaque test."""
|
||||
cx = db.initialiser(tmp_path / "test.db")
|
||||
try:
|
||||
yield cx
|
||||
finally:
|
||||
cx.close()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def base_ensemencee(base, textes_annexe) -> sqlite3.Connection:
|
||||
"""Base contenant les textes de l'annexe."""
|
||||
db.enregistrer_textes(base, textes_annexe.textes)
|
||||
return base
|
||||
Reference in New Issue
Block a user