dsp-tools 0.9.13__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 (348) hide show
  1. dsp_tools/__init__.py +5 -0
  2. dsp_tools/cli/args.py +47 -0
  3. dsp_tools/cli/call_action.py +85 -0
  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 +479 -0
  7. dsp_tools/cli/entry_point.py +322 -0
  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/clients/connection.py +35 -0
  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 +321 -0
  58. dsp_tools/commands/excel2json/lists/__init__.py +0 -0
  59. dsp_tools/commands/excel2json/lists/compliance_checks.py +292 -0
  60. dsp_tools/commands/excel2json/lists/make_lists.py +247 -0
  61. dsp_tools/commands/excel2json/lists/models/__init__.py +0 -0
  62. dsp_tools/commands/excel2json/lists/models/deserialise.py +30 -0
  63. dsp_tools/commands/excel2json/lists/models/input_error.py +216 -0
  64. dsp_tools/commands/excel2json/lists/models/serialise.py +57 -0
  65. dsp_tools/commands/excel2json/lists/utils.py +81 -0
  66. dsp_tools/commands/excel2json/models/__init__.py +0 -0
  67. dsp_tools/commands/excel2json/models/input_error.py +416 -0
  68. dsp_tools/commands/excel2json/models/json_header.py +175 -0
  69. dsp_tools/commands/excel2json/models/list_node_name.py +16 -0
  70. dsp_tools/commands/excel2json/models/ontology.py +76 -0
  71. dsp_tools/commands/excel2json/old_lists.py +328 -0
  72. dsp_tools/commands/excel2json/project.py +280 -0
  73. dsp_tools/commands/excel2json/properties.py +370 -0
  74. dsp_tools/commands/excel2json/resources.py +336 -0
  75. dsp_tools/commands/excel2json/utils.py +352 -0
  76. dsp_tools/commands/excel2xml/__init__.py +7 -0
  77. dsp_tools/commands/excel2xml/excel2xml_cli.py +523 -0
  78. dsp_tools/commands/excel2xml/excel2xml_lib.py +1953 -0
  79. dsp_tools/commands/excel2xml/propertyelement.py +47 -0
  80. dsp_tools/commands/get/__init__.py +0 -0
  81. dsp_tools/commands/get/get.py +166 -0
  82. dsp_tools/commands/get/get_permissions.py +257 -0
  83. dsp_tools/commands/get/get_permissions_legacy.py +89 -0
  84. dsp_tools/commands/get/legacy_models/__init__.py +0 -0
  85. dsp_tools/commands/get/legacy_models/context.py +318 -0
  86. dsp_tools/commands/get/legacy_models/group.py +241 -0
  87. dsp_tools/commands/get/legacy_models/helpers.py +47 -0
  88. dsp_tools/commands/get/legacy_models/listnode.py +390 -0
  89. dsp_tools/commands/get/legacy_models/model.py +12 -0
  90. dsp_tools/commands/get/legacy_models/ontology.py +324 -0
  91. dsp_tools/commands/get/legacy_models/project.py +366 -0
  92. dsp_tools/commands/get/legacy_models/propertyclass.py +417 -0
  93. dsp_tools/commands/get/legacy_models/resourceclass.py +676 -0
  94. dsp_tools/commands/get/legacy_models/user.py +438 -0
  95. dsp_tools/commands/get/models/__init__.py +0 -0
  96. dsp_tools/commands/get/models/permissions_models.py +10 -0
  97. dsp_tools/commands/id2iri.py +258 -0
  98. dsp_tools/commands/ingest_xmlupload/__init__.py +0 -0
  99. dsp_tools/commands/ingest_xmlupload/bulk_ingest_client.py +178 -0
  100. dsp_tools/commands/ingest_xmlupload/create_resources/__init__.py +0 -0
  101. dsp_tools/commands/ingest_xmlupload/create_resources/apply_ingest_id.py +69 -0
  102. dsp_tools/commands/ingest_xmlupload/create_resources/upload_xml.py +166 -0
  103. dsp_tools/commands/ingest_xmlupload/create_resources/user_information.py +121 -0
  104. dsp_tools/commands/ingest_xmlupload/ingest_files/__init__.py +0 -0
  105. dsp_tools/commands/ingest_xmlupload/ingest_files/ingest_files.py +64 -0
  106. dsp_tools/commands/ingest_xmlupload/upload_files/__init__.py +0 -0
  107. dsp_tools/commands/ingest_xmlupload/upload_files/filechecker.py +20 -0
  108. dsp_tools/commands/ingest_xmlupload/upload_files/input_error.py +57 -0
  109. dsp_tools/commands/ingest_xmlupload/upload_files/upload_failures.py +66 -0
  110. dsp_tools/commands/ingest_xmlupload/upload_files/upload_files.py +67 -0
  111. dsp_tools/commands/resume_xmlupload/__init__.py +0 -0
  112. dsp_tools/commands/resume_xmlupload/resume_xmlupload.py +96 -0
  113. dsp_tools/commands/start_stack.py +428 -0
  114. dsp_tools/commands/update_legal/CLAUDE.md +344 -0
  115. dsp_tools/commands/update_legal/__init__.py +0 -0
  116. dsp_tools/commands/update_legal/core.py +182 -0
  117. dsp_tools/commands/update_legal/csv_operations.py +135 -0
  118. dsp_tools/commands/update_legal/models.py +87 -0
  119. dsp_tools/commands/update_legal/xml_operations.py +247 -0
  120. dsp_tools/commands/validate_data/CLAUDE.md +159 -0
  121. dsp_tools/commands/validate_data/__init__.py +0 -0
  122. dsp_tools/commands/validate_data/constants.py +59 -0
  123. dsp_tools/commands/validate_data/mappers.py +143 -0
  124. dsp_tools/commands/validate_data/models/__init__.py +0 -0
  125. dsp_tools/commands/validate_data/models/api_responses.py +45 -0
  126. dsp_tools/commands/validate_data/models/input_problems.py +119 -0
  127. dsp_tools/commands/validate_data/models/rdf_like_data.py +117 -0
  128. dsp_tools/commands/validate_data/models/validation.py +106 -0
  129. dsp_tools/commands/validate_data/prepare_data/__init__.py +0 -0
  130. dsp_tools/commands/validate_data/prepare_data/get_rdf_like_data.py +296 -0
  131. dsp_tools/commands/validate_data/prepare_data/make_data_graph.py +91 -0
  132. dsp_tools/commands/validate_data/prepare_data/prepare_data.py +184 -0
  133. dsp_tools/commands/validate_data/process_validation_report/__init__.py +0 -0
  134. dsp_tools/commands/validate_data/process_validation_report/get_user_validation_message.py +358 -0
  135. dsp_tools/commands/validate_data/process_validation_report/query_validation_result.py +507 -0
  136. dsp_tools/commands/validate_data/process_validation_report/reformat_validation_results.py +150 -0
  137. dsp_tools/commands/validate_data/shacl_cli_validator.py +70 -0
  138. dsp_tools/commands/validate_data/sparql/__init__.py +0 -0
  139. dsp_tools/commands/validate_data/sparql/cardinality_shacl.py +209 -0
  140. dsp_tools/commands/validate_data/sparql/construct_shacl.py +92 -0
  141. dsp_tools/commands/validate_data/sparql/legal_info_shacl.py +36 -0
  142. dsp_tools/commands/validate_data/sparql/value_shacl.py +357 -0
  143. dsp_tools/commands/validate_data/utils.py +59 -0
  144. dsp_tools/commands/validate_data/validate_data.py +283 -0
  145. dsp_tools/commands/validate_data/validation/__init__.py +0 -0
  146. dsp_tools/commands/validate_data/validation/check_duplicate_files.py +55 -0
  147. dsp_tools/commands/validate_data/validation/check_for_unknown_classes.py +67 -0
  148. dsp_tools/commands/validate_data/validation/get_validation_report.py +94 -0
  149. dsp_tools/commands/validate_data/validation/validate_ontology.py +107 -0
  150. dsp_tools/commands/xmlupload/CLAUDE.md +292 -0
  151. dsp_tools/commands/xmlupload/__init__.py +0 -0
  152. dsp_tools/commands/xmlupload/iri_resolver.py +21 -0
  153. dsp_tools/commands/xmlupload/make_rdf_graph/__init__.py +0 -0
  154. dsp_tools/commands/xmlupload/make_rdf_graph/constants.py +63 -0
  155. dsp_tools/commands/xmlupload/make_rdf_graph/jsonld_utils.py +44 -0
  156. dsp_tools/commands/xmlupload/make_rdf_graph/make_file_value.py +77 -0
  157. dsp_tools/commands/xmlupload/make_rdf_graph/make_resource_and_values.py +114 -0
  158. dsp_tools/commands/xmlupload/make_rdf_graph/make_values.py +262 -0
  159. dsp_tools/commands/xmlupload/models/__init__.py +0 -0
  160. dsp_tools/commands/xmlupload/models/bitstream_info.py +18 -0
  161. dsp_tools/commands/xmlupload/models/formatted_text_value.py +10 -0
  162. dsp_tools/commands/xmlupload/models/ingest.py +143 -0
  163. dsp_tools/commands/xmlupload/models/input_problems.py +58 -0
  164. dsp_tools/commands/xmlupload/models/lookup_models.py +21 -0
  165. dsp_tools/commands/xmlupload/models/permission.py +45 -0
  166. dsp_tools/commands/xmlupload/models/permissions_parsed.py +93 -0
  167. dsp_tools/commands/xmlupload/models/processed/__init__.py +0 -0
  168. dsp_tools/commands/xmlupload/models/processed/file_values.py +29 -0
  169. dsp_tools/commands/xmlupload/models/processed/res.py +27 -0
  170. dsp_tools/commands/xmlupload/models/processed/values.py +101 -0
  171. dsp_tools/commands/xmlupload/models/rdf_models.py +26 -0
  172. dsp_tools/commands/xmlupload/models/upload_clients.py +14 -0
  173. dsp_tools/commands/xmlupload/models/upload_state.py +20 -0
  174. dsp_tools/commands/xmlupload/prepare_xml_input/__init__.py +0 -0
  175. dsp_tools/commands/xmlupload/prepare_xml_input/ark2iri.py +55 -0
  176. dsp_tools/commands/xmlupload/prepare_xml_input/get_processed_resources.py +252 -0
  177. dsp_tools/commands/xmlupload/prepare_xml_input/iiif_uri_validator.py +50 -0
  178. dsp_tools/commands/xmlupload/prepare_xml_input/list_client.py +120 -0
  179. dsp_tools/commands/xmlupload/prepare_xml_input/prepare_xml_input.py +67 -0
  180. dsp_tools/commands/xmlupload/prepare_xml_input/read_validate_xml_file.py +58 -0
  181. dsp_tools/commands/xmlupload/prepare_xml_input/transform_input_values.py +118 -0
  182. dsp_tools/commands/xmlupload/resource_create_client.py +25 -0
  183. dsp_tools/commands/xmlupload/richtext_id2iri.py +37 -0
  184. dsp_tools/commands/xmlupload/stash/__init__.py +0 -0
  185. dsp_tools/commands/xmlupload/stash/analyse_circular_reference_graph.py +236 -0
  186. dsp_tools/commands/xmlupload/stash/create_info_for_graph.py +53 -0
  187. dsp_tools/commands/xmlupload/stash/graph_models.py +87 -0
  188. dsp_tools/commands/xmlupload/stash/stash_circular_references.py +68 -0
  189. dsp_tools/commands/xmlupload/stash/stash_models.py +109 -0
  190. dsp_tools/commands/xmlupload/stash/upload_stashed_resptr_props.py +106 -0
  191. dsp_tools/commands/xmlupload/stash/upload_stashed_xml_texts.py +196 -0
  192. dsp_tools/commands/xmlupload/upload_config.py +76 -0
  193. dsp_tools/commands/xmlupload/write_diagnostic_info.py +27 -0
  194. dsp_tools/commands/xmlupload/xmlupload.py +516 -0
  195. dsp_tools/config/__init__.py +0 -0
  196. dsp_tools/config/logger_config.py +69 -0
  197. dsp_tools/config/warnings_config.py +32 -0
  198. dsp_tools/error/__init__.py +0 -0
  199. dsp_tools/error/custom_warnings.py +39 -0
  200. dsp_tools/error/exceptions.py +204 -0
  201. dsp_tools/error/problems.py +10 -0
  202. dsp_tools/error/xmllib_errors.py +20 -0
  203. dsp_tools/error/xmllib_warnings.py +54 -0
  204. dsp_tools/error/xmllib_warnings_util.py +159 -0
  205. dsp_tools/error/xsd_validation_error_msg.py +19 -0
  206. dsp_tools/legacy_models/__init__.py +0 -0
  207. dsp_tools/legacy_models/datetimestamp.py +81 -0
  208. dsp_tools/legacy_models/langstring.py +253 -0
  209. dsp_tools/legacy_models/projectContext.py +49 -0
  210. dsp_tools/py.typed +0 -0
  211. dsp_tools/resources/schema/data.xsd +648 -0
  212. dsp_tools/resources/schema/lists-only.json +72 -0
  213. dsp_tools/resources/schema/project.json +1258 -0
  214. dsp_tools/resources/schema/properties-only.json +874 -0
  215. dsp_tools/resources/schema/resources-only.json +140 -0
  216. dsp_tools/resources/start-stack/docker-compose.override-host.j2 +11 -0
  217. dsp_tools/resources/start-stack/docker-compose.override.yml +11 -0
  218. dsp_tools/resources/start-stack/docker-compose.yml +88 -0
  219. dsp_tools/resources/start-stack/dsp-app-config.json +45 -0
  220. dsp_tools/resources/start-stack/dsp-app-config.override-host.j2 +26 -0
  221. dsp_tools/resources/validate_data/api-shapes-resource-cardinalities.ttl +191 -0
  222. dsp_tools/resources/validate_data/api-shapes.ttl +804 -0
  223. dsp_tools/resources/validate_data/shacl-cli-image.yml +4 -0
  224. dsp_tools/resources/validate_data/validate-ontology.ttl +99 -0
  225. dsp_tools/utils/__init__.py +0 -0
  226. dsp_tools/utils/ansi_colors.py +32 -0
  227. dsp_tools/utils/data_formats/__init__.py +0 -0
  228. dsp_tools/utils/data_formats/date_util.py +166 -0
  229. dsp_tools/utils/data_formats/iri_util.py +30 -0
  230. dsp_tools/utils/data_formats/shared.py +81 -0
  231. dsp_tools/utils/data_formats/uri_util.py +76 -0
  232. dsp_tools/utils/fuseki_bloating.py +63 -0
  233. dsp_tools/utils/json_parsing.py +22 -0
  234. dsp_tools/utils/rdf_constants.py +42 -0
  235. dsp_tools/utils/rdflib_utils.py +10 -0
  236. dsp_tools/utils/replace_id_with_iri.py +66 -0
  237. dsp_tools/utils/request_utils.py +238 -0
  238. dsp_tools/utils/xml_parsing/__init__.py +0 -0
  239. dsp_tools/utils/xml_parsing/get_lookups.py +32 -0
  240. dsp_tools/utils/xml_parsing/get_parsed_resources.py +325 -0
  241. dsp_tools/utils/xml_parsing/models/__init__.py +0 -0
  242. dsp_tools/utils/xml_parsing/models/parsed_resource.py +76 -0
  243. dsp_tools/utils/xml_parsing/parse_clean_validate_xml.py +137 -0
  244. dsp_tools/xmllib/CLAUDE.md +302 -0
  245. dsp_tools/xmllib/__init__.py +49 -0
  246. dsp_tools/xmllib/general_functions.py +877 -0
  247. dsp_tools/xmllib/internal/__init__.py +0 -0
  248. dsp_tools/xmllib/internal/checkers.py +162 -0
  249. dsp_tools/xmllib/internal/circumvent_circular_imports.py +36 -0
  250. dsp_tools/xmllib/internal/constants.py +46 -0
  251. dsp_tools/xmllib/internal/input_converters.py +155 -0
  252. dsp_tools/xmllib/internal/serialise_file_value.py +57 -0
  253. dsp_tools/xmllib/internal/serialise_resource.py +177 -0
  254. dsp_tools/xmllib/internal/serialise_values.py +152 -0
  255. dsp_tools/xmllib/internal/type_aliases.py +11 -0
  256. dsp_tools/xmllib/models/__init__.py +0 -0
  257. dsp_tools/xmllib/models/config_options.py +28 -0
  258. dsp_tools/xmllib/models/date_formats.py +48 -0
  259. dsp_tools/xmllib/models/dsp_base_resources.py +1542 -0
  260. dsp_tools/xmllib/models/internal/__init__.py +0 -0
  261. dsp_tools/xmllib/models/internal/file_values.py +172 -0
  262. dsp_tools/xmllib/models/internal/geometry.py +162 -0
  263. dsp_tools/xmllib/models/internal/migration_metadata.py +55 -0
  264. dsp_tools/xmllib/models/internal/serialise_permissions.py +66 -0
  265. dsp_tools/xmllib/models/internal/values.py +342 -0
  266. dsp_tools/xmllib/models/licenses/__init__.py +0 -0
  267. dsp_tools/xmllib/models/licenses/other.py +59 -0
  268. dsp_tools/xmllib/models/licenses/recommended.py +107 -0
  269. dsp_tools/xmllib/models/permissions.py +41 -0
  270. dsp_tools/xmllib/models/res.py +1782 -0
  271. dsp_tools/xmllib/models/root.py +348 -0
  272. dsp_tools/xmllib/value_checkers.py +434 -0
  273. dsp_tools/xmllib/value_converters.py +777 -0
  274. dsp_tools-18.3.0.post13.dist-info/METADATA +90 -0
  275. dsp_tools-18.3.0.post13.dist-info/RECORD +286 -0
  276. dsp_tools-18.3.0.post13.dist-info/WHEEL +4 -0
  277. dsp_tools-18.3.0.post13.dist-info/entry_points.txt +3 -0
  278. dsp_tools-0.9.13.dist-info/LICENSE +0 -674
  279. dsp_tools-0.9.13.dist-info/METADATA +0 -144
  280. dsp_tools-0.9.13.dist-info/RECORD +0 -71
  281. dsp_tools-0.9.13.dist-info/WHEEL +0 -5
  282. dsp_tools-0.9.13.dist-info/entry_points.txt +0 -3
  283. dsp_tools-0.9.13.dist-info/top_level.txt +0 -1
  284. dsplib/models/connection.py +0 -272
  285. dsplib/models/group.py +0 -296
  286. dsplib/models/helpers.py +0 -505
  287. dsplib/models/langstring.py +0 -277
  288. dsplib/models/listnode.py +0 -578
  289. dsplib/models/model.py +0 -20
  290. dsplib/models/ontology.py +0 -448
  291. dsplib/models/permission.py +0 -112
  292. dsplib/models/project.py +0 -547
  293. dsplib/models/propertyclass.py +0 -505
  294. dsplib/models/resource.py +0 -366
  295. dsplib/models/resourceclass.py +0 -810
  296. dsplib/models/sipi.py +0 -30
  297. dsplib/models/user.py +0 -731
  298. dsplib/models/value.py +0 -1000
  299. dsplib/utils/knora-data-schema.xsd +0 -454
  300. dsplib/utils/knora-schema-lists.json +0 -83
  301. dsplib/utils/knora-schema.json +0 -434
  302. dsplib/utils/onto_commons.py +0 -24
  303. dsplib/utils/onto_create_lists.py +0 -73
  304. dsplib/utils/onto_create_ontology.py +0 -442
  305. dsplib/utils/onto_get.py +0 -58
  306. dsplib/utils/onto_validate.py +0 -33
  307. dsplib/utils/xml_upload.py +0 -539
  308. dsplib/widgets/doublepassword.py +0 -80
  309. knora/MLS-import-libraries.py +0 -84
  310. knora/dsp_tools.py +0 -96
  311. knora/dsplib/models/connection.py +0 -272
  312. knora/dsplib/models/group.py +0 -296
  313. knora/dsplib/models/helpers.py +0 -506
  314. knora/dsplib/models/langstring.py +0 -277
  315. knora/dsplib/models/listnode.py +0 -578
  316. knora/dsplib/models/model.py +0 -20
  317. knora/dsplib/models/ontology.py +0 -448
  318. knora/dsplib/models/permission.py +0 -112
  319. knora/dsplib/models/project.py +0 -583
  320. knora/dsplib/models/propertyclass.py +0 -505
  321. knora/dsplib/models/resource.py +0 -416
  322. knora/dsplib/models/resourceclass.py +0 -811
  323. knora/dsplib/models/sipi.py +0 -35
  324. knora/dsplib/models/user.py +0 -731
  325. knora/dsplib/models/value.py +0 -1000
  326. knora/dsplib/utils/knora-data-schema.xsd +0 -464
  327. knora/dsplib/utils/knora-schema-lists.json +0 -83
  328. knora/dsplib/utils/knora-schema.json +0 -444
  329. knora/dsplib/utils/onto_commons.py +0 -24
  330. knora/dsplib/utils/onto_create_lists.py +0 -73
  331. knora/dsplib/utils/onto_create_ontology.py +0 -451
  332. knora/dsplib/utils/onto_get.py +0 -58
  333. knora/dsplib/utils/onto_validate.py +0 -33
  334. knora/dsplib/utils/xml_upload.py +0 -540
  335. knora/dsplib/widgets/doublepassword.py +0 -80
  336. knora/knora.py +0 -2108
  337. knora/test.py +0 -99
  338. knora/testit.py +0 -76
  339. knora/xml2knora.py +0 -633
  340. {dsplib → dsp_tools/cli}/__init__.py +0 -0
  341. {dsplib/models → dsp_tools/clients}/__init__.py +0 -0
  342. {dsplib/utils → dsp_tools/commands}/__init__.py +0 -0
  343. {dsplib/widgets → dsp_tools/commands/create}/__init__.py +0 -0
  344. {knora → dsp_tools/commands/create/create_on_server}/__init__.py +0 -0
  345. {knora/dsplib → dsp_tools/commands/create/models}/__init__.py +0 -0
  346. {knora/dsplib/models → dsp_tools/commands/create/parsing}/__init__.py +0 -0
  347. {knora/dsplib/utils → dsp_tools/commands/create/serialisation}/__init__.py +0 -0
  348. {knora/dsplib/widgets → dsp_tools/commands/excel2json}/__init__.py +0 -0
@@ -0,0 +1,357 @@
1
+ from loguru import logger
2
+ from rdflib import RDF
3
+ from rdflib import SH
4
+ from rdflib import XSD
5
+ from rdflib import BNode
6
+ from rdflib import Graph
7
+ from rdflib import Literal
8
+ from rdflib import URIRef
9
+ from rdflib.collection import Collection
10
+
11
+ from dsp_tools.clients.list_client import OneList
12
+ from dsp_tools.commands.validate_data.models.api_responses import SHACLListInfo
13
+ from dsp_tools.utils.rdf_constants import KNORA_API
14
+ from dsp_tools.utils.rdf_constants import PropertyTypeAlias
15
+ from dsp_tools.utils.rdf_constants import SubjectObjectTypeAlias
16
+
17
+
18
+ def construct_property_shapes(onto: Graph, project_lists: list[OneList]) -> Graph:
19
+ """
20
+ Returns the sh:PropertyShape for the properties in the ontology.
21
+
22
+ Args:
23
+ onto: ontology graph
24
+ project_lists: all lists from a project
25
+
26
+ Returns:
27
+ Graph with the property shapes
28
+ """
29
+ logger.debug("Constructing property shapes for ontology.")
30
+ g = Graph()
31
+ g += _construct_link_value_shape(onto)
32
+ g += _construct_link_value_node_shape(onto)
33
+ g += _construct_property_type_text_value(onto)
34
+ g += _construct_list_shapes(onto, project_lists)
35
+ g += _construct_seqnum_is_part_of_prop_shape(onto)
36
+ g += _construct_value_type_shapes_to_class_shapes(onto)
37
+ g += _construct_link_value_type_shapes_to_class_shapes(onto)
38
+ return g + _add_property_shapes_to_class_shapes(onto)
39
+
40
+
41
+ def _add_property_shapes_to_class_shapes(onto: Graph) -> Graph:
42
+ logger.debug("Add property shape to resources")
43
+ query_s = """
44
+ PREFIX owl: <http://www.w3.org/2002/07/owl#>
45
+ PREFIX sh: <http://www.w3.org/ns/shacl#>
46
+ PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
47
+ PREFIX api-shapes: <http://api.knora.org/ontology/knora-api/shapes/v2#>
48
+ PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
49
+
50
+ CONSTRUCT {
51
+
52
+ ?class a sh:NodeShape ;
53
+ sh:property ?propShapesIRI .
54
+
55
+ } WHERE {
56
+
57
+ ?class a owl:Class ;
58
+ knora-api:isResourceClass true ;
59
+ knora-api:canBeInstantiated true ;
60
+ rdfs:subClassOf ?restriction .
61
+ ?restriction a owl:Restriction ;
62
+ owl:onProperty ?propRestriction .
63
+
64
+ ?propRestriction knora-api:isEditable true .
65
+ FILTER NOT EXISTS { ?propRestriction knora-api:isLinkValueProperty true }
66
+
67
+ BIND(IRI(CONCAT(str(?propRestriction), "_PropShape")) AS ?propShapesIRI)
68
+ }
69
+ """
70
+ if results_graph := onto.query(query_s).graph:
71
+ return results_graph
72
+ return Graph()
73
+
74
+
75
+ def _construct_value_type_shapes_to_class_shapes(onto: Graph) -> Graph:
76
+ logger.debug("Add value type shape to resources")
77
+ query_s = """
78
+ PREFIX owl: <http://www.w3.org/2002/07/owl#>
79
+ PREFIX sh: <http://www.w3.org/ns/shacl#>
80
+ PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
81
+ PREFIX api-shapes: <http://api.knora.org/ontology/knora-api/shapes/v2#>
82
+ PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
83
+
84
+ CONSTRUCT {
85
+
86
+ ?shapesIRI a sh:PropertyShape ;
87
+ sh:path ?propRestriction ;
88
+ sh:class ?objectType ;
89
+ sh:message ?objectTypeMessage .
90
+
91
+ } WHERE {
92
+
93
+ ?class a owl:Class ;
94
+ knora-api:isResourceClass true ;
95
+ knora-api:canBeInstantiated true ;
96
+ rdfs:subClassOf ?restriction .
97
+ ?restriction a owl:Restriction ;
98
+ owl:onProperty ?propRestriction .
99
+
100
+ ?propRestriction knora-api:isEditable true ;
101
+ knora-api:objectType ?objectType .
102
+
103
+ FILTER NOT EXISTS { ?propRestriction knora-api:isLinkProperty true }
104
+ FILTER NOT EXISTS { ?propRestriction knora-api:isLinkValueProperty true }
105
+
106
+ BIND(IRI(CONCAT(str(?propRestriction), "_PropShape")) AS ?shapesIRI)
107
+ BIND(CONCAT("This property requires a ", STRAFTER(STR(?objectType), "#")) AS ?objectTypeMessage)
108
+ }
109
+ """
110
+ if results_graph := onto.query(query_s).graph:
111
+ return results_graph
112
+ return Graph()
113
+
114
+
115
+ def _construct_link_value_type_shapes_to_class_shapes(onto: Graph) -> Graph:
116
+ logger.debug("Add value type shape to resources")
117
+ query_s = """
118
+ PREFIX owl: <http://www.w3.org/2002/07/owl#>
119
+ PREFIX sh: <http://www.w3.org/ns/shacl#>
120
+ PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
121
+ PREFIX api-shapes: <http://api.knora.org/ontology/knora-api/shapes/v2#>
122
+ PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
123
+
124
+ CONSTRUCT {
125
+
126
+ ?shapesIRI a sh:PropertyShape ;
127
+ sh:path ?propRestriction ;
128
+ sh:class knora-api:LinkValue ;
129
+ sh:message "This property requires a LinkValue" .
130
+
131
+ } WHERE {
132
+
133
+ ?class a owl:Class ;
134
+ knora-api:isResourceClass true ;
135
+ knora-api:canBeInstantiated true ;
136
+ rdfs:subClassOf ?restriction .
137
+ ?restriction a owl:Restriction ;
138
+ owl:onProperty ?propRestriction .
139
+
140
+ ?propRestriction knora-api:isEditable true ;
141
+ knora-api:isLinkProperty true .
142
+
143
+ BIND(IRI(CONCAT(str(?propRestriction), "_PropShape")) AS ?shapesIRI)
144
+ }
145
+ """
146
+ if results_graph := onto.query(query_s).graph:
147
+ return results_graph
148
+ return Graph()
149
+
150
+
151
+ def _construct_link_value_shape(onto: Graph) -> Graph:
152
+ logger.debug("Constructing LinkValue PropertyShape")
153
+ query_s = """
154
+ PREFIX owl: <http://www.w3.org/2002/07/owl#>
155
+ PREFIX sh: <http://www.w3.org/ns/shacl#>
156
+ PREFIX api-shapes: <http://api.knora.org/ontology/knora-api/shapes/v2#>
157
+ PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
158
+ PREFIX salsah-gui: <http://api.knora.org/ontology/salsah-gui/v2#>
159
+
160
+ CONSTRUCT {
161
+
162
+ ?shapesIRI a sh:PropertyShape ;
163
+ sh:path ?prop ;
164
+ sh:node ?nodeShapeIRI .
165
+
166
+ } WHERE {
167
+
168
+ ?prop a owl:ObjectProperty ;
169
+ salsah-gui:guiElement salsah-gui:Searchbox .
170
+
171
+ BIND(IRI(CONCAT(str(?prop), "_PropShape")) AS ?shapesIRI)
172
+ BIND(IRI(CONCAT(str(?prop), "_NodeShape")) AS ?nodeShapeIRI)
173
+ }
174
+ """
175
+ if results_graph := onto.query(query_s).graph:
176
+ return results_graph
177
+ return Graph()
178
+
179
+
180
+ def _construct_link_value_node_shape(onto: Graph) -> Graph:
181
+ logger.debug("Constructing LinkValue NodeShape")
182
+ query_s = """
183
+ PREFIX owl: <http://www.w3.org/2002/07/owl#>
184
+ PREFIX sh: <http://www.w3.org/ns/shacl#>
185
+ PREFIX api-shapes: <http://api.knora.org/ontology/knora-api/shapes/v2#>
186
+ PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
187
+ PREFIX salsah-gui: <http://api.knora.org/ontology/salsah-gui/v2#>
188
+
189
+ CONSTRUCT {
190
+
191
+ ?nodeShapeIRI a sh:NodeShape ;
192
+ sh:property [
193
+ a sh:PropertyShape ;
194
+ sh:path api-shapes:linkValueHasTargetID ;
195
+ sh:class ?rangeClass ;
196
+ sh:message ?msg
197
+ ] ;
198
+ sh:severity sh:Violation .
199
+
200
+ } WHERE {
201
+
202
+ ?prop a owl:ObjectProperty ;
203
+ knora-api:isLinkProperty true ;
204
+ knora-api:objectType ?rangeClass .
205
+
206
+ BIND(IRI(CONCAT(str(?prop), "_NodeShape")) AS ?nodeShapeIRI)
207
+ BIND(CONCAT("Range is ", str(?rangeClass), " or a subclass") AS ?msg)
208
+ }
209
+ """
210
+ if results_graph := onto.query(query_s).graph:
211
+ return results_graph
212
+ return Graph()
213
+
214
+
215
+ def _construct_property_type_text_value(onto: Graph) -> Graph:
216
+ property_type_mapper = {
217
+ "salsah-gui:SimpleText": "api-shapes:SimpleTextValue_ClassShape",
218
+ "salsah-gui:Textarea": "api-shapes:TextareaTextValue_ClassShape",
219
+ "salsah-gui:Richtext": "api-shapes:FormattedTextValue_ClassShape",
220
+ }
221
+ g = Graph()
222
+ for object_type, shacl_shape in property_type_mapper.items():
223
+ g += _construct_one_property_type_text_value(onto, object_type, shacl_shape)
224
+ return g
225
+
226
+
227
+ def _construct_one_property_type_text_value(onto: Graph, gui_element: str, shacl_shape: str) -> Graph:
228
+ logger.debug(f"Constructing shape for {gui_element}")
229
+ query_s = """
230
+ PREFIX owl: <http://www.w3.org/2002/07/owl#>
231
+ PREFIX sh: <http://www.w3.org/ns/shacl#>
232
+ PREFIX api-shapes: <http://api.knora.org/ontology/knora-api/shapes/v2#>
233
+ PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
234
+ PREFIX salsah-gui: <http://api.knora.org/ontology/salsah-gui/v2#>
235
+
236
+ CONSTRUCT {
237
+
238
+ ?shapesIRI a sh:PropertyShape ;
239
+ sh:path ?prop ;
240
+ sh:node %(shacl_shape)s .
241
+
242
+ } WHERE {
243
+
244
+ ?prop a owl:ObjectProperty ;
245
+ knora-api:objectType knora-api:TextValue ;
246
+ salsah-gui:guiElement %(gui_element)s .
247
+
248
+ BIND(IRI(CONCAT(str(?prop), "_PropShape")) AS ?shapesIRI)
249
+ }
250
+ """ % {"gui_element": gui_element, "shacl_shape": shacl_shape} # noqa: UP031 (printf-string-formatting)
251
+ if results_graph := onto.query(query_s).graph:
252
+ return results_graph
253
+ return Graph()
254
+
255
+
256
+ def _construct_list_shapes(onto: Graph, project_lists: list[OneList]) -> Graph:
257
+ lists_graph = Graph()
258
+ for one_list in project_lists:
259
+ lists_graph += _construct_one_list_node_shape(one_list)
260
+ for one_list in project_lists:
261
+ lists_graph += _construct_one_list_property_shape(onto, one_list)
262
+ return lists_graph
263
+
264
+
265
+ def _construct_one_list_node_shape(one_list: OneList) -> Graph:
266
+ g = Graph()
267
+ list_iri = URIRef(one_list.list_iri)
268
+ g.add((list_iri, RDF.type, SH.NodeShape))
269
+ g.add((list_iri, SH.severity, SH.Violation))
270
+ list_iris = [nd.iri for nd in one_list.nodes]
271
+ node_prop_info = SHACLListInfo(
272
+ list_iri=list_iri,
273
+ sh_path=KNORA_API.listValueAsListNode,
274
+ sh_message=(
275
+ f"A valid node from the list '{one_list.list_name}' must be used with this property "
276
+ f"(input displayed in format 'listName / NodeName')."
277
+ ),
278
+ sh_in=list_iris,
279
+ )
280
+ g += _construct_one_list_property_shape_with_collection(node_prop_info)
281
+ return g
282
+
283
+
284
+ def _construct_one_list_property_shape_with_collection(shacl_info: SHACLListInfo) -> Graph:
285
+ g = Graph()
286
+ collection_bn = BNode()
287
+ collection_literals: list[SubjectObjectTypeAlias] = [Literal(lit, datatype=XSD.string) for lit in shacl_info.sh_in]
288
+ Collection(g, collection_bn, collection_literals)
289
+ prop_shape: list[tuple[PropertyTypeAlias, SubjectObjectTypeAlias]] = [
290
+ (RDF.type, SH.PropertyShape),
291
+ (SH.path, shacl_info.sh_path),
292
+ (URIRef("http://www.w3.org/ns/shacl#in"), collection_bn),
293
+ (SH.message, Literal(shacl_info.sh_message, datatype=XSD.string)),
294
+ ]
295
+ prop_bn: SubjectObjectTypeAlias = BNode()
296
+ for prop, obj in prop_shape:
297
+ g.add((prop_bn, prop, obj))
298
+ g.add((shacl_info.list_iri, SH.property, prop_bn))
299
+ return g
300
+
301
+
302
+ def _construct_one_list_property_shape(onto: Graph, one_list: OneList) -> Graph:
303
+ logger.debug(f"Constructing Collection Shape for ListValue: {one_list.list_iri}")
304
+ query_s = """
305
+ PREFIX owl: <http://www.w3.org/2002/07/owl#>
306
+ PREFIX sh: <http://www.w3.org/ns/shacl#>
307
+ PREFIX api-shapes: <http://api.knora.org/ontology/knora-api/shapes/v2#>
308
+ PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
309
+ PREFIX salsah-gui: <http://api.knora.org/ontology/salsah-gui/v2#>
310
+
311
+ CONSTRUCT {
312
+ ?shapesIRI a sh:PropertyShape ;
313
+ sh:path ?prop ;
314
+ sh:node <%(list)s> ;
315
+ sh:severity sh:Violation .
316
+ } WHERE {
317
+ ?prop a owl:ObjectProperty ;
318
+ knora-api:objectType knora-api:ListValue ;
319
+ salsah-gui:guiAttribute %(guiAttribute)s .
320
+
321
+ BIND(IRI(CONCAT(str(?prop), "_PropShape")) AS ?shapesIRI)
322
+ }
323
+ """ % {"guiAttribute": one_list.hlist(), "list": one_list.list_iri} # noqa: UP031 (printf-string-formatting)
324
+ if results_graph := onto.query(query_s).graph:
325
+ return results_graph
326
+ return Graph()
327
+
328
+
329
+ def _construct_seqnum_is_part_of_prop_shape(onto: Graph) -> Graph:
330
+ logger.debug("Constructing Collection Shape seqnum / isPartOf")
331
+ query_s = """
332
+ PREFIX owl: <http://www.w3.org/2002/07/owl#>
333
+ PREFIX sh: <http://www.w3.org/ns/shacl#>
334
+ PREFIX dash: <http://datashapes.org/dash#>
335
+ PREFIX api-shapes: <http://api.knora.org/ontology/knora-api/shapes/v2#>
336
+ PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
337
+ PREFIX salsah-gui: <http://api.knora.org/ontology/salsah-gui/v2#>
338
+
339
+ CONSTRUCT {
340
+ ?resourceClass sh:property api-shapes:seqnum_PropShape .
341
+ } WHERE {
342
+ ?resourceClass rdfs:subClassOf ?restriction .
343
+ ?restriction a owl:Restriction .
344
+ {
345
+ ?restriction owl:onProperty knora-api:seqnum .
346
+ }
347
+ UNION
348
+ {
349
+ ?restriction owl:onProperty knora-api:isPartOf .
350
+ }
351
+ }
352
+ """
353
+ # The API allows the ontology to declare cardinalities for seqnum without isPartOf and vice versa.
354
+ # Therefore, we have a union query.
355
+ if results_graph := onto.query(query_s).graph:
356
+ return results_graph
357
+ return Graph()
@@ -0,0 +1,59 @@
1
+ import shutil
2
+ from pathlib import Path
3
+ from tempfile import TemporaryDirectory
4
+
5
+ from dsp_tools.utils.rdf_constants import SubjectObjectTypeAlias
6
+
7
+
8
+ def get_temp_directory() -> TemporaryDirectory[str]:
9
+ ttl_dir = (Path.home() / ".dsp-tools" / "validate-data").absolute()
10
+ ttl_dir.mkdir(exist_ok=True, parents=True)
11
+ t_dir = TemporaryDirectory(dir=ttl_dir)
12
+ return t_dir
13
+
14
+
15
+ def clean_up_temp_directory(temp_dir: TemporaryDirectory[str], save_graphs_dir: Path | None) -> None:
16
+ if save_graphs_dir:
17
+ tmp_folder = Path(temp_dir.name)
18
+ save_graphs_dir.mkdir(parents=True, exist_ok=True)
19
+ for tmp_filepath in tmp_folder.glob("*"):
20
+ if tmp_filepath.is_file():
21
+ dest_filepath = save_graphs_dir / tmp_filepath.relative_to(tmp_folder)
22
+ shutil.copy2(tmp_filepath, dest_filepath)
23
+ temp_dir.cleanup()
24
+
25
+
26
+ def reformat_any_iri(iri: SubjectObjectTypeAlias | str) -> str:
27
+ """
28
+ Reformats any kind of IRI, if it starts with data then it treats is like a data IRI.
29
+ Otherwise, like an ontology IRI.
30
+
31
+ Args:
32
+ iri: Input IRI
33
+
34
+ Returns:
35
+ reformatted string
36
+ """
37
+ iri_str = str(iri)
38
+ if iri_str.startswith("http://data/"):
39
+ return reformat_data_iri(iri_str)
40
+ if iri_str.startswith("http://rdfh.ch/"):
41
+ return iri_str
42
+ return reformat_onto_iri(iri_str)
43
+
44
+
45
+ def reformat_onto_iri(iri: SubjectObjectTypeAlias | str) -> str:
46
+ """Takes a rdflib Node and returns a prefixed IRI in string form."""
47
+ iri_str = str(iri)
48
+ if "http://www.w3.org/2000/01/rdf-schema#" in iri_str:
49
+ return f"rdfs:{iri_str.split('#')[-1]}"
50
+ onto = iri_str.split("/")[-2]
51
+ ending = iri_str.split("#")[-1]
52
+ if onto == "knora-api":
53
+ return ending
54
+ return f"{onto}:{ending}"
55
+
56
+
57
+ def reformat_data_iri(iri: SubjectObjectTypeAlias | str) -> str:
58
+ """Takes a rdflib Node with in the data namespace and returns only the suffix."""
59
+ return str(iri).replace("http://data/", "", 1)