[DTP-Worker] hardening correctness · l'alignement du compteur de tests audit_4big↔discovery (fix ASCII ac595d0) était INCOMPLET · criteria.py gardait def (un espace figé) là où la source sœur reglib.discovery a def\s+def test_x(/def\ttest_x( (Python valide) loupés → sous-comptage silencieux + désaccord avec l'autorité byte-gatée de la colonne « Tests » des fiches (violation #6, même racine « détecter la forme, pas une graphie » que ac595d0/fd99362)

Fix chirurgical `def ` → `def\s+` (forme strictement identique à discovery._TEST_METHOD_RE) + teeth test_tests_counts_non_single_space_def_separator (prouvé mordant : ancien regex compte 1/3, nouveau 3/3). Occurrence latente (0 def multi-espace dans le dépôt aujourd'hui) → quality_report.json byte-identique (audit_4big s'auto-exclut de son scoring). Cascade matrice régression 627→628 / 610→611 ; fiches qa+erpnext_backend re-dérivées. Axe recursion (os.walk vs os.listdir) non-occurrent, laissé. Classe compteur-coïncidence désormais close sur ses 2 axes. Pas de nouveau gate (#5 · check_readme_claims mord déjà). 0 code moteur V18 (bloqué #6), 0 commande VPS (#8).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-11 09:05:51 +00:00
parent fd99362660
commit 35de616236
8 changed files with 63 additions and 12 deletions
@@ -15,7 +15,13 @@ import json
import os
import re
_TEST_DEF_RE = re.compile(r"^\s*def (test_\w+)\s*\(", re.MULTILINE)
# `\w` (Unicode) pour les identifiants accentués (`test_traçabilite_source`) ET
# `def\s+` (espacement libre) : `def test_x(` / `def\ttest_x(` sont du Python
# valide (PEP 8 recommande un espace mais le langage n'en impose pas). Forme
# STRICTEMENT identique à la source sœur `reglib/discovery.py:_TEST_METHOD_RE`,
# autorité byte-gatée de la colonne « Tests » des fiches — les deux compteurs du
# MÊME concept doivent coïncider (sinon dérive d'évidence #6, cf. le fix ASCII).
_TEST_DEF_RE = re.compile(r"^\s*def\s+(test_\w+)\s*\(", re.MULTILINE)
_ADD_PARSER_RE = re.compile(r"add_parser\(|add_subparsers\(")
# Garde `if __name__ == "__main__":` — les DEUX styles de guillemets sont du
# Python valide (PEP 8 n'impose rien), l'ordre des opérandes peut être inversé
@@ -126,6 +126,27 @@ class CriteriaTest(unittest.TestCase):
res = criteria.crit_tests(mod, 1)
self.assertIn("2 méthodes", res["evidence"])
def test_tests_counts_non_single_space_def_separator(self):
# Robustesse (complète l'alignement char-class du fix ASCII) : `def` et
# le nom de méthode peuvent être séparés par PLUSIEURS espaces ou une
# tabulation — du Python valide. Le littéral `def ` (un seul espace)
# loupait `def test_x(` / `def\ttest_x(` → sous-comptage silencieux et
# DÉSACCORD avec la source sœur reglib.discovery (`def\s+`), autorité de
# la colonne « Tests » des fiches. Les deux compteurs du MÊME concept
# doivent coïncider sur toute graphie valide (#6).
with tempfile.TemporaryDirectory() as d:
mod = os.path.join(d, "mod")
tdir = os.path.join(mod, "tests")
os.makedirs(tdir)
with open(os.path.join(tdir, "test_mod.py"), "w",
encoding="utf-8") as fh:
fh.write("import unittest\nclass T(unittest.TestCase):\n"
" def test_one_space(self):\n pass\n"
" def test_two_spaces(self):\n pass\n"
" def\ttest_tab(self):\n pass\n")
res = criteria.crit_tests(mod, 1)
self.assertIn("3 méthodes", res["evidence"])
def test_cli_fails_without_entrypoint(self):
with tempfile.TemporaryDirectory() as d:
mod = _make_module(d, cli=False)