Files
veye-lalwa/tests/test_markdown.py
T
Cyber MawonajandClaude Opus 5 c36b8dc631 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>
2026-07-25 18:22:18 -04:00

84 lines
2.6 KiB
Python

"""Découpage des tableaux, nettoyage et marqueurs de citation."""
from __future__ import annotations
from pipeline.parseurs.markdown import (
decouper_sections,
extraire_marqueurs,
extraire_tableaux,
nettoyer,
)
TABLEAU = """\
## Tableau d'essai
| Col A | Col B |
|---|---|
| a1 | b1 |
| a2 | b2 |
Texte après le tableau.
"""
def test_extraire_tableaux_simple() -> None:
(tableau,) = extraire_tableaux(TABLEAU)
assert tableau.entetes == ["Col A", "Col B"]
assert tableau.lignes == [{"Col A": "a1", "Col B": "b1"}, {"Col A": "a2", "Col B": "b2"}]
assert tableau.section == "Tableau d'essai"
assert len(tableau) == 2
def test_extraire_tableaux_tolere_une_ligne_courte() -> None:
source = "| A | B | C |\n|---|---|---|\n| 1 | 2 |\n"
(tableau,) = extraire_tableaux(source)
assert tableau.lignes == [{"A": "1", "B": "2", "C": ""}]
def test_extraire_tableaux_respecte_les_barres_echappees() -> None:
source = "| A | B |\n|---|---|\n| x \\| y | z |\n"
(tableau,) = extraire_tableaux(source)
assert tableau.lignes[0]["A"] == "x | y"
def test_extraire_tableaux_sur_le_corpus_reel(annexe: str) -> None:
tableaux = extraire_tableaux(annexe)
assert len(tableaux) == 2
tableau_a, tableau_b = tableaux
assert tableau_a.entetes[0] == "N° de loi"
assert len(tableau_a) == 27, "27 lois promulguées attendues au tableau A"
assert tableau_b.entetes[0] == "Texte"
assert len(tableau_b) == 23
def test_nettoyer_retire_emphase_et_marqueurs() -> None:
brut = "**Adoptée, non promulguée** (21 juill.) ; saisine [^dim04-487^][^phase5-3.1^]"
assert nettoyer(brut) == "Adoptée, non promulguée (21 juill.) ; saisine"
def test_nettoyer_peut_garder_les_marqueurs() -> None:
brut = "Chlordécone [^dim07-24^]"
assert nettoyer(brut, garder_marqueurs=True) == "Chlordécone [^dim07-24^]"
def test_extraire_marqueurs_distingue_les_dimensions() -> None:
marqueurs = extraire_marqueurs("[^dim07-24^] et [^phase5-3.1^] et [^insight-5^] et [^42^]")
assert [(m.dimension, m.numero) for m in marqueurs] == [
("dim07", "24"),
("phase5", "3.1"),
("insight", "5"),
("", "42"),
]
def test_extraire_marqueurs_dedoublonne() -> None:
assert len(extraire_marqueurs("[^dim01-3^] [^dim01-3^] [^dim01-4^]")) == 2
def test_decouper_sections() -> None:
source = "# Titre\ncorps un\n\n## Sous\ncorps deux\n"
sections = decouper_sections(source)
assert [s.titre for s in sections] == ["Titre", "Sous"]
assert sections[0].corps == "corps un"
assert sections[1].niveau == 2