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

DRAFT: Begin json schema exporter

parent 5c8e6ff2
No related branches found
No related tags found
2 merge requests!89ENH: JsonSchemaExporter accepts do_not_create parameter.,!80F simple schema export
#!/usr/bin/env python
# encoding: utf-8
#
# This file is a part of the CaosDB Project.
#
# Copyright (C) 2023 Indiscale GmbH <info@indiscale.com>
# Copyright (C) 2023 Florian Spreckelsen <f.spreckelsen@indiscale.com>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <https://www.gnu.org/licenses/>.
#
import json
import linkahead as db
def _make_required_list(rt: db.RecordType):
"""Return the list of names of properties with importance db.OBLIGATORY."""
required = []
for prop in rt.properties:
importance = rt.get_importance(prop.name)
if importance == db.OBLIGATORY:
required.append(prop.name)
return required
def _make_text_property(description="", text_format=None, text_pattern=None):
prop = {
"type": "string"
}
if description:
prop["description"] = description
if text_format is not None:
prop["format"] = text_format
if text_pattern is not None:
prop["pattern"] = text_pattern
return prop
def recordtype_to_json_schema(rt: db.RecordType, additional_properties: bool = True,
name_and_description_in_properties: bool = True):
"""Create a jsonschema from a given RecordType that can be used, e.g., to
validate a json specifying a record of the given type.
Parameters
----------
rt : RecordType
The RecordType from which a json schema will be created.
additional_properties : bool, optional
Whether additional propeties will be admitted in the resulting
schema. Optional, default is True.
name_and_description_in_properties : bool, optional
Whether to include name and description in the `properties` section of
the schema to be exported. Optional, default is True.
Returns
-------
schema : dict
A dict containing the json schema created from the given RecordType's properties.
"""
schema = {
"$schema": "https://json-schema.org/draft/2019-09/schema",
"type": "object"
}
if rt.name:
schema["title"] = rt.name
if rt.description:
schema["description"] = rt.description
schema["required"] = _make_required_list(rt)
schema["additionalProperties"] = additional_properties
props = {}
if name_and_description_in_properties:
props["name"] = _make_text_property("The name of the Record to be created")
props["description"] = _make_text_property("The description of the Record to be created")
schema["properties"] = props
return schema
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