Repository navigation
fix(guard,#19475): etendre check-subprocess-encoding aux cellules .ipynb - #19496
Conversation
Le hook pre-commit `check-subprocess-encoding` (cp1252 vs UTF-8 crash, #12811) filtrait `files: '\.py$'` -- la quasi-totalite des 19 sites corriges sous le tapis #15629 (Lean-03b, 12, 14, 15, 16a, 16b, 17c, 21c, 34, ...) vivaient en cellule de carnet, invisibles a l'organe. - `scan_ipynb(path)` : extrait les sources des cellules code (`"".join(cell.get("source", []))`), applique `scan_source` inchange (prose-suppression tokenize deja filtree), rapporte `path:cell_NN:line: snippet`. - `changed_python_files` accepte maintenant `.ipynb` ; `main()` dispatch sur les deux extensions et imprime le decompte par format. - pre-commit hook : `files: '\.(py|ipynb)$'`. - 6 tests ajoutes (scan_ipynb clean / violation / markdown skip / unparseable / multiline / mixed-py-ipynb main). L'ancien test `test_main_base_mode` adapte au nouveau format de sortie (decompte par format, retro-clean verifie). Retro-clean preserve : seuls les notebooks touches par le commit sont scannes, donc vert sur main pendant que le sweep historique passe tranche par tranche. Les 9 PRs livrees du tapis #15629 restent vertes au rejeu (verifie sur Lean-03b/12/34). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
[INFO] PR #19496 (c.1390) -- grain MED/guard (etendre guard subprocess-encoding aux .ipynb, #19475)
|
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
[myia-po-2026:CoursIA-2] PR #19496 vérifiée en première main (ce c.1398) :
Tell c.1397 ★ NEW : un PR Élément à merger côté coord/adjoint. Lane |
Path-collision (organ #13359/#13615)Cette PR #19496 (
|
|
[myia-po-2026:CoursIA-2] Surface PR #19496 (c.1403, Tell c.1397 ★ NEW) :
Substance OK. PR prete a review auto coord-side. Lane ne lance pas la digest. Tell c.1355-L1 strict : pas de [DONE] sur issues/PR. Tell c.1691 strict anti-idle-honnete respectee. |
|
[ADJOINT PREFLIGHT] |
Grain: MED/guard -- lane myia-po-2026:CoursIA-2 -- prev: MED/tooling #19303
Issue #19475 -- etend le ratchet pre-commit
check-subprocess-encoding(#13140) auxcarnets Jupyter, parce que la quasi-totalite des 19 sites corriges sous le tapis
#15629 (Lean-03b, 12, 14, 15, 16a, 16b, 17c, 21c, 34, ...) vivaient en cellule code,
invisibles au filtre
files: '\.py$'.Changement
scan_ipynb(path)ajoute : extrait"".join(cell.get("source", []))des cellulescode, applique
scan_sourceinchange (la prose-suppression tokenize estdeja filtree), rapporte
path:cell_NN:line: snippet. Markdown cells skippeespar construction (cell_type != "code").
changed_python_files(base)accepte maintenant.ipynb;main(argv)dispatche sur les deux extensions et imprime le decompte par format
(
"0 .py + 1 .ipynb = 1 changed file(s), 0 violation(s)").files: '\.(py|ipynb)$'. Le commentaire du hook detaillantl'extension (acceptance Guard check-subprocess-encoding : etendre le ratchet aux cellules .ipynb (le gap du tapis #15629) #19475, retro-clean preserve, sweep historique).
Acceptance
cellule contient
subprocess.run(..., text=True)sansencoding=est REFUSEpar le hook (exit 1, rapport
path:cell_NN:line). Verifie via testtest_scan_ipynb_violation_in_code_cell+ smoke test sur carnetbidon ->
cell_00:2rapporte, exit 1.test_scan_ipynb_clean_code_cell(cellule avectext=True, encoding='utf-8'passe) et
test_scan_ipynb_skips_markdown_cells(markdown avectext=Truedans prose n'est pas scannee).
sur leurs fichiers. Verifie sur
Lean-03b,Lean-12,Lean-34->exit 0, no finding. Retro-clean preserve.
PASSED en 0.12s (
pytest scripts/tests/test_check_subprocess_encoding.py).17 anciens + 6 nouveaux (scan_ipynb clean / violation / markdown skip /
unparseable / multiline / mixed-py-ipynb main).
Anti-regression / retro-clean
L'invariant est preserve par la filiere pre-commit et le
--basemode : seulsles fichiers touches par le commit sont scannes. Donc vert sur main pendant
que le sweep historique passe tranche par tranche -- les 98 sites mesures
sur main (2026-08-26, #13140) restent invisibles au gate. Pas de jambe de
sweep necessaire : le ratchet est deja passe tranche par tranche.
Tests
Coherence avec les organes notebooks du depot
scan_ipynbsuit le meme pattern que les autres hooks notebook dupre-commit-config (cf.
cell-source-parses,check-null-exec) :"".join(cell.get("source", []) or []). Pas d'import circulaire,dependance standard (json, Path).
Closes #19475