Update json_to_md.py
Run Pytest with Allure and Coverage Reports / tests (push) Successful in 51s
Run Pytest with Allure and Coverage Reports / deploy (push) Has been skipped

This commit is contained in:
2025-07-10 14:30:09 +02:00
parent ece9e0b982
commit f4e00518e8
+48 -29
View File
@@ -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"<details>\n<summary>📁 `{full_path}`</summary>\n\n")
if subtree[key]: # has children
write_tree(f, subtree[key], full_path)
f.write("</details>\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"<details>\n<summary>{emoji} `{nodeid}`</summary>\n\n")
f.write(f"- **outcome:** `{outcome}`\n")
for base_path in sorted(grouped_collectors):
f.write(f"<details>\n<summary>📁 `{base_path}`</summary>\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"<details>\n<summary>{emoji} `{short_node}`</summary>\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("</details>\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("</details>\n\n")
if "tests" in data:
f.write("## 🔎 Tests\n")
grouped = defaultdict(lambda: defaultdict(list))