Skip to content
Snippets Groups Projects
Commit 87483f68 authored by Florian Spreckelsen's avatar Florian Spreckelsen
Browse files

ENH: Implement parsing of enums

parent 34da56d4
No related branches found
No related tags found
2 merge requests!39Release 0.4.0,!33F json schema datamodel
Pipeline #20433 passed
...@@ -580,9 +580,11 @@ class JsonSchemaParser(Parser): ...@@ -580,9 +580,11 @@ class JsonSchemaParser(Parser):
for ii, elt in enumerate(model_dict): for ii, elt in enumerate(model_dict):
if "title" not in elt: 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: 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 # Check if this is a valid Json Schema
try: try:
jsonschema.Draft202012Validator.check_schema(elt) jsonschema.Draft202012Validator.check_schema(elt)
...@@ -597,7 +599,9 @@ class JsonSchemaParser(Parser): ...@@ -597,7 +599,9 @@ class JsonSchemaParser(Parser):
def _treat_element(self, elt: dict, name: str): def _treat_element(self, elt: dict, name: str):
if name in self.model: if name in self.model:
return self.model[name] 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": if "format" in elt and elt["format"] == "date-time":
# Treat datetime strings separately # Treat datetime strings separately
ent = db.Property(name=name, datatype=db.DATETIME) ent = db.Property(name=name, datatype=db.DATETIME)
...@@ -612,7 +616,8 @@ class JsonSchemaParser(Parser): ...@@ -612,7 +616,8 @@ class JsonSchemaParser(Parser):
elif elt["type"] == "object": elif elt["type"] == "object":
ent = self._treat_record_type(elt, name) ent = self._treat_record_type(elt, name)
else: 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: if "description" in elt:
ent.description = elt["description"] ent.description = elt["description"]
...@@ -637,6 +642,15 @@ class JsonSchemaParser(Parser): ...@@ -637,6 +642,15 @@ class JsonSchemaParser(Parser):
return rt 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__": if __name__ == "__main__":
model = parse_model_from_yaml('data_model.yml') model = parse_model_from_yaml('data_model.yml')
......
...@@ -141,7 +141,8 @@ def test_enum(): ...@@ -141,7 +141,8 @@ def test_enum():
assert isinstance(model["Dataset"], db.RecordType) assert isinstance(model["Dataset"], db.RecordType)
assert model["Dataset"].get_property("license") is not None 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) assert isinstance(model["license"], db.RecordType)
for name in licenses: for name in licenses:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment