diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py index 6bfe494c6e2de648323ebbfbaf6fbd36f102fc8d..aacae6fe880e229a3797d76a190a04be157e87e9 100644 --- a/src/caosadvancedtools/models/parser.py +++ b/src/caosadvancedtools/models/parser.py @@ -876,7 +876,16 @@ class JsonSchemaParser(Parser): def _treat_pattern_properties(self, pattern_elements, name_prefix=""): """Special Treatment for pattern properties: A RecordType is created for - each pattern property. + each pattern property. In case of a `type: object` PatternProperty, the + remaining properties of the JSON entry are appended to the new + RecordType; in case of an atomic type PatternProperty, a single value + Property is added to the RecordType. + + Raises + ------ + NotImplementedError + In case of patternProperties with non-object, non-atomic type, e.g., + array. """ num_patterns = len(pattern_elements) @@ -884,17 +893,32 @@ class JsonSchemaParser(Parser): returns = [] for ii, (key, element) in enumerate(pattern_elements.items()): name_suffix = f"_{ii+1}" if num_patterns > 1 else "" - name = name_prefix + "Element" + name_suffix - pattern_type = self._treat_record_type(element, name) + name = name_prefix + "Entry" + name_suffix + if element["type"] == "object": + # simple, is already an object, so can be treated like any other + # record type. + pattern_type = self._treat_record_type(element, name) + elif element["type"] in JSON_SCHEMA_ATOMIC_TYPES: + # create a property that stores the actual value of the pattern + # property. + propname = f"{name}_value" + prop = db.Property(name=propname, datatype=self._get_atomic_datatype(element)) + self.model[propname] = prop + pattern_type = db.RecordType(name=name) + pattern_type.add_property(prop) + else: + raise NotImplementedError( + "Pattern properties are currently only supported for types " + + ", ".join(JSON_SCHEMA_ATOMIC_TYPES) + ", and object.") # Add pattern property and description - pattern_type.add_property(pattern_prop) + pattern_type.add_property(pattern_prop, importance=db.OBLIGATORY) if pattern_type.description: pattern_type.description += f"\n\npattern: {key}" else: pattern_type.description = f"pattern: {key}" - model[name] = pattern_type + self.model[name] = pattern_type returns.append(pattern_type) return returns