From 9f8c69e394c2bb364dfd9e4d91bd90b8e3f6bb77 Mon Sep 17 00:00:00 2001
From: fspreck <f.spreckelsen@indiscale.com>
Date: Tue, 22 Mar 2022 17:23:15 +0100
Subject: [PATCH] ENH: Discard integer enums for now

---
 src/caosadvancedtools/models/parser.py        |  6 ++++
 .../datamodel_enum_prop.schema.json           |  6 ++--
 .../datamodel_int_enum_broken.schema.json     | 11 +++++++
 unittests/test_json_schema_model_parser.py    | 32 +++++++++++++++++--
 4 files changed, 49 insertions(+), 6 deletions(-)
 create mode 100644 unittests/json-schema-models/datamodel_int_enum_broken.schema.json

diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index 3bc90371..b3557c76 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -664,6 +664,12 @@ class JsonSchemaParser(Parser):
         return rt
 
     def _treat_enum(self, elt: dict, name: str):
+        if "type" in elt and elt["type"] == "integer":
+            raise NotImplementedError(
+                "Integer-enums are not allowd until "
+                "https://gitlab.indiscale.com/caosdb/src/caosdb-server/-/issues/224 "
+                "has been fixed."
+            )
         rt = db.RecordType(name=name)
         for enum_elt in elt["enum"]:
             rec = db.Record(name=self._stringify(enum_elt))
diff --git a/unittests/json-schema-models/datamodel_enum_prop.schema.json b/unittests/json-schema-models/datamodel_enum_prop.schema.json
index a764ceca..a14008d1 100644
--- a/unittests/json-schema-models/datamodel_enum_prop.schema.json
+++ b/unittests/json-schema-models/datamodel_enum_prop.schema.json
@@ -7,9 +7,9 @@
             "type": "string",
             "enum": ["CC-BY", "CC-BY-SA", "CC0", "restricted access"]
         },
-        "int_enum": {
-            "type": "integer",
-            "enum": [1, 2, 3]
+        "number_enum": {
+            "type": "number",
+            "enum": [1.1, 2.2, 3.3]
         }
     },
     "required": ["license"]
diff --git a/unittests/json-schema-models/datamodel_int_enum_broken.schema.json b/unittests/json-schema-models/datamodel_int_enum_broken.schema.json
new file mode 100644
index 00000000..159b84ac
--- /dev/null
+++ b/unittests/json-schema-models/datamodel_int_enum_broken.schema.json
@@ -0,0 +1,11 @@
+{
+    "title": "Dataset",
+    "description": "Some description",
+    "type": "object",
+    "properties": {
+        "int_enum": {
+            "type": "integer",
+            "enum": [1, 2, 3]
+        }
+    }
+}
diff --git a/unittests/test_json_schema_model_parser.py b/unittests/test_json_schema_model_parser.py
index 7ae92bfd..ed0b48ce 100644
--- a/unittests/test_json_schema_model_parser.py
+++ b/unittests/test_json_schema_model_parser.py
@@ -158,15 +158,41 @@ def test_enum():
         assert model[name].has_parent(model["license"])
 
     # Also allow enums with non-string types
+    number_enums = ["1.1", "2.2", "3.3"]
+    for name in ["number_enum"] + number_enums:
+        assert name in model
+
+    assert isinstance(model["number_enum"], db.RecordType)
+    assert model["Dataset"].get_property("number_enum") is not None
+    assert model["Dataset"].get_property("number_enum").is_reference()
+    assert model["Dataset"].get_property(
+        "number_enum").datatype.name == "number_enum"
+
+    for name in number_enums:
+        assert isinstance(model[name], db.Record)
+        assert model[name].name == name
+        assert len(model[name].parents) == 1
+        assert model[name].has_parent(model["number_enum"])
+
+
+@pytest.mark.xfail(reason="Don't allow integer enums until https://gitlab.indiscale.com/caosdb/src/caosdb-server/-/issues/224 has been fixed")
+def test_int_enum():
+    """Check an enum property with type: integer"""
+    # @author Florian Spreckelsen
+    # @date 2022-03-22
+
+    model = parse_model_from_json_schema(os.path.join(
+        FILEPATH, "datamodel_int_enum_broken.schema.json"))
     int_enums = ["1", "2", "3"]
-    for name in ["int_enum"] + int_enums:
+    for name in ["Dataset", "int_enum"] + int_enums:
         assert name in model
 
-    assert isinstance(model["int_enum"], db.RecordType)
+    assert isinstance(model["Dataset"], db.RecordType)
     assert model["Dataset"].get_property("int_enum") is not None
-    assert model["Dataset"].get_property("int_enum").is_reference()
+    assert model["Dataset"].get_property("int_enum").is_reference
     assert model["Dataset"].get_property(
         "int_enum").datatype.name == "int_enum"
+    assert isinstance(model["int_enum"], db.RecordType)
 
     for name in int_enums:
         assert isinstance(model[name], db.Record)
-- 
GitLab