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,348 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import warnings
5
+ from collections.abc import Collection
6
+ from dataclasses import dataclass
7
+ from dataclasses import field
8
+ from pathlib import Path
9
+ from typing import Union
10
+ from uuid import uuid4
11
+
12
+ import pandas as pd
13
+ from dotenv import find_dotenv
14
+ from dotenv import load_dotenv
15
+ from loguru import logger
16
+ from lxml import etree
17
+
18
+ from dsp_tools.error.custom_warnings import DspToolsFutureWarning
19
+ from dsp_tools.error.xmllib_warnings import MessageInfo
20
+ from dsp_tools.error.xmllib_warnings_util import emit_xmllib_input_warning
21
+ from dsp_tools.utils.ansi_colors import BOLD_GREEN
22
+ from dsp_tools.utils.ansi_colors import BOLD_RED
23
+ from dsp_tools.utils.ansi_colors import RESET_TO_DEFAULT
24
+ from dsp_tools.utils.xml_parsing.parse_clean_validate_xml import validate_root_emit_user_message
25
+ from dsp_tools.xmllib.internal.constants import DASCH_SCHEMA
26
+ from dsp_tools.xmllib.internal.constants import XML_NAMESPACE_MAP
27
+ from dsp_tools.xmllib.internal.serialise_resource import serialise_resources
28
+ from dsp_tools.xmllib.models.dsp_base_resources import AudioSegmentResource
29
+ from dsp_tools.xmllib.models.dsp_base_resources import LinkResource
30
+ from dsp_tools.xmllib.models.dsp_base_resources import RegionResource
31
+ from dsp_tools.xmllib.models.dsp_base_resources import VideoSegmentResource
32
+ from dsp_tools.xmllib.models.internal.file_values import AuthorshipLookup
33
+ from dsp_tools.xmllib.models.internal.serialise_permissions import XMLPermissions
34
+ from dsp_tools.xmllib.models.permissions import Permissions
35
+ from dsp_tools.xmllib.models.res import Resource
36
+
37
+ type AnyResource = Union[Resource, RegionResource, LinkResource, VideoSegmentResource, AudioSegmentResource]
38
+
39
+ load_dotenv(dotenv_path=find_dotenv(usecwd=True))
40
+
41
+
42
+ @dataclass
43
+ class XMLRoot:
44
+ shortcode: str
45
+ default_ontology: str
46
+ resources: list[AnyResource] = field(default_factory=list)
47
+ _res_id_to_type_lookup: dict[str, list[str]] = field(default_factory=dict)
48
+
49
+ @staticmethod
50
+ def create_new(shortcode: str, default_ontology: str) -> XMLRoot:
51
+ """
52
+ Create a new XML root, for one file.
53
+
54
+ Args:
55
+ shortcode: project shortcode
56
+ default_ontology: name of the default ontology
57
+
58
+ Returns:
59
+ Instance of `XMLRoot`
60
+
61
+ Examples:
62
+ ```python
63
+ root = xmllib.XMLRoot.create_new(
64
+ shortcode="0000",
65
+ default_ontology="onto"
66
+ )
67
+ ```
68
+ """
69
+ return XMLRoot(shortcode=shortcode, default_ontology=default_ontology)
70
+
71
+ def add_resource(self, resource: AnyResource) -> XMLRoot:
72
+ """
73
+ Add one resource to the root.
74
+
75
+ Args:
76
+ resource: any one of:
77
+ `Resource`,
78
+ `RegionResource`,
79
+ `LinkResource`,
80
+ `VideoSegmentResource`,
81
+ `AudioSegmentResource`
82
+
83
+ Returns:
84
+ The original XMLRoot, with the added resource
85
+
86
+ Warning:
87
+ If the ID of the new resource is already used.
88
+
89
+ Examples:
90
+ ```python
91
+ resource = xmllib.Resource.create_new(
92
+ res_id="ID", restype=":ResourceType", label="label"
93
+ )
94
+
95
+ root = root.add_resource(resource)
96
+ ```
97
+ """
98
+ if isinstance(resource, Resource):
99
+ res_type = resource.restype
100
+ else:
101
+ res_type = resource.__class__.__name__
102
+ if types_used := self._res_id_to_type_lookup.get(resource.res_id):
103
+ existing_types = [f"'{x}'" for x in types_used]
104
+ msg = (
105
+ f"The ID for this resource of type '{res_type}' "
106
+ f"is already used by resource(s) of the following type(s): {', '.join(existing_types)}."
107
+ )
108
+ info_msg = MessageInfo(
109
+ message=msg,
110
+ resource_id=resource.res_id,
111
+ field="Resource ID",
112
+ )
113
+ emit_xmllib_input_warning(info_msg)
114
+ self._res_id_to_type_lookup[resource.res_id].append(res_type)
115
+ else:
116
+ self._res_id_to_type_lookup[resource.res_id] = [res_type]
117
+ self.resources.append(resource)
118
+ return self
119
+
120
+ def add_resource_multiple(self, resources: Collection[AnyResource]) -> XMLRoot:
121
+ """
122
+ Add a list of resources to the root.
123
+
124
+ Args:
125
+ resources: a list of:
126
+ `Resource`,
127
+ `RegionResource`,
128
+ `LinkResource`,
129
+ `VideoSegmentResource`,
130
+ `AudioSegmentResource`
131
+ The types of the resources may be mixed.
132
+
133
+ Returns:
134
+ The original XMLRoot, with the added resource
135
+
136
+ Warning:
137
+ If the ID of the new resource is already used.
138
+
139
+ Examples:
140
+ ```python
141
+ resource_1 = xmllib.Resource.create_new(
142
+ res_id="ID_1", restype=":ResourceType", label="label 1"
143
+ )
144
+ resource_2 = xmllib.Resource.create_new(
145
+ res_id="ID_2", restype=":ResourceType", label="label 2"
146
+ )
147
+
148
+ root = root.add_resource_multiple([resource_1, resource_2])
149
+ ```
150
+ """
151
+ for res in resources:
152
+ self.add_resource(res)
153
+ return self
154
+
155
+ def add_resource_optional(self, resource: AnyResource | None) -> XMLRoot:
156
+ """
157
+ If the resource is not None, add it to the XMLRoot, otherwise return the XMLRoot unchanged.
158
+
159
+ Args:
160
+ resource: any one of:
161
+ `Resource`,
162
+ `RegionResource`,
163
+ `LinkResource`,
164
+ `VideoSegmentResource`,
165
+ `AudioSegmentResource`
166
+
167
+ Returns:
168
+ The original XMLRoot, with the added value if it was not empty. Else the unchanged original XMLRoot.
169
+
170
+ Warning:
171
+ If the ID of the new resource is already used.
172
+
173
+ Examples:
174
+ ```python
175
+ resource = xmllib.Resource.create_new(
176
+ res_id="ID", restype=":ResourceType", label="label"
177
+ )
178
+
179
+ root = root.add_resource_optional(resource)
180
+ ```
181
+
182
+ ```python
183
+ root = root.add_resource_optional(None)
184
+ ```
185
+ """
186
+ if resource:
187
+ self.add_resource(resource)
188
+ return self
189
+
190
+ def write_file(self, filepath: str | Path, default_permissions: Permissions | None = None) -> None:
191
+ """
192
+ Write the finished XML to a file.
193
+
194
+ Args:
195
+ filepath: where to save the file
196
+ default_permissions: This parameter is deprecated and has no effect.
197
+ Default permissions can be set in the JSON project file.
198
+
199
+ Warning:
200
+ if the XML is not valid according to the schema
201
+
202
+ Examples:
203
+ ```python
204
+ root.write_file("xml_file_name.xml")
205
+ ```
206
+ """
207
+
208
+ if default_permissions:
209
+ msg = (
210
+ "You added a default permission. This has no effect. This functionality is deprecated, "
211
+ "because project wide default permissions are set in the JSON project file. "
212
+ "This parameter will be removed soon."
213
+ )
214
+ warnings.warn(DspToolsFutureWarning(msg))
215
+
216
+ root = self.serialise()
217
+
218
+ # The logging is only configured when using the CLI entry point.
219
+ # If this is not disabled, then the statements will also be printed out on the terminal.
220
+ logger.disable("dsp_tools")
221
+ validate_root_emit_user_message(root, Path(filepath).parent)
222
+
223
+ etree.indent(root, space=" ")
224
+ xml_string = etree.tostring(
225
+ root,
226
+ encoding="unicode",
227
+ pretty_print=True,
228
+ doctype='<?xml version="1.0" encoding="UTF-8"?>',
229
+ )
230
+ with open(filepath, "w", encoding="utf-8") as f:
231
+ f.write(xml_string)
232
+ print(f"The XML file was successfully saved to {filepath}.")
233
+ if file_path := os.getenv("XMLLIB_WARNINGS_CSV_SAVEPATH"):
234
+ df = pd.read_csv(file_path)
235
+ if len(df) > 0:
236
+ msg = f"{len(df)} warnings occurred, please consult '{file_path}' for details."
237
+ print(BOLD_RED, msg, RESET_TO_DEFAULT)
238
+ else:
239
+ msg = "No warnings occurred during the runtime."
240
+ print(BOLD_GREEN, msg, RESET_TO_DEFAULT)
241
+
242
+ def serialise(self) -> etree._Element:
243
+ """
244
+ Create an `lxml.etree._Element` with the information in the root.
245
+ If you wish to create a file, we recommend using the `write_file` method instead.
246
+
247
+ Returns:
248
+ The `XMLRoot` serialised as XML
249
+ """
250
+ root = self._make_root()
251
+ root.extend(self._get_permissions())
252
+ author_lookup = _make_authorship_lookup(self.resources)
253
+ authorship = _serialise_authorship(author_lookup.lookup)
254
+ root.extend(authorship)
255
+ serialised_resources = serialise_resources(self.resources, author_lookup)
256
+ root.extend(serialised_resources)
257
+ return root
258
+
259
+ def _get_permissions(self) -> list[etree._Element]:
260
+ contains_old_permissions, contains_new_permissions = self._find_permission_types()
261
+ if contains_old_permissions:
262
+ msg = (
263
+ "Your data contains old permissions. Please migrate to the new ones:\n"
264
+ " - Permissions.OPEN -> use Permissions.PUBLIC instead\n"
265
+ " - Permissions.RESTRICTED -> use Permissions.PRIVATE instead\n"
266
+ " - Permissions.RESTRICTED_VIEW -> use Permissions.LIMITED_VIEW instead\n"
267
+ )
268
+ warnings.warn(msg, category=DspToolsFutureWarning)
269
+ return XMLPermissions().serialise(contains_old_permissions, contains_new_permissions)
270
+
271
+ def _find_permission_types(self) -> tuple[bool, bool]:
272
+ contains_old_permissions = False
273
+ contains_new_permissions = False
274
+ for res in self.resources:
275
+ if self._is_old(res.permissions):
276
+ contains_old_permissions = True
277
+ elif self._is_new(res.permissions):
278
+ contains_new_permissions = True
279
+ for val in res.values:
280
+ if self._is_old(val.permissions):
281
+ contains_old_permissions = True
282
+ elif self._is_new(val.permissions):
283
+ contains_new_permissions = True
284
+ if isinstance(res, Resource):
285
+ if res.file_value:
286
+ if self._is_old(res.file_value.metadata.permissions):
287
+ contains_old_permissions = True
288
+ elif self._is_new(res.file_value.metadata.permissions):
289
+ contains_new_permissions = True
290
+ if contains_old_permissions and contains_new_permissions:
291
+ # no need to continue, the end result won't change any more
292
+ return True, True
293
+ return contains_old_permissions, contains_new_permissions
294
+
295
+ def _is_old(self, perm: Permissions) -> bool:
296
+ return perm in [Permissions.OPEN, Permissions.RESTRICTED_VIEW, Permissions.RESTRICTED]
297
+
298
+ def _is_new(self, perm: Permissions) -> bool:
299
+ return perm in [Permissions.PUBLIC, Permissions.LIMITED_VIEW, Permissions.PRIVATE]
300
+
301
+ def _make_root(self) -> etree._Element:
302
+ schema_url = (
303
+ "https://raw.githubusercontent.com/dasch-swiss/dsp-tools/main/src/dsp_tools/resources/schema/data.xsd"
304
+ )
305
+ schema_location_key = str(etree.QName("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation"))
306
+ schema_location_value = f"https://dasch.swiss/schema {schema_url}"
307
+ return etree.Element(
308
+ f"{DASCH_SCHEMA}knora",
309
+ attrib={
310
+ schema_location_key: schema_location_value,
311
+ "shortcode": self.shortcode,
312
+ "default-ontology": self.default_ontology,
313
+ },
314
+ nsmap=XML_NAMESPACE_MAP,
315
+ )
316
+
317
+
318
+ def _make_authorship_lookup(resources: list[AnyResource]) -> AuthorshipLookup:
319
+ filtered_resources = [x for x in resources if isinstance(x, Resource)]
320
+ file_vals = [x.file_value for x in filtered_resources if x.file_value]
321
+ authors = {x.metadata.authorship for x in file_vals if x.metadata.authorship}
322
+ sorted_authors = sorted(authors)
323
+ env_var = str(os.getenv("XMLLIB_AUTHORSHIP_ID_WITH_INTEGERS")).lower()
324
+ if env_var == "true":
325
+ auth_nums: list[int | str] = list(range(1, len(sorted_authors) + 1))
326
+ else:
327
+ auth_nums = [str(uuid4()) for _ in range(len(sorted_authors))]
328
+ auth_ids = [f"authorship_{x}" for x in auth_nums]
329
+ lookup = dict(zip(sorted_authors, auth_ids))
330
+ return AuthorshipLookup(lookup)
331
+
332
+
333
+ def _serialise_authorship(authorship_lookup: dict[tuple[str, ...], str]) -> list[etree._Element]:
334
+ to_serialise = [(auth, id_) for auth, id_ in authorship_lookup.items()]
335
+ to_serialise = sorted(to_serialise, key=lambda x: x[0])
336
+ return [_make_one_authorship_element(auth, id_) for auth, id_ in to_serialise]
337
+
338
+
339
+ def _make_one_authorship_element(authors: tuple[str, ...], author_id: str) -> etree._Element:
340
+ def _make_one_author(author: str) -> etree._Element:
341
+ ele = etree.Element(f"{DASCH_SCHEMA}author", nsmap=XML_NAMESPACE_MAP)
342
+ ele.text = author
343
+ return ele
344
+
345
+ authorship_ele = etree.Element(f"{DASCH_SCHEMA}authorship", attrib={"id": author_id}, nsmap=XML_NAMESPACE_MAP)
346
+ all_authors = [_make_one_author(x) for x in authors]
347
+ authorship_ele.extend(all_authors)
348
+ return authorship_ele