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.
Files changed (316) hide show
  1. dsp_tools/__init__.py +4 -0
  2. dsp_tools/cli/args.py +36 -0
  3. dsp_tools/cli/call_action.py +51 -231
  4. dsp_tools/cli/call_action_files_only.py +101 -0
  5. dsp_tools/cli/call_action_with_network.py +207 -0
  6. dsp_tools/cli/create_parsers.py +156 -58
  7. dsp_tools/cli/entry_point.py +56 -26
  8. dsp_tools/cli/utils.py +87 -0
  9. dsp_tools/clients/CLAUDE.md +420 -0
  10. dsp_tools/clients/authentication_client.py +14 -0
  11. dsp_tools/clients/authentication_client_live.py +66 -0
  12. dsp_tools/{utils → clients}/connection.py +2 -18
  13. dsp_tools/clients/connection_live.py +233 -0
  14. dsp_tools/clients/fuseki_metrics.py +60 -0
  15. dsp_tools/clients/group_user_clients.py +35 -0
  16. dsp_tools/clients/group_user_clients_live.py +181 -0
  17. dsp_tools/clients/legal_info_client.py +23 -0
  18. dsp_tools/clients/legal_info_client_live.py +132 -0
  19. dsp_tools/clients/list_client.py +49 -0
  20. dsp_tools/clients/list_client_live.py +166 -0
  21. dsp_tools/clients/metadata_client.py +24 -0
  22. dsp_tools/clients/metadata_client_live.py +47 -0
  23. dsp_tools/clients/ontology_clients.py +49 -0
  24. dsp_tools/clients/ontology_create_client_live.py +166 -0
  25. dsp_tools/clients/ontology_get_client_live.py +80 -0
  26. dsp_tools/clients/permissions_client.py +68 -0
  27. dsp_tools/clients/project_client.py +16 -0
  28. dsp_tools/clients/project_client_live.py +66 -0
  29. dsp_tools/commands/create/communicate_problems.py +24 -0
  30. dsp_tools/commands/create/create.py +134 -0
  31. dsp_tools/commands/create/create_on_server/cardinalities.py +111 -0
  32. dsp_tools/commands/create/create_on_server/classes.py +99 -0
  33. dsp_tools/commands/create/create_on_server/complete_ontologies.py +116 -0
  34. dsp_tools/commands/create/create_on_server/default_permissions.py +134 -0
  35. dsp_tools/commands/create/create_on_server/group_users.py +165 -0
  36. dsp_tools/commands/create/create_on_server/lists.py +163 -0
  37. dsp_tools/commands/create/create_on_server/mappers.py +12 -0
  38. dsp_tools/commands/create/create_on_server/onto_utils.py +74 -0
  39. dsp_tools/commands/create/create_on_server/ontology.py +52 -0
  40. dsp_tools/commands/create/create_on_server/project.py +68 -0
  41. dsp_tools/commands/create/create_on_server/properties.py +119 -0
  42. dsp_tools/commands/create/exceptions.py +29 -0
  43. dsp_tools/commands/create/lists_only.py +66 -0
  44. dsp_tools/commands/create/models/create_problems.py +87 -0
  45. dsp_tools/commands/create/models/parsed_ontology.py +88 -0
  46. dsp_tools/commands/create/models/parsed_project.py +81 -0
  47. dsp_tools/commands/create/models/rdf_ontology.py +12 -0
  48. dsp_tools/commands/create/models/server_project_info.py +100 -0
  49. dsp_tools/commands/create/parsing/parse_lists.py +45 -0
  50. dsp_tools/commands/create/parsing/parse_ontology.py +243 -0
  51. dsp_tools/commands/create/parsing/parse_project.py +149 -0
  52. dsp_tools/commands/create/parsing/parsing_utils.py +40 -0
  53. dsp_tools/commands/create/project_validate.py +595 -0
  54. dsp_tools/commands/create/serialisation/ontology.py +119 -0
  55. dsp_tools/commands/create/serialisation/project.py +44 -0
  56. dsp_tools/commands/excel2json/CLAUDE.md +101 -0
  57. dsp_tools/commands/excel2json/json_header.py +57 -23
  58. dsp_tools/commands/excel2json/{new_lists → lists}/compliance_checks.py +26 -26
  59. dsp_tools/commands/excel2json/{new_lists/make_new_lists.py → lists/make_lists.py} +19 -18
  60. dsp_tools/commands/excel2json/{new_lists → lists}/models/input_error.py +1 -12
  61. dsp_tools/commands/excel2json/{new_lists → lists}/models/serialise.py +9 -5
  62. dsp_tools/commands/excel2json/{new_lists → lists}/utils.py +4 -4
  63. dsp_tools/commands/excel2json/models/input_error.py +31 -11
  64. dsp_tools/commands/excel2json/models/json_header.py +53 -15
  65. dsp_tools/commands/excel2json/models/ontology.py +4 -3
  66. dsp_tools/commands/excel2json/{lists.py → old_lists.py} +26 -112
  67. dsp_tools/commands/excel2json/project.py +78 -34
  68. dsp_tools/commands/excel2json/properties.py +57 -36
  69. dsp_tools/commands/excel2json/resources.py +32 -12
  70. dsp_tools/commands/excel2json/utils.py +20 -1
  71. dsp_tools/commands/excel2xml/__init__.py +2 -2
  72. dsp_tools/commands/excel2xml/excel2xml_cli.py +7 -15
  73. dsp_tools/commands/excel2xml/excel2xml_lib.py +138 -493
  74. dsp_tools/commands/excel2xml/propertyelement.py +5 -5
  75. dsp_tools/commands/{project → get}/get.py +29 -13
  76. dsp_tools/commands/get/get_permissions.py +257 -0
  77. dsp_tools/commands/get/get_permissions_legacy.py +89 -0
  78. dsp_tools/commands/{project/models → get/legacy_models}/context.py +6 -6
  79. dsp_tools/commands/{project/models → get/legacy_models}/group.py +5 -10
  80. dsp_tools/commands/{project/models → get/legacy_models}/listnode.py +5 -35
  81. dsp_tools/commands/{project/models → get/legacy_models}/model.py +1 -1
  82. dsp_tools/commands/{project/models → get/legacy_models}/ontology.py +9 -14
  83. dsp_tools/commands/{project/models → get/legacy_models}/project.py +13 -6
  84. dsp_tools/commands/{project/models → get/legacy_models}/propertyclass.py +9 -16
  85. dsp_tools/commands/{project/models → get/legacy_models}/resourceclass.py +8 -46
  86. dsp_tools/commands/{project/models → get/legacy_models}/user.py +19 -60
  87. dsp_tools/commands/get/models/permissions_models.py +10 -0
  88. dsp_tools/commands/id2iri.py +20 -10
  89. dsp_tools/commands/ingest_xmlupload/bulk_ingest_client.py +81 -56
  90. dsp_tools/commands/ingest_xmlupload/create_resources/apply_ingest_id.py +4 -10
  91. dsp_tools/commands/ingest_xmlupload/create_resources/upload_xml.py +97 -37
  92. dsp_tools/commands/ingest_xmlupload/create_resources/user_information.py +2 -2
  93. dsp_tools/commands/ingest_xmlupload/ingest_files/ingest_files.py +9 -10
  94. dsp_tools/commands/ingest_xmlupload/upload_files/filechecker.py +3 -3
  95. dsp_tools/commands/ingest_xmlupload/upload_files/input_error.py +2 -10
  96. dsp_tools/commands/ingest_xmlupload/upload_files/upload_failures.py +12 -2
  97. dsp_tools/commands/ingest_xmlupload/upload_files/upload_files.py +8 -9
  98. dsp_tools/commands/resume_xmlupload/resume_xmlupload.py +18 -18
  99. dsp_tools/commands/start_stack.py +126 -77
  100. dsp_tools/commands/update_legal/CLAUDE.md +344 -0
  101. dsp_tools/commands/update_legal/__init__.py +0 -0
  102. dsp_tools/commands/update_legal/core.py +182 -0
  103. dsp_tools/commands/update_legal/csv_operations.py +135 -0
  104. dsp_tools/commands/update_legal/models.py +87 -0
  105. dsp_tools/commands/update_legal/xml_operations.py +247 -0
  106. dsp_tools/commands/validate_data/CLAUDE.md +159 -0
  107. dsp_tools/commands/validate_data/__init__.py +0 -0
  108. dsp_tools/commands/validate_data/constants.py +59 -0
  109. dsp_tools/commands/validate_data/mappers.py +143 -0
  110. dsp_tools/commands/validate_data/models/__init__.py +0 -0
  111. dsp_tools/commands/validate_data/models/api_responses.py +45 -0
  112. dsp_tools/commands/validate_data/models/input_problems.py +119 -0
  113. dsp_tools/commands/validate_data/models/rdf_like_data.py +117 -0
  114. dsp_tools/commands/validate_data/models/validation.py +106 -0
  115. dsp_tools/commands/validate_data/prepare_data/__init__.py +0 -0
  116. dsp_tools/commands/validate_data/prepare_data/get_rdf_like_data.py +296 -0
  117. dsp_tools/commands/validate_data/prepare_data/make_data_graph.py +91 -0
  118. dsp_tools/commands/validate_data/prepare_data/prepare_data.py +184 -0
  119. dsp_tools/commands/validate_data/process_validation_report/__init__.py +0 -0
  120. dsp_tools/commands/validate_data/process_validation_report/get_user_validation_message.py +358 -0
  121. dsp_tools/commands/validate_data/process_validation_report/query_validation_result.py +507 -0
  122. dsp_tools/commands/validate_data/process_validation_report/reformat_validation_results.py +150 -0
  123. dsp_tools/commands/validate_data/shacl_cli_validator.py +70 -0
  124. dsp_tools/commands/validate_data/sparql/__init__.py +0 -0
  125. dsp_tools/commands/{xml_validate/sparql/resource_shacl.py → validate_data/sparql/cardinality_shacl.py} +45 -47
  126. dsp_tools/commands/validate_data/sparql/construct_shacl.py +92 -0
  127. dsp_tools/commands/validate_data/sparql/legal_info_shacl.py +36 -0
  128. dsp_tools/commands/validate_data/sparql/value_shacl.py +357 -0
  129. dsp_tools/commands/validate_data/utils.py +59 -0
  130. dsp_tools/commands/validate_data/validate_data.py +283 -0
  131. dsp_tools/commands/validate_data/validation/__init__.py +0 -0
  132. dsp_tools/commands/validate_data/validation/check_duplicate_files.py +55 -0
  133. dsp_tools/commands/validate_data/validation/check_for_unknown_classes.py +67 -0
  134. dsp_tools/commands/validate_data/validation/get_validation_report.py +94 -0
  135. dsp_tools/commands/validate_data/validation/validate_ontology.py +107 -0
  136. dsp_tools/commands/xmlupload/CLAUDE.md +292 -0
  137. dsp_tools/commands/xmlupload/make_rdf_graph/__init__.py +0 -0
  138. dsp_tools/commands/xmlupload/make_rdf_graph/constants.py +63 -0
  139. dsp_tools/commands/xmlupload/make_rdf_graph/jsonld_utils.py +44 -0
  140. dsp_tools/commands/xmlupload/make_rdf_graph/make_file_value.py +77 -0
  141. dsp_tools/commands/xmlupload/make_rdf_graph/make_resource_and_values.py +114 -0
  142. dsp_tools/commands/xmlupload/make_rdf_graph/make_values.py +262 -0
  143. dsp_tools/commands/xmlupload/models/bitstream_info.py +18 -0
  144. dsp_tools/commands/xmlupload/models/formatted_text_value.py +0 -25
  145. dsp_tools/commands/xmlupload/models/ingest.py +56 -70
  146. dsp_tools/commands/xmlupload/models/input_problems.py +6 -14
  147. dsp_tools/commands/xmlupload/models/lookup_models.py +21 -0
  148. dsp_tools/commands/xmlupload/models/permission.py +0 -39
  149. dsp_tools/commands/xmlupload/models/{deserialise/xmlpermission.py → permissions_parsed.py} +2 -2
  150. dsp_tools/commands/xmlupload/models/processed/__init__.py +0 -0
  151. dsp_tools/commands/xmlupload/models/processed/file_values.py +29 -0
  152. dsp_tools/commands/xmlupload/models/processed/res.py +27 -0
  153. dsp_tools/commands/xmlupload/models/processed/values.py +101 -0
  154. dsp_tools/commands/xmlupload/models/rdf_models.py +26 -0
  155. dsp_tools/commands/xmlupload/models/upload_clients.py +3 -3
  156. dsp_tools/commands/xmlupload/models/upload_state.py +2 -4
  157. dsp_tools/commands/xmlupload/prepare_xml_input/__init__.py +0 -0
  158. dsp_tools/commands/xmlupload/{ark2iri.py → prepare_xml_input/ark2iri.py} +1 -1
  159. dsp_tools/commands/xmlupload/prepare_xml_input/get_processed_resources.py +252 -0
  160. dsp_tools/commands/xmlupload/{iiif_uri_validator.py → prepare_xml_input/iiif_uri_validator.py} +2 -14
  161. dsp_tools/commands/xmlupload/{list_client.py → prepare_xml_input/list_client.py} +15 -10
  162. dsp_tools/commands/xmlupload/prepare_xml_input/prepare_xml_input.py +67 -0
  163. dsp_tools/commands/xmlupload/prepare_xml_input/read_validate_xml_file.py +58 -0
  164. dsp_tools/commands/xmlupload/prepare_xml_input/transform_input_values.py +118 -0
  165. dsp_tools/commands/xmlupload/resource_create_client.py +7 -468
  166. dsp_tools/commands/xmlupload/richtext_id2iri.py +37 -0
  167. dsp_tools/commands/xmlupload/stash/{construct_and_analyze_graph.py → analyse_circular_reference_graph.py} +64 -157
  168. dsp_tools/commands/xmlupload/stash/create_info_for_graph.py +53 -0
  169. dsp_tools/commands/xmlupload/stash/graph_models.py +13 -8
  170. dsp_tools/commands/xmlupload/stash/stash_circular_references.py +48 -115
  171. dsp_tools/commands/xmlupload/stash/stash_models.py +4 -9
  172. dsp_tools/commands/xmlupload/stash/upload_stashed_resptr_props.py +34 -40
  173. dsp_tools/commands/xmlupload/stash/upload_stashed_xml_texts.py +98 -108
  174. dsp_tools/commands/xmlupload/upload_config.py +8 -0
  175. dsp_tools/commands/xmlupload/write_diagnostic_info.py +14 -9
  176. dsp_tools/commands/xmlupload/xmlupload.py +214 -192
  177. dsp_tools/config/__init__.py +0 -0
  178. dsp_tools/config/logger_config.py +69 -0
  179. dsp_tools/{utils → config}/warnings_config.py +4 -1
  180. dsp_tools/error/__init__.py +0 -0
  181. dsp_tools/error/custom_warnings.py +39 -0
  182. dsp_tools/error/exceptions.py +204 -0
  183. dsp_tools/error/problems.py +10 -0
  184. dsp_tools/error/xmllib_errors.py +20 -0
  185. dsp_tools/error/xmllib_warnings.py +54 -0
  186. dsp_tools/error/xmllib_warnings_util.py +159 -0
  187. dsp_tools/error/xsd_validation_error_msg.py +19 -0
  188. dsp_tools/legacy_models/__init__.py +0 -0
  189. dsp_tools/{models → legacy_models}/datetimestamp.py +7 -7
  190. dsp_tools/{models → legacy_models}/langstring.py +1 -1
  191. dsp_tools/{models → legacy_models}/projectContext.py +4 -4
  192. dsp_tools/resources/schema/data.xsd +108 -83
  193. dsp_tools/resources/schema/lists-only.json +4 -23
  194. dsp_tools/resources/schema/project.json +80 -35
  195. dsp_tools/resources/schema/properties-only.json +1 -4
  196. dsp_tools/resources/start-stack/docker-compose.override-host.j2 +11 -0
  197. dsp_tools/resources/start-stack/docker-compose.yml +34 -30
  198. dsp_tools/resources/start-stack/dsp-app-config.json +45 -0
  199. dsp_tools/resources/start-stack/dsp-app-config.override-host.j2 +26 -0
  200. dsp_tools/resources/validate_data/api-shapes-resource-cardinalities.ttl +191 -0
  201. dsp_tools/resources/validate_data/api-shapes.ttl +804 -0
  202. dsp_tools/resources/validate_data/shacl-cli-image.yml +4 -0
  203. dsp_tools/resources/validate_data/validate-ontology.ttl +99 -0
  204. dsp_tools/utils/ansi_colors.py +32 -0
  205. dsp_tools/utils/data_formats/__init__.py +0 -0
  206. dsp_tools/utils/{date_util.py → data_formats/date_util.py} +13 -1
  207. dsp_tools/utils/data_formats/iri_util.py +30 -0
  208. dsp_tools/utils/{shared.py → data_formats/shared.py} +1 -35
  209. dsp_tools/utils/{uri_util.py → data_formats/uri_util.py} +12 -2
  210. dsp_tools/utils/fuseki_bloating.py +63 -0
  211. dsp_tools/utils/json_parsing.py +22 -0
  212. dsp_tools/utils/rdf_constants.py +42 -0
  213. dsp_tools/utils/rdflib_utils.py +10 -0
  214. dsp_tools/utils/replace_id_with_iri.py +66 -0
  215. dsp_tools/utils/request_utils.py +238 -0
  216. dsp_tools/utils/xml_parsing/__init__.py +0 -0
  217. dsp_tools/utils/xml_parsing/get_lookups.py +32 -0
  218. dsp_tools/utils/xml_parsing/get_parsed_resources.py +325 -0
  219. dsp_tools/utils/xml_parsing/models/__init__.py +0 -0
  220. dsp_tools/utils/xml_parsing/models/parsed_resource.py +76 -0
  221. dsp_tools/utils/xml_parsing/parse_clean_validate_xml.py +137 -0
  222. dsp_tools/xmllib/CLAUDE.md +302 -0
  223. dsp_tools/xmllib/__init__.py +49 -0
  224. dsp_tools/xmllib/general_functions.py +877 -0
  225. dsp_tools/xmllib/internal/__init__.py +0 -0
  226. dsp_tools/xmllib/internal/checkers.py +162 -0
  227. dsp_tools/xmllib/internal/circumvent_circular_imports.py +36 -0
  228. dsp_tools/xmllib/internal/constants.py +46 -0
  229. dsp_tools/xmllib/internal/input_converters.py +155 -0
  230. dsp_tools/xmllib/internal/serialise_file_value.py +57 -0
  231. dsp_tools/xmllib/internal/serialise_resource.py +177 -0
  232. dsp_tools/xmllib/internal/serialise_values.py +152 -0
  233. dsp_tools/xmllib/internal/type_aliases.py +11 -0
  234. dsp_tools/xmllib/models/config_options.py +28 -0
  235. dsp_tools/xmllib/models/date_formats.py +48 -0
  236. dsp_tools/xmllib/models/dsp_base_resources.py +1380 -400
  237. dsp_tools/xmllib/models/internal/__init__.py +0 -0
  238. dsp_tools/xmllib/models/internal/file_values.py +172 -0
  239. dsp_tools/xmllib/models/internal/geometry.py +162 -0
  240. dsp_tools/xmllib/models/{migration_metadata.py → internal/migration_metadata.py} +14 -10
  241. dsp_tools/xmllib/models/internal/serialise_permissions.py +66 -0
  242. dsp_tools/xmllib/models/internal/values.py +342 -0
  243. dsp_tools/xmllib/models/licenses/__init__.py +0 -0
  244. dsp_tools/xmllib/models/licenses/other.py +59 -0
  245. dsp_tools/xmllib/models/licenses/recommended.py +107 -0
  246. dsp_tools/xmllib/models/permissions.py +41 -0
  247. dsp_tools/xmllib/models/res.py +1782 -0
  248. dsp_tools/xmllib/models/root.py +313 -26
  249. dsp_tools/xmllib/value_checkers.py +310 -47
  250. dsp_tools/xmllib/value_converters.py +765 -8
  251. dsp_tools-18.3.0.post13.dist-info/METADATA +90 -0
  252. dsp_tools-18.3.0.post13.dist-info/RECORD +286 -0
  253. dsp_tools-18.3.0.post13.dist-info/WHEEL +4 -0
  254. {dsp_tools-9.1.0.post11.dist-info → dsp_tools-18.3.0.post13.dist-info}/entry_points.txt +1 -0
  255. dsp_tools/commands/project/create/project_create.py +0 -1107
  256. dsp_tools/commands/project/create/project_create_lists.py +0 -204
  257. dsp_tools/commands/project/create/project_validate.py +0 -453
  258. dsp_tools/commands/project/models/project_definition.py +0 -12
  259. dsp_tools/commands/rosetta.py +0 -124
  260. dsp_tools/commands/template.py +0 -30
  261. dsp_tools/commands/xml_validate/api_connection.py +0 -122
  262. dsp_tools/commands/xml_validate/deserialise_input.py +0 -135
  263. dsp_tools/commands/xml_validate/make_data_rdf.py +0 -193
  264. dsp_tools/commands/xml_validate/models/data_deserialised.py +0 -108
  265. dsp_tools/commands/xml_validate/models/data_rdf.py +0 -214
  266. dsp_tools/commands/xml_validate/models/input_problems.py +0 -191
  267. dsp_tools/commands/xml_validate/models/validation.py +0 -29
  268. dsp_tools/commands/xml_validate/reformat_validaton_result.py +0 -89
  269. dsp_tools/commands/xml_validate/sparql/construct_shapes.py +0 -16
  270. dsp_tools/commands/xml_validate/xml_validate.py +0 -151
  271. dsp_tools/commands/xmlupload/check_consistency_with_ontology.py +0 -253
  272. dsp_tools/commands/xmlupload/models/deserialise/deserialise_value.py +0 -236
  273. dsp_tools/commands/xmlupload/models/deserialise/xmlresource.py +0 -171
  274. dsp_tools/commands/xmlupload/models/namespace_context.py +0 -39
  275. dsp_tools/commands/xmlupload/models/ontology_lookup_models.py +0 -161
  276. dsp_tools/commands/xmlupload/models/ontology_problem_models.py +0 -178
  277. dsp_tools/commands/xmlupload/models/serialise/jsonld_serialiser.py +0 -40
  278. dsp_tools/commands/xmlupload/models/serialise/serialise_value.py +0 -51
  279. dsp_tools/commands/xmlupload/ontology_client.py +0 -92
  280. dsp_tools/commands/xmlupload/project_client.py +0 -91
  281. dsp_tools/commands/xmlupload/read_validate_xml_file.py +0 -99
  282. dsp_tools/models/custom_warnings.py +0 -31
  283. dsp_tools/models/exceptions.py +0 -90
  284. dsp_tools/resources/0100-template-repo/template.json +0 -45
  285. dsp_tools/resources/0100-template-repo/template.xml +0 -27
  286. dsp_tools/resources/start-stack/docker-compose-validation.yml +0 -5
  287. dsp_tools/resources/start-stack/start-stack-config.yml +0 -4
  288. dsp_tools/resources/xml_validate/api-shapes.ttl +0 -411
  289. dsp_tools/resources/xml_validate/replace_namespace.xslt +0 -61
  290. dsp_tools/utils/connection_live.py +0 -383
  291. dsp_tools/utils/iri_util.py +0 -14
  292. dsp_tools/utils/logger_config.py +0 -41
  293. dsp_tools/utils/set_encoder.py +0 -20
  294. dsp_tools/utils/xml_utils.py +0 -145
  295. dsp_tools/utils/xml_validation.py +0 -197
  296. dsp_tools/utils/xml_validation_models.py +0 -68
  297. dsp_tools/xmllib/models/file_values.py +0 -78
  298. dsp_tools/xmllib/models/resource.py +0 -415
  299. dsp_tools/xmllib/models/values.py +0 -428
  300. dsp_tools-9.1.0.post11.dist-info/METADATA +0 -130
  301. dsp_tools-9.1.0.post11.dist-info/RECORD +0 -167
  302. dsp_tools-9.1.0.post11.dist-info/WHEEL +0 -4
  303. dsp_tools-9.1.0.post11.dist-info/licenses/LICENSE +0 -674
  304. /dsp_tools/{commands/excel2json/new_lists → clients}/__init__.py +0 -0
  305. /dsp_tools/commands/{excel2json/new_lists/models → create}/__init__.py +0 -0
  306. /dsp_tools/commands/{project → create/create_on_server}/__init__.py +0 -0
  307. /dsp_tools/commands/{project/create → create/models}/__init__.py +0 -0
  308. /dsp_tools/commands/{project/models → create/parsing}/__init__.py +0 -0
  309. /dsp_tools/commands/{xml_validate → create/serialisation}/__init__.py +0 -0
  310. /dsp_tools/commands/{xml_validate/models → excel2json/lists}/__init__.py +0 -0
  311. /dsp_tools/commands/{xml_validate/sparql → excel2json/lists/models}/__init__.py +0 -0
  312. /dsp_tools/commands/excel2json/{new_lists → lists}/models/deserialise.py +0 -0
  313. /dsp_tools/commands/{xmlupload/models/deserialise → get}/__init__.py +0 -0
  314. /dsp_tools/commands/{xmlupload/models/serialise → get/legacy_models}/__init__.py +0 -0
  315. /dsp_tools/commands/{project/models → get/legacy_models}/helpers.py +0 -0
  316. /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.models.exceptions import BaseError
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
- for res_id, stash_items in link_value_stash.res_2_stash_items.copy().items():
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.target_id)
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, context):
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
- payload = _create_resptr_prop_json_object_to_update(stash, res_iri, target_iri, context)
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.prop_name)
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.prop_name}"')
86
+ logger.debug(f' Successfully uploaded resptr links of "{stash.value.prop_iri}"')
84
87
  return True
85
88
 
86
89
 
87
- def _log_unable_to_upload_link_value(msg: str, res_id: str, prop_name: str) -> None:
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
- res_iri: str,
92
+ res_iri_str: str,
96
93
  target_iri: str,
97
- context: dict[str, str],
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
- linkVal = {
101
- "@type": "knora-api:LinkValue",
102
- "knora-api:linkValueHasTargetIri": {"@id": target_iri},
103
- }
104
- if stash.permission:
105
- linkVal["knora-api:hasPermissions"] = stash.permission
106
- jsonobj = {
107
- "@id": res_iri,
108
- "@type": stash.res_type,
109
- f"{stash.prop_name}Value": linkVal,
110
- "@context": context,
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.models.formatted_text_value import FormattedTextValue
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.models.exceptions import BaseError
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
- for res_id, stash_items in standoff_stash.res_2_stash_items.copy().items():
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.prop_name, resource_in_triplestore, stash_item.uuid)
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
- values_on_server = resource.get(property_name)
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
- adjusted_text_value = stash_item.value.with_iris(iri_resolver)
192
- payload = _create_XMLResource_json_object_to_update(
193
- res_iri,
194
- res_type,
195
- stash_item.prop_name,
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.prop_name)
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.prop_name}"')
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
- id2iri_filename = f"{timestamp}_id2iri_mapping_{servername}.json"
19
- with open(id2iri_filename, "x", encoding="utf-8") as f:
20
- json.dump(id2iri_mapping, f, ensure_ascii=False, indent=4)
21
- print(f"{datetime.now()}: The mapping of internal IDs to IRIs was written to {id2iri_filename}")
22
- logger.info(f"The mapping of internal IDs to IRIs was written to {id2iri_filename}")
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)