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
@@ -0,0 +1,342 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any
5
+ from typing import Protocol
6
+
7
+ from dsp_tools.error.xmllib_errors import XmllibInputError
8
+ from dsp_tools.error.xmllib_warnings import MessageInfo
9
+ from dsp_tools.error.xmllib_warnings_util import emit_xmllib_input_type_mismatch_warning
10
+ from dsp_tools.error.xmllib_warnings_util import raise_xmllib_input_error
11
+ from dsp_tools.utils.data_formats.uri_util import is_uri
12
+ from dsp_tools.xmllib.internal.checkers import check_and_inform_about_angular_brackets
13
+ from dsp_tools.xmllib.internal.circumvent_circular_imports import parse_richtext_as_xml
14
+ from dsp_tools.xmllib.internal.input_converters import check_and_fix_is_non_empty_string
15
+ from dsp_tools.xmllib.internal.input_converters import check_and_get_corrected_comment
16
+ from dsp_tools.xmllib.models.config_options import NewlineReplacement
17
+ from dsp_tools.xmllib.models.permissions import Permissions
18
+ from dsp_tools.xmllib.value_checkers import is_color
19
+ from dsp_tools.xmllib.value_checkers import is_date
20
+ from dsp_tools.xmllib.value_checkers import is_decimal
21
+ from dsp_tools.xmllib.value_checkers import is_geoname
22
+ from dsp_tools.xmllib.value_checkers import is_integer
23
+ from dsp_tools.xmllib.value_checkers import is_link_value
24
+ from dsp_tools.xmllib.value_checkers import is_nonempty_value
25
+ from dsp_tools.xmllib.value_checkers import is_timestamp
26
+ from dsp_tools.xmllib.value_converters import convert_to_bool_string
27
+ from dsp_tools.xmllib.value_converters import replace_newlines_with_tags
28
+
29
+
30
+ class Value(Protocol):
31
+ value: str
32
+ prop_name: str
33
+ permissions: Permissions
34
+ comment: str | None
35
+
36
+
37
+ @dataclass
38
+ class BooleanValue(Value):
39
+ value: str
40
+ prop_name: str
41
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
42
+ comment: str | None = None
43
+
44
+ @classmethod
45
+ def new(
46
+ cls,
47
+ value: Any,
48
+ prop_name: str,
49
+ permissions: Permissions,
50
+ comment: str | None,
51
+ resource_id: str | None,
52
+ ) -> BooleanValue:
53
+ try:
54
+ val = str(convert_to_bool_string(value)).lower()
55
+ except XmllibInputError:
56
+ emit_xmllib_input_type_mismatch_warning(
57
+ expected_type="bool", value=value, res_id=resource_id, prop_name=prop_name
58
+ )
59
+ val = str(value)
60
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
61
+ return cls(value=val, prop_name=prop_name, permissions=permissions, comment=fixed_comment)
62
+
63
+
64
+ @dataclass
65
+ class ColorValue(Value):
66
+ value: str
67
+ prop_name: str
68
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
69
+ comment: str | None = None
70
+
71
+ @classmethod
72
+ def new(
73
+ cls,
74
+ value: Any,
75
+ prop_name: str,
76
+ permissions: Permissions,
77
+ comment: str | None,
78
+ resource_id: str | None,
79
+ ) -> ColorValue:
80
+ if not is_color(value):
81
+ emit_xmllib_input_type_mismatch_warning(
82
+ expected_type="color", value=value, res_id=resource_id, prop_name=prop_name
83
+ )
84
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
85
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
86
+
87
+
88
+ @dataclass
89
+ class DateValue(Value):
90
+ value: str
91
+ prop_name: str
92
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
93
+ comment: str | None = None
94
+
95
+ @classmethod
96
+ def new(
97
+ cls,
98
+ value: Any,
99
+ prop_name: str,
100
+ permissions: Permissions,
101
+ comment: str | None,
102
+ resource_id: str | None,
103
+ ) -> DateValue:
104
+ if not is_date(value):
105
+ emit_xmllib_input_type_mismatch_warning(
106
+ expected_type="date", value=value, res_id=resource_id, prop_name=prop_name
107
+ )
108
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
109
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
110
+
111
+
112
+ @dataclass
113
+ class DecimalValue(Value):
114
+ value: str
115
+ prop_name: str
116
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
117
+ comment: str | None = None
118
+
119
+ @classmethod
120
+ def new(
121
+ cls,
122
+ value: Any,
123
+ prop_name: str,
124
+ permissions: Permissions,
125
+ comment: str | None,
126
+ resource_id: str | None,
127
+ ) -> DecimalValue:
128
+ if not is_decimal(value):
129
+ emit_xmllib_input_type_mismatch_warning(
130
+ expected_type="decimal", value=value, res_id=resource_id, prop_name=prop_name
131
+ )
132
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
133
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
134
+
135
+
136
+ @dataclass
137
+ class GeonameValue(Value):
138
+ value: str
139
+ prop_name: str
140
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
141
+ comment: str | None = None
142
+
143
+ @classmethod
144
+ def new(
145
+ cls,
146
+ value: Any,
147
+ prop_name: str,
148
+ permissions: Permissions,
149
+ comment: str | None,
150
+ resource_id: str | None,
151
+ ) -> GeonameValue:
152
+ if not is_geoname(value):
153
+ emit_xmllib_input_type_mismatch_warning(
154
+ expected_type="geoname", value=value, res_id=resource_id, prop_name=prop_name
155
+ )
156
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
157
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
158
+
159
+
160
+ @dataclass
161
+ class IntValue(Value):
162
+ value: str
163
+ prop_name: str
164
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
165
+ comment: str | None = None
166
+
167
+ @classmethod
168
+ def new(
169
+ cls,
170
+ value: Any,
171
+ prop_name: str,
172
+ permissions: Permissions,
173
+ comment: str | None,
174
+ resource_id: str | None,
175
+ ) -> IntValue:
176
+ if not is_integer(value):
177
+ emit_xmllib_input_type_mismatch_warning(
178
+ expected_type="integer", value=value, res_id=resource_id, prop_name=prop_name
179
+ )
180
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
181
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
182
+
183
+
184
+ @dataclass
185
+ class LinkValue(Value):
186
+ value: str
187
+ prop_name: str
188
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
189
+ comment: str | None = None
190
+
191
+ @classmethod
192
+ def new(
193
+ cls,
194
+ value: Any,
195
+ prop_name: str,
196
+ permissions: Permissions,
197
+ comment: str | None,
198
+ resource_id: str | None,
199
+ ) -> LinkValue:
200
+ if not is_link_value(value):
201
+ emit_xmllib_input_type_mismatch_warning(
202
+ expected_type="xsd:ID or DSP resource IRI", value=value, res_id=resource_id, prop_name=prop_name
203
+ )
204
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
205
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
206
+
207
+
208
+ @dataclass
209
+ class ListValue(Value):
210
+ value: str
211
+ list_name: str
212
+ prop_name: str
213
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
214
+ comment: str | None = None
215
+
216
+ @classmethod
217
+ def new(
218
+ cls,
219
+ value: Any,
220
+ list_name: Any,
221
+ prop_name: str,
222
+ permissions: Permissions,
223
+ comment: str | None,
224
+ resource_id: str | None,
225
+ ) -> ListValue:
226
+ if str(value).startswith("http://rdfh.ch/lists/"):
227
+ list_str = ""
228
+ else:
229
+ list_str = str(list_name)
230
+ if not is_nonempty_value(list_name):
231
+ emit_xmllib_input_type_mismatch_warning(
232
+ expected_type="list name", value=list_name, res_id=resource_id, prop_name=prop_name
233
+ )
234
+ if not is_nonempty_value(value):
235
+ emit_xmllib_input_type_mismatch_warning(
236
+ expected_type="list node", value=value, res_id=resource_id, prop_name=prop_name
237
+ )
238
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
239
+ return cls(
240
+ value=str(value),
241
+ list_name=str(list_str),
242
+ prop_name=prop_name,
243
+ permissions=permissions,
244
+ comment=fixed_comment,
245
+ )
246
+
247
+
248
+ @dataclass
249
+ class SimpleText(Value):
250
+ value: str
251
+ prop_name: str
252
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
253
+ comment: str | None = None
254
+
255
+ @classmethod
256
+ def new(
257
+ cls,
258
+ value: Any,
259
+ prop_name: str,
260
+ permissions: Permissions,
261
+ comment: str | None,
262
+ resource_id: str | None,
263
+ ) -> SimpleText:
264
+ converted_val = check_and_fix_is_non_empty_string(value=value, res_id=resource_id, prop_name=prop_name)
265
+ check_and_inform_about_angular_brackets(value=value, res_id=resource_id, prop_name=prop_name)
266
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
267
+ return cls(value=converted_val, prop_name=prop_name, permissions=permissions, comment=fixed_comment)
268
+
269
+
270
+ @dataclass
271
+ class Richtext(Value):
272
+ value: str
273
+ prop_name: str
274
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
275
+ comment: str | None = None
276
+
277
+ @classmethod
278
+ def new(
279
+ cls,
280
+ value: Any,
281
+ prop_name: str,
282
+ permissions: Permissions,
283
+ comment: str | None,
284
+ resource_id: str | None,
285
+ newline_replacement: NewlineReplacement = NewlineReplacement.NONE,
286
+ ) -> Richtext:
287
+ converted_val = check_and_fix_is_non_empty_string(value=value, res_id=resource_id, prop_name=prop_name)
288
+ converted_val = replace_newlines_with_tags(converted_val, newline_replacement)
289
+ result = parse_richtext_as_xml(converted_val)
290
+ if isinstance(result, MessageInfo):
291
+ raise_xmllib_input_error(result)
292
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
293
+ return cls(value=converted_val, prop_name=prop_name, permissions=permissions, comment=fixed_comment)
294
+
295
+
296
+ @dataclass
297
+ class TimeValue(Value):
298
+ value: str
299
+ prop_name: str
300
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
301
+ comment: str | None = None
302
+
303
+ @classmethod
304
+ def new(
305
+ cls,
306
+ value: Any,
307
+ prop_name: str,
308
+ permissions: Permissions,
309
+ comment: str | None,
310
+ resource_id: str | None,
311
+ ) -> TimeValue:
312
+ if not is_timestamp(value):
313
+ emit_xmllib_input_type_mismatch_warning(
314
+ expected_type="timestamp", value=value, res_id=resource_id, prop_name=prop_name
315
+ )
316
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
317
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
318
+
319
+
320
+ @dataclass
321
+ class UriValue(Value):
322
+ value: str
323
+ prop_name: str
324
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
325
+ comment: str | None = None
326
+
327
+ @classmethod
328
+ def new(
329
+ cls,
330
+ value: Any,
331
+ prop_name: str,
332
+ permissions: Permissions,
333
+ comment: str | None,
334
+ resource_id: str | None,
335
+ ) -> UriValue:
336
+ v = str(value)
337
+ if not is_uri(v):
338
+ emit_xmllib_input_type_mismatch_warning(
339
+ expected_type="uri", value=value, res_id=resource_id, prop_name=prop_name
340
+ )
341
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
342
+ return cls(value=v, prop_name=prop_name, permissions=permissions, comment=fixed_comment)
File without changes
@@ -0,0 +1,59 @@
1
+ from __future__ import annotations
2
+
3
+ from dsp_tools.xmllib.models.licenses.recommended import License
4
+
5
+
6
+ class LicenseOther:
7
+ """
8
+ Pre-defined licenses that are available in DSP.
9
+ If the user is free to choose a license, we recommend to choose from our [recommended licenses](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/licenses/recommended/).
10
+
11
+ - `Public`: [See `Public` for details](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/licenses/other/#xmllib.models.licenses.other.Public).
12
+ - `Various`: [See `Various` for details](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/licenses/other/#xmllib.models.licenses.other.Various).
13
+
14
+ Examples:
15
+ ```python
16
+ # adding a BORIS Standard License to a file
17
+ resource = resource.add_file(
18
+ filename="images/cat.jpg",
19
+ license=xmllib.LicenseOther.Various.BORIS_STANDARD,
20
+ copyright_holder="Meow University",
21
+ authorship=["Kitty Meow"],
22
+ )
23
+ ```
24
+ """
25
+
26
+ Public: type[Public]
27
+ Various: type[Various]
28
+
29
+
30
+ class Public(License):
31
+ """
32
+ Pre-defined public domain licenses.
33
+ [See the API documentation for details about the licenses.](https://docs.dasch.swiss/latest/DSP-API/01-introduction/legal-info/#license)
34
+
35
+ - `CC_0_1_0`: CC0 1.0 Universal
36
+ - `CC_PDM_1_0`: Public Domain Mark 1.0 Universal
37
+ """
38
+
39
+ CC_0_1_0 = "http://rdfh.ch/licenses/cc-0-1.0"
40
+ CC_PDM_1_0 = "http://rdfh.ch/licenses/cc-pdm-1.0"
41
+
42
+
43
+ class Various(License):
44
+ """
45
+ A collection of various, pre-defined licenses.
46
+ [See the API documentation for details about the licenses.](https://docs.dasch.swiss/latest/DSP-API/01-introduction/legal-info/#license)
47
+
48
+ - `BORIS_STANDARD`: BORIS Standard License
49
+ - `FRANCE_OUVERTE`: LICENCE OUVERTE 2.0
50
+ - `RIGHTSSTATEMENTS_NOC_NC`: Rightsstatements: No Copyright - Non-Commercial Use Only
51
+ """
52
+
53
+ BORIS_STANDARD = "http://rdfh.ch/licenses/boris"
54
+ FRANCE_OUVERTE = "http://rdfh.ch/licenses/open-licence-2.0"
55
+ RIGHTSSTATEMENTS_NOC_NC = "http://rdfh.ch/licenses/noc-nc-1.0"
56
+
57
+
58
+ LicenseOther.Public = Public
59
+ LicenseOther.Various = Various
@@ -0,0 +1,107 @@
1
+ from __future__ import annotations
2
+
3
+ from enum import StrEnum
4
+
5
+
6
+ class License(StrEnum): ...
7
+
8
+
9
+ class LicenseRecommended:
10
+ """
11
+ Recommended licenses:
12
+
13
+ - `DSP`: Licenses created and curated by DaSCH, [see `DSP` for details.](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/licenses/recommended/#xmllib.models.licenses.recommended.DSP)
14
+ - `CC`: Creative Commons licenses, [see `CC` for details.](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/licenses/recommended/#xmllib.models.licenses.recommended.CC)
15
+
16
+ Tip:
17
+ Use the helper function [`find_license_in_string()`](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/general-functions/#xmllib.general_functions.find_license_in_string)
18
+ to parse a license from a string.
19
+
20
+ Examples:
21
+ ```python
22
+ # adding a Creative Commons license to a file
23
+ resource = resource.add_file(
24
+ filename="images/cat.jpg",
25
+ license=xmllib.LicenseRecommended.CC.BY,
26
+ copyright_holder="Meow University",
27
+ authorship=["Kitty Meow"],
28
+ )
29
+ ```
30
+
31
+ ```python
32
+ # adding a DSP license to a file
33
+ resource = resource.add_file(
34
+ filename="images/dog.jpg",
35
+ license=xmllib.LicenseRecommended.DSP.PUBLIC_DOMAIN,
36
+ copyright_holder="Bark University",
37
+ authorship=["Bark McDog"],
38
+ )
39
+ ```
40
+ """
41
+
42
+ CC: type[CC]
43
+ DSP: type[DSP]
44
+
45
+
46
+ class CC(License):
47
+ """
48
+ Pre-defined and recommended [Creative Commons licenses:](https://creativecommons.org/share-your-work/)
49
+
50
+ - `BY`: [Attribution 4.0](https://creativecommons.org/licenses/by/4.0/)
51
+ - `BY_SA`: [Attribution-ShareAlike 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
52
+ - `BY_NC`: [Attribution-NonCommercial 4.0](https://creativecommons.org/licenses/by-nc/4.0/)
53
+ - `BY_NC_SA`: [Attribution-NonCommercial-ShareAlike 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)
54
+ - `BY_ND`: [Attribution-NoDerivatives 4.0](https://creativecommons.org/licenses/by-nd/4.0/)
55
+ - `BY_NC_ND`: [Attribution-NonCommercial-NoDerivatives 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/)
56
+
57
+ Tip:
58
+ Use the helper function [find_license_in_string()](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/general-functions/#xmllib.general_functions.find_license_in_string)
59
+ to parse a license from a string.
60
+
61
+ Examples:
62
+ ```python
63
+ # adding a Creative Commons license to a file
64
+ resource = resource.add_file(
65
+ filename="images/dog.jpg",
66
+ license=xmllib.LicenseRecommended.CC.BY_NC_ND,
67
+ copyright_holder="Bark University",
68
+ authorship=["Bark McDog"],
69
+ )
70
+ ```
71
+ """
72
+
73
+ BY = "http://rdfh.ch/licenses/cc-by-4.0"
74
+ BY_SA = "http://rdfh.ch/licenses/cc-by-sa-4.0"
75
+ BY_NC = "http://rdfh.ch/licenses/cc-by-nc-4.0"
76
+ BY_NC_SA = "http://rdfh.ch/licenses/cc-by-nc-sa-4.0"
77
+ BY_ND = "http://rdfh.ch/licenses/cc-by-nd-4.0"
78
+ BY_NC_ND = "http://rdfh.ch/licenses/cc-by-nc-nd-4.0"
79
+
80
+
81
+ class DSP(License):
82
+ """
83
+ Pre-defined and recommended licenses created and curated by DaSCH:
84
+
85
+ - `AI_GENERATED`: AI-Generated Content - Not Protected by Copyright
86
+ - `UNKNOWN`: Unknown License - Ask Copyright Holder for Permission
87
+ - `PUBLIC_DOMAIN`: Public Domain - Not Protected by Copyright
88
+
89
+ Examples:
90
+ ```python
91
+ # adding a DSP license to a file
92
+ resource = resource.add_file(
93
+ filename="images/cat.jpg",
94
+ license=xmllib.LicenseRecommended.DSP.PUBLIC_DOMAIN,
95
+ copyright_holder="Meow University",
96
+ authorship=["Kitty Meow"],
97
+ )
98
+ ```
99
+ """
100
+
101
+ AI_GENERATED = "http://rdfh.ch/licenses/ai-generated"
102
+ UNKNOWN = "http://rdfh.ch/licenses/unknown"
103
+ PUBLIC_DOMAIN = "http://rdfh.ch/licenses/public-domain"
104
+
105
+
106
+ LicenseRecommended.CC = CC
107
+ LicenseRecommended.DSP = DSP
@@ -0,0 +1,41 @@
1
+ from __future__ import annotations
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class Permissions(Enum):
7
+ """
8
+ Options of permissions for resources and values:
9
+
10
+ - `PROJECT_SPECIFIC_PERMISSIONS`: the permissions defined on project level will be applied
11
+ - `PUBLIC`: the resource/value is visible for everyone
12
+ - `PRIVATE`: the resource/value is only visible for project members
13
+ - `LIMITED_VIEW`: the resource/value is visible for everyone,
14
+ but images are blurred/watermarked for non-project members
15
+
16
+ Deprecated terms:
17
+
18
+ - `OPEN`: use `PUBLIC` instead
19
+ - `RESTRICTED`: use `PRIVATE` instead
20
+ - `RESTRICTED_VIEW`: use `LIMITED_VIEW` instead
21
+
22
+ Examples:
23
+ ```python
24
+ resource = xmllib.Resource.create_new(
25
+ res_id="ID",
26
+ restype=":ResourceType",
27
+ label="label",
28
+ permissions=xmllib.Permissions.PRIVATE,
29
+ )
30
+ ```
31
+ """
32
+
33
+ PROJECT_SPECIFIC_PERMISSIONS = ""
34
+ PUBLIC = "public"
35
+ PRIVATE = "private"
36
+ LIMITED_VIEW = "limited_view"
37
+
38
+ # Deprecated terminology
39
+ OPEN = "open"
40
+ RESTRICTED = "restricted"
41
+ RESTRICTED_VIEW = "restricted-view"