diff --git a/json_to_md.py b/json_to_md.py
index 894b1dae9..965b8c9c4 100644
--- a/json_to_md.py
+++ b/json_to_md.py
@@ -37,11 +37,19 @@ def get_details_block(summary, body, level=0, params_str=None):
border = f"border-left: 2px solid #eee;" if level > 0 else ""
if params_str:
summary = f"{summary} parameters: [{params_str}]"
- return (f'
\n'
- f"\n{summary}
\n\n"
- f"{body}\n"
- f" \n"
- f"
\n\n")
+ return (f'
+'
+ f"
+{summary}
+
+"
+ f"{body}
+"
+ f"
+"
+ f"
+
+")
def make_test_block(test, status, emoji, level):
nodeid = test.get("nodeid", "")
@@ -58,7 +66,10 @@ def make_test_block(test, status, emoji, level):
if value is None:
phase_body += f"- **{field.capitalize()}:** None\n"
else:
- details_body = "```\n" + stringify(value) + "\n```\n"
+ details_body = "```
+" + stringify(value) + "
+```
+"
phase_body += get_details_block(f"๐ {field.capitalize()}", details_body, level+2)
if phase_body:
body_test += f"\n### ๐ง {phase.capitalize()} Phase\n\n" + phase_body
@@ -72,6 +83,8 @@ def json_to_md_nested(json_path, md_path):
f.write(f"# ๐งช Test Report\n")
f.write(f"*Generated on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*\n\n")
+ known = {'summary', 'tests', 'collectors'}
+
if 'summary' in data:
f.write("## ๐ Summary\n")
for key, value in data['summary'].items():
@@ -80,7 +93,7 @@ def json_to_md_nested(json_path, md_path):
f.write(f"- **Total Duration**: {duration:.3f}s\n" if duration else "- **Total Duration**: None\n")
f.write("\n")
- if "tests" in data and "summary" in data:
+ if "tests" in data:
f.write("## ๐ Tests\n")
for test in data["tests"]:
f.write(make_test_block(test, test.get("outcome", "unknown"), "โ
" if test.get("outcome") == "passed" else "โ", level=0))
@@ -93,7 +106,8 @@ def json_to_md_nested(json_path, md_path):
result = collector.get("result", [])
result_block = ""
if result:
- result_block += "```\n"
+ result_block += "```
+"
for item in result:
if isinstance(item, dict):
for k, v in item.items():
@@ -103,14 +117,20 @@ def json_to_md_nested(json_path, md_path):
result_block += "```"
f.write(get_details_block(f"{emoji} {nodeid}", result_block, level=1))
- if 'warnings' in data and data['warnings']:
- f.write("## โ ๏ธ Warnings\n\n")
- for i, warning in enumerate(data['warnings'], 1):
- warn_body = "```\n"
- for k, v in warning.items():
- warn_body += f"{k}: {v}\n"
- warn_body += "```\n"
- f.write(get_details_block(f"Warning #{i}", warn_body, level=1))
+ for key, value in data.items():
+ if key not in known:
+ block = ""
+ if isinstance(value, list):
+ block += "```
+"
+ for item in value:
+ block += stringify(item) + "\n"
+ block += "```"
+ else:
+ block = f"```
+{stringify(value)}
+```"
+ f.write(get_details_block(f"๐ง {key.capitalize()}", block, level=0))
def run_pytest_and_generate_banner_with_logs(md_path, log_path, exit_code):
if exit_code == 0 or exit_code == 1:
@@ -163,10 +183,16 @@ def run_pytest_and_generate_banner_with_logs(md_path, log_path, exit_code):
return
full_banner = (
banner +
- "\n๐ Short test summary info
\n\n" +
- "```\n" + "".join(short_summary_lines) + "```\n \n\n" +
- "\n๐ชต Full raw pytest log
\n\n" +
- "```\n" + "".join(log_lines) + "```\n \n\n" +
+ "๐ Short test summary info
\n\n" +
+ "```
+" + "".join(short_summary_lines) + "```
+" +
+ " \n\n" +
+ "๐ชต Full raw pytest log
\n\n" +
+ "```
+" + "".join(log_lines) + "```
+" +
+ " \n\n" +
"---\n\n"
)
try: