Stratégie de nettoyage du code legacy
Ce guide explique comment Whoosh-NG sépare le code moderne typé du code legacy, et comment le nettoyage progressif est organisé.
Pourquoi une frontière legacy ?
whoosh-modern est la nouvelle surface de Whoosh-NG, entièrement typée.
Le package whoosh original fonctionne toujours au runtime, mais il contient
des décennies de motifs de compatibilité Python 2/3, de métaprogrammation
dynamique et d'internes non typés. Forcer des types stricts sur l'ensemble
d'un coup bloquerait le développement.
La stratégie de nettoyage est incrémentale et opt-in :
src/whoosh_modern/est typé et vérifié avecpyrightetmypyen mode strict.src/whoosh/est la surface legacy. Elle est divisée en :- modules exclus (documentés dans
pyrightconfig.json) — code trop dynamique ou vendu pour justifier un passage de types rentable maintenant ; - candidats au nettoyage — petits fichiers isolés, faciles à annoter et à vérifier.
- modules exclus (documentés dans
- Chaque sprint, une vague de candidats est typée, testée, puis sortie de la zone de tolérance élevée.
Seuils actuels (Sprint 2)
| Vérificateur | Portée | Seuil |
|---|---|---|
pyright | src/whoosh_modern/ | 0 erreur (strict) |
pyright | legacy | ≤ 500 erreurs (tolérant) |
mypy | src/ | 0 erreur (via overrides + ignore_errors) |
Justification des exclusions (pyrightconfig.json)
La liste exclude de pyrightconfig.json regroupe les fichiers par thème :
- Vendu / sans stubs :
pyparsing.py,relativedelta.py - Shims de migration :
codec/whoosh2.py,codec/whoosh3.py - Parsing dynamique :
qparser/,query/,analysis/,automata/ - Stockage fichiers :
filedb/,reading/,writing/ - Heuristique / data-driven :
lang/dmetaphone.py,lang/lovins.py,lang/phonetic.py,lang/wordnet.py - Objets dynamiques :
classify.py,index.py,locking.py,formats.py,middleware/ - Bas niveau vendu :
support/bench.py,support/base85.py,support/bitstream.py,support/bitvector.py,support/charset.py,support/levenshtein.py
Plan Sprint 2
Pour le Sprint 2, l'accent est mis sur les petits modules utilitaires et de support, sans dépendances externes ni métaprogrammation lourde.
Vague de candidats :
src/whoosh/util/varints.pysrc/whoosh/util/text.pysrc/whoosh/util/loading.pysrc/whoosh/support/bitstream.pysrc/whoosh/support/levenshtein.py
Pour chaque fichier :
- Supprimer le
# type: ignoreglobal (si présent). - Ajouter des signatures de fonctions précises.
- Lancer
pyrightetmypypour confirmer 0 nouvelle erreur. - Retirer le fichier des exclusions de
pyrightconfig.json. - Ajouter un test de régression dans
tests/test_legacy_cleanup.py.
Objectif long terme
Chaque fichier de src/whoosh/ doit finir par être vérifiable par mypy et
pyright sans exclusion globale. D'ici là, la liste d'exclusion est le
registre explicite de la dette, et chaque sprint la réduit.