diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py index 3bc903714f70db03c024941a70911ee7af39104c..b3557c76ed311f3323138f741a6c2e538c641135 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 a764ceca246971a2bbfa1aecab14c9c3a1f54fe1..a14008d141606368519c0caadc30b16a1dc9d16d 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 0000000000000000000000000000000000000000..159b84ac36c26325b59cdd25d2830152c4acdaaa --- /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 7ae92bfd537f027a6f132626f3dd88f0cd974ad6..ed0b48ceaa07563923867f23618eae7c5e3ad2a4 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)