From 85e022d76ecd41b0c440865395c6efb9e93d9cb1 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 2 Aug 2024 23:57:55 +1000 Subject: [PATCH] IfcTester now groups results by types to make long failure lists more useful --- src/ifctester/ifctester/reporter.py | 55 ++++++++++++++++--- src/ifctester/ifctester/templates/report.html | 10 ++++ 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/ifctester/ifctester/reporter.py b/src/ifctester/ifctester/reporter.py index d38d23a484..c6b9c0225c 100644 --- a/src/ifctester/ifctester/reporter.py +++ b/src/ifctester/ifctester/reporter.py @@ -110,8 +110,8 @@ ResultsEntity = TypedDict( "ResultsEntity", { "reason": str, - "element": str, - "element_type": str, + "element": ifcopenshell.entity_instance, + "element_type": Union[ifcopenshell.entity_instance, None], "class": str, "predefined_type": str, "name": Union[str, None], @@ -428,23 +428,60 @@ class Json(Reporter): class Html(Json): def __init__(self, ids: Ids): + self.entity_limit = 100 super().__init__(ids) def report(self) -> None: super().report() - entity_limit = 100 for spec in self.results["specifications"]: for requirement in spec["requirements"]: total_passed_entities = len(requirement["passed_entities"]) total_failed_entities = len(requirement["failed_entities"]) - requirement["passed_entities"] = requirement["passed_entities"][0:entity_limit] - requirement["failed_entities"] = requirement["failed_entities"][0:entity_limit] + requirement["passed_entities"] = self.limit_entities(requirement["passed_entities"]) + requirement["failed_entities"] = self.limit_entities(requirement["failed_entities"]) requirement["total_failed_entities"] = total_failed_entities - requirement["total_omitted_failures"] = total_failed_entities - entity_limit - requirement["has_omitted_failures"] = total_failed_entities > entity_limit + requirement["total_omitted_failures"] = total_failed_entities - self.entity_limit + requirement["has_omitted_failures"] = total_failed_entities > self.entity_limit requirement["total_passed_entities"] = total_passed_entities - requirement["total_omitted_passes"] = total_passed_entities - entity_limit - requirement["has_omitted_passes"] = total_passed_entities > entity_limit + requirement["total_omitted_passes"] = total_passed_entities - self.entity_limit + requirement["has_omitted_passes"] = total_passed_entities > self.entity_limit + + def limit_entities(self, entities): + if len(entities) > self.entity_limit: + if entities[0]["element_type"]: + return self.group_by_type(entities) + return entities[0 : self.entity_limit] + return entities + + def group_by_type(self, entities): + results = [] + group_limit = 5 + grouped_by_type = {} + [grouped_by_type.setdefault(e["element_type"], []).append(e) for e in entities] + total_entities = 0 + for element_type, entities in grouped_by_type.items(): + for i, entity in enumerate(entities): + results.append(entity) + total_entities += 1 + + if element_type and i > group_limit: + results[-1]["type_name"] = element_type.Name if element_type else "Untyped" + if element_type: + results[-1]["type_tag"] = element_type.Tag + results[-1]["type_global_id"] = element_type.GlobalId + results[-1]["extra_of_type"] = len(entities) - i + if total_entities == self.entity_limit: + return results + break + + if total_entities == self.entity_limit: + results[-1]["type_name"] = element_type.Name if element_type else "Untyped" + if element_type: + results[-1]["type_tag"] = element_type.Tag + results[-1]["type_global_id"] = element_type.GlobalId + results[-1]["extra_of_type"] = len(entities) - i + return results + return results def to_string(self) -> str: import pystache diff --git a/src/ifctester/ifctester/templates/report.html b/src/ifctester/ifctester/templates/report.html index c98e28f9e8..8cd0407172 100644 --- a/src/ifctester/ifctester/templates/report.html +++ b/src/ifctester/ifctester/templates/report.html @@ -167,6 +167,11 @@ {{global_id}} {{tag}} + {{#extra_of_type}} + + ... {{extra_of_type}} more of the same element type ({{type_name}} with Tag {{type_tag}} and GlobalId {{type_global_id}}) not shown ... + + {{/extra_of_type}} {{/passed_entities}} {{#has_omitted_passes}} @@ -200,6 +205,11 @@ {{global_id}} {{tag}} + {{#extra_of_type}} + + ... {{extra_of_type}} more of the same element type ({{type_name}} with Tag {{type_tag}} and GlobalId {{type_global_id}}) not shown ... + + {{/extra_of_type}} {{/failed_entities}} {{#has_omitted_failures}}