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