mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 10:11:46 +00:00
IfcTester now groups results by types to make long failure lists more useful
This commit is contained in:
@@ -110,8 +110,8 @@ ResultsEntity = TypedDict(
|
|||||||
"ResultsEntity",
|
"ResultsEntity",
|
||||||
{
|
{
|
||||||
"reason": str,
|
"reason": str,
|
||||||
"element": str,
|
"element": ifcopenshell.entity_instance,
|
||||||
"element_type": str,
|
"element_type": Union[ifcopenshell.entity_instance, None],
|
||||||
"class": str,
|
"class": str,
|
||||||
"predefined_type": str,
|
"predefined_type": str,
|
||||||
"name": Union[str, None],
|
"name": Union[str, None],
|
||||||
@@ -428,23 +428,60 @@ class Json(Reporter):
|
|||||||
|
|
||||||
class Html(Json):
|
class Html(Json):
|
||||||
def __init__(self, ids: Ids):
|
def __init__(self, ids: Ids):
|
||||||
|
self.entity_limit = 100
|
||||||
super().__init__(ids)
|
super().__init__(ids)
|
||||||
|
|
||||||
def report(self) -> None:
|
def report(self) -> None:
|
||||||
super().report()
|
super().report()
|
||||||
entity_limit = 100
|
|
||||||
for spec in self.results["specifications"]:
|
for spec in self.results["specifications"]:
|
||||||
for requirement in spec["requirements"]:
|
for requirement in spec["requirements"]:
|
||||||
total_passed_entities = len(requirement["passed_entities"])
|
total_passed_entities = len(requirement["passed_entities"])
|
||||||
total_failed_entities = len(requirement["failed_entities"])
|
total_failed_entities = len(requirement["failed_entities"])
|
||||||
requirement["passed_entities"] = requirement["passed_entities"][0:entity_limit]
|
requirement["passed_entities"] = self.limit_entities(requirement["passed_entities"])
|
||||||
requirement["failed_entities"] = requirement["failed_entities"][0:entity_limit]
|
requirement["failed_entities"] = self.limit_entities(requirement["failed_entities"])
|
||||||
requirement["total_failed_entities"] = total_failed_entities
|
requirement["total_failed_entities"] = total_failed_entities
|
||||||
requirement["total_omitted_failures"] = total_failed_entities - entity_limit
|
requirement["total_omitted_failures"] = total_failed_entities - self.entity_limit
|
||||||
requirement["has_omitted_failures"] = total_failed_entities > entity_limit
|
requirement["has_omitted_failures"] = total_failed_entities > self.entity_limit
|
||||||
requirement["total_passed_entities"] = total_passed_entities
|
requirement["total_passed_entities"] = total_passed_entities
|
||||||
requirement["total_omitted_passes"] = total_passed_entities - entity_limit
|
requirement["total_omitted_passes"] = total_passed_entities - self.entity_limit
|
||||||
requirement["has_omitted_passes"] = total_passed_entities > 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:
|
def to_string(self) -> str:
|
||||||
import pystache
|
import pystache
|
||||||
|
|||||||
@@ -167,6 +167,11 @@
|
|||||||
<td>{{global_id}}</td>
|
<td>{{global_id}}</td>
|
||||||
<td>{{tag}}</td>
|
<td>{{tag}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{{#extra_of_type}}
|
||||||
|
<tr>
|
||||||
|
<td colspan="7">... {{extra_of_type}} more of the same element type ({{type_name}} with Tag {{type_tag}} and GlobalId {{type_global_id}}) not shown ...</td>
|
||||||
|
</tr>
|
||||||
|
{{/extra_of_type}}
|
||||||
{{/passed_entities}}
|
{{/passed_entities}}
|
||||||
{{#has_omitted_passes}}
|
{{#has_omitted_passes}}
|
||||||
<tr>
|
<tr>
|
||||||
@@ -200,6 +205,11 @@
|
|||||||
<td>{{global_id}}</td>
|
<td>{{global_id}}</td>
|
||||||
<td>{{tag}}</td>
|
<td>{{tag}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{{#extra_of_type}}
|
||||||
|
<tr>
|
||||||
|
<td colspan="7">... {{extra_of_type}} more of the same element type ({{type_name}} with Tag {{type_tag}} and GlobalId {{type_global_id}}) not shown ...</td>
|
||||||
|
</tr>
|
||||||
|
{{/extra_of_type}}
|
||||||
{{/failed_entities}}
|
{{/failed_entities}}
|
||||||
{{#has_omitted_failures}}
|
{{#has_omitted_failures}}
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
Reference in New Issue
Block a user