spb/traite-evaluation-qc
Public
1#!/usr/bin/env python32"""Inventaire des scripts, tests, données, figures et classeurs → manuscript/appendices/_inventaire.tex (longtable) et verification/inventaire.md."""3import pathlib, re4ROOT = pathlib.Path(__file__).resolve().parents[1]5def esc(s): return s.replace("\\", "").replace("{", "\\{").replace("}", "\\}").replace("_", "\\_").replace("&", "\\&").replace("%", "\\%").replace("#", "\\#").replace("$", "\\$")6def doc(p):7 t = p.read_text(encoding="utf-8", errors="ignore")8 m = re.search(r'"""(.*?)"""', t, re.S) or re.search(r"^#\s*(.+)$", t, re.M)9 return esc(m.group(1).strip().split("\n")[0]) if m else ""10def tronque(s, n):11 """Coupe au dernier mot entier avant n caractères et ajoute des points de suspension."""12 if len(s) <= n: return s13 return s[:n].rsplit(" ", 1)[0].rstrip(" ,;:(—-") + "…"14rows = []15for d, kind in [("analysis/python/traite", "module"), ("analysis/python/cases", "calcul"), ("analysis/python/figures", "figure"), ("analysis/python/tests", "test"), ("analysis/r", "R"), ("tools", "outil")]:16 for p in sorted((ROOT / d).glob("*.py")) + sorted((ROOT / d).glob("*.R")) + sorted((ROOT / d).glob("*.sh")):17 if p.name.startswith("__"): continue18 rows.append((kind, esc(str(p.relative_to(ROOT))).replace("/", "/\\allowbreak{}").replace("\\_", "\\_\\allowbreak{}"), tronque(doc(p), 110)))19data = [(esc(str(p.relative_to(ROOT))).replace("/", "/\\allowbreak{}"), f"{p.stat().st_size/1024:.0f} ko") for p in sorted((ROOT / "data/synthetic").glob("*")) if p.is_file()]20xl = [esc(str(p.relative_to(ROOT))) for p in sorted((ROOT / "spreadsheets").glob("*.xlsx"))]21nfig = len(list((ROOT / "assets/figures").rglob("*.pdf")))22tex = ["\\footnotesize", "\\begin{longtable}{lp{46mm}p{64mm}}", "\\caption{Scripts du dépôt (modules, calculs, figures, tests, outils)}\\label{tab:app:scripts}\\\\", "\\toprule Type & Fichier & Rôle \\\\ \\midrule \\endfirsthead", "\\toprule Type & Fichier & Rôle \\\\ \\midrule \\endhead", "\\bottomrule \\endfoot"]23tex += [f"{k} & \\texttt{{{f}}} & {d} \\\\" for k, f, d in rows] + ["\\end{longtable}", "", "\\begin{longtable}{lr}", "\\caption{Jeux de données synthétiques}\\label{tab:app:donnees}\\\\", "\\toprule Fichier & Taille \\\\ \\midrule \\endfirsthead", "\\toprule Fichier & Taille \\\\ \\midrule \\endhead", "\\bottomrule \\endfoot"]24tex += [f"\\texttt{{{f}}} & {s} \\\\" for f, s in data] + ["\\end{longtable}", "\\normalsize", "", "\\begin{itemize}"] + [f"\\item \\texttt{{{x}}}" for x in xl] + ["\\end{itemize}", f"\\noindent Figures PDF générées : {nfig}."]25(ROOT / "manuscript/appendices/_inventaire.tex").write_text("\n".join(tex), encoding="utf-8")26(ROOT / "verification/inventaire.md").write_text(f"# Inventaire ({len(rows)} scripts, {len(data)} fichiers de données, {len(xl)} classeurs, {nfig} figures)\n\n" + "\n".join(f"- {k} `{f}` — {d}" for k, f, d in rows), encoding="utf-8")27print(f"{len(rows)} scripts, {len(data)} données, {len(xl)} classeurs, {nfig} figures")28