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,124 +0,0 @@
1
- import shutil
2
- import subprocess
3
- from pathlib import Path
4
-
5
- from dsp_tools.cli.args import ServerCredentials
6
- from dsp_tools.commands.project.create.project_create import create_project
7
- from dsp_tools.commands.xmlupload.xmlupload import xmlupload
8
- from dsp_tools.models.exceptions import UserError
9
-
10
-
11
- def _update_possibly_existing_repo(rosetta_folder: Path) -> bool:
12
- """
13
- Makes an attempt to pull the latest version of rosetta from GitHub.
14
-
15
- Args:
16
- rosetta_folder: path to the (possibly existing) clone of the repo
17
-
18
- Returns:
19
- True if the repo exists and could be updated, False if the repo doesn't exist or couldn't be updated
20
- """
21
- is_rosetta_up_to_date = True
22
- if rosetta_folder.is_dir():
23
- print(f"Execute 'git pull' in {rosetta_folder}...")
24
- completed_process = subprocess.run("git pull".split(), cwd=rosetta_folder, check=False)
25
- if not completed_process or completed_process.returncode != 0:
26
- print(f"'git pull' failed. Remove '{rosetta_folder}'...")
27
- shutil.rmtree(rosetta_folder, ignore_errors=True)
28
- is_rosetta_up_to_date = False
29
- else:
30
- is_rosetta_up_to_date = False
31
-
32
- return is_rosetta_up_to_date
33
-
34
-
35
- def _clone_repo(
36
- rosetta_folder: Path,
37
- enclosing_folder: Path,
38
- ) -> None:
39
- """
40
- Clones the rosetta repo into the enclosing folder.
41
-
42
- Args:
43
- rosetta_folder: path to the (not yet existing) clone
44
- enclosing_folder: path to the (existing) destination where rosetta should be cloned into
45
-
46
- Raises:
47
- UserError: If rosetta cannot be cloned
48
- """
49
- print(f"Clone into {rosetta_folder}...")
50
- cmd = "git clone https://github.com/dasch-swiss/082E-rosetta-scripts.git".split()
51
- completed_process = subprocess.run(cmd, cwd=enclosing_folder, check=False)
52
- if not completed_process or completed_process.returncode != 0:
53
- raise UserError("There was a problem while cloning the rosetta test project")
54
-
55
-
56
- def _create_json(rosetta_folder: Path) -> bool:
57
- """
58
- Creates the rosetta project on the locally running DSP stack.
59
-
60
- Args:
61
- rosetta_folder: path to the clone
62
-
63
- Returns:
64
- True if the project could be created without problems, False if something went wrong during the creation process
65
- """
66
- print("Execute 'dsp-tools create rosetta.json'...")
67
- creds = ServerCredentials(server="http://0.0.0.0:3333", user="root@example.com", password="test")
68
- return create_project(
69
- project_file_as_path_or_parsed=rosetta_folder / "rosetta.json",
70
- creds=creds,
71
- verbose=False,
72
- )
73
-
74
-
75
- def _upload_xml(rosetta_folder: Path) -> bool:
76
- """
77
- Uplaod the rosetta data on the locally running DSP stack.
78
-
79
- Args:
80
- rosetta_folder: path to the clone
81
-
82
- Returns:
83
- True if all data could be uploaded without problems, False if something went wrong during the upload process
84
- """
85
- print("Execute 'dsp-tools xmlupload rosetta.xml'...")
86
- creds = ServerCredentials(
87
- user="root@example.com",
88
- password="test",
89
- server="http://0.0.0.0:3333",
90
- dsp_ingest_url="http://0.0.0.0:3340",
91
- )
92
- return xmlupload(
93
- input_file=rosetta_folder / "rosetta.xml",
94
- creds=creds,
95
- imgdir=str(rosetta_folder),
96
- )
97
-
98
-
99
- def upload_rosetta() -> bool:
100
- """
101
- This method clones https://github.com/dasch-swiss/082E-rosetta-scripts
102
- into ~/.dsp-tools/rosetta.
103
- If the repository is already there, it pulls instead of cloning.
104
- Then, rosetta.json is created and rosetta.xml uploaded.
105
-
106
- Raises:
107
- UserError: If the repo cannot be cloned nor pulled
108
-
109
- Returns:
110
- True if everything went well
111
- """
112
-
113
- enclosing_folder = Path.home() / Path(".dsp-tools/rosetta")
114
- enclosing_folder.mkdir(parents=True, exist_ok=True)
115
- rosetta_folder = enclosing_folder / "082E-rosetta-scripts"
116
-
117
- is_rosetta_up_to_date = _update_possibly_existing_repo(rosetta_folder=rosetta_folder)
118
- if not is_rosetta_up_to_date:
119
- _clone_repo(rosetta_folder=rosetta_folder, enclosing_folder=enclosing_folder)
120
-
121
- success1 = _create_json(rosetta_folder=rosetta_folder)
122
- success2 = _upload_xml(rosetta_folder=rosetta_folder)
123
-
124
- return success1 and success2
@@ -1,30 +0,0 @@
1
- import importlib.resources
2
- import shutil
3
- from pathlib import Path
4
-
5
- from dsp_tools.models.exceptions import UserError
6
-
7
-
8
- def generate_template_repo() -> bool:
9
- """
10
- Copies the folder src/dsp_tools/resources/0100-template-repo to the working directory.
11
-
12
- Raises:
13
- UserError: If a folder with the same name already exists in the working directory
14
-
15
- Returns:
16
- True if the folder could be copied without problems
17
- """
18
- # copy contents of src/dsp_tools/resources/0100-template-repo to cwd/template-repo
19
- template_path_of_user = Path("0100-template-repo")
20
- try:
21
- template_path_of_user.mkdir()
22
- except OSError:
23
- raise UserError("A folder '0100-template-repo' already exists in your current working directory.") from None
24
- template_path_of_distribution = importlib.resources.files("dsp_tools").joinpath("resources/0100-template-repo")
25
- for file in template_path_of_distribution.iterdir():
26
- with importlib.resources.as_file(file) as f:
27
- shutil.copy(f, template_path_of_user / file.name)
28
- print(f"Created {template_path_of_user / file.name}")
29
-
30
- return True
@@ -1,122 +0,0 @@
1
- from dataclasses import dataclass
2
- from typing import Any
3
- from typing import cast
4
-
5
- import requests
6
- from loguru import logger
7
- from rdflib import Graph
8
- from requests import ReadTimeout
9
- from requests import RequestException
10
- from requests import Response
11
-
12
- from dsp_tools.models.exceptions import InternalError
13
- from dsp_tools.models.exceptions import UserError
14
-
15
-
16
- @dataclass
17
- class OntologyConnection:
18
- api_url: str
19
- shortcode: str
20
-
21
- def _get(self, url: str, headers: dict[str, Any] | None = None) -> Response:
22
- """
23
- Sends a get request to the designated url
24
-
25
- Args:
26
- url: URL for the request
27
- headers: headers for the request
28
-
29
- Returns:
30
- Response of the request if it was a 200 response code
31
-
32
- Raises:
33
- InternalError: in case of errors raised by the requests library
34
- UserError: If a non-200 response was given
35
- """
36
- try:
37
- timeout = 100
38
- logger.debug(f"REQUEST: GET to {url}, timeout: {timeout}, headers: {headers}")
39
- response = requests.get(url, headers=headers, timeout=timeout)
40
- logger.debug(f"RESPONSE: {response.status_code}")
41
- except (TimeoutError, ReadTimeout) as err:
42
- logger.exception(err)
43
- raise InternalError("TimeoutError occurred. See logs for details.") from None
44
- except (ConnectionError, RequestException) as err:
45
- logger.exception(err)
46
- raise InternalError("ConnectionError occurred. See logs for details.") from None
47
- if not response.ok:
48
- msg = f"Non-ok response: {response.status_code}\nOriginal message: {response.text}"
49
- logger.exception(msg)
50
- raise UserError(msg)
51
- return response
52
-
53
- def get_knora_api(self) -> str:
54
- url = f"{self.api_url}/ontology/knora-api/v2#"
55
- onto = self._get(url, headers={"Accept": "text/turtle"})
56
- return onto.text
57
-
58
- def get_ontologies(self) -> list[str]:
59
- """
60
- Returns a list of project ontologies as a string in turtle format.
61
-
62
- Returns:
63
- list of ontologies
64
- """
65
- ontology_iris = self._get_ontology_iris()
66
- return [self._get_one_ontology(x) for x in ontology_iris]
67
-
68
- def _get_ontology_iris(self) -> list[str]:
69
- endpoint = f"{self.api_url}/admin/projects/shortcode/{self.shortcode}"
70
- response = self._get(endpoint)
71
- response_json = cast(dict[str, Any], response.json())
72
- msg = f"The response from the API does not contain any ontologies.\nAPI response:{response.text}"
73
- if not (proj := response_json.get("project")):
74
- logger.exception(msg)
75
- raise UserError(msg)
76
- if not (ontos := proj.get("ontologies")):
77
- logger.exception(msg)
78
- raise UserError(msg)
79
- output = cast(list[str], ontos)
80
- return output
81
-
82
- def _get_one_ontology(self, ontology_iri: str) -> str:
83
- response = self._get(ontology_iri, headers={"Accept": "text/turtle"})
84
- return response.text
85
-
86
-
87
- @dataclass
88
- class ShaclValidator:
89
- """Client to validate RDF data against a given SHACL shape."""
90
-
91
- dsp_api_url: str
92
-
93
- def validate(self, data_ttl: str, shacl_ttl: str) -> Graph:
94
- """
95
- Sends a multipart/form-data request with two turtle files (data.ttl and shacl.ttl) to the given URL
96
- and expects a response containing a single text/turtle body which is loaded into an rdflib Graph.
97
-
98
- Args:
99
- data_ttl (str): The turtle content for the data.ttl file (as a string).
100
- shacl_ttl (str): The turtle content for the shacl.ttl file (as a string).
101
-
102
- Returns:
103
- Graph: The rdflib Graph object loaded with the response turtle data.
104
-
105
- Raises:
106
- InternalError: in case of a non-ok response
107
- """
108
- files = {
109
- "data.ttl": ("data.ttl", data_ttl, "text/turtle"),
110
- "shacl.ttl": ("shacl.ttl", shacl_ttl, "text/turtle"),
111
- }
112
- timeout = 10
113
- request_url = f"{self.dsp_api_url}/shacl/validate"
114
- logger.debug(f"REQUEST: POST to {request_url}, timeout: {timeout}")
115
- response = requests.post(request_url, files=files, timeout=timeout)
116
- if not response.ok:
117
- msg = f"Failed to send request. Status code: {response.status_code}, Original Message:\n{response.text}"
118
- logger.error(msg)
119
- raise InternalError(msg)
120
- graph = Graph()
121
- graph.parse(data=response.text, format="turtle")
122
- return graph
@@ -1,135 +0,0 @@
1
- from typing import Callable
2
- from typing import Sequence
3
- from typing import cast
4
-
5
- from lxml import etree
6
-
7
- from dsp_tools.commands.xml_validate.models.data_deserialised import AbstractResource
8
- from dsp_tools.commands.xml_validate.models.data_deserialised import AnnotationDeserialised
9
- from dsp_tools.commands.xml_validate.models.data_deserialised import AudioSegmentDeserialised
10
- from dsp_tools.commands.xml_validate.models.data_deserialised import BooleanValueDeserialised
11
- from dsp_tools.commands.xml_validate.models.data_deserialised import ColorValueDeserialised
12
- from dsp_tools.commands.xml_validate.models.data_deserialised import DataDeserialised
13
- from dsp_tools.commands.xml_validate.models.data_deserialised import DateValueDeserialised
14
- from dsp_tools.commands.xml_validate.models.data_deserialised import DecimalValueDeserialised
15
- from dsp_tools.commands.xml_validate.models.data_deserialised import GeonameValueDeserialised
16
- from dsp_tools.commands.xml_validate.models.data_deserialised import IntValueDeserialised
17
- from dsp_tools.commands.xml_validate.models.data_deserialised import LinkObjDeserialised
18
- from dsp_tools.commands.xml_validate.models.data_deserialised import LinkValueDeserialised
19
- from dsp_tools.commands.xml_validate.models.data_deserialised import ListValueDeserialised
20
- from dsp_tools.commands.xml_validate.models.data_deserialised import ProjectDeserialised
21
- from dsp_tools.commands.xml_validate.models.data_deserialised import ProjectInformation
22
- from dsp_tools.commands.xml_validate.models.data_deserialised import RegionDeserialised
23
- from dsp_tools.commands.xml_validate.models.data_deserialised import ResourceDeserialised
24
- from dsp_tools.commands.xml_validate.models.data_deserialised import RichtextDeserialised
25
- from dsp_tools.commands.xml_validate.models.data_deserialised import SimpleTextDeserialised
26
- from dsp_tools.commands.xml_validate.models.data_deserialised import TimeValueDeserialised
27
- from dsp_tools.commands.xml_validate.models.data_deserialised import UriValueDeserialised
28
- from dsp_tools.commands.xml_validate.models.data_deserialised import ValueDeserialised
29
- from dsp_tools.commands.xml_validate.models.data_deserialised import VideoSegmentDeserialised
30
-
31
-
32
- def deserialise_xml(root: etree._Element) -> ProjectDeserialised:
33
- """
34
- Takes the root of an XML
35
- Extracts the data of the project and transforms all its resources.
36
-
37
- Args:
38
- root: root of an xml with qnames and comments removed
39
-
40
- Returns:
41
- Class instance with the information reformatted
42
- """
43
- shortcode = root.attrib["shortcode"]
44
- default_ontology = root.attrib["default-ontology"]
45
- project_info = ProjectInformation(shortcode, default_ontology)
46
- data_deserialised = _deserialise_all_resources(root)
47
- return ProjectDeserialised(project_info, data_deserialised)
48
-
49
-
50
- def _deserialise_all_resources(root: etree._Element) -> DataDeserialised:
51
- all_res: list[AbstractResource] = []
52
- for res in root.iterchildren():
53
- res_id = res.attrib["id"]
54
- lbl = cast(str, res.attrib.get("label"))
55
- match res.tag:
56
- case "resource":
57
- all_res.append(_deserialise_one_resource(res))
58
- case "annotation":
59
- all_res.append(AnnotationDeserialised(res_id, lbl))
60
- case "region":
61
- all_res.append(RegionDeserialised(res_id, lbl))
62
- case "link":
63
- all_res.append(LinkObjDeserialised(res_id, lbl))
64
- case "video-segment":
65
- all_res.append(VideoSegmentDeserialised(res_id, lbl))
66
- case "audio-segment":
67
- all_res.append(AudioSegmentDeserialised(res_id, lbl))
68
- case _:
69
- pass
70
- return DataDeserialised(all_res)
71
-
72
-
73
- def _deserialise_one_resource(resource: etree._Element) -> ResourceDeserialised:
74
- values: list[ValueDeserialised] = []
75
- for val in resource.iterchildren():
76
- values.extend(_deserialise_one_property(val))
77
- return ResourceDeserialised(
78
- res_id=resource.attrib["id"],
79
- res_class=resource.attrib["restype"],
80
- label=resource.attrib["label"],
81
- values=values,
82
- )
83
-
84
-
85
- def _deserialise_one_property(prop_ele: etree._Element) -> Sequence[ValueDeserialised]: # noqa: PLR0911 (too-many-branches, return statements)
86
- match prop_ele.tag:
87
- case "boolean-prop":
88
- return _deserialise_one_value(prop_ele, BooleanValueDeserialised)
89
- case "color-prop":
90
- return _deserialise_one_value(prop_ele, ColorValueDeserialised)
91
- case "date-prop":
92
- return _deserialise_one_value(prop_ele, DateValueDeserialised)
93
- case "decimal-prop":
94
- return _deserialise_one_value(prop_ele, DecimalValueDeserialised)
95
- case "geoname-prop":
96
- return _deserialise_one_value(prop_ele, GeonameValueDeserialised)
97
- case "list-prop":
98
- return _deserialise_list_prop(prop_ele)
99
- case "integer-prop":
100
- return _deserialise_one_value(prop_ele, IntValueDeserialised)
101
- case "resptr-prop":
102
- return _deserialise_one_value(prop_ele, LinkValueDeserialised)
103
- case "text-prop":
104
- return _deserialise_text_prop(prop_ele)
105
- case "time-prop":
106
- return _deserialise_one_value(prop_ele, TimeValueDeserialised)
107
- case "uri-prop":
108
- return _deserialise_one_value(prop_ele, UriValueDeserialised)
109
- case _:
110
- return []
111
-
112
-
113
- def _deserialise_one_value(
114
- prop: etree._Element, func: Callable[[str, str | None], ValueDeserialised]
115
- ) -> Sequence[ValueDeserialised]:
116
- prop_name = prop.attrib["name"]
117
- return [func(prop_name, x.text) for x in prop.iterchildren()]
118
-
119
-
120
- def _deserialise_list_prop(prop: etree._Element) -> list[ListValueDeserialised]:
121
- prop_name = prop.attrib["name"]
122
- list_name = prop.attrib["list"]
123
- return [ListValueDeserialised(prop_name, x.text, list_name) for x in prop.iterchildren()]
124
-
125
-
126
- def _deserialise_text_prop(prop: etree._Element) -> list[SimpleTextDeserialised | RichtextDeserialised]:
127
- prop_name = prop.attrib["name"]
128
- all_vals: list[SimpleTextDeserialised | RichtextDeserialised] = []
129
- for val in prop.iterchildren():
130
- match val.attrib["encoding"]:
131
- case "utf8":
132
- all_vals.append(SimpleTextDeserialised(prop_name, val.text))
133
- case "xml":
134
- all_vals.append(RichtextDeserialised(prop_name, val.text))
135
- return all_vals
@@ -1,193 +0,0 @@
1
- from typing import Callable
2
-
3
- from rdflib import XSD
4
- from rdflib import Literal
5
- from rdflib import Namespace
6
- from rdflib import URIRef
7
-
8
- from dsp_tools.commands.xml_validate.models.data_deserialised import AbstractResource
9
- from dsp_tools.commands.xml_validate.models.data_deserialised import AnnotationDeserialised
10
- from dsp_tools.commands.xml_validate.models.data_deserialised import AudioSegmentDeserialised
11
- from dsp_tools.commands.xml_validate.models.data_deserialised import BooleanValueDeserialised
12
- from dsp_tools.commands.xml_validate.models.data_deserialised import ColorValueDeserialised
13
- from dsp_tools.commands.xml_validate.models.data_deserialised import DataDeserialised
14
- from dsp_tools.commands.xml_validate.models.data_deserialised import DateValueDeserialised
15
- from dsp_tools.commands.xml_validate.models.data_deserialised import DecimalValueDeserialised
16
- from dsp_tools.commands.xml_validate.models.data_deserialised import GeonameValueDeserialised
17
- from dsp_tools.commands.xml_validate.models.data_deserialised import IntValueDeserialised
18
- from dsp_tools.commands.xml_validate.models.data_deserialised import LinkObjDeserialised
19
- from dsp_tools.commands.xml_validate.models.data_deserialised import LinkValueDeserialised
20
- from dsp_tools.commands.xml_validate.models.data_deserialised import ListValueDeserialised
21
- from dsp_tools.commands.xml_validate.models.data_deserialised import RegionDeserialised
22
- from dsp_tools.commands.xml_validate.models.data_deserialised import ResourceDeserialised
23
- from dsp_tools.commands.xml_validate.models.data_deserialised import RichtextDeserialised
24
- from dsp_tools.commands.xml_validate.models.data_deserialised import SimpleTextDeserialised
25
- from dsp_tools.commands.xml_validate.models.data_deserialised import TimeValueDeserialised
26
- from dsp_tools.commands.xml_validate.models.data_deserialised import UriValueDeserialised
27
- from dsp_tools.commands.xml_validate.models.data_deserialised import ValueDeserialised
28
- from dsp_tools.commands.xml_validate.models.data_deserialised import VideoSegmentDeserialised
29
- from dsp_tools.commands.xml_validate.models.data_rdf import BooleanValueRDF
30
- from dsp_tools.commands.xml_validate.models.data_rdf import ColorValueRDF
31
- from dsp_tools.commands.xml_validate.models.data_rdf import DataRDF
32
- from dsp_tools.commands.xml_validate.models.data_rdf import DateValueRDF
33
- from dsp_tools.commands.xml_validate.models.data_rdf import DecimalValueRDF
34
- from dsp_tools.commands.xml_validate.models.data_rdf import GeonameValueRDF
35
- from dsp_tools.commands.xml_validate.models.data_rdf import IntValueRDF
36
- from dsp_tools.commands.xml_validate.models.data_rdf import LinkValueRDF
37
- from dsp_tools.commands.xml_validate.models.data_rdf import ListValueRDF
38
- from dsp_tools.commands.xml_validate.models.data_rdf import RDFTriples
39
- from dsp_tools.commands.xml_validate.models.data_rdf import ResourceRDF
40
- from dsp_tools.commands.xml_validate.models.data_rdf import RichtextRDF
41
- from dsp_tools.commands.xml_validate.models.data_rdf import SimpleTextRDF
42
- from dsp_tools.commands.xml_validate.models.data_rdf import TimeValueRDF
43
- from dsp_tools.commands.xml_validate.models.data_rdf import UriValueRDF
44
- from dsp_tools.commands.xml_validate.models.data_rdf import ValueRDF
45
- from dsp_tools.models.exceptions import InternalError
46
-
47
- KNORA_API = Namespace("http://api.knora.org/ontology/knora-api/v2#")
48
- DATA = Namespace("http://data/")
49
-
50
-
51
- def make_data_rdf(data_deserialised: DataDeserialised) -> DataRDF:
52
- """
53
- Transforms the deserialised data into instances that can produce a RDF graph.
54
-
55
- Args:
56
- data_deserialised: Deserialised Data
57
-
58
- Returns:
59
- Instance with the data
60
- """
61
- all_triples: list[RDFTriples] = []
62
- for r in data_deserialised.resources:
63
- all_triples.extend(_transform_one_resource(r))
64
- return DataRDF(all_triples)
65
-
66
-
67
- def _transform_one_resource(res: AbstractResource) -> list[RDFTriples]:
68
- if isinstance(res, ResourceDeserialised):
69
- return _transform_one_project_resource(res)
70
- return [_transform_one_dsp_resource(res)]
71
-
72
-
73
- def _transform_one_dsp_resource(res: AbstractResource) -> RDFTriples:
74
- res_type_mapper = {
75
- AnnotationDeserialised: KNORA_API.Annotation,
76
- RegionDeserialised: KNORA_API.Region,
77
- LinkObjDeserialised: KNORA_API.LinkObj,
78
- VideoSegmentDeserialised: KNORA_API.VideoSegment,
79
- AudioSegmentDeserialised: KNORA_API.AudioSegment,
80
- }
81
- return ResourceRDF(
82
- res_iri=DATA[res.res_id], res_class=res_type_mapper[type(res)], label=Literal(res.label, datatype=XSD.string)
83
- )
84
-
85
-
86
- def _transform_one_project_resource(res: ResourceDeserialised) -> list[RDFTriples]:
87
- res_iri = DATA[res.res_id]
88
- all_triples: list[RDFTriples] = [
89
- ResourceRDF(res_iri=res_iri, res_class=URIRef(res.res_class), label=Literal(res.label, datatype=XSD.string))
90
- ]
91
- all_triples.extend([_transform_one_value(v, res_iri) for v in res.values])
92
- return all_triples
93
-
94
-
95
- def _transform_one_value(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF: # noqa: PLR0911 (too many return statements)
96
- func_mapper = {
97
- ColorValueDeserialised: ColorValueRDF,
98
- DateValueDeserialised: DateValueRDF,
99
- GeonameValueDeserialised: GeonameValueRDF,
100
- IntValueDeserialised: IntValueRDF,
101
- SimpleTextDeserialised: SimpleTextRDF,
102
- RichtextDeserialised: RichtextRDF,
103
- }
104
- match val:
105
- case ColorValueDeserialised() | DateValueDeserialised() | SimpleTextDeserialised() | RichtextDeserialised():
106
- return _transform_into_xsd_string(val, res_iri, func_mapper[type(val)])
107
- case GeonameValueDeserialised() | IntValueDeserialised():
108
- return _transform_into_xsd_integer(val, res_iri, func_mapper[type(val)])
109
- case BooleanValueDeserialised():
110
- return _transform_into_bool(val, res_iri)
111
- case DecimalValueDeserialised():
112
- return _transform_decimal_value(val, res_iri)
113
- case LinkValueDeserialised():
114
- return _transform_link_value(val, res_iri)
115
- case ListValueDeserialised():
116
- return _transform_list_value(val, res_iri)
117
- case TimeValueDeserialised():
118
- return _transform_time_value(val, res_iri)
119
- case UriValueDeserialised():
120
- return _transform_uri_value(val, res_iri)
121
- case _:
122
- raise InternalError(f"Unknown Value Type: {type(val)}")
123
-
124
-
125
- def _transform_into_xsd_string(
126
- val: ValueDeserialised, res_iri: URIRef, func: Callable[[URIRef, Literal, URIRef], ValueRDF]
127
- ) -> ValueRDF:
128
- new_str = val.object_value if val.object_value is not None else ""
129
- return func(URIRef(val.prop_name), Literal(new_str, datatype=XSD.string), res_iri)
130
-
131
-
132
- def _transform_into_xsd_integer(
133
- val: ValueDeserialised, res_iri: URIRef, func: Callable[[URIRef, Literal, URIRef], ValueRDF]
134
- ) -> ValueRDF:
135
- content = (
136
- Literal(val.object_value, datatype=XSD.integer)
137
- if val.object_value is not None
138
- else Literal("", datatype=XSD.string)
139
- )
140
- return func(URIRef(val.prop_name), content, res_iri)
141
-
142
-
143
- def _transform_into_bool(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF:
144
- match val.object_value:
145
- case "1" | "true":
146
- content = Literal(True, datatype=XSD.boolean)
147
- case "0" | "false":
148
- content = Literal(False, datatype=XSD.boolean)
149
- case _:
150
- content = Literal("", datatype=XSD.string)
151
- return BooleanValueRDF(URIRef(val.prop_name), content, res_iri)
152
-
153
-
154
- def _transform_decimal_value(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF:
155
- content = (
156
- Literal(val.object_value, datatype=XSD.decimal)
157
- if val.object_value is not None
158
- else Literal("", datatype=XSD.string)
159
- )
160
- return DecimalValueRDF(URIRef(val.prop_name), content, res_iri)
161
-
162
-
163
- def _transform_link_value(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF:
164
- content = val.object_value if val.object_value is not None else ""
165
- return LinkValueRDF(URIRef(val.prop_name), DATA[content], res_iri)
166
-
167
-
168
- def _transform_list_value(val: ListValueDeserialised, res_iri: URIRef) -> ValueRDF:
169
- node_name = val.object_value if val.object_value is not None else ""
170
- return ListValueRDF(
171
- prop_name=URIRef(val.prop_name),
172
- object_value=Literal(node_name, datatype=XSD.string),
173
- list_name=Literal(val.list_name, datatype=XSD.string),
174
- res_iri=res_iri,
175
- )
176
-
177
-
178
- def _transform_time_value(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF:
179
- content = (
180
- Literal(val.object_value, datatype=XSD.dateTimeStamp)
181
- if val.object_value is not None
182
- else Literal("", datatype=XSD.string)
183
- )
184
- return TimeValueRDF(URIRef(val.prop_name), content, res_iri)
185
-
186
-
187
- def _transform_uri_value(val: ValueDeserialised, res_iri: URIRef) -> ValueRDF:
188
- content = (
189
- Literal(val.object_value, datatype=XSD.anyURI)
190
- if val.object_value is not None
191
- else Literal("", datatype=XSD.string)
192
- )
193
- return UriValueRDF(URIRef(val.prop_name), content, res_iri)