diff --git a/json_to_md.py b/json_to_md.py index 6c7fad2bd..008e3a58c 100644 --- a/json_to_md.py +++ b/json_to_md.py @@ -4,6 +4,26 @@ import json import argparse import os import re +from collections import defaultdict +import os + +def build_tree(nodeids): + tree = lambda: defaultdict(tree) + root = tree() + for nid in nodeids: + parts = nid.replace("\\", "/").split("/") # normalize path + current = root + for part in parts: + current = current[part] + return root + +def write_tree(f, subtree, path=""): + for key in sorted(subtree): + full_path = f"{path}/{key}" if path else key + f.write(f"
\n📁 `{full_path}`\n\n") + if subtree[key]: # has children + write_tree(f, subtree[key], full_path) + f.write("
\n\n") def stringify(obj): if obj is None or obj == "": @@ -73,41 +93,40 @@ def json_to_md_nested(json_path, md_path, allure_dir=None): if "collectors" in data: f.write("## 📚 Collectés\n") - # Group by file / subpath - grouped_collectors = defaultdict(list) + # 1. Collect all nodeids that represent paths + nodeids = [collector.get("nodeid", "unknown").split("::")[0] for collector in data["collectors"]] + + # 2. Build directory tree from paths + dir_tree = build_tree(nodeids) + + # 3. Write the tree recursively + write_tree(f, dir_tree) + + # 4. Ensuite, tu peux afficher les détails pour chaque vrai test (en dehors de la hiérarchie) for collector in data["collectors"]: nodeid = collector.get("nodeid", "unknown") - base = nodeid.split("::")[0].replace("\\", "/") # Normalize paths - grouped_collectors[base].append(collector) + outcome = collector.get("outcome", "unknown") + emoji = "✅" if outcome == "passed" else "❌" + f.write(f"
\n{emoji} `{nodeid}`\n\n") + f.write(f"- **outcome:** `{outcome}`\n") - for base_path in sorted(grouped_collectors): - f.write(f"
\n📁 `{base_path}`\n\n") - for collector in grouped_collectors[base_path]: - outcome = collector.get("outcome", "unknown") - emoji = "✅" if outcome == "passed" else "❌" - nodeid = collector.get("nodeid", "unknown") - short_node = nodeid.split("[")[0] - - f.write(f"
\n{emoji} `{short_node}`\n\n") - f.write(f"- **outcome:** `{outcome}`\n") - - results = collector.get("result", []) - if results: - f.write("- **result:**\n```\n") - for item in results: - if isinstance(item, dict): - for k, v in item.items(): - f.write(f"{k}: {v}\n") - f.write("\n") - else: - f.write(f"{item}\n") - f.write("```\n") - else: - f.write("- **result:** `None`\n") - f.write("
\n\n") + results = collector.get("result", []) + if results: + f.write("- **result:**\n```\n") + for item in results: + if isinstance(item, dict): + for k, v in item.items(): + f.write(f"{k}: {v}\n") + f.write("\n") + else: + f.write(f"{item}\n") + f.write("```\n") + else: + f.write("- **result:** `None`\n") f.write("
\n\n") + if "tests" in data: f.write("## 🔎 Tests\n") grouped = defaultdict(lambda: defaultdict(list))