maturity scorecard generation

This commit is contained in:
2026-05-08 01:59:42 +02:00
parent b4f620533c
commit 3a94042ca3
14 changed files with 1385 additions and 95 deletions

View File

@@ -7,10 +7,19 @@ import argparse
import json
import os
import subprocess
import sys
from datetime import datetime, timezone
from pathlib import Path
from typing import Any
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
from open_cmis_tck.normalization import ( # noqa: E402
aggregate_case_result,
parse_text_report,
result_counts,
)
GROUP_CLASSES = {
"repository-type": [
@@ -57,7 +66,14 @@ def main() -> int:
result = run_console_adapter(args)
print(json.dumps(result, indent=2, sort_keys=True))
return 0 if result["result"] in {"pass", "skipped"} else 1
non_error_results = {
"pass",
"skipped",
"warning",
"expected_gap",
"unsupported_by_design",
}
return 0 if result["result"] in non_error_results else 1
def run_console_adapter(args: argparse.Namespace) -> dict[str, Any]:
@@ -157,14 +173,16 @@ def run_console_adapter(args: argparse.Namespace) -> dict[str, Any]:
]
)
cases = _cases_from_console_output(completed.stdout)
if completed.returncode == 0 and not any(case["status"] == "fail" for case in cases):
cases = parse_text_report(completed.stdout, args.check_group, group_classes)
if cases:
status = aggregate_case_result(result_counts(cases), completed.returncode)
elif completed.returncode == 0:
status = "pass"
else:
status = "fail"
status = "infrastructure_error"
return _result(
status,
[f"OpenCMIS TCK ConsoleRunner exited with {completed.returncode} for {args.check_group}."],
_console_observations(completed.returncode, args.check_group, cases),
args,
group_classes,
args.run_dir,
@@ -301,26 +319,6 @@ def _maven_command(args: argparse.Namespace, session_path: Path, groups_path: Pa
]
def _cases_from_console_output(output: str) -> list[dict[str, str]]:
cases = []
for line in output.splitlines():
stripped = line.strip()
upper = stripped.upper()
if not stripped:
continue
if "UNEXPECTED_EXCEPTION" in upper:
cases.append({"id": stripped[:120], "status": "infrastructure_error", "message": stripped})
elif "FAILURE" in upper:
cases.append({"id": stripped[:120], "status": "fail", "message": stripped})
elif "WARNING" in upper:
cases.append({"id": stripped[:120], "status": "warning", "message": stripped})
elif "SKIPPED" in upper:
cases.append({"id": stripped[:120], "status": "skipped", "message": stripped})
elif "OK" in upper:
cases.append({"id": stripped[:120], "status": "pass", "message": stripped})
return cases
def _result(
status: str,
observations: list[str],
@@ -329,14 +327,12 @@ def _result(
run_dir: Path | None,
artifact_dir: Path,
artifact_refs: list[str],
cases: list[dict[str, str]] | None = None,
cases: list[dict[str, Any]] | None = None,
returncode: int | None = None,
extra_facts: dict[str, Any] | None = None,
) -> dict[str, Any]:
cases = cases or []
counts: dict[str, int] = {}
for case in cases:
counts[case["status"]] = counts.get(case["status"], 0) + 1
counts = result_counts(cases)
if not counts:
counts[status] = 1
facts = {
@@ -361,6 +357,20 @@ def _result(
}
def _console_observations(returncode: int, check_group: str, cases: list[dict[str, Any]]) -> list[str]:
if cases:
counts = result_counts(cases)
return [
f"OpenCMIS TCK ConsoleRunner exited with {returncode} for {check_group}.",
"Normalized OpenCMIS TextReport case statuses: "
+ ", ".join(f"{key}: {value}" for key, value in counts.items())
+ ".",
]
return [
f"OpenCMIS TCK ConsoleRunner exited with {returncode} for {check_group}, but no TextReport cases were parsed."
]
def _artifact_ref(path: Path, run_dir: Path | None, artifact_dir: Path) -> str:
resolved = path.resolve()
if run_dir is not None: