#!/usr/bin/env python3 """Inventaire des scripts, tests, données, figures et classeurs → manuscript/appendices/_inventaire.tex (longtable) et verification/inventaire.md.""" import pathlib, re ROOT = pathlib.Path(__file__).resolve().parents[1] def esc(s): return s.replace("\\", "").replace("{", "\\{").replace("}", "\\}").replace("_", "\\_").replace("&", "\\&").replace("%", "\\%").replace("#", "\\#").replace("$", "\\$") def doc(p): t = p.read_text(encoding="utf-8", errors="ignore") m = re.search(r'"""(.*?)"""', t, re.S) or re.search(r"^#\s*(.+)$", t, re.M) return esc(m.group(1).strip().split("\n")[0]) if m else "" def tronque(s, n): """Coupe au dernier mot entier avant n caractères et ajoute des points de suspension.""" if len(s) <= n: return s return s[:n].rsplit(" ", 1)[0].rstrip(" ,;:(—-") + "…" rows = [] for d, kind in [("analysis/python/traite", "module"), ("analysis/python/cases", "calcul"), ("analysis/python/figures", "figure"), ("analysis/python/tests", "test"), ("analysis/r", "R"), ("tools", "outil")]: for p in sorted((ROOT / d).glob("*.py")) + sorted((ROOT / d).glob("*.R")) + sorted((ROOT / d).glob("*.sh")): if p.name.startswith("__"): continue rows.append((kind, esc(str(p.relative_to(ROOT))).replace("/", "/\\allowbreak{}").replace("\\_", "\\_\\allowbreak{}"), tronque(doc(p), 110))) data = [(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()] xl = [esc(str(p.relative_to(ROOT))) for p in sorted((ROOT / "spreadsheets").glob("*.xlsx"))] nfig = len(list((ROOT / "assets/figures").rglob("*.pdf"))) tex = ["\\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"] tex += [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"] tex += [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}."] (ROOT / "manuscript/appendices/_inventaire.tex").write_text("\n".join(tex), encoding="utf-8") (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") print(f"{len(rows)} scripts, {len(data)} données, {len(xl)} classeurs, {nfig} figures")