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
dsplib/models/helpers.py DELETED
@@ -1,505 +0,0 @@
1
- from dataclasses import dataclass
2
- from typing import NewType, List, Set, Dict, Tuple, Optional, Any, Union, Pattern
3
- from enum import Enum, unique
4
- from traceback import format_exc
5
- from pystrict import strict
6
- import re
7
- import sys
8
-
9
- #
10
- # here we do some data typing that should help
11
- #
12
- @dataclass
13
- class OntoInfo:
14
- """
15
- A small class thats holds an ontology IRI. The variable "hashtag" is True, if "#" is used s separate elements,
16
- False if the element name is just appended
17
- """
18
- iri: str
19
- hashtag: bool
20
-
21
-
22
- ContextType = NewType("ContextType", Dict[str, OntoInfo])
23
-
24
-
25
- def LINE():
26
- return sys._getframe(1).f_lineno
27
-
28
-
29
- @strict
30
- class IriTest:
31
- __iri_regexp = re.compile("^(http)s?://([\\w\\.\\-~]+)?(:\\d{,6})?(/[\\w\\-~]+)*(#[\\w\\-~]*)?")
32
-
33
- @classmethod
34
- def test(cls, val: str) -> bool:
35
- m = cls.__iri_regexp.match(val)
36
- return m.span()[1] == len(val) if m else False
37
-
38
-
39
- @strict
40
- class BaseError(Exception):
41
- """
42
- A basic error class
43
- """
44
- _message: str
45
-
46
- def __init__(self, message: str) -> None:
47
- """
48
- Constructor for error message
49
- :param message: error message string
50
- """
51
- super().__init__()
52
- self._message = message
53
-
54
- def __str__(self) -> str:
55
- """
56
- Convert to string
57
- :return: stringyfied error message
58
- """
59
- return "ERROR: " + self._message + "!\n\n" + format_exc()
60
-
61
- @property
62
- def message(self) -> str:
63
- return self._message
64
-
65
-
66
- @unique
67
- class Actions(Enum):
68
- Create = 1
69
- Read = 2
70
- Update = 3
71
- Delete = 4
72
-
73
-
74
- @unique
75
- class Cardinality(Enum):
76
- C_1 = "1"
77
- C_0_1 = "0-1"
78
- C_1_n = "1-n"
79
- C_0_n = "0-n"
80
-
81
- @strict
82
- class ContextIterator:
83
- _context: 'Context'
84
- _prefixes: List[str]
85
- _index: int
86
-
87
- def __init__(self, context: 'Context'):
88
- self._context = context
89
- self._prefixes = [x for x in self._context.context]
90
- self._index = 0
91
-
92
- def __next__(self):
93
- if len(self._context.context) == 0 and self._index == 0:
94
- return None, None
95
- elif self._index < len(self._context.context):
96
- tmp = self._prefixes[self._index]
97
- self._index += 1
98
- return tmp, self._context.context[tmp]
99
- else:
100
- raise StopIteration
101
-
102
-
103
- @strict
104
- class Context:
105
- """
106
- This class holds a JSON-LD context with the ontology IRI's and the associated prefixes
107
- """
108
- _context: ContextType
109
- _rcontext: Dict[str, str]
110
- _exp: Pattern
111
-
112
- common_ontologies: ContextType = {
113
- "foaf": OntoInfo("http://xmlns.com/foaf/0.1/", False),
114
- "dc": OntoInfo("http://purl.org/dc/elements/1.1/", False),
115
- "dcterms": OntoInfo("http://purl.org/dc/terms/", False),
116
- "dcmi": OntoInfo("http://purl.org/dc/dcmitype/", False),
117
- "skos": OntoInfo("http://www.w3.org/2004/02/skos/core", True),
118
- "bibtex": OntoInfo("http://purl.org/net/nknouf/ns/bibtex", True),
119
- "bibo": OntoInfo("http://purl.org/ontology/bibo/", False),
120
- "cidoc": OntoInfo("http://purl.org/NET/cidoc-crm/core", True)
121
- }
122
-
123
- knora_ontologies: ContextType = {
124
- "knora-api": OntoInfo("http://api.knora.org/ontology/knora-api/v2", True),
125
- "salsah-gui": OntoInfo("http://api.knora.org/ontology/salsah-gui/v2", True)
126
- }
127
-
128
- base_ontologies: ContextType = {
129
- "rdf": OntoInfo("http://www.w3.org/1999/02/22-rdf-syntax-ns", True),
130
- "rdfs": OntoInfo("http://www.w3.org/2000/01/rdf-schema", True),
131
- "owl": OntoInfo("http://www.w3.org/2002/07/owl", True),
132
- "xsd": OntoInfo("http://www.w3.org/2001/XMLSchema", True)
133
- }
134
-
135
- def __is_iri(self, val: str) -> bool:
136
- """
137
- Test if string has a valid IRI pattern
138
-
139
- :param val: Input string
140
- :return: True, if val corresponds to IRI pattern
141
- """
142
-
143
- m = self._exp.match(val)
144
- return m.span()[1] == len(val) if m else False
145
-
146
- def __init__(self, context: Optional[Dict[str, str]] = None):
147
- """
148
- THe Constructor of the Context. It takes one optional parameter which as a dict of
149
- prefix - ontology-iri pairs. If the hashtag "#" is used to append element name, the
150
- ontology-iri *must* end with "#"!
151
- :param context: A dict of prefix - ontology-iri pairs
152
- """
153
- #
154
- # regexp to test for a complete IRI (including fragment identifier)
155
- #
156
- self._exp = re.compile("^(http)s?://([\\w\\.\\-~]+)?(:\\d{,6})?(/[\\w\\-~]+)*(#[\\w\\-~]*)?")
157
-
158
- if context:
159
- cleaned_input: Dict[str, str] = {prefix: onto for (prefix, onto) in context.items() if self.base_ontologies.get(prefix) is None and self.knora_ontologies.get(prefix) is None}
160
- self._context = {}
161
- for prefix, onto in cleaned_input.items():
162
- self._context[prefix] = OntoInfo(onto[:-1], True) if onto.endswith('#') else OntoInfo(onto, False)
163
- #
164
- # we always want the base ontologies/prefixes included in the context
165
- #
166
- for cc in self.base_ontologies.items():
167
- if self._context.get(cc[0]) is None:
168
- self._context[cc[0]] = cc[1]
169
- #
170
- # we always want the knora ontologies/prefixes included in the context
171
- #
172
- for cc in self.knora_ontologies.items():
173
- if self._context.get(cc[0]) is None:
174
- self._context[cc[0]] = cc[1]
175
- else:
176
- self._context = {
177
- "rdf": OntoInfo("http://www.w3.org/1999/02/22-rdf-syntax-ns", True),
178
- "rdfs": OntoInfo("http://www.w3.org/2000/01/rdf-schema", True),
179
- "owl": OntoInfo("http://www.w3.org/2002/07/owl", True),
180
- "xsd": OntoInfo("http://www.w3.org/2001/XMLSchema", True),
181
- "knora-api": OntoInfo("http://api.knora.org/ontology/knora-api/v2", True),
182
- "salsah-gui": OntoInfo("http://api.knora.org/ontology/salsah-gui/v2", True)
183
- }
184
- self._rcontext = dict(map(lambda x: (x[1].iri, x[0]), self._context.items()))
185
-
186
- def __len__(self) -> int:
187
- return len(self._context)
188
-
189
- def __getitem__(self, key: str) -> OntoInfo:
190
- return self._context[key]
191
-
192
- def __setitem__(self, key: str, value: OntoInfo):
193
- self._context[key] = value
194
- self._rcontext[value.iri] = key
195
-
196
- def __delitem__(self, key: str) -> None:
197
- iri = self._context[key].iri
198
- del self._context[key].iri
199
- del self._rcontext[iri]
200
-
201
- def __contains__(self, key: str) -> bool:
202
- return key in self._context
203
-
204
- def __iter__(self) -> ContextIterator:
205
- return ContextIterator(self)
206
-
207
- def __str__(self) -> str:
208
- output = "Context:\n"
209
- for prefix, val in self._context.items():
210
- output += " " + prefix + ": " + val.iri + "\n"
211
- return output
212
-
213
- #
214
- # now we have a lot of getters/setters
215
- #
216
- @property
217
- def context(self) -> ContextType:
218
- return self._context
219
-
220
- @context.setter
221
- def context(self, value: ContextType) -> None:
222
- """
223
- Setter function for the context out of a dict in the form { prefix1 : iri1, prefix2, iri2, …}
224
-
225
- :param value: Dictionary of context
226
- :return: None
227
- """
228
- if value is not None and isinstance(value, ContextType):
229
- self._context = value
230
- else:
231
- raise BaseError("Error in parameter to context setter")
232
-
233
- @property
234
- def rcontext(self) -> Dict[str, str]:
235
- return self._rcontext
236
-
237
- def add_context(self, prefix: str, iri: Optional[str] = None) -> None:
238
- """
239
- Add a new context to a context instance
240
-
241
- :param prefix: The prefix that should be used
242
- :param iri: The IRI that belongs to this context prefix
243
- :return: None
244
- """
245
- if iri is None:
246
- if prefix in self.knora_ontologies:
247
- return
248
- if prefix in self.base_ontologies:
249
- return
250
- if prefix in self.common_ontologies:
251
- self._context[prefix] = self.common_ontologies[prefix]
252
- else:
253
- raise BaseError("The prefix '{}' is not known!".format(prefix))
254
- else:
255
- if iri.endswith("#"):
256
- iri = iri[:-1]
257
- self._context[prefix] = OntoInfo(iri, True)
258
- else:
259
- self._context[prefix] = OntoInfo(iri, False)
260
- self._rcontext[iri] = prefix
261
-
262
- def iri_from_prefix(self, prefix: str) -> Optional[str]:
263
- """
264
- Returns the full IRI belonging to this prefix, without trailing "#"!
265
-
266
- :param prefix: Prefix of the context entry
267
- :return: The full IRI without trailing "#"
268
- """
269
- #if self.__is_iri(prefix):
270
- if IriTest.test(prefix):
271
- return prefix
272
- if self._context.get(prefix) is not None:
273
- return self._context.get(prefix).iri
274
- else:
275
- return None
276
-
277
- def prefix_from_iri(self, iri: str) -> Optional[str]:
278
- """
279
- Get the IRI from a full context that has or has not a a trailing "#". It first searches in the normal list
280
- of contexted. If the iri is not found there, it looks in the list common (external) ontologies. If the
281
- ontology is found there, this ontology is added to the list of known ontology and it's prefix is returned.
282
- If nothing is found, None is returns
283
-
284
- :param iri: The full IRI with or without trailing "#", or
285
- :return: the prefix of this context element, or None, if not found
286
- """
287
- #if not self.__is_iri(iri):
288
- if not IriTest.test(iri):
289
- raise BaseError("String does not conform to IRI patter: " + iri)
290
- if iri.endswith("#"):
291
- iri = iri[:-1]
292
- result = self._rcontext.get(iri)
293
- if result is None:
294
- entrylist = list(filter(lambda x: x[1].iri == iri, self.common_ontologies.items()))
295
- if len(entrylist) == 1:
296
- entry = entrylist[0]
297
- self._context[entry[0]] = entry[1] # add to list of prefixes used
298
- self._rcontext[entry[1].iri] = entry[0]
299
- result = entry[0]
300
- else:
301
- tmp = iri.split('/')
302
- if tmp[-1] == "v2":
303
- #
304
- # we have a knora ontology name "http://server/ontology/shortcode/shortname/v2"
305
- self._context[tmp[-2]] = OntoInfo(iri, True) # add to list of prefixes used
306
- self._rcontext[iri] = tmp[-2]
307
- else:
308
- raise BaseError("Iri cannot be resolved to a well-known prefix!")
309
- return result
310
-
311
- def get_qualified_iri(self, val: Optional[str]) -> Optional[str]:
312
- """
313
- We will return the full qualified IRI, if it is not yet a full qualified IRI. If
314
- the IRI is already fully qualified, the we just return it.
315
-
316
- :param val: The input short form
317
- :return: the fully qualified IRI
318
- """
319
- if val is None:
320
- return None
321
- #if self.__is_iri(val):
322
- if IriTest.test(val):
323
- return val
324
- tmp = val.split(':')
325
- if len(tmp) < 2:
326
- raise BaseError("There is no separator to identify the prefix: " + val)
327
- iri_info = self._context.get(tmp[0])
328
- if iri_info is None:
329
- entrylist = list(filter(lambda x: x[1].iri == tmp[0], self.common_ontologies.items()))
330
- if len(entrylist) == 1:
331
- entry = entrylist[0]
332
- self._context[entry[0]] = entry[1] # add to list of prefixes used
333
- self._rcontext[entry[1].iri] = entry[0]
334
- iri_info = entry[1]
335
- else:
336
- raise BaseError("Ontology not known! Cannot generate full qualified IRI")
337
- if iri_info.hashtag:
338
- return iri_info.iri + '#' + tmp[1]
339
- else:
340
- return iri_info.iri + tmp[1]
341
-
342
- def get_prefixed_iri(self, iri: Optional[str]) -> Optional[str]:
343
- """
344
- We reduce a fully qualified IRI to a short one in the form "prefix:name"
345
-
346
- :param iri: Fully qualified IRI
347
- :return: Return short from of IRI ("prefix:name")
348
- """
349
-
350
- if iri is None:
351
- return None
352
- #
353
- # check if the iri already has the form "prefix:name"
354
- #
355
- m = re.match("([\\w-]+):([\\w-]+)", iri)
356
- if m and m.span()[1] == len(iri):
357
- return iri
358
- #if not self.__is_iri(iri):
359
- if not IriTest.test(iri):
360
- raise BaseError("String does not conform to IRI patter: " + iri)
361
-
362
- splitpoint = iri.find('#')
363
- if splitpoint == -1:
364
- splitpoint = iri.rfind('/')
365
- ontopart = iri[:splitpoint + 1]
366
- element = iri[splitpoint + 1:]
367
- else:
368
- ontopart = iri[:splitpoint]
369
- element = iri[splitpoint + 1:]
370
- prefix = self._rcontext.get(ontopart)
371
- if prefix is None:
372
- entrylist = list(filter(lambda x: x[1].iri == ontopart, self.common_ontologies.items()))
373
- if len(entrylist) == 1:
374
- entry = entrylist[0]
375
- self._context[entry[0]] = entry[1] # add to list of prefixes used
376
- self._rcontext[entry[1].iri] = entry[0]
377
- prefix = entry[0]
378
- else:
379
- raise BaseError("Ontology {} not known! Cannot generate full qualified IRI: prefix={}".format(iri, prefix))
380
- return prefix + ':' + element
381
-
382
- def reduce_iri(self, iristr: str, ontoname: Optional[str] = None) -> str:
383
- """
384
- Reduce an IRI to the form that is used within the definition json file. It expects
385
- the context object to have entries (prefixes) for all IRI's
386
- - if it's an external IRI, it returns: "prefix:name"
387
- - if it's in the same ontology, it returns ":name"
388
- - if it's a system ontoloy ("knora-api" or "salsah-gui") it returns "name"
389
- :param iristr:
390
- :return:
391
- """
392
- rdf = self.prefix_from_iri("http://www.w3.org/1999/02/22-rdf-syntax-ns#")
393
- rdfs = self.prefix_from_iri("http://www.w3.org/2000/01/rdf-schema#")
394
- owl = self.prefix_from_iri("http://www.w3.org/2002/07/owl#")
395
- xsd = self.prefix_from_iri("http://www.w3.org/2001/XMLSchema#")
396
- knora_api = self.prefix_from_iri("http://api.knora.org/ontology/knora-api/v2#")
397
- salsah_gui = self.prefix_from_iri("http://api.knora.org/ontology/salsah-gui/v2#")
398
-
399
- #if self.__is_iri(iristr):
400
- if IriTest.test(iristr):
401
- iristr = self.get_prefixed_iri(iristr)
402
- tmp = iristr.split(':')
403
- if tmp[0] == knora_api or tmp[0] == salsah_gui:
404
- return tmp[1]
405
- elif ontoname is not None and tmp[0] == ontoname:
406
- return ':' + tmp[1]
407
- else:
408
- return iristr
409
-
410
- def toJsonObj(self) -> Dict[str, str]:
411
- """
412
- Return a python object that can be jsonfied...
413
- :return: Object to be jsonfied
414
- """
415
- return {prefix: oinfo.iri + '#' if oinfo.hashtag else oinfo.iri
416
- for prefix, oinfo in self._context.items()}
417
-
418
- def get_externals_used(self) -> Dict[str, str]:
419
- exclude = ["rdf", "rdfs", "owl", "xsd", "knora-api", "salsah-gui"]
420
- return {prefix: onto.iri for prefix, onto in self._context.items() if prefix not in exclude}
421
-
422
- def print(self) -> None:
423
- for a in self._context.items():
424
- print(a[0] + ': "' + a[1].iri + '"')
425
-
426
-
427
- class LastModificationDate:
428
- """
429
- Class to hold and process the last modification date of a ontology
430
- """
431
- _last_modification_date: str;
432
-
433
- def __init__(self, val: Any):
434
- """
435
- The constructor works for different inputs:
436
- - a string holding the modification date
437
- - an instance of "LastModificationDate"
438
- - json-ld construct of the form { "@type": "xsd:dateTimeStamp", "@value": "date-str" }
439
- :param val: datetimestamp as string, instance of "LastModificationDate" or json-ld construct
440
- """
441
- if isinstance(val, str):
442
- self._last_modification_date = val;
443
- elif isinstance(val, LastModificationDate):
444
- self._last_modification_date = str(val)
445
- else:
446
- if val.get("@type") is not None and val.get("@type") == "xsd:dateTimeStamp":
447
- self._last_modification_date = val["@value"]
448
- else:
449
- raise BaseError("Invalid LastModificationDate")
450
-
451
- def __eq__(self, other: Union[str, 'LastModificationDate']) -> bool:
452
- if isinstance(other, str):
453
- other = LastModificationDate(other)
454
- return self._last_modification_date == other._last_modification_date
455
-
456
- def __lt__(self, other: 'LastModificationDate') -> bool:
457
- if isinstance(other, str):
458
- other = LastModificationDate(other)
459
- return self._last_modification_date < other._last_modification_date
460
-
461
- def __le__(self, other: 'LastModificationDate') -> bool:
462
- if isinstance(other, str):
463
- other = LastModificationDate(other)
464
- return self._last_modification_date <= other._last_modification_date
465
-
466
- def __gt__(self, other: 'LastModificationDate') -> bool:
467
- if isinstance(other, str):
468
- other = LastModificationDate(other)
469
- return self._last_modification_date > other._last_modification_date
470
-
471
- def __ge__(self, other: 'LastModificationDate') -> bool:
472
- if isinstance(other, str):
473
- other = LastModificationDate(other)
474
- return self._last_modification_date >= other._last_modification_date
475
-
476
- def __ne__(self, other: 'LastModificationDate') -> bool:
477
- if isinstance(other, str):
478
- other = LastModificationDate(other)
479
- return self._last_modification_date != other._last_modification_date
480
-
481
- def __str__(self: 'LastModificationDate') -> Union[None, str]:
482
- return self._last_modification_date
483
-
484
- def toJsonObj(self):
485
- return {
486
- "@type": "xsd:dateTimeStamp",
487
- "@value": self._last_modification_date
488
- }
489
-
490
-
491
- class WithId:
492
- """
493
- Class helper to get json-ld "@id" thingies
494
- """
495
- _tmp: str = None
496
-
497
- def __init__(self, obj: Optional[Dict[str, str]]):
498
- if obj is None:
499
- return
500
- self._tmp = obj.get('@id')
501
-
502
- def str(self) -> Optional[str]:
503
- return self._tmp
504
-
505
-