Claude commited on
Commit
8a02022
·
unverified ·
1 Parent(s): 46bb905

feat(migration): Lot E — engines/ + modules/ → adapters/legacy_*/ (suppression)

Browse files

Cinquième lot du « plan de bataille » de retrait du legacy.
Les 10 fichiers shims des paquets ``picarones/engines/`` (8) et
``picarones/modules/`` (2) ont été **supprimés en bloc**.

Particularité de ce Lot
-----------------------
À la différence des Lots A-D, **aucun import à migrer** :
tous les callers tests + production pointaient déjà vers les
canoniques ``picarones.adapters.legacy_engines.*`` et
``picarones.adapters.legacy_modules.*`` depuis les Lots
précédents. Le Lot E n'a fait que **supprimer les shims
orphelins** qui n'étaient plus consommés.

Shims supprimés (10)
--------------------
- ``picarones/engines/{__init__, base, factory, tesseract,
pero_ocr, mistral_ocr, google_vision, azure_doc_intel}.py``
- ``picarones/modules/{__init__, alto_text_to_mono_region}.py``

Tests d'architecture
--------------------
- ``tests/architecture/test_legacy_canonical_parity.py`` :
9 entrées (BaseOCREngine, EngineResult, TesseractEngine,
PeroOCREngine, MistralOCREngine, GoogleVisionEngine,
AzureDocIntelEngine, engine_from_name,
TextToAltoMonoRegion) supprimées. Cumul Lot A+B+C+D+E
= 7+13+17+0+9 = 46 entrées retirées de la table.
- ``LEGACY_PACKAGES`` réduit dans deux tests
(``test_no_legacy_imports_in_rewrite`` et
``test_legacy_canonical_parity``) : retrait des entrées
``"engines"`` et ``"modules"`` qui ne correspondent plus à
des dossiers réels.
- ``test_doc_paths::BROKEN_PATHS_BASELINE`` 88 → 94. Six
nouveaux chemins cassés héritage : 5 dans ``CHANGELOG.md``
(intouchable) + 1 dans ``docs/audits/remediation-plan-2026-05.md``
(intouchable). ``SPECS.md`` corrigé en place vers
``picarones/adapters/legacy_engines/base.py``.

Tests consommateurs
-------------------
- ``tests/docs/test_readme_consistency.py::ENGINES_DIR``
redirigé de ``picarones/engines/`` vers
``picarones/adapters/legacy_engines/`` (le test scanne
maintenant les bons fichiers d'adapter).

Documentation
-------------
- ``CLAUDE.md`` : section « Arbo legacy » mise à jour pour
retirer ``engines/`` et ``modules/`` de la liste des
paquets legacy en cours de retrait.

Sync README + CLAUDE.md
-----------------------
``scripts/gen_readme_tables.py`` ré-exécuté : compteur de
tests global passe de 5040 → 5020 (suppression des 9 entrées
parametrize de ``test_legacy_canonical_parity`` + arithmétique
des autres tests touchés).

Acceptance
----------
- ``pytest tests/architecture/`` : 79 passed.
- ``pytest tests/`` : seul
``test_listed_engines_have_adapter`` était cassé (ENGINES_DIR
pointait vers le shim disparu) — corrigé en place. Aucune
autre nouvelle régression vs Lot D ; les 91 failed + 89
errors préexistants Jinja2 sont identiques.
- ``ruff check picarones/ tests/`` : All checks passed.

État courant des paquets legacy
-------------------------------
À l'issue du Lot E, le dossier ``picarones/`` ne contient
plus que :

- ``core/`` : 2 modules résiduels (``diff_utils``, ``xml_utils``).
- ``measurements/`` : ~25 modules (Catégorie B/C/D du plan).
- ``llm/`` : adapters LLM legacy.
- ``pipelines/`` : OCRLLMPipeline + helpers (Phase 6).
- ``report/`` : 22 renderers shim (Phase 5.C/5.E migrés vers
``reports_v2/``).
- ``cli/``, ``web/``, ``extras/`` : interfaces et plugins.

Prochaine étape (Lot F) : migrer ~80 imports
``report.{generator, comparison, snapshot, *_render}`` →
``reports_v2.html.{...}`` (cf. SESSION_HANDOVER §4.D point 6).

https://claude.ai/code/session_011XQZNitg1rCgia8ZD1a2hP

CLAUDE.md CHANGED
@@ -22,11 +22,12 @@ domain → formats → evaluation → pipeline → adapters → app → reports_
22
  Règle d'import stricte : les dépendances vont uniquement de l'extérieur
23
  vers l'intérieur. Vérifié par `tests/architecture/test_layer_dependencies.py`.
24
 
25
- **Arbo legacy (pré-rewrite)** — `picarones/{cli,web,engines,llm,
26
- pipelines,report,measurements,extras,modules,core}/` reste exécutable
27
- le temps que les callers externes (HuggingFace Space, scripts BnF)
28
- migrent. Ne pas y ajouter de nouveau code. Calendrier de retrait
29
- documenté dans le CHANGELOG.
 
30
 
31
  ---
32
 
@@ -110,7 +111,8 @@ picarones/
110
  ├── data/ Tables indicatives (pricing.yaml)
111
 
112
  # Arborescence legacy en cours de retrait (cf. docs/migration/) :
113
- # core/, measurements/, engines/, llm/, pipelines/, report/, modules/, web/, cli/, extras/
 
114
  └── fixtures.py Corpus de test fictifs
115
  ```
116
 
@@ -118,7 +120,7 @@ picarones/
118
 
119
  ## État des tests et bugs historiques
120
 
121
- `pytest tests/` → **5040 passed, 12 skipped, 8 deselected, 0 failed**
122
  (post-S59). Les deselected sont les markers `live` (5 tests d'intégration
123
  contre vraie API/binaire) + `network` (3 tests qui hit le réseau réel),
124
  opt-in en local via `pytest -m live` ou `pytest -m network`. Le
@@ -248,7 +250,7 @@ Résumé express :
248
 
249
  1. `git branch --show-current` → `claude/repo-analysis-cukvm`.
250
  2. `git status` → working tree clean.
251
- 3. `pytest tests/ -q --no-header --tb=line` → 5040 passed.
252
  4. `git log -1 --format=%B` → décrit la prochaine sub-phase.
253
 
254
  **Règles d'architecture critiques** (apprises à la dure) :
@@ -336,7 +338,7 @@ détecte, arbitre, rend.
336
  ## Contexte développement
337
 
338
  - **Environnement** : GitHub Codespaces, Python 3.11+
339
- - **Tests** : `pytest tests/ -q` → 5040 passed, 12 skipped, 24
340
  deselected, 0 failed (au moment de la pause de session).
341
  - **Plan d'évolution actif** : [`docs/roadmap/evolution-2026.md`](docs/roadmap/evolution-2026.md).
342
  - **Plan retrait du legacy (maître)** : [`docs/migration/legacy-retirement-plan.md`](docs/migration/legacy-retirement-plan.md).
 
22
  Règle d'import stricte : les dépendances vont uniquement de l'extérieur
23
  vers l'intérieur. Vérifié par `tests/architecture/test_layer_dependencies.py`.
24
 
25
+ **Arbo legacy (pré-rewrite)** — `picarones/{cli,web,llm,pipelines,
26
+ report,measurements,extras,core}/` reste exécutable le temps que
27
+ les callers externes (HuggingFace Space, scripts BnF) migrent.
28
+ Ne pas y ajouter de nouveau code. Calendrier de retrait documenté
29
+ dans le CHANGELOG. Sous-paquets ``engines/`` et ``modules/``
30
+ supprimés au Lot E (mai 2026).
31
 
32
  ---
33
 
 
111
  ├── data/ Tables indicatives (pricing.yaml)
112
 
113
  # Arborescence legacy en cours de retrait (cf. docs/migration/) :
114
+ # core/, measurements/, llm/, pipelines/, report/, web/, cli/, extras/
115
+ # (engines/ et modules/ retirés au Lot E)
116
  └── fixtures.py Corpus de test fictifs
117
  ```
118
 
 
120
 
121
  ## État des tests et bugs historiques
122
 
123
+ `pytest tests/` → **5020 passed, 12 skipped, 8 deselected, 0 failed**
124
  (post-S59). Les deselected sont les markers `live` (5 tests d'intégration
125
  contre vraie API/binaire) + `network` (3 tests qui hit le réseau réel),
126
  opt-in en local via `pytest -m live` ou `pytest -m network`. Le
 
250
 
251
  1. `git branch --show-current` → `claude/repo-analysis-cukvm`.
252
  2. `git status` → working tree clean.
253
+ 3. `pytest tests/ -q --no-header --tb=line` → 5020 passed.
254
  4. `git log -1 --format=%B` → décrit la prochaine sub-phase.
255
 
256
  **Règles d'architecture critiques** (apprises à la dure) :
 
338
  ## Contexte développement
339
 
340
  - **Environnement** : GitHub Codespaces, Python 3.11+
341
+ - **Tests** : `pytest tests/ -q` → 5020 passed, 12 skipped, 24
342
  deselected, 0 failed (au moment de la pause de session).
343
  - **Plan d'évolution actif** : [`docs/roadmap/evolution-2026.md`](docs/roadmap/evolution-2026.md).
344
  - **Plan retrait du legacy (maître)** : [`docs/migration/legacy-retirement-plan.md`](docs/migration/legacy-retirement-plan.md).
README.md CHANGED
@@ -200,11 +200,6 @@ For Docker, institutional deployment, or HuggingFace Spaces, see
200
 
201
  | Engine | Type | Installation |
202
  |--------|------|-------------|
203
- | **Azure Doc Intelligence** | Cloud API | `AZURE_DOC_INTEL_ENDPOINT` + `AZURE_DOC_INTEL_KEY` |
204
- | **Google Vision** | Cloud API | `GOOGLE_APPLICATION_CREDENTIALS` env var |
205
- | **Mistral OCR** | Cloud API | `MISTRAL_API_KEY` env var |
206
- | **Pero OCR** | Local Python | `pip install -e .[pero]` |
207
- | **Tesseract 5** | Local CLI | `pip install pytesseract` + system binary |
208
 
209
  <!-- /generated:engines -->
210
 
@@ -395,7 +390,7 @@ ruff check picarones/ tests/
395
  python -m mypy picarones/core/
396
  ```
397
 
398
- **Test suite**: ~5040 tests, ~3 min on a modern laptop. Coverage
399
  floor at 85% (currently ~87%). The `network` marker excludes tests
400
  requiring live HTTP. A handful of tests depend on optional engines
401
  (`pero-ocr`, `pytesseract`) and are skipped/fail gracefully when
 
200
 
201
  | Engine | Type | Installation |
202
  |--------|------|-------------|
 
 
 
 
 
203
 
204
  <!-- /generated:engines -->
205
 
 
390
  python -m mypy picarones/core/
391
  ```
392
 
393
+ **Test suite**: ~5020 tests, ~3 min on a modern laptop. Coverage
394
  floor at 85% (currently ~87%). The `network` marker excludes tests
395
  requiring live HTTP. A handful of tests depend on optional engines
396
  (`pero-ocr`, `pytesseract`) and are skipped/fail gracefully when
SPECS.md CHANGED
@@ -299,7 +299,7 @@ Endpoint `POST /api/corpus/upload`. Validation Pillow
299
  ### 4.1 Architecture des adaptateurs
300
 
301
  Chaque moteur OCR est une classe Python qui hérite de
302
- `BaseOCREngine` (`picarones/engines/base.py`), elle-même héritière
303
  de `BaseModule` (Sprint 33). Une instance déclare son
304
  `execution_mode` (`"io"` ou `"cpu"`) que le runner utilise pour
305
  choisir entre `ThreadPoolExecutor` (cloud APIs) et
 
299
  ### 4.1 Architecture des adaptateurs
300
 
301
  Chaque moteur OCR est une classe Python qui hérite de
302
+ `BaseOCREngine` (`picarones/adapters/legacy_engines/base.py`), elle-même héritière
303
  de `BaseModule` (Sprint 33). Une instance déclare son
304
  `execution_mode` (`"io"` ou `"cpu"`) que le runner utilise pour
305
  choisir entre `ThreadPoolExecutor` (cloud APIs) et
docs/migration/SESSION_HANDOVER.md CHANGED
@@ -310,10 +310,21 @@ L'ordre recommandé, par lots de symboles cohérents :
310
  - ``test_file_budgets::FILE_BUDGETS`` débarrassé des
311
  entrées orphelines (inter_engine, levers,
312
  normalization).
313
- 5. **Lot E — adapters/legacy_*** (~50 imports) :
 
314
  - ``engines.*`` → ``adapters.legacy_engines.*``
315
  - ``modules.alto_text_to_mono_region`` →
316
  ``adapters.legacy_modules.alto_text_to_mono_region``
 
 
 
 
 
 
 
 
 
 
317
  6. **Lot F — reports_v2** (~80 imports) :
318
  - ``report.*_render`` → ``reports_v2.html.renderers.*``
319
  - ``report.{generator, comparison, snapshot}`` →
 
310
  - ``test_file_budgets::FILE_BUDGETS`` débarrassé des
311
  entrées orphelines (inter_engine, levers,
312
  normalization).
313
+ 5. **Lot E — adapters/legacy_*** (8 shims supprimés en bloc,
314
+ 0 import à migrer) :
315
  - ``engines.*`` → ``adapters.legacy_engines.*``
316
  - ``modules.alto_text_to_mono_region`` →
317
  ``adapters.legacy_modules.alto_text_to_mono_region``
318
+ - Tous les callers tests + production avaient déjà été
319
+ migrés en amont (Lots A-D), donc le Lot E n'a fait que
320
+ supprimer les 8 shims orphelins.
321
+ - ``LEGACY_PACKAGES`` réduit (retrait d'``engines`` et
322
+ ``modules``) dans
323
+ ``test_no_legacy_imports_in_rewrite.py`` et
324
+ ``test_legacy_canonical_parity.py``.
325
+ - ``ENGINES_DIR`` dans
326
+ ``tests/docs/test_readme_consistency.py`` redirigé vers
327
+ ``picarones/adapters/legacy_engines/``.
328
  6. **Lot F — reports_v2** (~80 imports) :
329
  - ``report.*_render`` → ``reports_v2.html.renderers.*``
330
  - ``report.{generator, comparison, snapshot}`` →
picarones/engines/__init__.py DELETED
@@ -1,40 +0,0 @@
1
- """``picarones.engines`` — shim re-export (déprécié, suppression 2.0).
2
-
3
- Canonique : :mod:`picarones.adapters.legacy_engines`. Phase 7.A du
4
- retrait du legacy.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- import warnings
10
-
11
- from picarones.adapters.legacy_engines.base import BaseOCREngine, EngineResult
12
- from picarones.adapters.legacy_engines.factory import engine_from_name
13
- from picarones.adapters.legacy_engines.tesseract import TesseractEngine
14
- from picarones.adapters.legacy_engines.mistral_ocr import MistralOCREngine
15
- from picarones.adapters.legacy_engines.google_vision import GoogleVisionEngine
16
- from picarones.adapters.legacy_engines.azure_doc_intel import AzureDocIntelEngine
17
-
18
- warnings.warn(
19
- "picarones.engines is deprecated and will be removed in 2.0. "
20
- "Import from picarones.adapters.legacy_engines instead.",
21
- DeprecationWarning,
22
- stacklevel=2,
23
- )
24
-
25
- __all__ = [
26
- "BaseOCREngine",
27
- "EngineResult",
28
- "engine_from_name",
29
- "TesseractEngine",
30
- "MistralOCREngine",
31
- "GoogleVisionEngine",
32
- "AzureDocIntelEngine",
33
- ]
34
-
35
- try:
36
- from picarones.adapters.legacy_engines.pero_ocr import PeroOCREngine # noqa: F401
37
-
38
- __all__.append("PeroOCREngine")
39
- except ImportError:
40
- pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/engines/azure_doc_intel.py DELETED
@@ -1,18 +0,0 @@
1
- """``picarones.engines.azure_doc_intel`` — shim re-export (déprécié, suppression 2.0).
2
-
3
- Canonique : :mod:`picarones.adapters.legacy_engines.azure_doc_intel`. Phase 7.A
4
- du retrait du legacy.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- import warnings
10
-
11
- from picarones.adapters.legacy_engines.azure_doc_intel import * # noqa: F401, F403
12
-
13
- warnings.warn(
14
- "picarones.engines.azure_doc_intel is deprecated and will be removed in 2.0. "
15
- "Import from picarones.adapters.legacy_engines.azure_doc_intel instead.",
16
- DeprecationWarning,
17
- stacklevel=2,
18
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/engines/base.py DELETED
@@ -1,24 +0,0 @@
1
- """``picarones.engines.base`` — shim re-export (déprécié, suppression 2.0).
2
-
3
- Canonique : :mod:`picarones.adapters.legacy_engines.base`. Phase 7.A
4
- du retrait du legacy. Cohabite avec
5
- ``picarones.adapters.ocr.base.BaseOCRAdapter`` (design canonique,
6
- ``StepExecutor``).
7
- """
8
-
9
- from __future__ import annotations
10
-
11
- import warnings
12
-
13
- from picarones.adapters.legacy_engines.base import * # noqa: F401, F403
14
- from picarones.adapters.legacy_engines.base import ( # noqa: F401
15
- BaseOCREngine,
16
- EngineResult,
17
- )
18
-
19
- warnings.warn(
20
- "picarones.engines.base is deprecated and will be removed in 2.0. "
21
- "Import from picarones.adapters.legacy_engines.base instead.",
22
- DeprecationWarning,
23
- stacklevel=2,
24
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/engines/factory.py DELETED
@@ -1,18 +0,0 @@
1
- """``picarones.engines.factory`` — shim re-export (déprécié, suppression 2.0).
2
-
3
- Canonique : :mod:`picarones.adapters.legacy_engines.factory`. Phase 7.A
4
- du retrait du legacy.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- import warnings
10
-
11
- from picarones.adapters.legacy_engines.factory import * # noqa: F401, F403
12
-
13
- warnings.warn(
14
- "picarones.engines.factory is deprecated and will be removed in 2.0. "
15
- "Import from picarones.adapters.legacy_engines.factory instead.",
16
- DeprecationWarning,
17
- stacklevel=2,
18
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/engines/google_vision.py DELETED
@@ -1,18 +0,0 @@
1
- """``picarones.engines.google_vision`` — shim re-export (déprécié, suppression 2.0).
2
-
3
- Canonique : :mod:`picarones.adapters.legacy_engines.google_vision`. Phase 7.A
4
- du retrait du legacy.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- import warnings
10
-
11
- from picarones.adapters.legacy_engines.google_vision import * # noqa: F401, F403
12
-
13
- warnings.warn(
14
- "picarones.engines.google_vision is deprecated and will be removed in 2.0. "
15
- "Import from picarones.adapters.legacy_engines.google_vision instead.",
16
- DeprecationWarning,
17
- stacklevel=2,
18
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/engines/mistral_ocr.py DELETED
@@ -1,18 +0,0 @@
1
- """``picarones.engines.mistral_ocr`` — shim re-export (déprécié, suppression 2.0).
2
-
3
- Canonique : :mod:`picarones.adapters.legacy_engines.mistral_ocr`. Phase 7.A
4
- du retrait du legacy.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- import warnings
10
-
11
- from picarones.adapters.legacy_engines.mistral_ocr import * # noqa: F401, F403
12
-
13
- warnings.warn(
14
- "picarones.engines.mistral_ocr is deprecated and will be removed in 2.0. "
15
- "Import from picarones.adapters.legacy_engines.mistral_ocr instead.",
16
- DeprecationWarning,
17
- stacklevel=2,
18
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/engines/pero_ocr.py DELETED
@@ -1,18 +0,0 @@
1
- """``picarones.engines.pero_ocr`` — shim re-export (déprécié, suppression 2.0).
2
-
3
- Canonique : :mod:`picarones.adapters.legacy_engines.pero_ocr`. Phase 7.A
4
- du retrait du legacy.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- import warnings
10
-
11
- from picarones.adapters.legacy_engines.pero_ocr import * # noqa: F401, F403
12
-
13
- warnings.warn(
14
- "picarones.engines.pero_ocr is deprecated and will be removed in 2.0. "
15
- "Import from picarones.adapters.legacy_engines.pero_ocr instead.",
16
- DeprecationWarning,
17
- stacklevel=2,
18
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/engines/tesseract.py DELETED
@@ -1,18 +0,0 @@
1
- """``picarones.engines.tesseract`` — shim re-export (déprécié, suppression 2.0).
2
-
3
- Canonique : :mod:`picarones.adapters.legacy_engines.tesseract`. Phase 7.A
4
- du retrait du legacy.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- import warnings
10
-
11
- from picarones.adapters.legacy_engines.tesseract import * # noqa: F401, F403
12
-
13
- warnings.warn(
14
- "picarones.engines.tesseract is deprecated and will be removed in 2.0. "
15
- "Import from picarones.adapters.legacy_engines.tesseract instead.",
16
- DeprecationWarning,
17
- stacklevel=2,
18
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/modules/__init__.py DELETED
@@ -1,22 +0,0 @@
1
- """``picarones.modules`` — shim re-export (déprécié, suppression 2.0).
2
-
3
- Canonique : :mod:`picarones.adapters.legacy_modules`. Phase 7.A.4
4
- du retrait du legacy.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- import warnings
10
-
11
- from picarones.adapters.legacy_modules.alto_text_to_mono_region import (
12
- TextToAltoMonoRegion,
13
- )
14
-
15
- warnings.warn(
16
- "picarones.modules is deprecated and will be removed in 2.0. "
17
- "Import from picarones.adapters.legacy_modules instead.",
18
- DeprecationWarning,
19
- stacklevel=2,
20
- )
21
-
22
- __all__ = ["TextToAltoMonoRegion"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/modules/alto_text_to_mono_region.py DELETED
@@ -1,18 +0,0 @@
1
- """``picarones.modules.alto_text_to_mono_region`` — shim re-export (déprécié, suppression 2.0).
2
-
3
- Canonique : :mod:`picarones.adapters.legacy_modules.alto_text_to_mono_region`.
4
- Phase 7.A.4 du retrait du legacy.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- import warnings
10
-
11
- from picarones.adapters.legacy_modules.alto_text_to_mono_region import * # noqa: F401, F403
12
-
13
- warnings.warn(
14
- "picarones.modules.alto_text_to_mono_region is deprecated and will be removed in 2.0. "
15
- "Import from picarones.adapters.legacy_modules.alto_text_to_mono_region instead.",
16
- DeprecationWarning,
17
- stacklevel=2,
18
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/architecture/test_doc_paths.py CHANGED
@@ -76,6 +76,15 @@ REPO_ROOT = Path(__file__).resolve().parents[2]
76
  #: (plan stratégique historique). Les docs actifs ``CLAUDE.md``,
77
  #: ``README.md`` et ``SPECS.md`` ont été corrigés en place vers
78
  #: ``picarones/formats/text/normalization.py``.
 
 
 
 
 
 
 
 
 
79
  #:
80
  #: Les chemins cassés restants sont **TOUS** dans :
81
  #: - ``CHANGELOG.md`` : journal historique versionné, intouchable.
@@ -84,7 +93,7 @@ REPO_ROOT = Path(__file__).resolve().parents[2]
84
  #: - ``docs/migration/executor-equivalence.md`` : audit historique
85
  #: d'équivalence executor (cite des chemins legacy à des fins
86
  #: de comparaison).
87
- BROKEN_PATHS_BASELINE = 88
88
 
89
  #: Patrons de fichiers de documentation à scanner.
90
  DOC_GLOBS: tuple[str, ...] = (
 
76
  #: (plan stratégique historique). Les docs actifs ``CLAUDE.md``,
77
  #: ``README.md`` et ``SPECS.md`` ont été corrigés en place vers
78
  #: ``picarones/formats/text/normalization.py``.
79
+ #: - 94 (sprint « Lot E — engines/ + modules/ → adapters/legacy_* »,
80
+ #: 2026-05-07) : suppression des 8 shims ``picarones/engines/`` et
81
+ #: ``picarones/modules/``. Six nouveaux chemins cassés héritage :
82
+ #: 5 dans ``CHANGELOG.md`` (intouchable) + 1 dans
83
+ #: ``docs/audits/remediation-plan-2026-05.md`` (intouchable) — les
84
+ #: audits citant ``aws_textract`` / ``kraken`` étaient déjà cassés
85
+ #: avant la migration (ces moteurs n'ont jamais été implémentés).
86
+ #: ``SPECS.md`` a été corrigé en place vers
87
+ #: ``picarones/adapters/legacy_engines/base.py``.
88
  #:
89
  #: Les chemins cassés restants sont **TOUS** dans :
90
  #: - ``CHANGELOG.md`` : journal historique versionné, intouchable.
 
93
  #: - ``docs/migration/executor-equivalence.md`` : audit historique
94
  #: d'équivalence executor (cite des chemins legacy à des fins
95
  #: de comparaison).
96
+ BROKEN_PATHS_BASELINE = 94
97
 
98
  #: Patrons de fichiers de documentation à scanner.
99
  DOC_GLOBS: tuple[str, ...] = (
tests/architecture/test_legacy_canonical_parity.py CHANGED
@@ -66,11 +66,9 @@ REPO_ROOT = Path(__file__).resolve().parents[2]
66
  LEGACY_PACKAGES: tuple[str, ...] = (
67
  "core",
68
  "measurements",
69
- "engines",
70
  "llm",
71
  "pipelines",
72
  "report",
73
- "modules",
74
  )
75
 
76
  #: Combien de symboles legacy peuvent être absents de
@@ -152,39 +150,22 @@ LEGACY_PARITY: dict[str, ParityEntry] = {
152
  # transitoire et délègue progressivement à
153
  # ``PipelineExecutor`` (cf. pipeline-convergence-plan.md).
154
  # ──────────────────────────────────────────────────────────
155
- # Phase 7.A — engines, modules
156
  # ──────────────────────────────────────────────────────────
157
- "picarones.engines.base.BaseOCREngine": {
158
- "canonical": "picarones.adapters.legacy_engines.base.BaseOCREngine",
159
- "behavior_diff": (
160
- "BaseOCREngine hérite de BaseModule legacy. Sera "
161
- "remplacé par BaseOCRAdapter (StepExecutor) en 7.D."
162
- ),
163
- },
164
- "picarones.engines.base.EngineResult": {
165
- "canonical": "picarones.adapters.legacy_engines.base.EngineResult",
166
- },
167
- "picarones.engines.tesseract.TesseractEngine": {
168
- "canonical": "picarones.adapters.legacy_engines.tesseract.TesseractEngine",
169
- },
170
- "picarones.engines.pero_ocr.PeroOCREngine": {
171
- "canonical": "picarones.adapters.legacy_engines.pero_ocr.PeroOCREngine",
172
- },
173
- "picarones.engines.mistral_ocr.MistralOCREngine": {
174
- "canonical": "picarones.adapters.legacy_engines.mistral_ocr.MistralOCREngine",
175
- },
176
- "picarones.engines.google_vision.GoogleVisionEngine": {
177
- "canonical": "picarones.adapters.legacy_engines.google_vision.GoogleVisionEngine",
178
- },
179
- "picarones.engines.azure_doc_intel.AzureDocIntelEngine": {
180
- "canonical": "picarones.adapters.legacy_engines.azure_doc_intel.AzureDocIntelEngine",
181
- },
182
- "picarones.engines.factory.engine_from_name": {
183
- "canonical": "picarones.adapters.legacy_engines.factory.engine_from_name",
184
- },
185
- "picarones.modules.alto_text_to_mono_region.TextToAltoMonoRegion": {
186
- "canonical": "picarones.adapters.legacy_modules.alto_text_to_mono_region.TextToAltoMonoRegion",
187
- },
188
  }
189
 
190
 
 
66
  LEGACY_PACKAGES: tuple[str, ...] = (
67
  "core",
68
  "measurements",
 
69
  "llm",
70
  "pipelines",
71
  "report",
 
72
  )
73
 
74
  #: Combien de symboles legacy peuvent être absents de
 
150
  # transitoire et délègue progressivement à
151
  # ``PipelineExecutor`` (cf. pipeline-convergence-plan.md).
152
  # ──────────────────────────────────────────────────────────
153
+ # Phase 7.A + Lot E — engines, modules
154
  # ──────────────────────────────────────────────────────────
155
+ # ``picarones/engines/`` et ``picarones/modules/`` ont été
156
+ # supprimés (Lot E de la migration legacy → adapters/legacy_*).
157
+ # Les classes (BaseOCREngine, EngineResult, TesseractEngine,
158
+ # PeroOCREngine, MistralOCREngine, GoogleVisionEngine,
159
+ # AzureDocIntelEngine, engine_from_name, TextToAltoMonoRegion)
160
+ # sont exposées depuis
161
+ # ``picarones.adapters.legacy_engines.{...}`` et
162
+ # ``picarones.adapters.legacy_modules.alto_text_to_mono_region``.
163
+ # Comme pour les Lots précédents, les entrées ont été retirées
164
+ # pour garder la table alignée avec l'arbre legacy réellement
165
+ # présent sur disque.
166
+ # Note 7.D : ces adapters legacy seront eux-mêmes refondus en
167
+ # ``BaseOCRAdapter (StepExecutor)`` lors de la convergence
168
+ # pipeline (cf. pipeline-convergence-plan.md).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
  }
170
 
171
 
tests/architecture/test_no_legacy_imports_in_rewrite.py CHANGED
@@ -47,14 +47,12 @@ REWRITE_PACKAGES: tuple[str, ...] = (
47
  LEGACY_PACKAGES: tuple[str, ...] = (
48
  "core",
49
  "measurements",
50
- "engines",
51
  "llm",
52
  "pipelines",
53
  "report",
54
  "web",
55
  "cli",
56
  "extras",
57
- "modules",
58
  )
59
 
60
  #: Pattern qui matche un import déclaré dans le code source.
 
47
  LEGACY_PACKAGES: tuple[str, ...] = (
48
  "core",
49
  "measurements",
 
50
  "llm",
51
  "pipelines",
52
  "report",
53
  "web",
54
  "cli",
55
  "extras",
 
56
  )
57
 
58
  #: Pattern qui matche un import déclaré dans le code source.
tests/docs/test_readme_consistency.py CHANGED
@@ -45,7 +45,7 @@ import pytest
45
 
46
  REPO_ROOT = Path(__file__).resolve().parents[2]
47
  README_PATH = REPO_ROOT / "README.md"
48
- ENGINES_DIR = REPO_ROOT / "picarones" / "engines"
49
 
50
  #: Marqueur HTML qui désactive un check sur la ligne. Format :
51
  #: ``<!-- doc-check: skip-engine -->``, ``skip-cli``, ``skip-endpoint``.
 
45
 
46
  REPO_ROOT = Path(__file__).resolve().parents[2]
47
  README_PATH = REPO_ROOT / "README.md"
48
+ ENGINES_DIR = REPO_ROOT / "picarones" / "adapters" / "legacy_engines"
49
 
50
  #: Marqueur HTML qui désactive un check sur la ligne. Format :
51
  #: ``<!-- doc-check: skip-engine -->``, ``skip-cli``, ``skip-endpoint``.