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
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from datetime import datetime
|
|
4
|
-
from typing import Any
|
|
5
4
|
from typing import cast
|
|
6
5
|
|
|
7
6
|
from loguru import logger
|
|
7
|
+
from rdflib import RDF
|
|
8
|
+
from rdflib import BNode
|
|
9
|
+
from rdflib import Graph
|
|
10
|
+
from rdflib import URIRef
|
|
11
|
+
from tqdm import tqdm
|
|
8
12
|
|
|
13
|
+
from dsp_tools.clients.connection import Connection
|
|
14
|
+
from dsp_tools.commands.xmlupload.make_rdf_graph.jsonld_utils import serialise_jsonld_for_value
|
|
15
|
+
from dsp_tools.commands.xmlupload.make_rdf_graph.make_values import make_link_value_graph
|
|
9
16
|
from dsp_tools.commands.xmlupload.models.upload_state import UploadState
|
|
10
17
|
from dsp_tools.commands.xmlupload.stash.stash_models import LinkValueStash
|
|
11
18
|
from dsp_tools.commands.xmlupload.stash.stash_models import LinkValueStashItem
|
|
12
19
|
from dsp_tools.commands.xmlupload.stash.stash_models import Stash
|
|
13
|
-
from dsp_tools.
|
|
14
|
-
from dsp_tools.utils.connection import Connection
|
|
20
|
+
from dsp_tools.error.exceptions import BaseError
|
|
15
21
|
|
|
16
22
|
|
|
17
23
|
def upload_stashed_resptr_props(
|
|
18
24
|
upload_state: UploadState,
|
|
19
25
|
con: Connection,
|
|
20
|
-
context: dict[str, str],
|
|
21
26
|
) -> None:
|
|
22
27
|
"""
|
|
23
28
|
After all resources are uploaded, the stashed resptr props must be applied to their resources in DSP.
|
|
@@ -26,28 +31,27 @@ def upload_stashed_resptr_props(
|
|
|
26
31
|
Args:
|
|
27
32
|
upload_state: the current state of the upload
|
|
28
33
|
con: connection to DSP
|
|
29
|
-
context: the JSON-LD context of the resource
|
|
30
34
|
"""
|
|
31
|
-
|
|
32
|
-
print(f"{datetime.now()}: Upload the stashed resptrs...")
|
|
33
|
-
logger.info("Upload the stashed resptrs...")
|
|
35
|
+
logger.info("Upload the stashed links...")
|
|
34
36
|
upload_state.pending_stash = cast(Stash, upload_state.pending_stash)
|
|
35
37
|
link_value_stash = cast(LinkValueStash, upload_state.pending_stash.link_value_stash)
|
|
36
|
-
|
|
38
|
+
progress_bar = tqdm(
|
|
39
|
+
link_value_stash.res_2_stash_items.copy().items(), desc="Upload the stashed links", dynamic_ncols=True
|
|
40
|
+
)
|
|
41
|
+
for res_id, stash_items in progress_bar:
|
|
37
42
|
res_iri = upload_state.iri_resolver.get(res_id)
|
|
38
43
|
if not res_iri:
|
|
39
44
|
# resource could not be uploaded to DSP, so the stash cannot be uploaded either
|
|
40
45
|
# no action necessary: this resource will remain in nonapplied_resptr_props,
|
|
41
46
|
# which will be handled by the caller
|
|
42
47
|
continue
|
|
43
|
-
print(f"{datetime.now()}: Upload resptrs of resource '{res_id}'...")
|
|
44
48
|
logger.info(f" Upload resptrs of resource '{res_id}'...")
|
|
45
49
|
for stash_item in reversed(stash_items):
|
|
46
50
|
# reversed avoids any problems caused by removing from the list we loop over at the same time
|
|
47
|
-
target_iri = upload_state.iri_resolver.get(stash_item.
|
|
51
|
+
target_iri = upload_state.iri_resolver.get(stash_item.value.value)
|
|
48
52
|
if not target_iri:
|
|
49
53
|
continue
|
|
50
|
-
if _upload_stash_item(stash_item, res_iri, target_iri, con
|
|
54
|
+
if _upload_stash_item(stash_item, res_iri, target_iri, con):
|
|
51
55
|
link_value_stash.res_2_stash_items[res_id].remove(stash_item)
|
|
52
56
|
# remove res_id if all stash items were uploaded
|
|
53
57
|
if not link_value_stash.res_2_stash_items[res_id]:
|
|
@@ -59,7 +63,6 @@ def _upload_stash_item(
|
|
|
59
63
|
res_iri: str,
|
|
60
64
|
target_iri: str,
|
|
61
65
|
con: Connection,
|
|
62
|
-
context: dict[str, str],
|
|
63
66
|
) -> bool:
|
|
64
67
|
"""
|
|
65
68
|
Upload a single stashed link value to DSP.
|
|
@@ -69,44 +72,35 @@ def _upload_stash_item(
|
|
|
69
72
|
res_iri: the iri of the resource
|
|
70
73
|
target_iri: the iri of the target resource
|
|
71
74
|
con: connection to DSP
|
|
72
|
-
context: the JSON-LD context of the resource
|
|
73
75
|
|
|
74
76
|
Returns:
|
|
75
77
|
True, if the upload was successful, False otherwise
|
|
76
78
|
"""
|
|
77
|
-
|
|
79
|
+
graph = _make_link_value_create_graph(stash, res_iri, target_iri)
|
|
80
|
+
payload = serialise_jsonld_for_value(graph, res_iri)
|
|
78
81
|
try:
|
|
79
82
|
con.post(route="/v2/values", data=payload)
|
|
80
83
|
except BaseError as err:
|
|
81
|
-
_log_unable_to_upload_link_value(err.message, stash.res_id, stash.
|
|
84
|
+
_log_unable_to_upload_link_value(err.message, stash.res_id, stash.value.prop_iri)
|
|
82
85
|
return False
|
|
83
|
-
logger.debug(f' Successfully uploaded resptr links of "{stash.
|
|
86
|
+
logger.debug(f' Successfully uploaded resptr links of "{stash.value.prop_iri}"')
|
|
84
87
|
return True
|
|
85
88
|
|
|
86
89
|
|
|
87
|
-
def
|
|
88
|
-
err_msg = f"Unable to upload the resptr prop of '{prop_name}' of resource '{res_id}'."
|
|
89
|
-
print(f"{datetime.now()}: WARNING: {err_msg} Original error message: {msg}")
|
|
90
|
-
logger.opt(exception=True).warning(err_msg)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def _create_resptr_prop_json_object_to_update(
|
|
90
|
+
def _make_link_value_create_graph(
|
|
94
91
|
stash: LinkValueStashItem,
|
|
95
|
-
|
|
92
|
+
res_iri_str: str,
|
|
96
93
|
target_iri: str,
|
|
97
|
-
|
|
98
|
-
) -> dict[str, Any]:
|
|
94
|
+
) -> Graph:
|
|
99
95
|
"""This function creates a JSON object that can be sent as an update request to the DSP-API."""
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
return jsonobj
|
|
96
|
+
val_bn = BNode()
|
|
97
|
+
res_iri = URIRef(res_iri_str)
|
|
98
|
+
graph = make_link_value_graph(stash.value, val_bn, res_iri, URIRef(target_iri))
|
|
99
|
+
graph.add((res_iri, RDF.type, URIRef(stash.res_type)))
|
|
100
|
+
return graph
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _log_unable_to_upload_link_value(msg: str, res_id: str, prop_name: str) -> None:
|
|
104
|
+
err_msg = f"Unable to upload the resptr prop of '{prop_name}' of resource '{res_id}'."
|
|
105
|
+
print(f"{datetime.now()}: WARNING: {err_msg} Original error message: {msg}")
|
|
106
|
+
logger.error(err_msg)
|
|
@@ -6,94 +6,20 @@ from typing import cast
|
|
|
6
6
|
from urllib.parse import quote_plus
|
|
7
7
|
|
|
8
8
|
from loguru import logger
|
|
9
|
+
from rdflib import RDF
|
|
10
|
+
from rdflib import Graph
|
|
11
|
+
from rdflib import URIRef
|
|
12
|
+
from tqdm import tqdm
|
|
9
13
|
|
|
14
|
+
from dsp_tools.clients.connection import Connection
|
|
10
15
|
from dsp_tools.commands.xmlupload.iri_resolver import IriResolver
|
|
11
|
-
from dsp_tools.commands.xmlupload.
|
|
16
|
+
from dsp_tools.commands.xmlupload.make_rdf_graph.jsonld_utils import serialise_jsonld_for_value
|
|
17
|
+
from dsp_tools.commands.xmlupload.make_rdf_graph.make_values import make_richtext_value_graph
|
|
12
18
|
from dsp_tools.commands.xmlupload.models.upload_state import UploadState
|
|
13
19
|
from dsp_tools.commands.xmlupload.stash.stash_models import StandoffStash
|
|
14
20
|
from dsp_tools.commands.xmlupload.stash.stash_models import StandoffStashItem
|
|
15
21
|
from dsp_tools.commands.xmlupload.stash.stash_models import Stash
|
|
16
|
-
from dsp_tools.
|
|
17
|
-
from dsp_tools.utils.connection import Connection
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def _log_unable_to_retrieve_resource(
|
|
21
|
-
resource: str,
|
|
22
|
-
received_error: BaseError,
|
|
23
|
-
) -> None:
|
|
24
|
-
"""
|
|
25
|
-
This function logs the error if it is not possible to retrieve the resource.
|
|
26
|
-
|
|
27
|
-
Args:
|
|
28
|
-
resource: the resource id
|
|
29
|
-
received_error: the error
|
|
30
|
-
"""
|
|
31
|
-
# print the message to keep track of the cause for the failure
|
|
32
|
-
# apart from that; no action is necessary:
|
|
33
|
-
# this resource will remain in nonapplied_xml_texts, which will be handled by the caller
|
|
34
|
-
err_msg = (
|
|
35
|
-
f"Unable to upload XML texts of resource '{resource}', "
|
|
36
|
-
"because the resource cannot be retrieved from the DSP server."
|
|
37
|
-
)
|
|
38
|
-
print(f"{datetime.now()}: WARNING: {err_msg} Original error message: {received_error.message}")
|
|
39
|
-
logger.opt(exception=True).warning(err_msg)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def _log_unable_to_upload_xml_resource(
|
|
43
|
-
received_error: BaseError,
|
|
44
|
-
stashed_resource_id: str,
|
|
45
|
-
prop_name: str,
|
|
46
|
-
) -> None:
|
|
47
|
-
"""
|
|
48
|
-
This function logs if it is not possible to upload a xml resource.
|
|
49
|
-
|
|
50
|
-
Args:
|
|
51
|
-
received_error: Error received
|
|
52
|
-
stashed_resource_id: id of the resource
|
|
53
|
-
prop_name: name of the property
|
|
54
|
-
"""
|
|
55
|
-
# print the message to keep track of the cause for the failure
|
|
56
|
-
# apart from that; no action is necessary:
|
|
57
|
-
# this resource will remain in nonapplied_xml_texts, which will be handled by the caller
|
|
58
|
-
err_msg = f"Unable to upload the xml text of '{prop_name}' of resource '{stashed_resource_id}'."
|
|
59
|
-
print(f"{datetime.now()}: WARNING: {err_msg} Original error message: {received_error.message}")
|
|
60
|
-
logger.opt(exception=True).warning(err_msg)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def _create_XMLResource_json_object_to_update(
|
|
64
|
-
res_iri: str,
|
|
65
|
-
res_type: str,
|
|
66
|
-
link_prop_name: str,
|
|
67
|
-
value_iri: str,
|
|
68
|
-
new_xmltext: FormattedTextValue,
|
|
69
|
-
context: dict[str, str],
|
|
70
|
-
) -> dict[str, Any]:
|
|
71
|
-
"""
|
|
72
|
-
This function creates a JSON object that can be sent as update request to DSP-API.
|
|
73
|
-
|
|
74
|
-
Args:
|
|
75
|
-
res_iri: the iri of the resource
|
|
76
|
-
res_type: the type of the resource
|
|
77
|
-
link_prop_name: the name of the link property
|
|
78
|
-
value_iri: the iri of the value
|
|
79
|
-
new_xmltext: the new xml text to be uploaded
|
|
80
|
-
context: the JSON-LD context of the resource
|
|
81
|
-
|
|
82
|
-
Returns:
|
|
83
|
-
json string
|
|
84
|
-
"""
|
|
85
|
-
jsonobj = {
|
|
86
|
-
"@id": res_iri,
|
|
87
|
-
"@type": res_type,
|
|
88
|
-
link_prop_name: {
|
|
89
|
-
"@id": value_iri,
|
|
90
|
-
"@type": "knora-api:TextValue",
|
|
91
|
-
"knora-api:textValueAsXml": new_xmltext.as_xml(),
|
|
92
|
-
"knora-api:textValueHasMapping": {"@id": "http://rdfh.ch/standoff/mappings/StandardMapping"},
|
|
93
|
-
},
|
|
94
|
-
"@context": context,
|
|
95
|
-
}
|
|
96
|
-
return jsonobj
|
|
22
|
+
from dsp_tools.error.exceptions import BaseError
|
|
97
23
|
|
|
98
24
|
|
|
99
25
|
def upload_stashed_xml_texts(upload_state: UploadState, con: Connection) -> None:
|
|
@@ -105,12 +31,13 @@ def upload_stashed_xml_texts(upload_state: UploadState, con: Connection) -> None
|
|
|
105
31
|
upload_state: the current state of the upload
|
|
106
32
|
con: connection to DSP
|
|
107
33
|
"""
|
|
108
|
-
|
|
109
|
-
print(f"{datetime.now()}: Upload the stashed XML texts...")
|
|
110
34
|
logger.info("Upload the stashed XML texts...")
|
|
111
35
|
upload_state.pending_stash = cast(Stash, upload_state.pending_stash)
|
|
112
36
|
standoff_stash = cast(StandoffStash, upload_state.pending_stash.standoff_stash)
|
|
113
|
-
|
|
37
|
+
progress_bar = tqdm(
|
|
38
|
+
standoff_stash.res_2_stash_items.copy().items(), desc="Upload stashed XML texts", dynamic_ncols=True
|
|
39
|
+
)
|
|
40
|
+
for res_id, stash_items in progress_bar:
|
|
114
41
|
res_iri = upload_state.iri_resolver.get(res_id)
|
|
115
42
|
if not res_iri:
|
|
116
43
|
# resource could not be uploaded to DSP, so the stash cannot be uploaded either
|
|
@@ -122,22 +49,17 @@ def upload_stashed_xml_texts(upload_state: UploadState, con: Connection) -> None
|
|
|
122
49
|
except BaseError as err:
|
|
123
50
|
_log_unable_to_retrieve_resource(resource=res_id, received_error=err)
|
|
124
51
|
continue
|
|
125
|
-
print(f"{datetime.now()}: Upload XML text(s) of resource '{res_id}'...")
|
|
126
52
|
logger.info(f" Upload XML text(s) of resource '{res_id}'...")
|
|
127
|
-
context = resource_in_triplestore["@context"]
|
|
128
53
|
for stash_item in stash_items:
|
|
129
|
-
value_iri = _get_value_iri(stash_item.
|
|
54
|
+
value_iri = _get_value_iri(stash_item.value.prop_iri, resource_in_triplestore, stash_item.value.value_uuid)
|
|
130
55
|
if not value_iri:
|
|
131
56
|
continue
|
|
132
57
|
if _upload_stash_item(
|
|
133
58
|
stash_item=stash_item,
|
|
134
59
|
res_iri=res_iri,
|
|
135
|
-
res_type=stash_item.res_type,
|
|
136
|
-
res_id=res_id,
|
|
137
60
|
value_iri=value_iri,
|
|
138
61
|
iri_resolver=upload_state.iri_resolver,
|
|
139
62
|
con=con,
|
|
140
|
-
context=context,
|
|
141
63
|
):
|
|
142
64
|
standoff_stash.res_2_stash_items[res_id].remove(stash_item)
|
|
143
65
|
if not standoff_stash.res_2_stash_items[res_id]:
|
|
@@ -149,7 +71,8 @@ def _get_value_iri(
|
|
|
149
71
|
resource: dict[str, Any],
|
|
150
72
|
uuid: str,
|
|
151
73
|
) -> str | None:
|
|
152
|
-
|
|
74
|
+
prefixed_prop = _make_prefixed_prop_from_absolute_iri(property_name)
|
|
75
|
+
values_on_server = resource.get(prefixed_prop)
|
|
153
76
|
if not isinstance(values_on_server, list):
|
|
154
77
|
values_on_server = [values_on_server]
|
|
155
78
|
|
|
@@ -162,15 +85,18 @@ def _get_value_iri(
|
|
|
162
85
|
return value_iri
|
|
163
86
|
|
|
164
87
|
|
|
88
|
+
def _make_prefixed_prop_from_absolute_iri(absolute_iri: str) -> str:
|
|
89
|
+
_, onto, prop = absolute_iri.rsplit("/", 2)
|
|
90
|
+
local_name = prop.split("#")[-1]
|
|
91
|
+
return f"{onto}:{local_name}"
|
|
92
|
+
|
|
93
|
+
|
|
165
94
|
def _upload_stash_item(
|
|
166
95
|
stash_item: StandoffStashItem,
|
|
167
96
|
res_iri: str,
|
|
168
|
-
res_type: str,
|
|
169
|
-
res_id: str,
|
|
170
97
|
value_iri: str,
|
|
171
98
|
iri_resolver: IriResolver,
|
|
172
99
|
con: Connection,
|
|
173
|
-
context: dict[str, str],
|
|
174
100
|
) -> bool:
|
|
175
101
|
"""
|
|
176
102
|
Upload a single stashed xml text to DSP.
|
|
@@ -178,29 +104,93 @@ def _upload_stash_item(
|
|
|
178
104
|
Args:
|
|
179
105
|
stash_item: the stashed text value to upload
|
|
180
106
|
res_iri: the iri of the resource
|
|
181
|
-
res_type: the type of the resource
|
|
182
|
-
res_id: the internal id of the resource
|
|
183
107
|
value_iri: the iri of the value
|
|
184
108
|
iri_resolver: resolver to map ids from the XML file to IRIs in DSP
|
|
185
109
|
con: connection to DSP
|
|
186
|
-
context: the JSON-LD context of the resource
|
|
187
110
|
|
|
188
111
|
Returns:
|
|
189
112
|
True, if the upload was successful, False otherwise
|
|
190
113
|
"""
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
value_iri,
|
|
197
|
-
adjusted_text_value,
|
|
198
|
-
context,
|
|
114
|
+
payload = _serialise_richtext_for_update(
|
|
115
|
+
stash_item=stash_item,
|
|
116
|
+
value_iri_str=value_iri,
|
|
117
|
+
res_iri_str=res_iri,
|
|
118
|
+
iri_resolver=iri_resolver,
|
|
199
119
|
)
|
|
200
120
|
try:
|
|
201
121
|
con.put(route="/v2/values", data=payload)
|
|
202
122
|
except BaseError as err:
|
|
203
|
-
_log_unable_to_upload_xml_resource(err, res_id, stash_item.
|
|
123
|
+
_log_unable_to_upload_xml_resource(err, stash_item.res_id, stash_item.value.prop_iri)
|
|
204
124
|
return False
|
|
205
|
-
logger.debug(f' Successfully uploaded xml text of "{stash_item.
|
|
125
|
+
logger.debug(f' Successfully uploaded xml text of "{stash_item.value.prop_iri}"')
|
|
206
126
|
return True
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _serialise_richtext_for_update(
|
|
130
|
+
stash_item: StandoffStashItem, value_iri_str: str, res_iri_str: str, iri_resolver: IriResolver
|
|
131
|
+
) -> dict[str, Any]:
|
|
132
|
+
graph = _make_richtext_update_graph(
|
|
133
|
+
stash_item=stash_item,
|
|
134
|
+
value_iri_str=value_iri_str,
|
|
135
|
+
res_iri_str=res_iri_str,
|
|
136
|
+
iri_resolver=iri_resolver,
|
|
137
|
+
)
|
|
138
|
+
return serialise_jsonld_for_value(graph, res_iri_str)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _make_richtext_update_graph(
|
|
142
|
+
stash_item: StandoffStashItem, value_iri_str: str, res_iri_str: str, iri_resolver: IriResolver
|
|
143
|
+
) -> Graph:
|
|
144
|
+
res_iri = URIRef(res_iri_str)
|
|
145
|
+
value_iri = URIRef(value_iri_str)
|
|
146
|
+
val_graph = make_richtext_value_graph(
|
|
147
|
+
val=stash_item.value,
|
|
148
|
+
val_node=value_iri,
|
|
149
|
+
res_node=res_iri,
|
|
150
|
+
iri_resolver=iri_resolver,
|
|
151
|
+
)
|
|
152
|
+
val_graph.add((res_iri, RDF.type, URIRef(stash_item.res_type)))
|
|
153
|
+
return val_graph
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _log_unable_to_retrieve_resource(
|
|
157
|
+
resource: str,
|
|
158
|
+
received_error: BaseError,
|
|
159
|
+
) -> None:
|
|
160
|
+
"""
|
|
161
|
+
This function logs the error if it is not possible to retrieve the resource.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
resource: the resource id
|
|
165
|
+
received_error: the error
|
|
166
|
+
"""
|
|
167
|
+
# print the message to keep track of the cause for the failure
|
|
168
|
+
# apart from that; no action is necessary:
|
|
169
|
+
# this resource will remain in nonapplied_xml_texts, which will be handled by the caller
|
|
170
|
+
err_msg = (
|
|
171
|
+
f"Unable to upload XML texts of resource '{resource}', "
|
|
172
|
+
"because the resource cannot be retrieved from the DSP server."
|
|
173
|
+
)
|
|
174
|
+
print(f"{datetime.now()}: WARNING: {err_msg} Original error message: {received_error.message}")
|
|
175
|
+
logger.error(err_msg)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def _log_unable_to_upload_xml_resource(
|
|
179
|
+
received_error: BaseError,
|
|
180
|
+
stashed_resource_id: str,
|
|
181
|
+
prop_name: str,
|
|
182
|
+
) -> None:
|
|
183
|
+
"""
|
|
184
|
+
This function logs if it is not possible to upload a xml resource.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
received_error: Error received
|
|
188
|
+
stashed_resource_id: id of the resource
|
|
189
|
+
prop_name: name of the property
|
|
190
|
+
"""
|
|
191
|
+
# print the message to keep track of the cause for the failure
|
|
192
|
+
# apart from that; no action is necessary:
|
|
193
|
+
# this resource will remain in nonapplied_xml_texts, which will be handled by the caller
|
|
194
|
+
err_msg = f"Unable to upload the xml text of '{prop_name}' of resource '{stashed_resource_id}'."
|
|
195
|
+
print(f"{datetime.now()}: WARNING: {err_msg} Original error message: {received_error.message}")
|
|
196
|
+
logger.error(err_msg)
|
|
@@ -8,6 +8,8 @@ from pathlib import Path
|
|
|
8
8
|
import regex
|
|
9
9
|
from loguru import logger
|
|
10
10
|
|
|
11
|
+
from dsp_tools.cli.args import ValidationSeverity
|
|
12
|
+
|
|
11
13
|
|
|
12
14
|
def _transform_server_url_to_foldername(server: str) -> str:
|
|
13
15
|
"""
|
|
@@ -49,6 +51,12 @@ class UploadConfig:
|
|
|
49
51
|
diagnostics: DiagnosticsConfig = field(default_factory=DiagnosticsConfig)
|
|
50
52
|
interrupt_after: int | None = None
|
|
51
53
|
skip_iiif_validation: bool = False
|
|
54
|
+
skip_validation: bool = False
|
|
55
|
+
skip_ontology_validation: bool = False
|
|
56
|
+
ignore_duplicate_files_warning: bool = False
|
|
57
|
+
validation_severity: ValidationSeverity = field(default_factory=lambda: ValidationSeverity.INFO)
|
|
58
|
+
id2iri_file: str | None = None
|
|
59
|
+
do_not_request_resource_metadata_from_db: bool = False
|
|
52
60
|
|
|
53
61
|
def with_server_info(
|
|
54
62
|
self,
|
|
@@ -2,21 +2,26 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
from datetime import datetime
|
|
5
|
+
from pathlib import Path
|
|
5
6
|
|
|
6
7
|
from loguru import logger
|
|
7
8
|
|
|
8
9
|
from dsp_tools.commands.xmlupload.upload_config import DiagnosticsConfig
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
def write_id2iri_mapping(
|
|
12
|
-
id2iri_mapping: dict[str, str],
|
|
13
|
-
diagnostics: DiagnosticsConfig,
|
|
14
|
-
) -> None:
|
|
12
|
+
def write_id2iri_mapping(id2iri_mapping: dict[str, str], shortcode: str, diagnostics: DiagnosticsConfig) -> None:
|
|
15
13
|
"""Writes the mapping of internal IDs to IRIs to a file."""
|
|
16
14
|
timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S")
|
|
17
15
|
servername = diagnostics.server_as_foldername
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
json_str = json.dumps(id2iri_mapping, ensure_ascii=False, indent=4)
|
|
17
|
+
id2iri_filename_for_user = f"id2iri_{shortcode}_{servername}_{timestamp}.json"
|
|
18
|
+
with open(id2iri_filename_for_user, "w", encoding="utf-8") as f:
|
|
19
|
+
f.write(json_str)
|
|
20
|
+
print(f"{datetime.now()}: The mapping of internal IDs to IRIs was written to {id2iri_filename_for_user}")
|
|
21
|
+
logger.info(f"The mapping of internal IDs to IRIs was written to {id2iri_filename_for_user}")
|
|
22
|
+
|
|
23
|
+
id_2_iri_folder = Path.home() / ".dsp-tools" / "id2iri"
|
|
24
|
+
id_2_iri_folder.mkdir(parents=True, exist_ok=True)
|
|
25
|
+
id2iri_filename_for_user_home = f"id2iri_{timestamp}_{shortcode}_{servername}.json"
|
|
26
|
+
with open(id_2_iri_folder / id2iri_filename_for_user_home, "w", encoding="utf-8") as f:
|
|
27
|
+
f.write(json_str)
|