From 87483f68983c032138fd0faa2b8c29b058ba7bb2 Mon Sep 17 00:00:00 2001 From: fspreck <f.spreckelsen@indiscale.com> Date: Wed, 16 Mar 2022 18:49:31 +0100 Subject: [PATCH] ENH: Implement parsing of enums --- src/caosadvancedtools/models/parser.py | 22 ++++++++++++++++++---- unittests/test_json_schema_model_parser.py | 3 ++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py index 37981f8a..b9be9ce2 100644 --- a/src/caosadvancedtools/models/parser.py +++ b/src/caosadvancedtools/models/parser.py @@ -580,9 +580,11 @@ class JsonSchemaParser(Parser): for ii, elt in enumerate(model_dict): if "title" not in elt: - raise JsonSchemaDefinitionError(f"Object {ii+1} is lacking the `title` key word") + raise JsonSchemaDefinitionError( + f"Object {ii+1} is lacking the `title` key word") if "type" not in elt: - raise JsonSchemaDefinitionError(f"Object {ii+1} is lacking the `type` key word") + raise JsonSchemaDefinitionError( + f"Object {ii+1} is lacking the `type` key word") # Check if this is a valid Json Schema try: jsonschema.Draft202012Validator.check_schema(elt) @@ -597,7 +599,9 @@ class JsonSchemaParser(Parser): def _treat_element(self, elt: dict, name: str): if name in self.model: return self.model[name] - if elt["type"] == "string": + if "enum" in elt: + ent = self._treat_enum(elt, name) + elif elt["type"] == "string": if "format" in elt and elt["format"] == "date-time": # Treat datetime strings separately ent = db.Property(name=name, datatype=db.DATETIME) @@ -612,7 +616,8 @@ class JsonSchemaParser(Parser): elif elt["type"] == "object": ent = self._treat_record_type(elt, name) else: - raise NotImplementedError(f"Cannot parse items of type '{elt['type']}' (yet).") + raise NotImplementedError( + f"Cannot parse items of type '{elt['type']}' (yet).") if "description" in elt: ent.description = elt["description"] @@ -637,6 +642,15 @@ class JsonSchemaParser(Parser): return rt + def _treat_enum(self, elt: dict, name: str): + rt = db.RecordType(name=name) + for enum_elt in elt["enum"]: + rec = db.Record(name=enum_elt) + rec.add_parent(rt) + self.model[enum_elt] = rec + + return rt + if __name__ == "__main__": model = parse_model_from_yaml('data_model.yml') diff --git a/unittests/test_json_schema_model_parser.py b/unittests/test_json_schema_model_parser.py index 85cb82c0..b432af5c 100644 --- a/unittests/test_json_schema_model_parser.py +++ b/unittests/test_json_schema_model_parser.py @@ -141,7 +141,8 @@ def test_enum(): assert isinstance(model["Dataset"], db.RecordType) assert model["Dataset"].get_property("license") is not None - assert model["Dataset"].get_property("license").datatype == "license" + assert model["Dataset"].get_property("license").is_reference() + assert model["Dataset"].get_property("license").datatype.name == "license" assert isinstance(model["license"], db.RecordType) for name in licenses: -- GitLab