test(build): échec bruyant si bloc hiddenimports introuvable (revue Task 2)

- _hiddenimport_strings assert désormais si le bloc hiddenimports=[...] est
  absent (renommage/refonte de spec) au lieu de retourner [] silencieusement,
  ce qui faisait passer le test à vide.
- Docstring corrigée : la regex s'arrête au PREMIER `]` où qu'il soit (pas
  « ligne seule ») — limitation réelle documentée.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 11:23:51 +02:00
parent 65c97a39b3
commit e4bc9166be

View File

@@ -22,18 +22,21 @@ FORBIDDEN_HIDDEN = ("optimum", "torch", "torchvision", "doctr")
REQUIRED_EXCLUDES = ("torch", "torchvision", "optimum", "doctr") REQUIRED_EXCLUDES = ("torch", "torchvision", "optimum", "doctr")
def _hiddenimport_strings(text): def _hiddenimport_strings(text, spec_name):
"""Retourne les chaînes littérales présentes dans la section hiddenimports=[...]. """Retourne les chaînes littérales présentes dans la section hiddenimports=[...].
On extrait uniquement la portion du texte entre `hiddenimports = [` et le `]` On extrait la portion entre `hiddenimports = [` et le PREMIER `]` rencontré
de fermeture correspondant (premier `]` sur une ligne seule), afin d'éviter où qu'il soit (`[^\\]]*` ne gère pas l'imbrication : un `]` dans un
les faux positifs générés par le bloc EXCLUDED_TORCH_STACK lui-même qui commentaire au sein de la liste tronquerait le bloc — acceptable ici, les
contient légitimement "torch", "optimum", etc. comme valeurs d'exclusion. specs n'en contiennent pas). Cette restriction évite les faux positifs du
bloc EXCLUDED_TORCH_STACK qui contient légitimement "torch", "optimum", etc.
Garde-fou : si le bloc hiddenimports est introuvable (renommage, refonte de
la spec), on échoue BRUYAMMENT au lieu de retourner [] — sinon le test
passerait à vide sans plus rien vérifier.
""" """
# Cherche le bloc hiddenimports = [ ... ]
match = re.search(r"hiddenimports\s*=\s*\[([^\]]*)\]", text, re.DOTALL) match = re.search(r"hiddenimports\s*=\s*\[([^\]]*)\]", text, re.DOTALL)
if not match: assert match is not None, f"bloc hiddenimports introuvable dans {spec_name}"
return []
block = match.group(1) block = match.group(1)
return re.findall(r"[\"']([A-Za-z0-9_.]+)[\"']", block) return re.findall(r"[\"']([A-Za-z0-9_.]+)[\"']", block)
@@ -42,7 +45,7 @@ def _hiddenimport_strings(text):
def test_spec_sans_hiddenimport_torch_optimum_doctr(spec_path): def test_spec_sans_hiddenimport_torch_optimum_doctr(spec_path):
text = spec_path.read_text(encoding="utf-8") text = spec_path.read_text(encoding="utf-8")
hits = [ hits = [
s for s in _hiddenimport_strings(text) s for s in _hiddenimport_strings(text, spec_path.name)
if s.split(".")[0] in FORBIDDEN_HIDDEN if s.split(".")[0] in FORBIDDEN_HIDDEN
] ]
assert hits == [], f"{spec_path.name} référence encore : {hits}" assert hits == [], f"{spec_path.name} référence encore : {hits}"