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,415 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import warnings
4
- from collections import defaultdict
5
- from dataclasses import dataclass
6
- from dataclasses import field
7
- from typing import Any
8
-
9
- import pandas as pd
10
- from lxml import etree
11
-
12
- from dsp_tools.models.custom_warnings import DspToolsUserWarning
13
- from dsp_tools.models.exceptions import InputError
14
- from dsp_tools.xmllib.models.file_values import AbstractFileValue
15
- from dsp_tools.xmllib.models.file_values import FileValue
16
- from dsp_tools.xmllib.models.file_values import IIIFUri
17
- from dsp_tools.xmllib.models.migration_metadata import MigrationMetadata
18
- from dsp_tools.xmllib.models.values import BooleanValue
19
- from dsp_tools.xmllib.models.values import ColorValue
20
- from dsp_tools.xmllib.models.values import DateValue
21
- from dsp_tools.xmllib.models.values import DecimalValue
22
- from dsp_tools.xmllib.models.values import GeonameValue
23
- from dsp_tools.xmllib.models.values import IntValue
24
- from dsp_tools.xmllib.models.values import LinkValue
25
- from dsp_tools.xmllib.models.values import ListValue
26
- from dsp_tools.xmllib.models.values import Richtext
27
- from dsp_tools.xmllib.models.values import SimpleText
28
- from dsp_tools.xmllib.models.values import TimeValue
29
- from dsp_tools.xmllib.models.values import UriValue
30
- from dsp_tools.xmllib.models.values import Value
31
- from dsp_tools.xmllib.value_checkers import is_string_like
32
-
33
- XML_NAMESPACE_MAP = {None: "https://dasch.swiss/schema", "xsi": "http://www.w3.org/2001/XMLSchema-instance"}
34
- DASCH_SCHEMA = "{https://dasch.swiss/schema}"
35
-
36
- LIST_SEPARATOR = "\n - "
37
-
38
-
39
- @dataclass
40
- class Resource:
41
- res_id: str
42
- restype: str
43
- label: str
44
- values: list[Value] = field(default_factory=list)
45
- permissions: str = "res-default"
46
- file_value: AbstractFileValue | None = None
47
- migration_metadata: MigrationMetadata | None = None
48
-
49
- def __post_init__(self) -> None:
50
- msg = []
51
- if not is_string_like(str(self.label)):
52
- msg.append(f"Label '{self.label}'")
53
- if not is_string_like(str(self.res_id)):
54
- msg.append(f"Resource ID '{self.res_id}'")
55
- if not is_string_like(str(self.restype)):
56
- msg.append(f"Resource Type '{self.restype}'")
57
- if msg:
58
- out_msg = (
59
- f"The Resource with the ID '{self.res_id}' should have strings in the following field(s), "
60
- f"the input is not a valid string.:{LIST_SEPARATOR}{LIST_SEPARATOR.join(msg)}"
61
- )
62
- warnings.warn(DspToolsUserWarning(out_msg))
63
-
64
- def new(self, res_id: str, restype: str, label: str, permissions: str = "res-default") -> Resource:
65
- return Resource(
66
- res_id=res_id,
67
- restype=restype,
68
- label=label,
69
- permissions=permissions,
70
- )
71
-
72
- def serialise(self) -> etree._Element:
73
- res_ele = self._serialise_resource_element()
74
- if self.file_value:
75
- res_ele.append(self.file_value.serialise())
76
- res_ele.extend(self._serialise_values())
77
- return res_ele
78
-
79
- def _serialise_resource_element(self) -> etree._Element:
80
- attribs = {"label": self.label, "restype": self.restype, "id": self.res_id}
81
- if self.permissions:
82
- attribs["permissions"] = self.permissions
83
- return etree.Element(f"{DASCH_SCHEMA}resource", attrib=attribs, nsmap=XML_NAMESPACE_MAP)
84
-
85
- def _serialise_values(self) -> list[etree._Element]:
86
- grouped = defaultdict(list)
87
- for val in self.values:
88
- grouped[val.prop_name].append(val)
89
- return [self._combine_values(prop_values) for prop_values in grouped.values()]
90
-
91
- def _combine_values(self, prop_values: list[Value]) -> etree._Element:
92
- prop_ = prop_values[0].make_prop()
93
- prop_eles = [x.make_element() for x in prop_values]
94
- prop_.extend(prop_eles)
95
- return prop_
96
-
97
- #######################
98
- # BooleanValue
99
- #######################
100
-
101
- def add_bool(
102
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
103
- ) -> Resource:
104
- self.values.append(BooleanValue(value, prop_name, permissions, comment, self.res_id))
105
- return self
106
-
107
- def add_bools(
108
- self, values: list[Any], prop_name: str, permissions: str | None = None, comment: str | None = None
109
- ) -> Resource:
110
- self.values.extend([BooleanValue(v, prop_name, permissions, comment, self.res_id) for v in values])
111
- return self
112
-
113
- def add_bool_optional(
114
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
115
- ) -> Resource:
116
- if not pd.isna(value):
117
- self.values.append(BooleanValue(value, prop_name, permissions, comment, self.res_id))
118
- return self
119
-
120
- #######################
121
- # ColorValue
122
- #######################
123
-
124
- def add_color(
125
- self, value: int | str, prop_name: str, permissions: str | None = None, comment: str | None = None
126
- ) -> Resource:
127
- self.values.append(ColorValue(value, prop_name, permissions, comment, self.res_id))
128
- return self
129
-
130
- def add_colors(
131
- self, values: list[int | str], prop_name: str, permissions: str | None = None, comment: str | None = None
132
- ) -> Resource:
133
- self.values.extend([ColorValue(v, prop_name, permissions, comment, self.res_id) for v in values])
134
- return self
135
-
136
- def add_color_optional(
137
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
138
- ) -> Resource:
139
- if not pd.isna(value):
140
- self.values.append(ColorValue(value, prop_name, permissions, comment, self.res_id))
141
- return self
142
-
143
- #######################
144
- # DateValue
145
- #######################
146
-
147
- def add_date(
148
- self, value: str, prop_name: str, permissions: str | None = None, comment: str | None = None
149
- ) -> Resource:
150
- self.values.append(DateValue(value, prop_name, permissions, comment, self.res_id))
151
- return self
152
-
153
- def add_dates(
154
- self, values: list[str], prop_name: str, permissions: str | None = None, comment: str | None = None
155
- ) -> Resource:
156
- self.values.extend([DateValue(v, prop_name, permissions, comment, self.res_id) for v in values])
157
- return self
158
-
159
- def add_date_optional(
160
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
161
- ) -> Resource:
162
- if not pd.isna(value):
163
- self.values.append(DateValue(value, prop_name, permissions, comment, self.res_id))
164
- return self
165
-
166
- #######################
167
- # DecimalValue
168
- #######################
169
-
170
- def add_decimal(
171
- self, value: float | str, prop_name: str, permissions: str | None = None, comment: str | None = None
172
- ) -> Resource:
173
- self.values.append(DecimalValue(value, prop_name, permissions, comment, self.res_id))
174
- return self
175
-
176
- def add_decimals(
177
- self, values: list[float | str], prop_name: str, permissions: str | None = None, comment: str | None = None
178
- ) -> Resource:
179
- self.values.extend([DecimalValue(v, prop_name, permissions, comment, self.res_id) for v in values])
180
- return self
181
-
182
- def add_decimal_optional(
183
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
184
- ) -> Resource:
185
- if not pd.isna(value):
186
- self.values.append(DecimalValue(value, prop_name, permissions, comment, self.res_id))
187
- return self
188
-
189
- #######################
190
- # GeonameValue
191
- #######################
192
-
193
- def add_geoname(
194
- self, value: int | str, prop_name: str, permissions: str | None = None, comment: str | None = None
195
- ) -> Resource:
196
- self.values.append(GeonameValue(value, prop_name, permissions, comment, self.res_id))
197
- return self
198
-
199
- def add_geonames(
200
- self, values: list[int | str], prop_name: str, permissions: str | None = None, comment: str | None = None
201
- ) -> Resource:
202
- self.values.extend([GeonameValue(v, prop_name, permissions, comment, self.res_id) for v in values])
203
- return self
204
-
205
- def add_geoname_optional(
206
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
207
- ) -> Resource:
208
- if not pd.isna(value):
209
- self.values.append(GeonameValue(value, prop_name, permissions, comment, self.res_id))
210
- return self
211
-
212
- #######################
213
- # IntValue
214
- #######################
215
-
216
- def add_integer(
217
- self, value: int | str, prop_name: str, permissions: str | None = None, comment: str | None = None
218
- ) -> Resource:
219
- self.values.append(IntValue(value, prop_name, permissions, comment, self.res_id))
220
- return self
221
-
222
- def add_integers(
223
- self, values: list[int | str], prop_name: str, permissions: str | None = None, comment: str | None = None
224
- ) -> Resource:
225
- self.values.extend([IntValue(v, prop_name, permissions, comment, self.res_id) for v in values])
226
- return self
227
-
228
- def add_integer_optional(
229
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
230
- ) -> Resource:
231
- if not pd.isna(value):
232
- self.values.append(IntValue(value, prop_name, permissions, comment, self.res_id))
233
- return self
234
-
235
- #######################
236
- # LinkValue
237
- #######################
238
-
239
- def add_link(
240
- self, value: str, prop_name: str, permissions: str | None = None, comment: str | None = None
241
- ) -> Resource:
242
- self.values.append(LinkValue(value, prop_name, permissions, comment, self.res_id))
243
- return self
244
-
245
- def add_links(
246
- self, values: list[str], prop_name: str, permissions: str | None = None, comment: str | None = None
247
- ) -> Resource:
248
- self.values.extend([LinkValue(v, prop_name, permissions, comment, self.res_id) for v in values])
249
- return self
250
-
251
- def add_link_optional(
252
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
253
- ) -> Resource:
254
- if not pd.isna(value):
255
- self.values.append(LinkValue(value, prop_name, permissions, comment, self.res_id))
256
- return self
257
-
258
- #######################
259
- # ListValue
260
- #######################
261
-
262
- def add_list(
263
- self, value: Any, list_name: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
264
- ) -> Resource:
265
- self.values.append(ListValue(value, list_name, prop_name, permissions, comment, self.res_id))
266
- return self
267
-
268
- def add_lists(
269
- self,
270
- values: list[Any],
271
- list_name: Any,
272
- prop_name: str,
273
- permissions: str | None = None,
274
- comment: str | None = None,
275
- ) -> Resource:
276
- self.values.extend([ListValue(v, list_name, prop_name, permissions, comment, self.res_id) for v in values])
277
- return self
278
-
279
- def add_list_optional(
280
- self, value: Any, list_name: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
281
- ) -> Resource:
282
- if not pd.isna(value):
283
- self.values.append(ListValue(value, list_name, prop_name, permissions, comment, self.res_id))
284
- return self
285
-
286
- #######################
287
- # TextValue: SimpleText
288
- #######################
289
-
290
- def add_simpletext(
291
- self, value: str, prop_name: str, permissions: str | None = None, comment: str | None = None
292
- ) -> Resource:
293
- self.values.append(SimpleText(value, prop_name, permissions, comment, self.res_id))
294
- return self
295
-
296
- def add_simpletexts(
297
- self, values: list[str], prop_name: str, permissions: str | None = None, comment: str | None = None
298
- ) -> Resource:
299
- self.values.extend([SimpleText(v, prop_name, permissions, comment, self.res_id) for v in values])
300
- return self
301
-
302
- def add_simpletext_optional(
303
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
304
- ) -> Resource:
305
- if not pd.isna(value):
306
- self.values.append(SimpleText(value, prop_name, permissions, comment, self.res_id))
307
- return self
308
-
309
- #######################
310
- # TextValue: Richtext
311
- #######################
312
-
313
- def add_richtext(
314
- self, value: str, prop_name: str, permissions: str | None = None, comment: str | None = None
315
- ) -> Resource:
316
- self.values.append(Richtext(value, prop_name, permissions, comment, self.res_id))
317
- return self
318
-
319
- def add_richtexts(
320
- self, values: list[str], prop_name: str, permissions: str | None = None, comment: str | None = None
321
- ) -> Resource:
322
- self.values.extend([Richtext(v, prop_name, permissions, comment, self.res_id) for v in values])
323
- return self
324
-
325
- def add_richtext_optional(
326
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
327
- ) -> Resource:
328
- if not pd.isna(value):
329
- self.values.append(Richtext(value, prop_name, permissions, comment, self.res_id))
330
- return self
331
-
332
- #######################
333
- # TimeValue
334
- #######################
335
-
336
- def add_time(
337
- self, value: str, prop_name: str, permissions: str | None = None, comment: str | None = None
338
- ) -> Resource:
339
- self.values.append(TimeValue(value, prop_name, permissions, comment, self.res_id))
340
- return self
341
-
342
- def add_times(
343
- self, values: list[str], prop_name: str, permissions: str | None = None, comment: str | None = None
344
- ) -> Resource:
345
- self.values.extend([TimeValue(v, prop_name, permissions, comment, self.res_id) for v in values])
346
- return self
347
-
348
- def add_time_optional(
349
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
350
- ) -> Resource:
351
- if not pd.isna(value):
352
- self.values.append(TimeValue(value, prop_name, permissions, comment, self.res_id))
353
- return self
354
-
355
- #######################
356
- # UriValue
357
- #######################
358
-
359
- def add_uri(
360
- self, value: str, prop_name: str, permissions: str | None = None, comment: str | None = None
361
- ) -> Resource:
362
- self.values.append(UriValue(value, prop_name, permissions, comment, self.res_id))
363
- return self
364
-
365
- def add_uris(
366
- self, values: list[str], prop_name: str, permissions: str | None = None, comment: str | None = None
367
- ) -> Resource:
368
- self.values.extend([UriValue(v, prop_name, permissions, comment, self.res_id) for v in values])
369
- return self
370
-
371
- def add_uri_optional(
372
- self, value: Any, prop_name: str, permissions: str | None = None, comment: str | None = None
373
- ) -> Resource:
374
- if not pd.isna(value):
375
- self.values.append(UriValue(value, prop_name, permissions, comment, self.res_id))
376
- return self
377
-
378
- #######################
379
- # AbstractFileValue
380
- #######################
381
-
382
- def add_file(self, filename: str, permissions: str | None = None, comment: str | None = None) -> Resource:
383
- if self.file_value:
384
- raise InputError(
385
- f"The resource with the ID '{self.res_id}' already contains a file with the name: "
386
- f"'{self.file_value.value}'.\n"
387
- f"The new file with the name '{filename}' cannot be added."
388
- )
389
- self.file_value = FileValue(filename, permissions, comment, self.res_id)
390
- return self
391
-
392
- def add_iiif_uri(self, iiif_uri: str, permissions: str | None = None, comment: str | None = None) -> Resource:
393
- if self.file_value:
394
- raise InputError(
395
- f"The resource with the ID '{self.res_id}' already contains a file with the name: "
396
- f"'{self.file_value.value}'.\n"
397
- f"The new file with the name '{iiif_uri}' cannot be added."
398
- )
399
- self.file_value = IIIFUri(iiif_uri, permissions, comment, self.res_id)
400
- return self
401
-
402
- #######################
403
- # Migration Metadata
404
- #######################
405
-
406
- def add_migration_metadata(
407
- self, creation_date: str | None, iri: str | None = None, ark: str | None = None
408
- ) -> Resource:
409
- if self.migration_metadata:
410
- raise InputError(
411
- f"The resource with the ID '{self.res_id}' already contains migration metadata, "
412
- f"no new data can be added."
413
- )
414
- self.migration_metadata = MigrationMetadata(creation_date=creation_date, iri=iri, ark=ark, res_id=self.res_id)
415
- return self