Skip to content
Snippets Groups Projects
Commit ed5695e0 authored by Daniel Hornung's avatar Daniel Hornung
Browse files

Merge branch 'f-name-in-json-schema' into 'dev'

ENH: Special treatment for name property

See merge request !42
parents 7833754c ab8bdd9f
No related branches found
No related tags found
2 merge requests!43REL: Release 0.4.1,!42ENH: Special treatment for name property
Pipeline #22436 passed
......@@ -10,6 +10,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ###
- `JsonSchemaParser` now identifies `name` properties in the schema with the
CaosDB name property.
### Deprecated ###
### Removed ###
......
......@@ -566,9 +566,11 @@ class Parser(object):
db.BOOLEAN]:
if is_list:
value.datatype = db.LIST(db.__getattribute__(dtype)) # pylint: disable=no-member
value.datatype = db.LIST(db.__getattribute__( # pylint: disable=no-member
dtype))
else:
value.datatype = db.__getattribute__(dtype) # pylint: disable=no-member
value.datatype = db.__getattribute__( # pylint: disable=no-member
dtype)
continue
......@@ -632,8 +634,9 @@ class JsonSchemaParser(Parser):
return self._create_model_from_dict(model_dict)
def _create_model_from_dict(self, model_dict: [dict, List[dict]]):
"""Parse a dictionary read in from the model definition in a json schema and
return the Datamodel created from it.
"""Parse a dictionary and return the Datamodel created from it.
The dictionary was typically created from the model definition in a json schema file.
Parameters
----------
......@@ -692,6 +695,15 @@ class JsonSchemaParser(Parser):
# Each element must have a specific type
raise JsonSchemaDefinitionError(
f"`type` is missing in element {name}.")
if name == "name":
# This is identified with the CaosDB name property as long as the
# type is correct.
if not elt["type"] == "string":
raise JsonSchemaDefinitionError(
"The 'name' property must be string-typed, otherwise it cannot "
"be identified with CaosDB's name property."
)
return None, force_list
if "enum" in elt:
ent = self._treat_enum(elt, name)
elif elt["type"] in JSON_SCHEMA_ATOMIC_TYPES:
......@@ -726,6 +738,10 @@ class JsonSchemaParser(Parser):
else:
name = self._stringify(key)
prop_ent, force_list = self._treat_element(prop, name)
if prop_ent is None:
# Nothing to be appended since the property has to be
# treated specially.
continue
importance = db.OBLIGATORY if key in required else db.RECOMMENDED
if not force_list:
rt.add_property(prop_ent, importance=importance)
......
{
"title": "Dataset",
"type": "object",
"properties": {
"name": { "type": "string", "description": "Name of this dataset" },
"date_time": { "type": "string", "format": "date-time" },
"date": { "type": "string", "format": "date" },
"integer": { "type": "integer", "description": "Some integer property" },
"boolean": { "type": "boolean" },
"number_prop": { "type": "number", "description": "Some float property" }
}
}
{
"title": "Dataset",
"type": "object",
"properties": {
"name": { "type": "boolean", "description": "Name of this dataset" },
"date_time": { "type": "string", "format": "date-time" },
"date": { "type": "string", "format": "date" },
"integer": { "type": "integer", "description": "Some integer property" },
"boolean": { "type": "boolean" },
"number_prop": { "type": "number", "description": "Some float property" }
}
}
......@@ -340,3 +340,19 @@ def test_list():
assert model[name].name == name
assert len(model[name].parents) == 1
assert model[name].has_parent(model["license"])
def test_name_property():
model = parse_model_from_json_schema(os.path.join(
FILEPATH, "datamodel_name.schema.json"))
dataset_rt = model["Dataset"]
assert dataset_rt.get_property("name") is None
assert "name" not in model
with pytest.raises(JsonSchemaDefinitionError) as err:
broken = parse_model_from_json_schema(os.path.join(
FILEPATH, "datamodel_name_wrong_type.schema.json"))
assert str(err.value).startswith(
"The 'name' property must be string-typed, otherwise it cannot be identified with CaosDB's "
"name property.")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment