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
dsp_tools/__init__.py ADDED
@@ -0,0 +1,5 @@
1
+ from dsp_tools import xmllib
2
+ from dsp_tools.commands import excel2xml
3
+ from dsp_tools.config.warnings_config import initialize_warnings
4
+
5
+ initialize_warnings()
dsp_tools/cli/args.py ADDED
@@ -0,0 +1,47 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from dataclasses import field
5
+ from enum import Enum
6
+ from pathlib import Path
7
+
8
+
9
+ @dataclass(frozen=True)
10
+ class ServerCredentials:
11
+ """Contains credentials to connect to a server."""
12
+
13
+ user: str
14
+ password: str
15
+ server: str
16
+ dsp_ingest_url: str = "http://0.0.0.0:3340"
17
+
18
+
19
+ @dataclass(frozen=True)
20
+ class ValidateDataConfig:
21
+ """Contains the configuration for validate data."""
22
+
23
+ xml_file: Path
24
+ save_graph_dir: Path | None
25
+ severity: ValidationSeverity
26
+ ignore_duplicate_files_warning: bool
27
+ is_on_prod_server: bool
28
+ skip_ontology_validation: bool
29
+ do_not_request_resource_metadata_from_db: bool
30
+
31
+
32
+ class ValidationSeverity(Enum):
33
+ ERROR = 3
34
+ WARNING = 2
35
+ INFO = 1
36
+
37
+
38
+ @dataclass
39
+ class PathDependencies:
40
+ required_files: list[Path] = field(default_factory=list)
41
+ required_directories: list[Path] = field(default_factory=list)
42
+
43
+
44
+ @dataclass
45
+ class NetworkRequirements:
46
+ api_url: str
47
+ always_requires_docker: bool = False
@@ -0,0 +1,85 @@
1
+ import argparse
2
+
3
+ from loguru import logger
4
+
5
+ from dsp_tools.cli.call_action_files_only import call_excel2json
6
+ from dsp_tools.cli.call_action_files_only import call_excel2lists
7
+ from dsp_tools.cli.call_action_files_only import call_excel2properties
8
+ from dsp_tools.cli.call_action_files_only import call_excel2resources
9
+ from dsp_tools.cli.call_action_files_only import call_id2iri
10
+ from dsp_tools.cli.call_action_files_only import call_old_excel2json
11
+ from dsp_tools.cli.call_action_files_only import call_old_excel2lists
12
+ from dsp_tools.cli.call_action_files_only import call_update_legal
13
+ from dsp_tools.cli.call_action_with_network import call_create
14
+ from dsp_tools.cli.call_action_with_network import call_get
15
+ from dsp_tools.cli.call_action_with_network import call_ingest_files
16
+ from dsp_tools.cli.call_action_with_network import call_ingest_xmlupload
17
+ from dsp_tools.cli.call_action_with_network import call_resume_xmlupload
18
+ from dsp_tools.cli.call_action_with_network import call_start_stack
19
+ from dsp_tools.cli.call_action_with_network import call_stop_stack
20
+ from dsp_tools.cli.call_action_with_network import call_upload_files
21
+ from dsp_tools.cli.call_action_with_network import call_validate_data
22
+ from dsp_tools.cli.call_action_with_network import call_xmlupload
23
+
24
+
25
+ def call_requested_action(args: argparse.Namespace) -> bool: # noqa: PLR0912 (too many branches)
26
+ """
27
+ Call the appropriate function of DSP-TOOLS.
28
+
29
+ Args:
30
+ args: parsed CLI arguments
31
+
32
+ Raises:
33
+ BaseError: from the called function
34
+ InputError: from the called function
35
+ DockerNotReachableError: from the called function
36
+ LocalDspApiNotReachableError: from the called function
37
+ unexpected errors from the called methods and underlying libraries
38
+
39
+ Returns:
40
+ success status
41
+ """
42
+ match args.action:
43
+ # commands with Docker / API interactions
44
+ case "start-stack":
45
+ result = call_start_stack(args)
46
+ case "stop-stack":
47
+ result = call_stop_stack()
48
+ case "create":
49
+ result = call_create(args)
50
+ case "get":
51
+ result = call_get(args)
52
+ case "validate-data":
53
+ result = call_validate_data(args)
54
+ case "xmlupload":
55
+ result = call_xmlupload(args)
56
+ case "resume-xmlupload":
57
+ result = call_resume_xmlupload(args)
58
+ case "upload-files":
59
+ result = call_upload_files(args)
60
+ case "ingest-files":
61
+ result = call_ingest_files(args)
62
+ case "ingest-xmlupload":
63
+ result = call_ingest_xmlupload(args)
64
+ # commands that do not require docker
65
+ case "excel2json":
66
+ result = call_excel2json(args)
67
+ case "old-excel2json":
68
+ result = call_old_excel2json(args)
69
+ case "excel2lists":
70
+ result = call_excel2lists(args)
71
+ case "old-excel2lists":
72
+ result = call_old_excel2lists(args)
73
+ case "excel2resources":
74
+ result = call_excel2resources(args)
75
+ case "excel2properties":
76
+ result = call_excel2properties(args)
77
+ case "id2iri":
78
+ result = call_id2iri(args)
79
+ case "update-legal":
80
+ result = call_update_legal(args)
81
+ case _:
82
+ print(f"ERROR: Unknown action '{args.action}'")
83
+ logger.error(f"Unknown action '{args.action}'")
84
+ result = False
85
+ return result
@@ -0,0 +1,101 @@
1
+ import argparse
2
+ from pathlib import Path
3
+
4
+ from dsp_tools.cli.args import PathDependencies
5
+ from dsp_tools.cli.utils import check_path_dependencies
6
+ from dsp_tools.commands.excel2json.lists.make_lists import excel2lists
7
+ from dsp_tools.commands.excel2json.old_lists import old_excel2lists
8
+ from dsp_tools.commands.excel2json.project import excel2json
9
+ from dsp_tools.commands.excel2json.project import old_excel2json
10
+ from dsp_tools.commands.excel2json.properties import excel2properties
11
+ from dsp_tools.commands.excel2json.resources import excel2resources
12
+ from dsp_tools.commands.id2iri import id2iri
13
+ from dsp_tools.commands.update_legal.core import update_legal_metadata
14
+ from dsp_tools.commands.update_legal.models import LegalMetadataDefaults
15
+ from dsp_tools.commands.update_legal.models import LegalProperties
16
+
17
+
18
+ def call_id2iri(args: argparse.Namespace) -> bool:
19
+ check_path_dependencies(PathDependencies([Path(args.xmlfile), Path(args.mapping)]))
20
+ return id2iri(
21
+ xml_file=args.xmlfile,
22
+ json_file=args.mapping,
23
+ remove_resource_if_id_in_mapping=args.remove_resources,
24
+ )
25
+
26
+
27
+ def call_excel2properties(args: argparse.Namespace) -> bool:
28
+ check_path_dependencies(PathDependencies([Path(args.excelfile)]))
29
+ _, _, success = excel2properties(
30
+ excelfile=args.excelfile,
31
+ path_to_output_file=args.properties_section,
32
+ )
33
+ return success
34
+
35
+
36
+ def call_excel2resources(args: argparse.Namespace) -> bool:
37
+ check_path_dependencies(PathDependencies([Path(args.excelfile)]))
38
+ _, _, success = excel2resources(
39
+ excelfile=args.excelfile,
40
+ path_to_output_file=args.resources_section,
41
+ )
42
+ return success
43
+
44
+
45
+ def call_old_excel2lists(args: argparse.Namespace) -> bool:
46
+ check_path_dependencies(PathDependencies(required_directories=[Path(args.excelfolder)]))
47
+ _, success = old_excel2lists(
48
+ excelfolder=args.excelfolder,
49
+ path_to_output_file=args.lists_section,
50
+ verbose=args.verbose,
51
+ )
52
+ return success
53
+
54
+
55
+ def call_excel2lists(args: argparse.Namespace) -> bool:
56
+ check_path_dependencies(PathDependencies(required_directories=[Path(args.excelfolder)]))
57
+ _, success = excel2lists(
58
+ excelfolder=args.excelfolder,
59
+ path_to_output_file=args.lists_section,
60
+ )
61
+ return success
62
+
63
+
64
+ def call_excel2json(args: argparse.Namespace) -> bool:
65
+ check_path_dependencies(PathDependencies(required_directories=[Path(args.excelfolder)]))
66
+ return excel2json(
67
+ data_model_files=args.excelfolder,
68
+ path_to_output_file=args.project_definition,
69
+ )
70
+
71
+
72
+ def call_old_excel2json(args: argparse.Namespace) -> bool:
73
+ check_path_dependencies(PathDependencies(required_directories=[Path(args.excelfolder)]))
74
+ return old_excel2json(
75
+ data_model_files=args.excelfolder,
76
+ path_to_output_file=args.project_definition,
77
+ )
78
+
79
+
80
+ def call_update_legal(args: argparse.Namespace) -> bool:
81
+ required_files = [Path(args.xmlfile)]
82
+ if args.fixed_errors:
83
+ required_files.append(Path(args.fixed_errors))
84
+ check_path_dependencies(PathDependencies(required_files))
85
+ properties = LegalProperties(
86
+ authorship_prop=args.authorship_prop,
87
+ copyright_prop=args.copyright_prop,
88
+ license_prop=args.license_prop,
89
+ )
90
+ defaults = LegalMetadataDefaults(
91
+ authorship_default=args.authorship_default,
92
+ copyright_default=args.copyright_default,
93
+ license_default=args.license_default,
94
+ )
95
+ return update_legal_metadata(
96
+ input_file=Path(args.xmlfile),
97
+ properties=properties,
98
+ defaults=defaults,
99
+ fixed_errors_file=Path(args.fixed_errors) if args.fixed_errors else None,
100
+ treat_invalid_licenses_as_unknown=args.treat_invalid_licenses_as_unknown,
101
+ )
@@ -0,0 +1,207 @@
1
+ import argparse
2
+ from pathlib import Path
3
+
4
+ from dsp_tools.cli.args import NetworkRequirements
5
+ from dsp_tools.cli.args import PathDependencies
6
+ from dsp_tools.cli.args import ValidationSeverity
7
+ from dsp_tools.cli.utils import check_docker_health
8
+ from dsp_tools.cli.utils import check_input_dependencies
9
+ from dsp_tools.cli.utils import get_creds
10
+ from dsp_tools.commands.create.create import create
11
+ from dsp_tools.commands.create.lists_only import create_lists_only
12
+ from dsp_tools.commands.create.project_validate import validate_project_only
13
+ from dsp_tools.commands.excel2json.old_lists import validate_lists_section_from_project
14
+ from dsp_tools.commands.get.get import get_project
15
+ from dsp_tools.commands.ingest_xmlupload.create_resources.upload_xml import ingest_xmlupload
16
+ from dsp_tools.commands.ingest_xmlupload.ingest_files.ingest_files import ingest_files
17
+ from dsp_tools.commands.ingest_xmlupload.upload_files.upload_files import upload_files
18
+ from dsp_tools.commands.resume_xmlupload.resume_xmlupload import resume_xmlupload
19
+ from dsp_tools.commands.start_stack import StackConfiguration
20
+ from dsp_tools.commands.start_stack import StackHandler
21
+ from dsp_tools.commands.validate_data.validate_data import validate_data
22
+ from dsp_tools.commands.xmlupload.upload_config import UploadConfig
23
+ from dsp_tools.commands.xmlupload.xmlupload import xmlupload
24
+ from dsp_tools.error.exceptions import InputError
25
+ from dsp_tools.utils.xml_parsing.parse_clean_validate_xml import parse_and_validate_xml_file
26
+
27
+
28
+ def call_start_stack(args: argparse.Namespace) -> bool:
29
+ check_docker_health()
30
+ stack_handler = StackHandler(
31
+ StackConfiguration(
32
+ max_file_size=args.max_file_size,
33
+ enforce_docker_system_prune=args.prune,
34
+ suppress_docker_system_prune=args.no_prune,
35
+ latest_dev_version=args.latest,
36
+ upload_test_data=args.with_test_data,
37
+ custom_host=args.custom_host,
38
+ )
39
+ )
40
+ return stack_handler.start_stack()
41
+
42
+
43
+ def call_stop_stack() -> bool:
44
+ check_docker_health()
45
+ stack_handler = StackHandler(StackConfiguration())
46
+ return stack_handler.stop_stack()
47
+
48
+
49
+ def call_upload_files(args: argparse.Namespace) -> bool:
50
+ xml_path = Path(args.xml_file)
51
+ image_dir = Path(args.imgdir)
52
+ network_requirements = NetworkRequirements(api_url=args.server)
53
+ path_requirements = PathDependencies([xml_path], required_directories=[image_dir])
54
+ check_input_dependencies(path_requirements, network_requirements)
55
+
56
+ return upload_files(
57
+ xml_file=xml_path,
58
+ creds=get_creds(args),
59
+ imgdir=image_dir,
60
+ )
61
+
62
+
63
+ def call_ingest_files(args: argparse.Namespace) -> bool:
64
+ check_input_dependencies(network_dependencies=NetworkRequirements(api_url=args.server))
65
+ return ingest_files(creds=get_creds(args), shortcode=args.shortcode)
66
+
67
+
68
+ def call_ingest_xmlupload(args: argparse.Namespace) -> bool:
69
+ xml_path = Path(args.xml_file)
70
+ required_files = [xml_path]
71
+ id2iri_file = args.id2iri_file
72
+ if id2iri_file:
73
+ required_files.append(Path(id2iri_file))
74
+ always_requires_docker = False if args.skip_validation else True
75
+ network_requirements = NetworkRequirements(args.server, always_requires_docker=always_requires_docker)
76
+ path_deps = PathDependencies(required_files)
77
+ check_input_dependencies(path_deps, network_requirements)
78
+
79
+ interrupt_after = args.interrupt_after if args.interrupt_after > 0 else None
80
+ return ingest_xmlupload(
81
+ xml_file=xml_path,
82
+ creds=get_creds(args),
83
+ interrupt_after=interrupt_after,
84
+ skip_validation=args.skip_validation,
85
+ skip_ontology_validation=args.skip_ontology_validation,
86
+ id2iri_file=id2iri_file,
87
+ do_not_request_resource_metadata_from_db=args.do_not_request_resource_metadata_from_db,
88
+ )
89
+
90
+
91
+ def call_xmlupload(args: argparse.Namespace) -> bool:
92
+ xml_path = Path(args.xmlfile)
93
+ required_files = [xml_path]
94
+ id2iri_file = args.id2iri_file
95
+ if id2iri_file:
96
+ required_files.append(Path(id2iri_file))
97
+ always_requires_docker = False if args.skip_validation else True
98
+ network_requirements = NetworkRequirements(args.server, always_requires_docker=always_requires_docker)
99
+ path_deps = PathDependencies(required_files, [Path(args.imgdir)])
100
+ check_input_dependencies(path_deps, network_requirements)
101
+
102
+ if args.validate_only:
103
+ if parse_and_validate_xml_file(xml_path):
104
+ print("The XML file is syntactically correct.")
105
+ return True
106
+ else:
107
+ return False # detailed error report has already been printed
108
+ else:
109
+ interrupt_after = args.interrupt_after if args.interrupt_after > 0 else None
110
+ match args.validation_severity:
111
+ case "info":
112
+ severity = ValidationSeverity.INFO
113
+ case "warning":
114
+ severity = ValidationSeverity.WARNING
115
+ case "error":
116
+ severity = ValidationSeverity.ERROR
117
+ case _:
118
+ raise InputError(
119
+ f"The entered validation severity '{args.validation_severity}' "
120
+ f"is not part of the allowed values: info, warning, error."
121
+ )
122
+ return xmlupload(
123
+ input_file=xml_path,
124
+ creds=get_creds(args),
125
+ imgdir=args.imgdir,
126
+ config=UploadConfig(
127
+ interrupt_after=interrupt_after,
128
+ skip_iiif_validation=args.no_iiif_uri_validation,
129
+ skip_validation=args.skip_validation,
130
+ ignore_duplicate_files_warning=args.ignore_duplicate_files_warning,
131
+ validation_severity=severity,
132
+ skip_ontology_validation=args.skip_ontology_validation,
133
+ do_not_request_resource_metadata_from_db=args.do_not_request_resource_metadata_from_db,
134
+ id2iri_file=id2iri_file,
135
+ ),
136
+ )
137
+
138
+
139
+ def call_validate_data(args: argparse.Namespace) -> bool:
140
+ xml_path = Path(args.xmlfile)
141
+ required_files = [xml_path]
142
+ id2iri_file = args.id2iri_file
143
+ if id2iri_file:
144
+ required_files.append(Path(id2iri_file))
145
+ network_requirements = NetworkRequirements(args.server, always_requires_docker=True)
146
+ path_deps = PathDependencies(required_files)
147
+ check_input_dependencies(path_deps, network_requirements)
148
+
149
+ return validate_data(
150
+ filepath=xml_path,
151
+ creds=get_creds(args),
152
+ save_graphs=args.save_graphs,
153
+ ignore_duplicate_files_warning=args.ignore_duplicate_files_warning,
154
+ skip_ontology_validation=args.skip_ontology_validation,
155
+ id2iri_file=id2iri_file,
156
+ do_not_request_resource_metadata_from_db=args.do_not_request_resource_metadata_from_db,
157
+ )
158
+
159
+
160
+ def call_resume_xmlupload(args: argparse.Namespace) -> bool:
161
+ # this does not need docker if not on localhost, as does not need to validate
162
+ check_input_dependencies(network_dependencies=NetworkRequirements(args.server))
163
+ return resume_xmlupload(
164
+ creds=get_creds(args),
165
+ skip_first_resource=args.skip_first_resource,
166
+ )
167
+
168
+
169
+ def call_get(args: argparse.Namespace) -> bool:
170
+ network_dependencies = NetworkRequirements(args.server)
171
+ path_dependencies = PathDependencies(required_directories=[Path(args.project_definition).parent])
172
+ check_input_dependencies(path_dependencies, network_dependencies)
173
+
174
+ return get_project(
175
+ project_identifier=args.project,
176
+ outfile_path=args.project_definition,
177
+ creds=get_creds(args),
178
+ verbose=args.verbose,
179
+ )
180
+
181
+
182
+ def call_create(args: argparse.Namespace) -> bool:
183
+ network_dependencies = NetworkRequirements(args.server)
184
+ path_dependencies = PathDependencies([Path(args.project_definition)])
185
+ check_input_dependencies(path_dependencies, network_dependencies)
186
+ project_file = Path(args.project_definition)
187
+ creds = get_creds(args)
188
+
189
+ success = False
190
+ match args.lists_only, args.validate_only:
191
+ case True, True:
192
+ success = validate_lists_section_from_project(project_file)
193
+ print("'Lists' section of the JSON project file is syntactically correct and passed validation.")
194
+ case True, False:
195
+ success = create_lists_only(
196
+ project_file=project_file,
197
+ creds=creds,
198
+ )
199
+ case False, True:
200
+ success = validate_project_only(project_file, creds.server)
201
+ case False, False:
202
+ success = create(
203
+ project_file=project_file,
204
+ creds=creds,
205
+ exit_if_exists=args.exit_if_exists,
206
+ )
207
+ return success