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))