Fix #6914. Bug where HTML IDS report did not visually indicate prohibited results correctly.

This commit is contained in:
Dion Moult
2025-09-28 22:26:39 +10:00
parent cfa21b3cbf
commit de2bd3ff1a
3 changed files with 30 additions and 5 deletions
+1 -1
View File
@@ -328,7 +328,7 @@ class Specification:
for facet in self.requirements:
facet.status = False
elif self.maxOccurs == 0: # Prohibited specification
if self.applicable_entities and not self.requirements:
if self.applicable_entities:
self.status = False
def get_usage(self) -> Cardinality:
+15 -2
View File
@@ -86,7 +86,7 @@ class ResultsSpecification(TypedDict):
total_checks_pass: int
total_checks_fail: int
percent_checks_pass: ResultsPercent
required: bool
cardinality: str
applicability: list[str]
requirements: list[ResultsRequirement]
@@ -356,6 +356,13 @@ class Json(Reporter):
)
percent_checks_pass = math.floor((total_checks_pass / total_checks) * 100) if total_checks else "N/A"
if specification.minOccurs == 1 and specification.maxOccurs == "unbounded":
cardinality = "required"
elif specification.minOccurs == 0 and specification.maxOccurs == "unbounded":
cardinality = "optional"
elif specification.minOccurs == 0 and specification.maxOccurs == 0:
cardinality = "prohibited"
return ResultsSpecification(
name=specification.name,
description=specification.description,
@@ -370,7 +377,7 @@ class Json(Reporter):
total_checks_pass=total_checks_pass,
total_checks_fail=total_checks - total_checks_pass,
percent_checks_pass=percent_checks_pass,
required=specification.minOccurs != 0,
cardinality=cardinality,
applicability=applicability,
requirements=requirements,
)
@@ -435,6 +442,12 @@ class Html(Json):
def report(self) -> None:
super().report()
for spec in self.results["specifications"]:
print('checking', spec["cardinality"])
if spec["cardinality"] == "optional" and spec["total_checks"] == 0:
spec["is_skipped"] = True
spec["is_prohibited"] = spec["cardinality"] == "prohibited"
spec["cardinality"] = spec["cardinality"].capitalize()
spec["has_requirements"] = bool(spec["requirements"])
for requirement in spec["requirements"]:
total_passed_entities = len(requirement["passed_entities"])
total_failed_entities = len(requirement["failed_entities"])
+14 -2
View File
@@ -107,16 +107,26 @@
{{/instructions}}
<div class="container">
<div class="{{^total_checks}}skipped{{/total_checks}}{{#total_checks}}{{#status}}pass{{/status}}{{^status}}fail{{/status}}{{/total_checks}} percent" style="width: {{^total_checks}}100{{/total_checks}}{{#total_checks}}{{percent_checks_pass}}{{/total_checks}}%;">{{^total_checks}}Skipped{{/total_checks}}{{#total_checks}}{{percent_checks_pass}}%{{/total_checks}}</div>
<div class="
{{#is_skipped}}skipped{{/is_skipped}}
{{^is_skipped}}{{#status}}pass{{/status}}{{^status}}fail{{/status}}{{/is_skipped}}
percent" style="width: {{^total_checks}}100{{/total_checks}}{{#total_checks}}{{percent_checks_pass}}{{/total_checks}}%;">{{#is_skipped}}Skipped{{/is_skipped}}{{^is_skipped}}{{percent_checks_pass}}%{{/is_skipped}}</div>
</div>
<p>
<span class="item {{^total_checks}}skipped{{/total_checks}}{{#total_checks}}{{#status}}pass{{/status}}{{^status}}fail{{/status}}{{/total_checks}}">{{^total_checks}}Skipped{{/total_checks}}{{#total_checks}}{{#status}}Pass{{/status}}{{^status}}Fail{{/status}}{{/total_checks}}</span>
<span class="item {{#is_skipped}}skipped{{/is_skipped}}{{^is_skipped}}{{#status}}pass{{/status}}{{^status}}fail{{/status}}{{/is_skipped}}">{{#is_skipped}}Optional: Skipped{{/is_skipped}}{{^is_skipped}}{{#status}}{{cardinality}}: Pass{{/status}}{{^status}}{{cardinality}}: Fail{{/status}}{{/is_skipped}}</span>
{{#is_prohibited}}
<span class="item">
Elements matched: <strong>{{total_applicable}}</strong>
</span>
{{/is_prohibited}}
{{^is_prohibited}}
<span class="item">
Checks passed: <strong>{{total_checks_pass}}</strong> / <strong>{{total_checks}}</strong>
</span>
<span class="item">
Elements passed: <strong>{{total_applicable_pass}}</strong> / <strong>{{total_applicable}}</strong>
</span>
{{/is_prohibited}}
</p>
{{^is_ifc_version}}
<p>
@@ -135,9 +145,11 @@
<li>{{.}}</li>
{{/applicability}}
</ul>
{{#has_requirements}}
<p>
<strong>Requirements</strong>
</p>
{{/has_requirements}}
<ol>
{{#requirements}}
<li class="{{^total_checks}}skipped{{/total_checks}}{{#total_checks}}{{#status}}pass{{/status}}{{^status}}fail{{/status}}{{/total_checks}}">