dashboard: Add a page for each implementation (#159)

This commit is contained in:
2022-04-14 19:56:06 +02:00
committed by GitHub
parent 778510e021
commit 2cd5fc1dca
2 changed files with 76 additions and 12 deletions

View File

@ -131,6 +131,24 @@ def append_docstring(element: ET.Element, obj: object) -> None:
element.append(rst_to_element(obj.__doc__)) element.append(rst_to_element(obj.__doc__))
def build_job_html(job: str, results: List[CaseResult]) -> ET.Element:
jobs = sorted({result.job for result in results})
root = ET.Element("html")
head = ET.SubElement(root, "head")
ET.SubElement(head, "title").text = job
ET.SubElement(head, "link", rel="stylesheet", type="text/css", href="./style.css")
body = ET.SubElement(root, "body")
ET.SubElement(body, "h1").text = job
table = build_test_table(jobs, results)
table.set("class", "job-results test-matrix")
body.append(table)
return root
def build_module_html( def build_module_html(
jobs: List[str], results: List[CaseResult], module_name: str jobs: List[str], results: List[CaseResult], module_name: str
) -> ET.Element: ) -> ET.Element:
@ -147,10 +165,19 @@ def build_module_html(
append_docstring(body, module) append_docstring(body, module)
results_by_class = group_by(results, lambda r: r.class_name) table = build_test_table(jobs, results)
table.set("class", "module-results test-matrix")
body.append(table)
table = ET.SubElement(body, "table") return root
table.set("class", "test-matrix")
def build_test_table(jobs: List[str], results: List[CaseResult]) -> ET.Element:
results_by_module_and_class = group_by(
results, lambda r: (r.module_name, r.class_name)
)
table = ET.Element("table")
job_row = ET.Element("tr") job_row = ET.Element("tr")
ET.SubElement(job_row, "th") # column of case name ET.SubElement(job_row, "th") # column of case name
@ -159,7 +186,11 @@ def build_module_html(
ET.SubElement(ET.SubElement(cell, "div"), "span").text = job ET.SubElement(ET.SubElement(cell, "div"), "span").text = job
cell.set("class", "job-name") cell.set("class", "job-name")
for (class_name, class_results) in sorted(results_by_class.items()): for ((module_name, class_name), class_results) in sorted(
results_by_module_and_class.items()
):
module = importlib.import_module(module_name)
# Header row: class name # Header row: class name
header_row = ET.SubElement(table, "tr") header_row = ET.SubElement(table, "tr")
th = ET.SubElement(header_row, "th", colspan=str(len(jobs) + 1)) th = ET.SubElement(header_row, "th", colspan=str(len(jobs) + 1))
@ -237,12 +268,12 @@ def build_module_html(
if result.message: if result.message:
cell.set("title", result.message) cell.set("title", result.message)
return root return table
def write_html_pages( def write_html_pages(
output_dir: Path, results: List[CaseResult] output_dir: Path, results: List[CaseResult]
) -> List[Tuple[str, str]]: ) -> List[Tuple[str, str, str]]:
"""Returns the list of (module_name, file_name).""" """Returns the list of (module_name, file_name)."""
output_dir.mkdir(parents=True, exist_ok=True) output_dir.mkdir(parents=True, exist_ok=True)
results_by_module = group_by(results, lambda r: r.module_name) results_by_module = group_by(results, lambda r: r.module_name)
@ -285,7 +316,19 @@ def write_html_pages(
root = build_module_html(module_jobs, module_results, module_name) root = build_module_html(module_jobs, module_results, module_name)
file_name = f"{module_name}.xhtml" file_name = f"{module_name}.xhtml"
write_xml_file(output_dir / file_name, root) write_xml_file(output_dir / file_name, root)
pages.append((module_name, file_name)) pages.append(("module", module_name, file_name))
for category in ("server", "client"):
for job in [job for job in job_categories if job_categories[job] == category]:
job_results = [
result
for result in results
if result.job == job or result.job.startswith(job + "-")
]
root = build_job_html(job, job_results)
file_name = f"{job}.xhtml"
write_xml_file(output_dir / file_name, root)
pages.append(("job", job, file_name))
return pages return pages
@ -300,7 +343,7 @@ def write_test_outputs(output_dir: Path, results: List[CaseResult]) -> None:
fd.write(result.system_out) fd.write(result.system_out)
def write_html_index(output_dir: Path, pages: List[Tuple[str, str]]) -> None: def write_html_index(output_dir: Path, pages: List[Tuple[str, str, str]]) -> None:
root = ET.Element("html") root = ET.Element("html")
head = ET.SubElement(root, "head") head = ET.SubElement(root, "head")
ET.SubElement(head, "title").text = "irctest dashboard" ET.SubElement(head, "title").text = "irctest dashboard"
@ -310,16 +353,37 @@ def write_html_index(output_dir: Path, pages: List[Tuple[str, str]]) -> None:
ET.SubElement(body, "h1").text = "irctest dashboard" ET.SubElement(body, "h1").text = "irctest dashboard"
module_pages = []
job_pages = []
for (page_type, title, file_name) in sorted(pages):
if page_type == "module":
module_pages.append((title, file_name))
elif page_type == "job":
job_pages.append((title, file_name))
else:
assert False, page_type
ET.SubElement(body, "h2").text = "Tests by command/specification"
dl = ET.SubElement(body, "dl") dl = ET.SubElement(body, "dl")
dl.set("class", "module-index") dl.set("class", "module-index")
for (module_name, file_name) in sorted(pages): for (module_name, file_name) in sorted(module_pages):
module = importlib.import_module(module_name) module = importlib.import_module(module_name)
link = ET.SubElement(ET.SubElement(dl, "dt"), "a", href=f"./{file_name}") link = ET.SubElement(ET.SubElement(dl, "dt"), "a", href=f"./{file_name}")
link.text = module_name link.text = module_name
append_docstring(ET.SubElement(dl, "dd"), module) append_docstring(ET.SubElement(dl, "dd"), module)
ET.SubElement(body, "h2").text = "Tests by implementation"
ul = ET.SubElement(body, "ul")
ul.set("class", "job-index")
for (job, file_name) in sorted(job_pages):
link = ET.SubElement(ET.SubElement(ul, "li"), "a", href=f"./{file_name}")
link.text = job
write_xml_file(output_dir / "index.xhtml", root) write_xml_file(output_dir / "index.xhtml", root)

View File

@ -51,17 +51,17 @@ table.test-matrix .expected-failure {
} }
/* Rotate headers, thanks to https://css-tricks.com/rotated-table-column-headers/ */ /* Rotate headers, thanks to https://css-tricks.com/rotated-table-column-headers/ */
th.job-name { table.module-results th.job-name {
height: 140px; height: 140px;
white-space: nowrap; white-space: nowrap;
} }
th.job-name > div { table.module-results th.job-name > div {
transform: transform:
translate(28px, 50px) translate(28px, 50px)
rotate(315deg); rotate(315deg);
width: 40px; width: 40px;
} }
th.job-name > div > span { table.module-results th.job-name > div > span {
border-bottom: 1px solid grey; border-bottom: 1px solid grey;
padding-left: 0px; padding-left: 0px;
} }