dsp-tools 9.1.0.post11__py3-none-any.whl → 18.3.0.post13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dsp_tools/__init__.py +4 -0
- dsp_tools/cli/args.py +36 -0
- dsp_tools/cli/call_action.py +51 -231
- dsp_tools/cli/call_action_files_only.py +101 -0
- dsp_tools/cli/call_action_with_network.py +207 -0
- dsp_tools/cli/create_parsers.py +156 -58
- dsp_tools/cli/entry_point.py +56 -26
- dsp_tools/cli/utils.py +87 -0
- dsp_tools/clients/CLAUDE.md +420 -0
- dsp_tools/clients/authentication_client.py +14 -0
- dsp_tools/clients/authentication_client_live.py +66 -0
- dsp_tools/{utils → clients}/connection.py +2 -18
- dsp_tools/clients/connection_live.py +233 -0
- dsp_tools/clients/fuseki_metrics.py +60 -0
- dsp_tools/clients/group_user_clients.py +35 -0
- dsp_tools/clients/group_user_clients_live.py +181 -0
- dsp_tools/clients/legal_info_client.py +23 -0
- dsp_tools/clients/legal_info_client_live.py +132 -0
- dsp_tools/clients/list_client.py +49 -0
- dsp_tools/clients/list_client_live.py +166 -0
- dsp_tools/clients/metadata_client.py +24 -0
- dsp_tools/clients/metadata_client_live.py +47 -0
- dsp_tools/clients/ontology_clients.py +49 -0
- dsp_tools/clients/ontology_create_client_live.py +166 -0
- dsp_tools/clients/ontology_get_client_live.py +80 -0
- dsp_tools/clients/permissions_client.py +68 -0
- dsp_tools/clients/project_client.py +16 -0
- dsp_tools/clients/project_client_live.py +66 -0
- dsp_tools/commands/create/communicate_problems.py +24 -0
- dsp_tools/commands/create/create.py +134 -0
- dsp_tools/commands/create/create_on_server/cardinalities.py +111 -0
- dsp_tools/commands/create/create_on_server/classes.py +99 -0
- dsp_tools/commands/create/create_on_server/complete_ontologies.py +116 -0
- dsp_tools/commands/create/create_on_server/default_permissions.py +134 -0
- dsp_tools/commands/create/create_on_server/group_users.py +165 -0
- dsp_tools/commands/create/create_on_server/lists.py +163 -0
- dsp_tools/commands/create/create_on_server/mappers.py +12 -0
- dsp_tools/commands/create/create_on_server/onto_utils.py +74 -0
- dsp_tools/commands/create/create_on_server/ontology.py +52 -0
- dsp_tools/commands/create/create_on_server/project.py +68 -0
- dsp_tools/commands/create/create_on_server/properties.py +119 -0
- dsp_tools/commands/create/exceptions.py +29 -0
- dsp_tools/commands/create/lists_only.py +66 -0
- dsp_tools/commands/create/models/create_problems.py +87 -0
- dsp_tools/commands/create/models/parsed_ontology.py +88 -0
- dsp_tools/commands/create/models/parsed_project.py +81 -0
- dsp_tools/commands/create/models/rdf_ontology.py +12 -0
- dsp_tools/commands/create/models/server_project_info.py +100 -0
- dsp_tools/commands/create/parsing/parse_lists.py +45 -0
- dsp_tools/commands/create/parsing/parse_ontology.py +243 -0
- dsp_tools/commands/create/parsing/parse_project.py +149 -0
- dsp_tools/commands/create/parsing/parsing_utils.py +40 -0
- dsp_tools/commands/create/project_validate.py +595 -0
- dsp_tools/commands/create/serialisation/ontology.py +119 -0
- dsp_tools/commands/create/serialisation/project.py +44 -0
- dsp_tools/commands/excel2json/CLAUDE.md +101 -0
- dsp_tools/commands/excel2json/json_header.py +57 -23
- dsp_tools/commands/excel2json/{new_lists → lists}/compliance_checks.py +26 -26
- dsp_tools/commands/excel2json/{new_lists/make_new_lists.py → lists/make_lists.py} +19 -18
- dsp_tools/commands/excel2json/{new_lists → lists}/models/input_error.py +1 -12
- dsp_tools/commands/excel2json/{new_lists → lists}/models/serialise.py +9 -5
- dsp_tools/commands/excel2json/{new_lists → lists}/utils.py +4 -4
- dsp_tools/commands/excel2json/models/input_error.py +31 -11
- dsp_tools/commands/excel2json/models/json_header.py +53 -15
- dsp_tools/commands/excel2json/models/ontology.py +4 -3
- dsp_tools/commands/excel2json/{lists.py → old_lists.py} +26 -112
- dsp_tools/commands/excel2json/project.py +78 -34
- dsp_tools/commands/excel2json/properties.py +57 -36
- dsp_tools/commands/excel2json/resources.py +32 -12
- dsp_tools/commands/excel2json/utils.py +20 -1
- dsp_tools/commands/excel2xml/__init__.py +2 -2
- dsp_tools/commands/excel2xml/excel2xml_cli.py +7 -15
- dsp_tools/commands/excel2xml/excel2xml_lib.py +138 -493
- dsp_tools/commands/excel2xml/propertyelement.py +5 -5
- dsp_tools/commands/{project → get}/get.py +29 -13
- dsp_tools/commands/get/get_permissions.py +257 -0
- dsp_tools/commands/get/get_permissions_legacy.py +89 -0
- dsp_tools/commands/{project/models → get/legacy_models}/context.py +6 -6
- dsp_tools/commands/{project/models → get/legacy_models}/group.py +5 -10
- dsp_tools/commands/{project/models → get/legacy_models}/listnode.py +5 -35
- dsp_tools/commands/{project/models → get/legacy_models}/model.py +1 -1
- dsp_tools/commands/{project/models → get/legacy_models}/ontology.py +9 -14
- dsp_tools/commands/{project/models → get/legacy_models}/project.py +13 -6
- dsp_tools/commands/{project/models → get/legacy_models}/propertyclass.py +9 -16
- dsp_tools/commands/{project/models → get/legacy_models}/resourceclass.py +8 -46
- dsp_tools/commands/{project/models → get/legacy_models}/user.py +19 -60
- dsp_tools/commands/get/models/permissions_models.py +10 -0
- dsp_tools/commands/id2iri.py +20 -10
- dsp_tools/commands/ingest_xmlupload/bulk_ingest_client.py +81 -56
- dsp_tools/commands/ingest_xmlupload/create_resources/apply_ingest_id.py +4 -10
- dsp_tools/commands/ingest_xmlupload/create_resources/upload_xml.py +97 -37
- dsp_tools/commands/ingest_xmlupload/create_resources/user_information.py +2 -2
- dsp_tools/commands/ingest_xmlupload/ingest_files/ingest_files.py +9 -10
- dsp_tools/commands/ingest_xmlupload/upload_files/filechecker.py +3 -3
- dsp_tools/commands/ingest_xmlupload/upload_files/input_error.py +2 -10
- dsp_tools/commands/ingest_xmlupload/upload_files/upload_failures.py +12 -2
- dsp_tools/commands/ingest_xmlupload/upload_files/upload_files.py +8 -9
- dsp_tools/commands/resume_xmlupload/resume_xmlupload.py +18 -18
- dsp_tools/commands/start_stack.py +126 -77
- dsp_tools/commands/update_legal/CLAUDE.md +344 -0
- dsp_tools/commands/update_legal/__init__.py +0 -0
- dsp_tools/commands/update_legal/core.py +182 -0
- dsp_tools/commands/update_legal/csv_operations.py +135 -0
- dsp_tools/commands/update_legal/models.py +87 -0
- dsp_tools/commands/update_legal/xml_operations.py +247 -0
- dsp_tools/commands/validate_data/CLAUDE.md +159 -0
- dsp_tools/commands/validate_data/__init__.py +0 -0
- dsp_tools/commands/validate_data/constants.py +59 -0
- dsp_tools/commands/validate_data/mappers.py +143 -0
- dsp_tools/commands/validate_data/models/__init__.py +0 -0
- dsp_tools/commands/validate_data/models/api_responses.py +45 -0
- dsp_tools/commands/validate_data/models/input_problems.py +119 -0
- dsp_tools/commands/validate_data/models/rdf_like_data.py +117 -0
- dsp_tools/commands/validate_data/models/validation.py +106 -0
- dsp_tools/commands/validate_data/prepare_data/__init__.py +0 -0
- dsp_tools/commands/validate_data/prepare_data/get_rdf_like_data.py +296 -0
- dsp_tools/commands/validate_data/prepare_data/make_data_graph.py +91 -0
- dsp_tools/commands/validate_data/prepare_data/prepare_data.py +184 -0
- dsp_tools/commands/validate_data/process_validation_report/__init__.py +0 -0
- dsp_tools/commands/validate_data/process_validation_report/get_user_validation_message.py +358 -0
- dsp_tools/commands/validate_data/process_validation_report/query_validation_result.py +507 -0
- dsp_tools/commands/validate_data/process_validation_report/reformat_validation_results.py +150 -0
- dsp_tools/commands/validate_data/shacl_cli_validator.py +70 -0
- dsp_tools/commands/validate_data/sparql/__init__.py +0 -0
- dsp_tools/commands/{xml_validate/sparql/resource_shacl.py → validate_data/sparql/cardinality_shacl.py} +45 -47
- dsp_tools/commands/validate_data/sparql/construct_shacl.py +92 -0
- dsp_tools/commands/validate_data/sparql/legal_info_shacl.py +36 -0
- dsp_tools/commands/validate_data/sparql/value_shacl.py +357 -0
- dsp_tools/commands/validate_data/utils.py +59 -0
- dsp_tools/commands/validate_data/validate_data.py +283 -0
- dsp_tools/commands/validate_data/validation/__init__.py +0 -0
- dsp_tools/commands/validate_data/validation/check_duplicate_files.py +55 -0
- dsp_tools/commands/validate_data/validation/check_for_unknown_classes.py +67 -0
- dsp_tools/commands/validate_data/validation/get_validation_report.py +94 -0
- dsp_tools/commands/validate_data/validation/validate_ontology.py +107 -0
- dsp_tools/commands/xmlupload/CLAUDE.md +292 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/__init__.py +0 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/constants.py +63 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/jsonld_utils.py +44 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/make_file_value.py +77 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/make_resource_and_values.py +114 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/make_values.py +262 -0
- dsp_tools/commands/xmlupload/models/bitstream_info.py +18 -0
- dsp_tools/commands/xmlupload/models/formatted_text_value.py +0 -25
- dsp_tools/commands/xmlupload/models/ingest.py +56 -70
- dsp_tools/commands/xmlupload/models/input_problems.py +6 -14
- dsp_tools/commands/xmlupload/models/lookup_models.py +21 -0
- dsp_tools/commands/xmlupload/models/permission.py +0 -39
- dsp_tools/commands/xmlupload/models/{deserialise/xmlpermission.py → permissions_parsed.py} +2 -2
- dsp_tools/commands/xmlupload/models/processed/__init__.py +0 -0
- dsp_tools/commands/xmlupload/models/processed/file_values.py +29 -0
- dsp_tools/commands/xmlupload/models/processed/res.py +27 -0
- dsp_tools/commands/xmlupload/models/processed/values.py +101 -0
- dsp_tools/commands/xmlupload/models/rdf_models.py +26 -0
- dsp_tools/commands/xmlupload/models/upload_clients.py +3 -3
- dsp_tools/commands/xmlupload/models/upload_state.py +2 -4
- dsp_tools/commands/xmlupload/prepare_xml_input/__init__.py +0 -0
- dsp_tools/commands/xmlupload/{ark2iri.py → prepare_xml_input/ark2iri.py} +1 -1
- dsp_tools/commands/xmlupload/prepare_xml_input/get_processed_resources.py +252 -0
- dsp_tools/commands/xmlupload/{iiif_uri_validator.py → prepare_xml_input/iiif_uri_validator.py} +2 -14
- dsp_tools/commands/xmlupload/{list_client.py → prepare_xml_input/list_client.py} +15 -10
- dsp_tools/commands/xmlupload/prepare_xml_input/prepare_xml_input.py +67 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/read_validate_xml_file.py +58 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/transform_input_values.py +118 -0
- dsp_tools/commands/xmlupload/resource_create_client.py +7 -468
- dsp_tools/commands/xmlupload/richtext_id2iri.py +37 -0
- dsp_tools/commands/xmlupload/stash/{construct_and_analyze_graph.py → analyse_circular_reference_graph.py} +64 -157
- dsp_tools/commands/xmlupload/stash/create_info_for_graph.py +53 -0
- dsp_tools/commands/xmlupload/stash/graph_models.py +13 -8
- dsp_tools/commands/xmlupload/stash/stash_circular_references.py +48 -115
- dsp_tools/commands/xmlupload/stash/stash_models.py +4 -9
- dsp_tools/commands/xmlupload/stash/upload_stashed_resptr_props.py +34 -40
- dsp_tools/commands/xmlupload/stash/upload_stashed_xml_texts.py +98 -108
- dsp_tools/commands/xmlupload/upload_config.py +8 -0
- dsp_tools/commands/xmlupload/write_diagnostic_info.py +14 -9
- dsp_tools/commands/xmlupload/xmlupload.py +214 -192
- dsp_tools/config/__init__.py +0 -0
- dsp_tools/config/logger_config.py +69 -0
- dsp_tools/{utils → config}/warnings_config.py +4 -1
- dsp_tools/error/__init__.py +0 -0
- dsp_tools/error/custom_warnings.py +39 -0
- dsp_tools/error/exceptions.py +204 -0
- dsp_tools/error/problems.py +10 -0
- dsp_tools/error/xmllib_errors.py +20 -0
- dsp_tools/error/xmllib_warnings.py +54 -0
- dsp_tools/error/xmllib_warnings_util.py +159 -0
- dsp_tools/error/xsd_validation_error_msg.py +19 -0
- dsp_tools/legacy_models/__init__.py +0 -0
- dsp_tools/{models → legacy_models}/datetimestamp.py +7 -7
- dsp_tools/{models → legacy_models}/langstring.py +1 -1
- dsp_tools/{models → legacy_models}/projectContext.py +4 -4
- dsp_tools/resources/schema/data.xsd +108 -83
- dsp_tools/resources/schema/lists-only.json +4 -23
- dsp_tools/resources/schema/project.json +80 -35
- dsp_tools/resources/schema/properties-only.json +1 -4
- dsp_tools/resources/start-stack/docker-compose.override-host.j2 +11 -0
- dsp_tools/resources/start-stack/docker-compose.yml +34 -30
- dsp_tools/resources/start-stack/dsp-app-config.json +45 -0
- dsp_tools/resources/start-stack/dsp-app-config.override-host.j2 +26 -0
- dsp_tools/resources/validate_data/api-shapes-resource-cardinalities.ttl +191 -0
- dsp_tools/resources/validate_data/api-shapes.ttl +804 -0
- dsp_tools/resources/validate_data/shacl-cli-image.yml +4 -0
- dsp_tools/resources/validate_data/validate-ontology.ttl +99 -0
- dsp_tools/utils/ansi_colors.py +32 -0
- dsp_tools/utils/data_formats/__init__.py +0 -0
- dsp_tools/utils/{date_util.py → data_formats/date_util.py} +13 -1
- dsp_tools/utils/data_formats/iri_util.py +30 -0
- dsp_tools/utils/{shared.py → data_formats/shared.py} +1 -35
- dsp_tools/utils/{uri_util.py → data_formats/uri_util.py} +12 -2
- dsp_tools/utils/fuseki_bloating.py +63 -0
- dsp_tools/utils/json_parsing.py +22 -0
- dsp_tools/utils/rdf_constants.py +42 -0
- dsp_tools/utils/rdflib_utils.py +10 -0
- dsp_tools/utils/replace_id_with_iri.py +66 -0
- dsp_tools/utils/request_utils.py +238 -0
- dsp_tools/utils/xml_parsing/__init__.py +0 -0
- dsp_tools/utils/xml_parsing/get_lookups.py +32 -0
- dsp_tools/utils/xml_parsing/get_parsed_resources.py +325 -0
- dsp_tools/utils/xml_parsing/models/__init__.py +0 -0
- dsp_tools/utils/xml_parsing/models/parsed_resource.py +76 -0
- dsp_tools/utils/xml_parsing/parse_clean_validate_xml.py +137 -0
- dsp_tools/xmllib/CLAUDE.md +302 -0
- dsp_tools/xmllib/__init__.py +49 -0
- dsp_tools/xmllib/general_functions.py +877 -0
- dsp_tools/xmllib/internal/__init__.py +0 -0
- dsp_tools/xmllib/internal/checkers.py +162 -0
- dsp_tools/xmllib/internal/circumvent_circular_imports.py +36 -0
- dsp_tools/xmllib/internal/constants.py +46 -0
- dsp_tools/xmllib/internal/input_converters.py +155 -0
- dsp_tools/xmllib/internal/serialise_file_value.py +57 -0
- dsp_tools/xmllib/internal/serialise_resource.py +177 -0
- dsp_tools/xmllib/internal/serialise_values.py +152 -0
- dsp_tools/xmllib/internal/type_aliases.py +11 -0
- dsp_tools/xmllib/models/config_options.py +28 -0
- dsp_tools/xmllib/models/date_formats.py +48 -0
- dsp_tools/xmllib/models/dsp_base_resources.py +1380 -400
- dsp_tools/xmllib/models/internal/__init__.py +0 -0
- dsp_tools/xmllib/models/internal/file_values.py +172 -0
- dsp_tools/xmllib/models/internal/geometry.py +162 -0
- dsp_tools/xmllib/models/{migration_metadata.py → internal/migration_metadata.py} +14 -10
- dsp_tools/xmllib/models/internal/serialise_permissions.py +66 -0
- dsp_tools/xmllib/models/internal/values.py +342 -0
- dsp_tools/xmllib/models/licenses/__init__.py +0 -0
- dsp_tools/xmllib/models/licenses/other.py +59 -0
- dsp_tools/xmllib/models/licenses/recommended.py +107 -0
- dsp_tools/xmllib/models/permissions.py +41 -0
- dsp_tools/xmllib/models/res.py +1782 -0
- dsp_tools/xmllib/models/root.py +313 -26
- dsp_tools/xmllib/value_checkers.py +310 -47
- dsp_tools/xmllib/value_converters.py +765 -8
- dsp_tools-18.3.0.post13.dist-info/METADATA +90 -0
- dsp_tools-18.3.0.post13.dist-info/RECORD +286 -0
- dsp_tools-18.3.0.post13.dist-info/WHEEL +4 -0
- {dsp_tools-9.1.0.post11.dist-info → dsp_tools-18.3.0.post13.dist-info}/entry_points.txt +1 -0
- dsp_tools/commands/project/create/project_create.py +0 -1107
- dsp_tools/commands/project/create/project_create_lists.py +0 -204
- dsp_tools/commands/project/create/project_validate.py +0 -453
- dsp_tools/commands/project/models/project_definition.py +0 -12
- dsp_tools/commands/rosetta.py +0 -124
- dsp_tools/commands/template.py +0 -30
- dsp_tools/commands/xml_validate/api_connection.py +0 -122
- dsp_tools/commands/xml_validate/deserialise_input.py +0 -135
- dsp_tools/commands/xml_validate/make_data_rdf.py +0 -193
- dsp_tools/commands/xml_validate/models/data_deserialised.py +0 -108
- dsp_tools/commands/xml_validate/models/data_rdf.py +0 -214
- dsp_tools/commands/xml_validate/models/input_problems.py +0 -191
- dsp_tools/commands/xml_validate/models/validation.py +0 -29
- dsp_tools/commands/xml_validate/reformat_validaton_result.py +0 -89
- dsp_tools/commands/xml_validate/sparql/construct_shapes.py +0 -16
- dsp_tools/commands/xml_validate/xml_validate.py +0 -151
- dsp_tools/commands/xmlupload/check_consistency_with_ontology.py +0 -253
- dsp_tools/commands/xmlupload/models/deserialise/deserialise_value.py +0 -236
- dsp_tools/commands/xmlupload/models/deserialise/xmlresource.py +0 -171
- dsp_tools/commands/xmlupload/models/namespace_context.py +0 -39
- dsp_tools/commands/xmlupload/models/ontology_lookup_models.py +0 -161
- dsp_tools/commands/xmlupload/models/ontology_problem_models.py +0 -178
- dsp_tools/commands/xmlupload/models/serialise/jsonld_serialiser.py +0 -40
- dsp_tools/commands/xmlupload/models/serialise/serialise_value.py +0 -51
- dsp_tools/commands/xmlupload/ontology_client.py +0 -92
- dsp_tools/commands/xmlupload/project_client.py +0 -91
- dsp_tools/commands/xmlupload/read_validate_xml_file.py +0 -99
- dsp_tools/models/custom_warnings.py +0 -31
- dsp_tools/models/exceptions.py +0 -90
- dsp_tools/resources/0100-template-repo/template.json +0 -45
- dsp_tools/resources/0100-template-repo/template.xml +0 -27
- dsp_tools/resources/start-stack/docker-compose-validation.yml +0 -5
- dsp_tools/resources/start-stack/start-stack-config.yml +0 -4
- dsp_tools/resources/xml_validate/api-shapes.ttl +0 -411
- dsp_tools/resources/xml_validate/replace_namespace.xslt +0 -61
- dsp_tools/utils/connection_live.py +0 -383
- dsp_tools/utils/iri_util.py +0 -14
- dsp_tools/utils/logger_config.py +0 -41
- dsp_tools/utils/set_encoder.py +0 -20
- dsp_tools/utils/xml_utils.py +0 -145
- dsp_tools/utils/xml_validation.py +0 -197
- dsp_tools/utils/xml_validation_models.py +0 -68
- dsp_tools/xmllib/models/file_values.py +0 -78
- dsp_tools/xmllib/models/resource.py +0 -415
- dsp_tools/xmllib/models/values.py +0 -428
- dsp_tools-9.1.0.post11.dist-info/METADATA +0 -130
- dsp_tools-9.1.0.post11.dist-info/RECORD +0 -167
- dsp_tools-9.1.0.post11.dist-info/WHEEL +0 -4
- dsp_tools-9.1.0.post11.dist-info/licenses/LICENSE +0 -674
- /dsp_tools/{commands/excel2json/new_lists → clients}/__init__.py +0 -0
- /dsp_tools/commands/{excel2json/new_lists/models → create}/__init__.py +0 -0
- /dsp_tools/commands/{project → create/create_on_server}/__init__.py +0 -0
- /dsp_tools/commands/{project/create → create/models}/__init__.py +0 -0
- /dsp_tools/commands/{project/models → create/parsing}/__init__.py +0 -0
- /dsp_tools/commands/{xml_validate → create/serialisation}/__init__.py +0 -0
- /dsp_tools/commands/{xml_validate/models → excel2json/lists}/__init__.py +0 -0
- /dsp_tools/commands/{xml_validate/sparql → excel2json/lists/models}/__init__.py +0 -0
- /dsp_tools/commands/excel2json/{new_lists → lists}/models/deserialise.py +0 -0
- /dsp_tools/commands/{xmlupload/models/deserialise → get}/__init__.py +0 -0
- /dsp_tools/commands/{xmlupload/models/serialise → get/legacy_models}/__init__.py +0 -0
- /dsp_tools/commands/{project/models → get/legacy_models}/helpers.py +0 -0
- /dsp_tools/{models → commands/get/models}/__init__.py +0 -0
dsp_tools/commands/rosetta.py
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import shutil
|
|
2
|
-
import subprocess
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
|
|
5
|
-
from dsp_tools.cli.args import ServerCredentials
|
|
6
|
-
from dsp_tools.commands.project.create.project_create import create_project
|
|
7
|
-
from dsp_tools.commands.xmlupload.xmlupload import xmlupload
|
|
8
|
-
from dsp_tools.models.exceptions import UserError
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def _update_possibly_existing_repo(rosetta_folder: Path) -> bool:
|
|
12
|
-
"""
|
|
13
|
-
Makes an attempt to pull the latest version of rosetta from GitHub.
|
|
14
|
-
|
|
15
|
-
Args:
|
|
16
|
-
rosetta_folder: path to the (possibly existing) clone of the repo
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
True if the repo exists and could be updated, False if the repo doesn't exist or couldn't be updated
|
|
20
|
-
"""
|
|
21
|
-
is_rosetta_up_to_date = True
|
|
22
|
-
if rosetta_folder.is_dir():
|
|
23
|
-
print(f"Execute 'git pull' in {rosetta_folder}...")
|
|
24
|
-
completed_process = subprocess.run("git pull".split(), cwd=rosetta_folder, check=False)
|
|
25
|
-
if not completed_process or completed_process.returncode != 0:
|
|
26
|
-
print(f"'git pull' failed. Remove '{rosetta_folder}'...")
|
|
27
|
-
shutil.rmtree(rosetta_folder, ignore_errors=True)
|
|
28
|
-
is_rosetta_up_to_date = False
|
|
29
|
-
else:
|
|
30
|
-
is_rosetta_up_to_date = False
|
|
31
|
-
|
|
32
|
-
return is_rosetta_up_to_date
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def _clone_repo(
|
|
36
|
-
rosetta_folder: Path,
|
|
37
|
-
enclosing_folder: Path,
|
|
38
|
-
) -> None:
|
|
39
|
-
"""
|
|
40
|
-
Clones the rosetta repo into the enclosing folder.
|
|
41
|
-
|
|
42
|
-
Args:
|
|
43
|
-
rosetta_folder: path to the (not yet existing) clone
|
|
44
|
-
enclosing_folder: path to the (existing) destination where rosetta should be cloned into
|
|
45
|
-
|
|
46
|
-
Raises:
|
|
47
|
-
UserError: If rosetta cannot be cloned
|
|
48
|
-
"""
|
|
49
|
-
print(f"Clone into {rosetta_folder}...")
|
|
50
|
-
cmd = "git clone https://github.com/dasch-swiss/082E-rosetta-scripts.git".split()
|
|
51
|
-
completed_process = subprocess.run(cmd, cwd=enclosing_folder, check=False)
|
|
52
|
-
if not completed_process or completed_process.returncode != 0:
|
|
53
|
-
raise UserError("There was a problem while cloning the rosetta test project")
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def _create_json(rosetta_folder: Path) -> bool:
|
|
57
|
-
"""
|
|
58
|
-
Creates the rosetta project on the locally running DSP stack.
|
|
59
|
-
|
|
60
|
-
Args:
|
|
61
|
-
rosetta_folder: path to the clone
|
|
62
|
-
|
|
63
|
-
Returns:
|
|
64
|
-
True if the project could be created without problems, False if something went wrong during the creation process
|
|
65
|
-
"""
|
|
66
|
-
print("Execute 'dsp-tools create rosetta.json'...")
|
|
67
|
-
creds = ServerCredentials(server="http://0.0.0.0:3333", user="root@example.com", password="test")
|
|
68
|
-
return create_project(
|
|
69
|
-
project_file_as_path_or_parsed=rosetta_folder / "rosetta.json",
|
|
70
|
-
creds=creds,
|
|
71
|
-
verbose=False,
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def _upload_xml(rosetta_folder: Path) -> bool:
|
|
76
|
-
"""
|
|
77
|
-
Uplaod the rosetta data on the locally running DSP stack.
|
|
78
|
-
|
|
79
|
-
Args:
|
|
80
|
-
rosetta_folder: path to the clone
|
|
81
|
-
|
|
82
|
-
Returns:
|
|
83
|
-
True if all data could be uploaded without problems, False if something went wrong during the upload process
|
|
84
|
-
"""
|
|
85
|
-
print("Execute 'dsp-tools xmlupload rosetta.xml'...")
|
|
86
|
-
creds = ServerCredentials(
|
|
87
|
-
user="root@example.com",
|
|
88
|
-
password="test",
|
|
89
|
-
server="http://0.0.0.0:3333",
|
|
90
|
-
dsp_ingest_url="http://0.0.0.0:3340",
|
|
91
|
-
)
|
|
92
|
-
return xmlupload(
|
|
93
|
-
input_file=rosetta_folder / "rosetta.xml",
|
|
94
|
-
creds=creds,
|
|
95
|
-
imgdir=str(rosetta_folder),
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def upload_rosetta() -> bool:
|
|
100
|
-
"""
|
|
101
|
-
This method clones https://github.com/dasch-swiss/082E-rosetta-scripts
|
|
102
|
-
into ~/.dsp-tools/rosetta.
|
|
103
|
-
If the repository is already there, it pulls instead of cloning.
|
|
104
|
-
Then, rosetta.json is created and rosetta.xml uploaded.
|
|
105
|
-
|
|
106
|
-
Raises:
|
|
107
|
-
UserError: If the repo cannot be cloned nor pulled
|
|
108
|
-
|
|
109
|
-
Returns:
|
|
110
|
-
True if everything went well
|
|
111
|
-
"""
|
|
112
|
-
|
|
113
|
-
enclosing_folder = Path.home() / Path(".dsp-tools/rosetta")
|
|
114
|
-
enclosing_folder.mkdir(parents=True, exist_ok=True)
|
|
115
|
-
rosetta_folder = enclosing_folder / "082E-rosetta-scripts"
|
|
116
|
-
|
|
117
|
-
is_rosetta_up_to_date = _update_possibly_existing_repo(rosetta_folder=rosetta_folder)
|
|
118
|
-
if not is_rosetta_up_to_date:
|
|
119
|
-
_clone_repo(rosetta_folder=rosetta_folder, enclosing_folder=enclosing_folder)
|
|
120
|
-
|
|
121
|
-
success1 = _create_json(rosetta_folder=rosetta_folder)
|
|
122
|
-
success2 = _upload_xml(rosetta_folder=rosetta_folder)
|
|
123
|
-
|
|
124
|
-
return success1 and success2
|
dsp_tools/commands/template.py
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import importlib.resources
|
|
2
|
-
import shutil
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
|
|
5
|
-
from dsp_tools.models.exceptions import UserError
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def generate_template_repo() -> bool:
|
|
9
|
-
"""
|
|
10
|
-
Copies the folder src/dsp_tools/resources/0100-template-repo to the working directory.
|
|
11
|
-
|
|
12
|
-
Raises:
|
|
13
|
-
UserError: If a folder with the same name already exists in the working directory
|
|
14
|
-
|
|
15
|
-
Returns:
|
|
16
|
-
True if the folder could be copied without problems
|
|
17
|
-
"""
|
|
18
|
-
# copy contents of src/dsp_tools/resources/0100-template-repo to cwd/template-repo
|
|
19
|
-
template_path_of_user = Path("0100-template-repo")
|
|
20
|
-
try:
|
|
21
|
-
template_path_of_user.mkdir()
|
|
22
|
-
except OSError:
|
|
23
|
-
raise UserError("A folder '0100-template-repo' already exists in your current working directory.") from None
|
|
24
|
-
template_path_of_distribution = importlib.resources.files("dsp_tools").joinpath("resources/0100-template-repo")
|
|
25
|
-
for file in template_path_of_distribution.iterdir():
|
|
26
|
-
with importlib.resources.as_file(file) as f:
|
|
27
|
-
shutil.copy(f, template_path_of_user / file.name)
|
|
28
|
-
print(f"Created {template_path_of_user / file.name}")
|
|
29
|
-
|
|
30
|
-
return True
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any
|
|
3
|
-
from typing import cast
|
|
4
|
-
|
|
5
|
-
import requests
|
|
6
|
-
from loguru import logger
|
|
7
|
-
from rdflib import Graph
|
|
8
|
-
from requests import ReadTimeout
|
|
9
|
-
from requests import RequestException
|
|
10
|
-
from requests import Response
|
|
11
|
-
|
|
12
|
-
from dsp_tools.models.exceptions import InternalError
|
|
13
|
-
from dsp_tools.models.exceptions import UserError
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@dataclass
|
|
17
|
-
class OntologyConnection:
|
|
18
|
-
api_url: str
|
|
19
|
-
shortcode: str
|
|
20
|
-
|
|
21
|
-
def _get(self, url: str, headers: dict[str, Any] | None = None) -> Response:
|
|
22
|
-
"""
|
|
23
|
-
Sends a get request to the designated url
|
|
24
|
-
|
|
25
|
-
Args:
|
|
26
|
-
url: URL for the request
|
|
27
|
-
headers: headers for the request
|
|
28
|
-
|
|
29
|
-
Returns:
|
|
30
|
-
Response of the request if it was a 200 response code
|
|
31
|
-
|
|
32
|
-
Raises:
|
|
33
|
-
InternalError: in case of errors raised by the requests library
|
|
34
|
-
UserError: If a non-200 response was given
|
|
35
|
-
"""
|
|
36
|
-
try:
|
|
37
|
-
timeout = 100
|
|
38
|
-
logger.debug(f"REQUEST: GET to {url}, timeout: {timeout}, headers: {headers}")
|
|
39
|
-
response = requests.get(url, headers=headers, timeout=timeout)
|
|
40
|
-
logger.debug(f"RESPONSE: {response.status_code}")
|
|
41
|
-
except (TimeoutError, ReadTimeout) as err:
|
|
42
|
-
logger.exception(err)
|
|
43
|
-
raise InternalError("TimeoutError occurred. See logs for details.") from None
|
|
44
|
-
except (ConnectionError, RequestException) as err:
|
|
45
|
-
logger.exception(err)
|
|
46
|
-
raise InternalError("ConnectionError occurred. See logs for details.") from None
|
|
47
|
-
if not response.ok:
|
|
48
|
-
msg = f"Non-ok response: {response.status_code}\nOriginal message: {response.text}"
|
|
49
|
-
logger.exception(msg)
|
|
50
|
-
raise UserError(msg)
|
|
51
|
-
return response
|
|
52
|
-
|
|
53
|
-
def get_knora_api(self) -> str:
|
|
54
|
-
url = f"{self.api_url}/ontology/knora-api/v2#"
|
|
55
|
-
onto = self._get(url, headers={"Accept": "text/turtle"})
|
|
56
|
-
return onto.text
|
|
57
|
-
|
|
58
|
-
def get_ontologies(self) -> list[str]:
|
|
59
|
-
"""
|
|
60
|
-
Returns a list of project ontologies as a string in turtle format.
|
|
61
|
-
|
|
62
|
-
Returns:
|
|
63
|
-
list of ontologies
|
|
64
|
-
"""
|
|
65
|
-
ontology_iris = self._get_ontology_iris()
|
|
66
|
-
return [self._get_one_ontology(x) for x in ontology_iris]
|
|
67
|
-
|
|
68
|
-
def _get_ontology_iris(self) -> list[str]:
|
|
69
|
-
endpoint = f"{self.api_url}/admin/projects/shortcode/{self.shortcode}"
|
|
70
|
-
response = self._get(endpoint)
|
|
71
|
-
response_json = cast(dict[str, Any], response.json())
|
|
72
|
-
msg = f"The response from the API does not contain any ontologies.\nAPI response:{response.text}"
|
|
73
|
-
if not (proj := response_json.get("project")):
|
|
74
|
-
logger.exception(msg)
|
|
75
|
-
raise UserError(msg)
|
|
76
|
-
if not (ontos := proj.get("ontologies")):
|
|
77
|
-
logger.exception(msg)
|
|
78
|
-
raise UserError(msg)
|
|
79
|
-
output = cast(list[str], ontos)
|
|
80
|
-
return output
|
|
81
|
-
|
|
82
|
-
def _get_one_ontology(self, ontology_iri: str) -> str:
|
|
83
|
-
response = self._get(ontology_iri, headers={"Accept": "text/turtle"})
|
|
84
|
-
return response.text
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
@dataclass
|
|
88
|
-
class ShaclValidator:
|
|
89
|
-
"""Client to validate RDF data against a given SHACL shape."""
|
|
90
|
-
|
|
91
|
-
dsp_api_url: str
|
|
92
|
-
|
|
93
|
-
def validate(self, data_ttl: str, shacl_ttl: str) -> Graph:
|
|
94
|
-
"""
|
|
95
|
-
Sends a multipart/form-data request with two turtle files (data.ttl and shacl.ttl) to the given URL
|
|
96
|
-
and expects a response containing a single text/turtle body which is loaded into an rdflib Graph.
|
|
97
|
-
|
|
98
|
-
Args:
|
|
99
|
-
data_ttl (str): The turtle content for the data.ttl file (as a string).
|
|
100
|
-
shacl_ttl (str): The turtle content for the shacl.ttl file (as a string).
|
|
101
|
-
|
|
102
|
-
Returns:
|
|
103
|
-
Graph: The rdflib Graph object loaded with the response turtle data.
|
|
104
|
-
|
|
105
|
-
Raises:
|
|
106
|
-
InternalError: in case of a non-ok response
|
|
107
|
-
"""
|
|
108
|
-
files = {
|
|
109
|
-
"data.ttl": ("data.ttl", data_ttl, "text/turtle"),
|
|
110
|
-
"shacl.ttl": ("shacl.ttl", shacl_ttl, "text/turtle"),
|
|
111
|
-
}
|
|
112
|
-
timeout = 10
|
|
113
|
-
request_url = f"{self.dsp_api_url}/shacl/validate"
|
|
114
|
-
logger.debug(f"REQUEST: POST to {request_url}, timeout: {timeout}")
|
|
115
|
-
response = requests.post(request_url, files=files, timeout=timeout)
|
|
116
|
-
if not response.ok:
|
|
117
|
-
msg = f"Failed to send request. Status code: {response.status_code}, Original Message:\n{response.text}"
|
|
118
|
-
logger.error(msg)
|
|
119
|
-
raise InternalError(msg)
|
|
120
|
-
graph = Graph()
|
|
121
|
-
graph.parse(data=response.text, format="turtle")
|
|
122
|
-
return graph
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
from typing import Callable
|
|
2
|
-
from typing import Sequence
|
|
3
|
-
from typing import cast
|
|
4
|
-
|
|
5
|
-
from lxml import etree
|
|
6
|
-
|
|
7
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import AbstractResource
|
|
8
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import AnnotationDeserialised
|
|
9
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import AudioSegmentDeserialised
|
|
10
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import BooleanValueDeserialised
|
|
11
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import ColorValueDeserialised
|
|
12
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import DataDeserialised
|
|
13
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import DateValueDeserialised
|
|
14
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import DecimalValueDeserialised
|
|
15
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import GeonameValueDeserialised
|
|
16
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import IntValueDeserialised
|
|
17
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import LinkObjDeserialised
|
|
18
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import LinkValueDeserialised
|
|
19
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import ListValueDeserialised
|
|
20
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import ProjectDeserialised
|
|
21
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import ProjectInformation
|
|
22
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import RegionDeserialised
|
|
23
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import ResourceDeserialised
|
|
24
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import RichtextDeserialised
|
|
25
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import SimpleTextDeserialised
|
|
26
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import TimeValueDeserialised
|
|
27
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import UriValueDeserialised
|
|
28
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import ValueDeserialised
|
|
29
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import VideoSegmentDeserialised
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def deserialise_xml(root: etree._Element) -> ProjectDeserialised:
|
|
33
|
-
"""
|
|
34
|
-
Takes the root of an XML
|
|
35
|
-
Extracts the data of the project and transforms all its resources.
|
|
36
|
-
|
|
37
|
-
Args:
|
|
38
|
-
root: root of an xml with qnames and comments removed
|
|
39
|
-
|
|
40
|
-
Returns:
|
|
41
|
-
Class instance with the information reformatted
|
|
42
|
-
"""
|
|
43
|
-
shortcode = root.attrib["shortcode"]
|
|
44
|
-
default_ontology = root.attrib["default-ontology"]
|
|
45
|
-
project_info = ProjectInformation(shortcode, default_ontology)
|
|
46
|
-
data_deserialised = _deserialise_all_resources(root)
|
|
47
|
-
return ProjectDeserialised(project_info, data_deserialised)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def _deserialise_all_resources(root: etree._Element) -> DataDeserialised:
|
|
51
|
-
all_res: list[AbstractResource] = []
|
|
52
|
-
for res in root.iterchildren():
|
|
53
|
-
res_id = res.attrib["id"]
|
|
54
|
-
lbl = cast(str, res.attrib.get("label"))
|
|
55
|
-
match res.tag:
|
|
56
|
-
case "resource":
|
|
57
|
-
all_res.append(_deserialise_one_resource(res))
|
|
58
|
-
case "annotation":
|
|
59
|
-
all_res.append(AnnotationDeserialised(res_id, lbl))
|
|
60
|
-
case "region":
|
|
61
|
-
all_res.append(RegionDeserialised(res_id, lbl))
|
|
62
|
-
case "link":
|
|
63
|
-
all_res.append(LinkObjDeserialised(res_id, lbl))
|
|
64
|
-
case "video-segment":
|
|
65
|
-
all_res.append(VideoSegmentDeserialised(res_id, lbl))
|
|
66
|
-
case "audio-segment":
|
|
67
|
-
all_res.append(AudioSegmentDeserialised(res_id, lbl))
|
|
68
|
-
case _:
|
|
69
|
-
pass
|
|
70
|
-
return DataDeserialised(all_res)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def _deserialise_one_resource(resource: etree._Element) -> ResourceDeserialised:
|
|
74
|
-
values: list[ValueDeserialised] = []
|
|
75
|
-
for val in resource.iterchildren():
|
|
76
|
-
values.extend(_deserialise_one_property(val))
|
|
77
|
-
return ResourceDeserialised(
|
|
78
|
-
res_id=resource.attrib["id"],
|
|
79
|
-
res_class=resource.attrib["restype"],
|
|
80
|
-
label=resource.attrib["label"],
|
|
81
|
-
values=values,
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def _deserialise_one_property(prop_ele: etree._Element) -> Sequence[ValueDeserialised]: # noqa: PLR0911 (too-many-branches, return statements)
|
|
86
|
-
match prop_ele.tag:
|
|
87
|
-
case "boolean-prop":
|
|
88
|
-
return _deserialise_one_value(prop_ele, BooleanValueDeserialised)
|
|
89
|
-
case "color-prop":
|
|
90
|
-
return _deserialise_one_value(prop_ele, ColorValueDeserialised)
|
|
91
|
-
case "date-prop":
|
|
92
|
-
return _deserialise_one_value(prop_ele, DateValueDeserialised)
|
|
93
|
-
case "decimal-prop":
|
|
94
|
-
return _deserialise_one_value(prop_ele, DecimalValueDeserialised)
|
|
95
|
-
case "geoname-prop":
|
|
96
|
-
return _deserialise_one_value(prop_ele, GeonameValueDeserialised)
|
|
97
|
-
case "list-prop":
|
|
98
|
-
return _deserialise_list_prop(prop_ele)
|
|
99
|
-
case "integer-prop":
|
|
100
|
-
return _deserialise_one_value(prop_ele, IntValueDeserialised)
|
|
101
|
-
case "resptr-prop":
|
|
102
|
-
return _deserialise_one_value(prop_ele, LinkValueDeserialised)
|
|
103
|
-
case "text-prop":
|
|
104
|
-
return _deserialise_text_prop(prop_ele)
|
|
105
|
-
case "time-prop":
|
|
106
|
-
return _deserialise_one_value(prop_ele, TimeValueDeserialised)
|
|
107
|
-
case "uri-prop":
|
|
108
|
-
return _deserialise_one_value(prop_ele, UriValueDeserialised)
|
|
109
|
-
case _:
|
|
110
|
-
return []
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def _deserialise_one_value(
|
|
114
|
-
prop: etree._Element, func: Callable[[str, str | None], ValueDeserialised]
|
|
115
|
-
) -> Sequence[ValueDeserialised]:
|
|
116
|
-
prop_name = prop.attrib["name"]
|
|
117
|
-
return [func(prop_name, x.text) for x in prop.iterchildren()]
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def _deserialise_list_prop(prop: etree._Element) -> list[ListValueDeserialised]:
|
|
121
|
-
prop_name = prop.attrib["name"]
|
|
122
|
-
list_name = prop.attrib["list"]
|
|
123
|
-
return [ListValueDeserialised(prop_name, x.text, list_name) for x in prop.iterchildren()]
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def _deserialise_text_prop(prop: etree._Element) -> list[SimpleTextDeserialised | RichtextDeserialised]:
|
|
127
|
-
prop_name = prop.attrib["name"]
|
|
128
|
-
all_vals: list[SimpleTextDeserialised | RichtextDeserialised] = []
|
|
129
|
-
for val in prop.iterchildren():
|
|
130
|
-
match val.attrib["encoding"]:
|
|
131
|
-
case "utf8":
|
|
132
|
-
all_vals.append(SimpleTextDeserialised(prop_name, val.text))
|
|
133
|
-
case "xml":
|
|
134
|
-
all_vals.append(RichtextDeserialised(prop_name, val.text))
|
|
135
|
-
return all_vals
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
from typing import Callable
|
|
2
|
-
|
|
3
|
-
from rdflib import XSD
|
|
4
|
-
from rdflib import Literal
|
|
5
|
-
from rdflib import Namespace
|
|
6
|
-
from rdflib import URIRef
|
|
7
|
-
|
|
8
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import AbstractResource
|
|
9
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import AnnotationDeserialised
|
|
10
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import AudioSegmentDeserialised
|
|
11
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import BooleanValueDeserialised
|
|
12
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import ColorValueDeserialised
|
|
13
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import DataDeserialised
|
|
14
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import DateValueDeserialised
|
|
15
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import DecimalValueDeserialised
|
|
16
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import GeonameValueDeserialised
|
|
17
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import IntValueDeserialised
|
|
18
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import LinkObjDeserialised
|
|
19
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import LinkValueDeserialised
|
|
20
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import ListValueDeserialised
|
|
21
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import RegionDeserialised
|
|
22
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import ResourceDeserialised
|
|
23
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import RichtextDeserialised
|
|
24
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import SimpleTextDeserialised
|
|
25
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import TimeValueDeserialised
|
|
26
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import UriValueDeserialised
|
|
27
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import ValueDeserialised
|
|
28
|
-
from dsp_tools.commands.xml_validate.models.data_deserialised import VideoSegmentDeserialised
|
|
29
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import BooleanValueRDF
|
|
30
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import ColorValueRDF
|
|
31
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import DataRDF
|
|
32
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import DateValueRDF
|
|
33
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import DecimalValueRDF
|
|
34
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import GeonameValueRDF
|
|
35
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import IntValueRDF
|
|
36
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import LinkValueRDF
|
|
37
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import ListValueRDF
|
|
38
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import RDFTriples
|
|
39
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import ResourceRDF
|
|
40
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import RichtextRDF
|
|
41
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import SimpleTextRDF
|
|
42
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import TimeValueRDF
|
|
43
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import UriValueRDF
|
|
44
|
-
from dsp_tools.commands.xml_validate.models.data_rdf import ValueRDF
|
|
45
|
-
from dsp_tools.models.exceptions import InternalError
|
|
46
|
-
|
|
47
|
-
KNORA_API = Namespace("http://api.knora.org/ontology/knora-api/v2#")
|
|
48
|
-
DATA = Namespace("http://data/")
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def make_data_rdf(data_deserialised: DataDeserialised) -> DataRDF:
|
|
52
|
-
"""
|
|
53
|
-
Transforms the deserialised data into instances that can produce a RDF graph.
|
|
54
|
-
|
|
55
|
-
Args:
|
|
56
|
-
data_deserialised: Deserialised Data
|
|
57
|
-
|
|
58
|
-
Returns:
|
|
59
|
-
Instance with the data
|
|
60
|
-
"""
|
|
61
|
-
all_triples: list[RDFTriples] = []
|
|
62
|
-
for r in data_deserialised.resources:
|
|
63
|
-
all_triples.extend(_transform_one_resource(r))
|
|
64
|
-
return DataRDF(all_triples)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def _transform_one_resource(res: AbstractResource) -> list[RDFTriples]:
|
|
68
|
-
if isinstance(res, ResourceDeserialised):
|
|
69
|
-
return _transform_one_project_resource(res)
|
|
70
|
-
return [_transform_one_dsp_resource(res)]
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def _transform_one_dsp_resource(res: AbstractResource) -> RDFTriples:
|
|
74
|
-
res_type_mapper = {
|
|
75
|
-
AnnotationDeserialised: KNORA_API.Annotation,
|
|
76
|
-
RegionDeserialised: KNORA_API.Region,
|
|
77
|
-
LinkObjDeserialised: KNORA_API.LinkObj,
|
|
78
|
-
VideoSegmentDeserialised: KNORA_API.VideoSegment,
|
|
79
|
-
AudioSegmentDeserialised: KNORA_API.AudioSegment,
|
|
80
|
-
}
|
|
81
|
-
return ResourceRDF(
|
|
82
|
-
res_iri=DATA[res.res_id], res_class=res_type_mapper[type(res)], label=Literal(res.label, datatype=XSD.string)
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def _transform_one_project_resource(res: ResourceDeserialised) -> list[RDFTriples]:
|
|
87
|
-
res_iri = DATA[res.res_id]
|
|
88
|
-
all_triples: list[RDFTriples] = [
|
|
89
|
-
ResourceRDF(res_iri=res_iri, res_class=URIRef(res.res_class), label=Literal(res.label, datatype=XSD.string))
|
|
90
|
-
]
|
|
91
|
-
all_triples.extend([_transform_one_value(v, res_iri) for v in res.values])
|
|
92
|
-
return all_triples
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def _transform_one_value(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF: # noqa: PLR0911 (too many return statements)
|
|
96
|
-
func_mapper = {
|
|
97
|
-
ColorValueDeserialised: ColorValueRDF,
|
|
98
|
-
DateValueDeserialised: DateValueRDF,
|
|
99
|
-
GeonameValueDeserialised: GeonameValueRDF,
|
|
100
|
-
IntValueDeserialised: IntValueRDF,
|
|
101
|
-
SimpleTextDeserialised: SimpleTextRDF,
|
|
102
|
-
RichtextDeserialised: RichtextRDF,
|
|
103
|
-
}
|
|
104
|
-
match val:
|
|
105
|
-
case ColorValueDeserialised() | DateValueDeserialised() | SimpleTextDeserialised() | RichtextDeserialised():
|
|
106
|
-
return _transform_into_xsd_string(val, res_iri, func_mapper[type(val)])
|
|
107
|
-
case GeonameValueDeserialised() | IntValueDeserialised():
|
|
108
|
-
return _transform_into_xsd_integer(val, res_iri, func_mapper[type(val)])
|
|
109
|
-
case BooleanValueDeserialised():
|
|
110
|
-
return _transform_into_bool(val, res_iri)
|
|
111
|
-
case DecimalValueDeserialised():
|
|
112
|
-
return _transform_decimal_value(val, res_iri)
|
|
113
|
-
case LinkValueDeserialised():
|
|
114
|
-
return _transform_link_value(val, res_iri)
|
|
115
|
-
case ListValueDeserialised():
|
|
116
|
-
return _transform_list_value(val, res_iri)
|
|
117
|
-
case TimeValueDeserialised():
|
|
118
|
-
return _transform_time_value(val, res_iri)
|
|
119
|
-
case UriValueDeserialised():
|
|
120
|
-
return _transform_uri_value(val, res_iri)
|
|
121
|
-
case _:
|
|
122
|
-
raise InternalError(f"Unknown Value Type: {type(val)}")
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
def _transform_into_xsd_string(
|
|
126
|
-
val: ValueDeserialised, res_iri: URIRef, func: Callable[[URIRef, Literal, URIRef], ValueRDF]
|
|
127
|
-
) -> ValueRDF:
|
|
128
|
-
new_str = val.object_value if val.object_value is not None else ""
|
|
129
|
-
return func(URIRef(val.prop_name), Literal(new_str, datatype=XSD.string), res_iri)
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
def _transform_into_xsd_integer(
|
|
133
|
-
val: ValueDeserialised, res_iri: URIRef, func: Callable[[URIRef, Literal, URIRef], ValueRDF]
|
|
134
|
-
) -> ValueRDF:
|
|
135
|
-
content = (
|
|
136
|
-
Literal(val.object_value, datatype=XSD.integer)
|
|
137
|
-
if val.object_value is not None
|
|
138
|
-
else Literal("", datatype=XSD.string)
|
|
139
|
-
)
|
|
140
|
-
return func(URIRef(val.prop_name), content, res_iri)
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
def _transform_into_bool(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF:
|
|
144
|
-
match val.object_value:
|
|
145
|
-
case "1" | "true":
|
|
146
|
-
content = Literal(True, datatype=XSD.boolean)
|
|
147
|
-
case "0" | "false":
|
|
148
|
-
content = Literal(False, datatype=XSD.boolean)
|
|
149
|
-
case _:
|
|
150
|
-
content = Literal("", datatype=XSD.string)
|
|
151
|
-
return BooleanValueRDF(URIRef(val.prop_name), content, res_iri)
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
def _transform_decimal_value(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF:
|
|
155
|
-
content = (
|
|
156
|
-
Literal(val.object_value, datatype=XSD.decimal)
|
|
157
|
-
if val.object_value is not None
|
|
158
|
-
else Literal("", datatype=XSD.string)
|
|
159
|
-
)
|
|
160
|
-
return DecimalValueRDF(URIRef(val.prop_name), content, res_iri)
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def _transform_link_value(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF:
|
|
164
|
-
content = val.object_value if val.object_value is not None else ""
|
|
165
|
-
return LinkValueRDF(URIRef(val.prop_name), DATA[content], res_iri)
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
def _transform_list_value(val: ListValueDeserialised, res_iri: URIRef) -> ValueRDF:
|
|
169
|
-
node_name = val.object_value if val.object_value is not None else ""
|
|
170
|
-
return ListValueRDF(
|
|
171
|
-
prop_name=URIRef(val.prop_name),
|
|
172
|
-
object_value=Literal(node_name, datatype=XSD.string),
|
|
173
|
-
list_name=Literal(val.list_name, datatype=XSD.string),
|
|
174
|
-
res_iri=res_iri,
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
def _transform_time_value(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF:
|
|
179
|
-
content = (
|
|
180
|
-
Literal(val.object_value, datatype=XSD.dateTimeStamp)
|
|
181
|
-
if val.object_value is not None
|
|
182
|
-
else Literal("", datatype=XSD.string)
|
|
183
|
-
)
|
|
184
|
-
return TimeValueRDF(URIRef(val.prop_name), content, res_iri)
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
def _transform_uri_value(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF:
|
|
188
|
-
content = (
|
|
189
|
-
Literal(val.object_value, datatype=XSD.anyURI)
|
|
190
|
-
if val.object_value is not None
|
|
191
|
-
else Literal("", datatype=XSD.string)
|
|
192
|
-
)
|
|
193
|
-
return UriValueRDF(URIRef(val.prop_name), content, res_iri)
|