From 051ce4b63bee39d40b3b74b2d1a9181628732557 Mon Sep 17 00:00:00 2001 From: fspreck <f.spreckelsen@indiscale.com> Date: Thu, 11 May 2023 17:27:28 +0200 Subject: [PATCH] ENH: Add treatment for null types --- src/caosadvancedtools/models/parser.py | 10 +++++++++- .../datamodel_atomic_properties.schema.json | 3 ++- unittests/test_json_schema_model_parser.py | 5 ++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py index a0da3b24..d806e825 100644 --- a/src/caosadvancedtools/models/parser.py +++ b/src/caosadvancedtools/models/parser.py @@ -77,7 +77,8 @@ JSON_SCHEMA_ATOMIC_TYPES = [ "string", "boolean", "integer", - "number" + "number", + "null" ] @@ -726,6 +727,10 @@ class JsonSchemaParser(Parser): return db.DOUBLE elif elt["type"] == "boolean": return db.BOOLEAN + elif elt["type"] == "null": + # This could be any datatype since a valid json will never have a + # value in a null property. We use TEXT for convenience. + return db.TEXT else: raise JsonSchemaDefinitionError(f"Unkown atomic type in {elt}.") @@ -761,6 +766,9 @@ class JsonSchemaParser(Parser): ent = self._treat_record_type(elt, name) elif elt["type"] == "array": ent, force_list = self._treat_list(elt, name) + elif elt["type"] == "null": + # null + return None, force_list else: raise NotImplementedError( f"Cannot parse items of type '{elt['type']}' (yet).") diff --git a/unittests/json-schema-models/datamodel_atomic_properties.schema.json b/unittests/json-schema-models/datamodel_atomic_properties.schema.json index 3828f131..7b4a23e5 100644 --- a/unittests/json-schema-models/datamodel_atomic_properties.schema.json +++ b/unittests/json-schema-models/datamodel_atomic_properties.schema.json @@ -18,7 +18,8 @@ "date": { "type": "string", "format": "date" }, "integer": { "type": "integer", "description": "Some integer property" }, "boolean": { "type": "boolean" }, - "number_prop": { "type": "number", "description": "Some float property" } + "number_prop": { "type": "number", "description": "Some float property" }, + "null_prop": { "type": "null", "description": "This property will never have a value." } } } ] diff --git a/unittests/test_json_schema_model_parser.py b/unittests/test_json_schema_model_parser.py index ae5ed5a5..90517ebd 100644 --- a/unittests/test_json_schema_model_parser.py +++ b/unittests/test_json_schema_model_parser.py @@ -103,7 +103,7 @@ def test_datamodel_with_atomic_properties(): assert isinstance(rt2, db.RecordType) assert rt2.name == "Dataset2" assert not rt2.description - assert len(rt2.get_properties()) == 5 + assert len(rt2.get_properties()) == 6 date_prop = rt2.get_property("date") assert date_prop.datatype == db.DATETIME @@ -121,6 +121,9 @@ def test_datamodel_with_atomic_properties(): float_prop2 = rt2.get_property("number_prop") assert float_prop.datatype == float_prop2.datatype + null_prop = rt2.get_property("null_prop") + assert null_prop.datatype == db.TEXT + def test_required_no_list(): """Exception must be raised when "required" is not a list.""" -- GitLab