Fix #4078. Bug in IfcTester that didn't allow certain facets to be used as applicabilities. Also canonicalise facet ordering for convenience.

This commit is contained in:
Dion Moult
2023-12-06 15:06:11 +11:00
parent 298363c175
commit a70d1ac1ca
2 changed files with 10 additions and 5 deletions
+4 -1
View File
@@ -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):
+6 -4
View File
@@ -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):