From 7b0302f2feed3475f908c3915ce89d9b5d423d11 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Tue, 14 Sep 2021 10:41:01 +0200 Subject: [PATCH] feat(excel-to-resources): create resources from excel (DSP-1576) (#88) * integrate script into dsp-tools * add validation and schema * add test * update test * add documentation * Update dsp-tools-usage.md * add resources module to bazel * unify docstrings * update documentation * update documentation * remove number from draft in schema reference * change schema to http://json-schema.org/draft-07/schema --- MANIFEST.in | 1 + docs/assets/images/img-resources-example.png | Bin 0 -> 56488 bytes docs/dsp-tools-create.md | 3 +- docs/dsp-tools-excel.md | 61 +++++--- docs/dsp-tools-usage.md | 64 ++++++--- docs/index.md | 31 ++-- knora/dsp_tools.py | 12 ++ knora/dsplib/utils/BUILD.bazel | 10 ++ knora/dsplib/utils/excel_to_json_resources.py | 102 ++++++++++++++ .../dsplib/utils/knora-schema-lists-only.json | 3 +- .../utils/knora-schema-resources-only.json | 132 ++++++++++++++++++ test/BUILD.bazel | 3 +- test/test_tools.py | 9 +- testdata/BUILD.bazel | 1 + testdata/Resources.xlsx | Bin 0 -> 17153 bytes 15 files changed, 371 insertions(+), 61 deletions(-) create mode 100644 docs/assets/images/img-resources-example.png create mode 100644 knora/dsplib/utils/excel_to_json_resources.py create mode 100644 knora/dsplib/utils/knora-schema-resources-only.json create mode 100644 testdata/Resources.xlsx diff --git a/MANIFEST.in b/MANIFEST.in index 4088c3b25..d97f0504b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,5 +2,6 @@ include README.md include knora/dsplib/utils/knora-schema.json include knora/dsplib/utils/knora-schema-lists.json include knora/dsplib/utils/knora-schema-lists-only.json +include knora/dsplib/utils/knora-schema-resources-only.json include knora/dsplib/utils/knora-data-schema.xsd include knora/dsplib/utils/language-codes-3b2_csv.csv diff --git a/docs/assets/images/img-resources-example.png b/docs/assets/images/img-resources-example.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0745fd53e23332109a05841d622b354e16d6a6 GIT binary patch literal 56488 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

$bk7hR;TaFgQct8*(M<P>1n>G0+~&&ORvAv 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 None: parser_excel_lists.add_argument('excelfolder', help='Path to the folder containing the Excel file(s)', default='lists') parser_excel_lists.add_argument('outfile', help='Path to the output JSON file containing the list data', default='list.json') + parser_excel_resources = subparsers.add_parser('excel2resources', help='Create a JSON file from an Excel file containing ' + 'resources for a DSP ontology. ') + parser_excel_resources.set_defaults(action='excel2resources') + parser_excel_resources.add_argument('excelfile', help='Path to the Excel file containing the resources', + default='resources.xlsx') + parser_excel_resources.add_argument('outfile', help='Path to the output JSON file containing the resource data', + default='resources.json') + args = parser.parse_args(args) if not hasattr(args, 'action'): @@ -133,6 +142,9 @@ def program(args: list) -> None: list_excel2json(listname=args.listname, excelfolder=args.excelfolder, outfile=args.outfile) + elif args.action == 'excel2resources': + resources_excel2json(excelfile=args.excelfile, + outfile=args.outfile) def main(): diff --git a/knora/dsplib/utils/BUILD.bazel b/knora/dsplib/utils/BUILD.bazel index c1ee8ae18..874eb98b9 100644 --- a/knora/dsplib/utils/BUILD.bazel +++ b/knora/dsplib/utils/BUILD.bazel @@ -14,6 +14,16 @@ py_library( ] ) +py_library( + name = "excel_to_json_resources", + visibility = ["//visibility:public"], + srcs = ["excel_to_json_resources.py"], + deps = [ + requirement("jsonschema"), + requirement("openpyxl") + ] +) + py_library( name = "expand_all_lists", visibility = ["//visibility:public"], diff --git a/knora/dsplib/utils/excel_to_json_resources.py b/knora/dsplib/utils/excel_to_json_resources.py new file mode 100644 index 000000000..4cb0bca96 --- /dev/null +++ b/knora/dsplib/utils/excel_to_json_resources.py @@ -0,0 +1,102 @@ +import json +import os + +import jsonschema +from openpyxl import load_workbook + + +def validate_resources_with_schema(json_file: str) -> bool: + """ + This function checks if the json resources are valid according to the schema. + + Args: + json_file: the json with the resources to be validated + + Returns: + True if the data passed validation, False otherwise + + """ + current_dir = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(current_dir, 'knora-schema-resources-only.json')) as schema: + resources_schema = json.load(schema) + + try: + jsonschema.validate(instance=json_file, schema=resources_schema) + except jsonschema.exceptions.ValidationError as err: + print(err) + return False + print('Resource data passed schema validation.') + return True + + +def resources_excel2json(excelfile: str, outfile: str): + """ + Converts properties described in an Excel file into a properties section which can be integrated into a DSP ontology + + Args: + excelfile: path to the Excel file containing the properties + outfile: path to the output JSON file containing the properties section for the ontology + + Returns: + None + """ + # load file + wb = load_workbook(excelfile, read_only=True) + + # get overview + sheet = wb['classes'] + resource_list = [c for c in sheet.iter_rows(min_row=2, values_only=True)] + + prefix = '"resources":' + resources = [] + # for each resource in resources overview + for res in resource_list: + # get name + name = res[0] + # get labels + labels = {} + if res[1]: + labels['en'] = res[1] + if res[2]: + labels['de'] = res[2] + if res[3]: + labels['fr'] = res[3] + if res[4]: + labels['it'] = res[4] + # get super + sup = res[5] + + # load details for this resource + sh = wb[name] + property_list = [c for c in sh.iter_rows(min_row=2, values_only=True)] + + cards = [] + # for each of the detail sheets + for i, prop in enumerate(property_list): + # get name and cardinality. + # GUI-order is equal to order in the sheet. + property_ = { + "propname": ":" + prop[0], + "cardinality": str(prop[1]), + "gui_order": i + 1 + } + cards.append(property_) + + # build resource dict + resource = { + "name": name, + "labels": labels, + "super": sup, + "cardinalities": cards + } + # append to resources list + resources.append(resource) + + if validate_resources_with_schema(json.loads(json.dumps(resources, indent=4))): + # write final list to JSON file if list passed validation + with open(file=outfile, mode='w+', encoding='utf-8') as file: + file.write(prefix) + json.dump(resources, file, indent=4) + print('Resource file was created successfully and written to file:', outfile) + else: + print('Resource data is not valid according to schema.') diff --git a/knora/dsplib/utils/knora-schema-lists-only.json b/knora/dsplib/utils/knora-schema-lists-only.json index f01b56b1a..393277a17 100644 --- a/knora/dsplib/utils/knora-schema-lists-only.json +++ b/knora/dsplib/utils/knora-schema-lists-only.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/draft-07/schema-list-only#", + "$schema": "http://json-schema.org/draft-07/schema#", "$id": "http://knora.org/pyknora/ontology/knora-schema-list-only.json", "title": "Knora JSON schema for lists only", "description": "JSON schema for lists used in Knora ontologies", @@ -48,7 +48,6 @@ "additionalProperties": false } }, - "type": "object", "properties": { "name": { diff --git a/knora/dsplib/utils/knora-schema-resources-only.json b/knora/dsplib/utils/knora-schema-resources-only.json new file mode 100644 index 000000000..41c92ab57 --- /dev/null +++ b/knora/dsplib/utils/knora-schema-resources-only.json @@ -0,0 +1,132 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://knora.org/pyknora/ontology/knora-schema-resources-only.json", + "title": "Knora JSON schema for resources only", + "description": "JSON schema for resources used in Knora ontologies", + "definitions": { + "langstring": { + "anyOf": [ + { + "type": "object", + "patternProperties": { + "^(en|de|fr|it)": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "string" + } + ] + }, + "label": { + "$ref": "#/definitions/langstring" + }, + "comment": { + "$ref": "#/definitions/langstring" + }, + "resourcedef": { + "type": [ + "string", + "array" + ], + "oneOf": [ + { + "enum": [ + "Resource", + "StillImageRepresentation", + "TextRepresentation", + "AudioRepresentation", + "DDDRepresentation", + "DocumentRepresentation", + "MovingImageRepresentation", + "Annotation", + "LinkObj", + "Region" + ] + }, + { + "pattern": "^([\\w-]*)?:(\\w+)$" + }, + { + "pattern": "^(http)(s)?://.*" + } + ], + "items": { + "$ref": "#/definitions/resourcedef" + } + }, + "resource": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "super": { + "$ref": "#/definitions/resourcedef" + }, + "labels": { + "$ref": "#/definitions/label" + }, + "comments": { + "$ref": "#/definitions/comment" + }, + "cardinalities": { + "type": "array", + "items": { + "$ref": "#/definitions/cardinality" + } + } + }, + "required": [ + "name", + "super", + "labels", + "cardinalities" + ], + "additionalProperties": false + }, + "cardinality": { + "type": "object", + "properties": { + "propname": { + "type": "string", + "oneOf": [ + { + "enum": [ + "Region", + "isPartOf", + "seqnum" + ] + }, + { + "pattern": "^(([\\w-]*)?:([\\w ]+))$" + } + ] + }, + "cardinality": { + "type": "string", + "enum": [ + "1", + "0-1", + "1-n", + "0-n" + ] + }, + "gui_order": { + "type": "integer" + } + }, + "required": [ + "propname", + "cardinality" + ], + "additionalProperties": false + } + }, + "type": "array", + "items": { + "$ref": "#/definitions/resource" + } +} diff --git a/test/BUILD.bazel b/test/BUILD.bazel index ef499ebfe..15d7c23d4 100644 --- a/test/BUILD.bazel +++ b/test/BUILD.bazel @@ -132,7 +132,8 @@ py_test( "//knora/dsplib/utils:onto_validate", "//knora/dsplib/utils:onto_create_ontology", "//knora/dsplib/utils:xml_upload", - "//knora/dsplib/utils:excel_to_json_lists" + "//knora/dsplib/utils:excel_to_json_lists", + "//knora/dsplib/utils:excel_to_json_resources" ], data = [ "//testdata:testdata", diff --git a/test/test_tools.py b/test/test_tools.py index 096cc9913..574ed126b 100644 --- a/test/test_tools.py +++ b/test/test_tools.py @@ -4,6 +4,7 @@ from knora.dsplib.utils import excel_to_json_lists from knora.dsplib.utils.excel_to_json_lists import list_excel2json +from knora.dsplib.utils.excel_to_json_resources import resources_excel2json from knora.dsplib.utils.onto_create_ontology import create_ontology from knora.dsplib.utils.onto_get import get_ontology from knora.dsplib.utils.onto_validate import validate_ontology @@ -22,6 +23,8 @@ def tearDown(self) -> None: excel_to_json_lists.cell_names = [] def test_get(self): + global other_tree_list, other_tree_list_out, not_used_list, not_used_list_out, tree_list_root, tree_list_root_out + with open('testdata/anything-onto.json') as f: onto_json_str = f.read() anything_onto = json.loads(onto_json_str) @@ -75,11 +78,15 @@ def test_get(self): # TODO fix this test # self.assertEqual(anything_onto['project']['ontologies'], anything_onto_out['project']['ontologies']) - def test_excel(self): + def test_excel_to_json_list(self): list_excel2json(listname='my_test_list', excelfolder='testdata/lists', outfile='_lists-out.json') + def test_excel_to_json_resources(self): + resources_excel2json(excelfile='testdata/Resources.xlsx', + outfile='_resources-out.json') + def test_validate_ontology(self): validate_ontology('testdata/test-onto.json') diff --git a/testdata/BUILD.bazel b/testdata/BUILD.bazel index a2a6d1caf..9c6edfd52 100644 --- a/testdata/BUILD.bazel +++ b/testdata/BUILD.bazel @@ -9,6 +9,7 @@ filegroup( visibility = ["//visibility:public"], srcs = [ "anything-onto.json", + "Resources.xlsx", "lists/description_en.xlsx", "lists/Beschreibung_de.xlsx", "test-data.xml", diff --git a/testdata/Resources.xlsx b/testdata/Resources.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8a5c21be519de2175e2e5fd6f856cf6c7e9145a3 GIT binary patch literal 17153 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 W0e`m>KtRavudnZ(i-`Z%+5ZO+dS}o8 literal 0 HcmV?d00001