From d24cd2a84c45899ee18a9cb113bfad83d3fb6abf Mon Sep 17 00:00:00 2001 From: tligui_y Date: Thu, 10 Jul 2025 10:14:07 +0200 Subject: [PATCH] Update json_to_md.py --- json_to_md.py | 77 +++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/json_to_md.py b/json_to_md.py index 2f4b49db6..28ddecebc 100644 --- a/json_to_md.py +++ b/json_to_md.py @@ -2,73 +2,72 @@ import json from datetime import datetime import argparse +def strip_params(nodeid): + """Supprime les paramètres des nodeids (ex: test[1-2] → test)""" + return nodeid.split('[')[0] + def json_to_adaptive_md(json_path, md_path): - """Convertit le JSON pytest en Markdown avec structure dynamique""" + """Convertit le JSON pytest en Markdown avec blocs repliables""" with open(json_path) as f: data = json.load(f) - + with open(md_path, 'w', encoding='utf-8') as f: - # En-tête f.write(f"# 🏗 Rapport de Tests (Générique)\n") f.write(f"*Généré le {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*\n\n") - + + # Résumé if 'summary' in data: f.write("## 📋 Summary\n") for key, value in data['summary'].items(): f.write(f"- **{key.capitalize()}:** `{value}`\n") - - total_duration = data.get('duration') - if total_duration is not None: - f.write(f"- **Durée totale:** `{total_duration:.3f}` s\n") - + if 'duration' in data: + f.write(f"- **Durée totale:** `{data['duration']:.3f}` s\n") f.write("\n") - - # Traitement hiérarchique automatique + + # Section Collectors + if 'collectors' in data: + f.write("## 📦 Collectors\n") + for collector in data['collectors']: + if 'nodeid' in collector: + name = strip_params(collector['nodeid']) + f.write(f"
\n📁 `{name}`\n\n") + f.write("```json\n") + json.dump(collector, f, indent=2, ensure_ascii=False) + f.write("\n```\n
\n\n") + + # Section Tests if 'tests' in data: - current_file = None - + f.write("## 🧪 Tests\n") for test in data['tests']: - # Nouveau fichier détecté - if '::' in test['nodeid'] and current_file != test['nodeid'].split('::')[0]: - current_file = test['nodeid'].split('::')[0] - f.write(f"\n## 📄 Fichier: `{current_file}`\n") - - # Nom du test (sans les paramètres pour plus de clarté) - test_name = test['nodeid'].split('::')[-1].split('[')[0] - f.write(f"\n### 🧪 {test_name}\n") - - # Paramètres dynamiques - if '[' in test['nodeid']: - params = test['nodeid'].split('[')[1].rstrip(']') - f.write("- **Paramètres:**\n") - for i, param in enumerate(params.split('-'), 1): - f.write(f" - Param {i}: `{param}`\n") - - # Métadonnées communes + base_name = strip_params(test['nodeid']) + f.write(f"
\n🔹 `{base_name}`\n\n") + + # Outcome avec emoji if "outcome" in test: outcome_value = test["outcome"] outcome_icons = { "passed": "✅", "skipped": "⏭️", "failed": "❌", - "error": "❗", + "error": "🛑", } emoji = outcome_icons.get(outcome_value) f.write(f"- **Statut:** {emoji} `{outcome_value}`\n") + # Durée if "call" in test and "duration" in test["call"]: f.write(f"- **Durée:** `{test['call']['duration']:.6f}`s\n") - - # Détails spécifiques au résultat + + # Si erreur ou autre, dump tout call[] if test.get("outcome") != "passed": call_data = test.get("call", {}) if call_data: - f.write("\n**Détails (raw call):**\n") - for key, value in call_data.items(): - f.write(f"\n- **{key}:**\n```\n{str(value)}\n```\n") - - f.write("\n" + "-"*50 + "\n") + f.write("\n
\n🔍 Détails (raw call)\n\n") + f.write("```json\n") + json.dump(call_data, f, indent=2, ensure_ascii=False) + f.write("\n```\n
\n") + f.write("
\n\n") if __name__ == "__main__": parser = argparse.ArgumentParser(description="Convert Pytest JSON report to Markdown") @@ -76,4 +75,4 @@ if __name__ == "__main__": parser.add_argument("--output", required=True, help="Chemin du fichier Markdown de sortie") args = parser.parse_args() - json_to_adaptive_md(args.input, args.output) \ No newline at end of file + json_to_adaptive_md(args.input, args.output)