From ff4eddf38a1ebecc2080b2fd1b0a70b27283f35e Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 6 Dec 2023 15:06:11 +1100 Subject: [PATCH] Fix #4078. Bug in IfcTester that didn't allow certain facets to be used as applicabilities. Also canonicalise facet ordering for convenience. --- src/ifctester/ifctester/facet.py | 5 ++++- src/ifctester/ifctester/ids.py | 10 ++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/ifctester/ifctester/facet.py b/src/ifctester/ifctester/facet.py index 29e767825b..9fdff87470 100644 --- a/src/ifctester/ifctester/facet.py +++ b/src/ifctester/ifctester/facet.py @@ -60,12 +60,15 @@ class Facet: for i, name in enumerate(self.parameters): setattr(self, name.replace("@", ""), parameters[i]) - def asdict(self): + def asdict(self, clause_type): results = {} for name in self.parameters: value = getattr(self, name.replace("@", "")) if value is not None: results[name] = value if "@" in name else self.to_ids_value(value) + if clause_type == "applicability": + for key in ["@uri", "@instructions", "@minOccurs", "@maxOccurs"]: + results.pop(key, None) return results def parse(self, xml): diff --git a/src/ifctester/ifctester/ids.py b/src/ifctester/ifctester/ids.py index 4355ce7fc6..0851e8f9c4 100644 --- a/src/ifctester/ifctester/ids.py +++ b/src/ifctester/ifctester/ids.py @@ -168,13 +168,15 @@ class Specification: clause = getattr(self, clause_type) if not clause: continue + facets = {} for facet in clause: facet_type = type(facet).__name__ facet_type = facet_type[0].lower() + facet_type[1:] - if facet_type in results[clause_type]: - results[clause_type][facet_type].append(facet.asdict()) - else: - results[clause_type][facet_type] = [facet.asdict()] + facets.setdefault(facet_type, []).append(facet.asdict(clause_type)) + # Canonicalise ordering as per XSD requirements + for facet_type in ("entity", "partOf", "classification", "attribute", "property", "material"): + if facet_type in facets: + results[clause_type][facet_type] = facets[facet_type] return results def parse(self, ids_dict):