pyegeria 5.4.0.28__py3-none-any.whl → 5.5.3.3__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.

Potentially problematic release.


This version of pyegeria might be problematic. Click here for more details.

Files changed (433) hide show
  1. commands/__init__.py +24 -0
  2. commands/cat/Dr-Egeria_md-orig.py +2 -2
  3. commands/cat/collection_actions.py +197 -0
  4. commands/cat/dr_egeria_command_help.py +137 -38
  5. commands/cat/dr_egeria_jupyter.py +7 -7
  6. commands/cat/dr_egeria_md.py +10 -267
  7. commands/cat/exp_list_glossaries.py +11 -14
  8. commands/cat/get_asset_graph.py +37 -267
  9. commands/cat/{get_collection.py → get_collection_tree.py} +10 -18
  10. commands/cat/get_project_dependencies.py +14 -14
  11. commands/cat/get_project_structure.py +15 -14
  12. commands/cat/get_tech_type_elements.py +16 -116
  13. commands/cat/glossary_actions.py +145 -298
  14. commands/cat/list_assets.py +3 -11
  15. commands/cat/list_cert_types.py +17 -63
  16. commands/cat/list_collections.py +17 -139
  17. commands/cat/list_deployed_catalogs.py +15 -27
  18. commands/cat/list_deployed_database_schemas.py +27 -43
  19. commands/cat/list_deployed_databases.py +16 -31
  20. commands/cat/list_deployed_servers.py +35 -54
  21. commands/cat/list_glossaries.py +18 -17
  22. commands/cat/list_projects.py +10 -12
  23. commands/cat/list_tech_type_elements.py +21 -37
  24. commands/cat/list_tech_types.py +13 -25
  25. commands/cat/list_terms.py +38 -79
  26. commands/cat/list_todos.py +4 -11
  27. commands/cat/list_user_ids.py +3 -10
  28. commands/cat/my_reports.py +559 -0
  29. commands/cat/run_report.py +394 -0
  30. commands/cat/{list_format_set.py → run_report_orig.py} +136 -44
  31. commands/cli/egeria.py +182 -219
  32. commands/cli/egeria_cat.py +32 -59
  33. commands/cli/egeria_my.py +13 -0
  34. commands/cli/egeria_ops.py +69 -74
  35. commands/cli/egeria_tech.py +17 -93
  36. commands/{cat → deprecated}/list_data_designer.py +2 -4
  37. commands/{cat → deprecated}/list_data_structures_full.py +3 -6
  38. commands/deprecated/old_get_asset_graph.py +315 -0
  39. commands/my/__init__.py +0 -2
  40. commands/my/list_my_profile.py +27 -34
  41. commands/my/list_my_roles.py +1 -7
  42. commands/my/monitor_my_todos.py +1 -7
  43. commands/my/monitor_open_todos.py +6 -7
  44. commands/my/todo_actions.py +4 -5
  45. commands/ops/__init__.py +0 -2
  46. commands/ops/gov_server_actions.py +17 -21
  47. commands/ops/list_archives.py +17 -38
  48. commands/ops/list_catalog_targets.py +33 -40
  49. commands/ops/load_archive.py +14 -11
  50. commands/ops/{monitor_engine_activity_c.py → monitor_active_engine_activity.py} +51 -82
  51. commands/ops/{monitor_integ_daemon_status.py → monitor_daemon_status.py} +35 -55
  52. commands/ops/monitor_engine_activity.py +79 -77
  53. commands/ops/{monitor_gov_eng_status.py → monitor_engine_status.py} +10 -7
  54. commands/ops/monitor_platform_status.py +38 -50
  55. commands/ops/monitor_server_startup.py +6 -11
  56. commands/ops/monitor_server_status.py +7 -11
  57. commands/ops/orig_monitor_server_list.py +8 -8
  58. commands/ops/orig_monitor_server_status.py +1 -5
  59. commands/ops/refresh_integration_daemon.py +5 -5
  60. commands/ops/restart_integration_daemon.py +5 -5
  61. commands/ops/table_integ_daemon_status.py +6 -6
  62. commands/ops/x_engine_actions.py +7 -7
  63. commands/tech/__init__.py +0 -2
  64. commands/tech/{generic_actions.py → element_actions.py} +6 -11
  65. commands/tech/get_element_info.py +20 -29
  66. commands/tech/get_guid_info.py +23 -42
  67. commands/tech/get_tech_details.py +20 -35
  68. commands/tech/get_tech_type_template.py +28 -39
  69. commands/tech/list_all_om_type_elements.py +24 -30
  70. commands/tech/list_all_om_type_elements_x.py +22 -28
  71. commands/tech/list_all_related_elements.py +19 -28
  72. commands/tech/list_anchored_elements.py +22 -30
  73. commands/tech/list_asset_types.py +19 -24
  74. commands/tech/list_elements_by_classification_by_property_value.py +26 -32
  75. commands/tech/list_elements_by_property_value.py +19 -25
  76. commands/tech/list_elements_by_property_value_x.py +20 -28
  77. commands/tech/list_elements_for_classification.py +28 -41
  78. commands/tech/list_gov_action_processes.py +16 -27
  79. commands/tech/list_information_supply_chains.py +22 -30
  80. commands/tech/list_registered_services.py +14 -26
  81. commands/tech/list_related_elements_with_prop_value.py +15 -25
  82. commands/tech/list_related_specification.py +1 -4
  83. commands/tech/list_relationship_types.py +15 -25
  84. commands/tech/list_relationships.py +20 -36
  85. commands/tech/list_solution_blueprints.py +28 -33
  86. commands/tech/list_solution_components.py +23 -29
  87. commands/tech/list_solution_roles.py +21 -32
  88. commands/tech/list_tech_templates.py +51 -54
  89. commands/tech/list_valid_metadata_values.py +5 -9
  90. commands/tech/table_tech_templates.py +2 -6
  91. commands/tech/x_list_related_elements.py +1 -4
  92. examples/GeoSpatial Products Example.py +524 -0
  93. examples/Jupyter Notebooks/P-egeria-server-config.ipynb +2137 -0
  94. examples/Jupyter Notebooks/README.md +2 -0
  95. examples/Jupyter Notebooks/common/P-environment-check.ipynb +115 -0
  96. examples/Jupyter Notebooks/common/__init__.py +14 -0
  97. examples/Jupyter Notebooks/common/common-functions.ipynb +4694 -0
  98. examples/Jupyter Notebooks/common/environment-check.ipynb +52 -0
  99. examples/Jupyter Notebooks/common/globals.ipynb +184 -0
  100. examples/Jupyter Notebooks/common/globals.py +154 -0
  101. examples/Jupyter Notebooks/common/orig_globals.py +152 -0
  102. examples/format_sets/all_format_sets.json +910 -0
  103. examples/format_sets/custom_format_sets.json +268 -0
  104. examples/format_sets/subset_format_sets.json +187 -0
  105. examples/format_sets_save_load_example.py +291 -0
  106. examples/jacquard_data_sets.py +129 -0
  107. examples/output_formats_example.py +193 -0
  108. examples/test_jacquard_data_sets.py +54 -0
  109. examples/test_jacquard_data_sets_scenarios.py +94 -0
  110. md_processing/__init__.py +33 -24
  111. md_processing/command_dispatcher.py +33 -0
  112. md_processing/command_mapping.py +221 -0
  113. md_processing/data/commands/commands_data_designer.json +537 -0
  114. md_processing/data/commands/commands_external_reference.json +733 -0
  115. md_processing/data/commands/commands_feedback.json +155 -0
  116. md_processing/data/commands/commands_general.json +204 -0
  117. md_processing/data/commands/commands_glossary.json +218 -0
  118. md_processing/data/commands/commands_governance.json +3678 -0
  119. md_processing/data/commands/commands_product_manager.json +865 -0
  120. md_processing/data/commands/commands_project.json +642 -0
  121. md_processing/data/commands/commands_solution_architect.json +366 -0
  122. md_processing/data/commands.json +6489 -30060
  123. md_processing/data/{commands-working.json → commands_working.json} +9304 -13513
  124. md_processing/data/gened_report_specs.py +6584 -0
  125. md_processing/data/generated_format_sets.json +6533 -0
  126. md_processing/data/generated_format_sets_old.json +4137 -0
  127. md_processing/data/generated_format_sets_old.py +45 -0
  128. md_processing/dr_egeria.py +182 -0
  129. md_processing/md_commands/data_designer_commands.py +195 -583
  130. md_processing/md_commands/ext_ref_commands.py +530 -0
  131. md_processing/md_commands/feedback_commands.py +726 -0
  132. md_processing/md_commands/glossary_commands.py +106 -490
  133. md_processing/md_commands/governance_officer_commands.py +129 -18
  134. md_processing/md_commands/product_manager_commands.py +362 -115
  135. md_processing/md_commands/project_commands.py +351 -134
  136. md_processing/md_commands/solution_architect_commands.py +276 -232
  137. md_processing/md_commands/view_commands.py +295 -0
  138. md_processing/md_processing_utils/common_md_proc_utils.py +258 -166
  139. md_processing/md_processing_utils/common_md_utils.py +138 -43
  140. md_processing/md_processing_utils/determine_width.py +103 -0
  141. md_processing/md_processing_utils/extraction_utils.py +100 -39
  142. md_processing/md_processing_utils/gen_report_specs.py +643 -0
  143. md_processing/md_processing_utils/generate_dr_help.py +61 -33
  144. md_processing/md_processing_utils/generate_md_cmd_templates.py +20 -19
  145. md_processing/md_processing_utils/generate_md_templates.py +3 -12
  146. md_processing/md_processing_utils/md_processing_constants.py +1053 -72
  147. pyegeria/__init__.py +203 -158
  148. pyegeria/core/__init__.py +40 -0
  149. pyegeria/core/_base_platform_client.py +574 -0
  150. pyegeria/core/_base_server_client.py +573 -0
  151. pyegeria/{_exceptions_new.py → core/_exceptions.py} +62 -30
  152. pyegeria/{_globals.py → core/_globals.py} +14 -3
  153. pyegeria/core/_server_client.py +6073 -0
  154. pyegeria/{_validators.py → core/_validators.py} +7 -8
  155. pyegeria/core/config.py +654 -0
  156. pyegeria/{create_tech_guid_lists.py → core/create_tech_guid_lists.py} +0 -1
  157. pyegeria/core/load_config.py +37 -0
  158. pyegeria/{logging_configuration.py → core/logging_configuration.py} +1 -1
  159. pyegeria/core/mcp_adapter.py +144 -0
  160. pyegeria/core/mcp_server.py +212 -0
  161. pyegeria/core/utils.py +405 -0
  162. pyegeria/{_client.py → deprecated/_client.py} +24 -25
  163. pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
  164. pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1987 -1877
  165. pyegeria/{output_formatter.py → deprecated/output_formatter_with_machine_keys.py} +298 -45
  166. pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +155 -171
  167. pyegeria/{valid_metadata_omvs.py → deprecated/valid_metadata_omvs.py} +93 -93
  168. pyegeria/{x_action_author_omvs.py → deprecated/x_action_author_omvs.py} +2 -3
  169. pyegeria/egeria_cat_client.py +26 -70
  170. pyegeria/egeria_client.py +130 -93
  171. pyegeria/egeria_config_client.py +40 -46
  172. pyegeria/egeria_tech_client.py +141 -54
  173. pyegeria/models/__init__.py +150 -0
  174. pyegeria/{models.py → models/models.py} +156 -20
  175. pyegeria/omvs/__init__.py +84 -0
  176. pyegeria/omvs/action_author.py +342 -0
  177. pyegeria/omvs/actor_manager.py +5980 -0
  178. pyegeria/omvs/asset_catalog.py +842 -0
  179. pyegeria/omvs/asset_maker.py +2736 -0
  180. pyegeria/omvs/automated_curation.py +4403 -0
  181. pyegeria/omvs/classification_manager.py +11213 -0
  182. pyegeria/{collection_manager.py → omvs/collection_manager.py} +1334 -1160
  183. pyegeria/omvs/community_matters_omvs.py +468 -0
  184. pyegeria/{core_omag_server_config.py → omvs/core_omag_server_config.py} +157 -157
  185. pyegeria/{data_designer.py → omvs/data_designer.py} +1115 -660
  186. pyegeria/omvs/data_discovery.py +869 -0
  187. pyegeria/omvs/data_engineer.py +372 -0
  188. pyegeria/omvs/digital_business.py +1133 -0
  189. pyegeria/omvs/external_links.py +1752 -0
  190. pyegeria/omvs/feedback_manager.py +834 -0
  191. pyegeria/{full_omag_server_config.py → omvs/full_omag_server_config.py} +73 -69
  192. pyegeria/{glossary_manager.py → omvs/glossary_manager.py} +857 -519
  193. pyegeria/{governance_officer.py → omvs/governance_officer.py} +964 -468
  194. pyegeria/omvs/lineage_linker.py +314 -0
  195. pyegeria/omvs/location_arena.py +1525 -0
  196. pyegeria/omvs/metadata_expert.py +668 -0
  197. pyegeria/omvs/metadata_explorer_omvs.py +2943 -0
  198. pyegeria/omvs/my_profile.py +1042 -0
  199. pyegeria/omvs/notification_manager.py +358 -0
  200. pyegeria/omvs/people_organizer.py +394 -0
  201. pyegeria/{platform_services.py → omvs/platform_services.py} +113 -193
  202. pyegeria/omvs/product_manager.py +1825 -0
  203. pyegeria/omvs/project_manager.py +1907 -0
  204. pyegeria/omvs/reference_data.py +1140 -0
  205. pyegeria/omvs/registered_info.py +334 -0
  206. pyegeria/omvs/runtime_manager.py +2817 -0
  207. pyegeria/omvs/schema_maker.py +446 -0
  208. pyegeria/{server_operations.py → omvs/server_operations.py} +27 -26
  209. pyegeria/{solution_architect_omvs.py → omvs/solution_architect.py} +1886 -1505
  210. pyegeria/omvs/specification_properties.py +37 -0
  211. pyegeria/omvs/subject_area.py +1042 -0
  212. pyegeria/omvs/template_manager_omvs.py +236 -0
  213. pyegeria/omvs/time_keeper.py +1761 -0
  214. pyegeria/omvs/valid_metadata.py +3221 -0
  215. pyegeria/omvs/valid_metadata_lists.py +37 -0
  216. pyegeria/omvs/valid_type_lists.py +37 -0
  217. pyegeria/view/__init__.py +28 -0
  218. pyegeria/{_output_format_models.py → view/_output_format_models.py} +160 -24
  219. pyegeria/view/_output_formats.py +14 -0
  220. pyegeria/view/base_report_formats.py +2719 -0
  221. pyegeria/view/dr_egeria_reports.py +56 -0
  222. pyegeria/view/format_set_executor.py +397 -0
  223. pyegeria/{md_processing_utils.py → view/md_processing_utils.py} +5 -5
  224. pyegeria/{mermaid_utilities.py → view/mermaid_utilities.py} +2 -154
  225. pyegeria/view/output_formatter.py +1297 -0
  226. pyegeria-5.5.3.3.dist-info/METADATA +218 -0
  227. pyegeria-5.5.3.3.dist-info/RECORD +241 -0
  228. {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info}/WHEEL +2 -1
  229. pyegeria-5.5.3.3.dist-info/entry_points.txt +103 -0
  230. pyegeria-5.5.3.3.dist-info/top_level.txt +4 -0
  231. commands/cat/.DS_Store +0 -0
  232. commands/cat/.env +0 -8
  233. commands/cat/README.md +0 -16
  234. commands/cat/debug_log +0 -1126
  235. commands/cat/debug_log.2025-08-18_11-34-38_088636.zip +0 -0
  236. commands/cat/list_categories.py +0 -192
  237. commands/cat/logs/pyegeria.log +0 -4
  238. commands/cli/debug_log +0 -0
  239. commands/cli/debug_log.log +0 -0
  240. commands/cli/txt_custom_v2.tcss +0 -19
  241. commands/my/README.md +0 -17
  242. commands/ops/README.md +0 -24
  243. commands/ops/logs/pyegeria.log +0 -0
  244. commands/ops/monitor_asset_events.py +0 -108
  245. commands/tech/README.md +0 -24
  246. md_processing/.DS_Store +0 -0
  247. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-30-37.md +0 -163
  248. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-35-58.md +0 -474
  249. md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +0 -8
  250. md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +0 -873
  251. md_processing/dr_egeria_inbox/arch_test.md +0 -57
  252. md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +0 -254
  253. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +0 -696
  254. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +0 -254
  255. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +0 -298
  256. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +0 -608
  257. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +0 -94
  258. md_processing/dr_egeria_inbox/archive/freddie_intro.md +0 -284
  259. md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +0 -275
  260. md_processing/dr_egeria_inbox/archive/test-term.md +0 -110
  261. md_processing/dr_egeria_inbox/cat_test.md +0 -100
  262. md_processing/dr_egeria_inbox/collections.md +0 -39
  263. md_processing/dr_egeria_inbox/data_designer_debug.log +0 -6
  264. md_processing/dr_egeria_inbox/data_designer_out.md +0 -60
  265. md_processing/dr_egeria_inbox/data_designer_search_test.md +0 -11
  266. md_processing/dr_egeria_inbox/data_field.md +0 -54
  267. md_processing/dr_egeria_inbox/data_spec.md +0 -77
  268. md_processing/dr_egeria_inbox/data_spec_test.md +0 -2406
  269. md_processing/dr_egeria_inbox/data_test.md +0 -179
  270. md_processing/dr_egeria_inbox/data_test2.md +0 -429
  271. md_processing/dr_egeria_inbox/data_test3.md +0 -462
  272. md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +0 -124
  273. md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +0 -168
  274. md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +0 -280
  275. md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +0 -318
  276. md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +0 -1073
  277. md_processing/dr_egeria_inbox/dr_egeria_isc1.md +0 -44
  278. md_processing/dr_egeria_inbox/generated_help_report.md +0 -9
  279. md_processing/dr_egeria_inbox/glossary_creation_experiment.ipynb +0 -341
  280. md_processing/dr_egeria_inbox/glossary_list.md +0 -5
  281. md_processing/dr_egeria_inbox/glossary_search_test.md +0 -40
  282. md_processing/dr_egeria_inbox/glossary_test1.md +0 -324
  283. md_processing/dr_egeria_inbox/gov_def.md +0 -482
  284. md_processing/dr_egeria_inbox/gov_def2.md +0 -447
  285. md_processing/dr_egeria_inbox/img.png +0 -0
  286. md_processing/dr_egeria_inbox/product.md +0 -211
  287. md_processing/dr_egeria_inbox/rel.md +0 -8
  288. md_processing/dr_egeria_inbox/sb.md +0 -119
  289. md_processing/dr_egeria_inbox/solution-components.md +0 -136
  290. md_processing/dr_egeria_inbox/solution_blueprints.md +0 -118
  291. md_processing/dr_egeria_inbox/synonym_test.md +0 -42
  292. md_processing/dr_egeria_inbox/t2.md +0 -268
  293. md_processing/dr_egeria_outbox/.obsidian/app.json +0 -1
  294. md_processing/dr_egeria_outbox/.obsidian/appearance.json +0 -1
  295. md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +0 -6
  296. md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +0 -31
  297. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +0 -10
  298. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +0 -4459
  299. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +0 -10
  300. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +0 -3
  301. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +0 -153
  302. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +0 -11
  303. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +0 -1
  304. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +0 -500
  305. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +0 -12
  306. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +0 -1
  307. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +0 -37
  308. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +0 -11
  309. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +0 -220
  310. md_processing/dr_egeria_outbox/.obsidian/types.json +0 -28
  311. md_processing/dr_egeria_outbox/.obsidian/workspace.json +0 -220
  312. md_processing/dr_egeria_outbox/Untitled.canvas +0 -1
  313. md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:22-dr_egeria_intro_part1.md +0 -312
  314. md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:23-dr_egeria_intro_part1.md +0 -265
  315. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:06-dr_egeria_intro_part1.md +0 -230
  316. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:30-dr_egeria_intro_part1.md +0 -296
  317. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:31-dr_egeria_intro_part1.md +0 -253
  318. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:08-dr_egeria_intro_part2.md +0 -343
  319. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:12-dr_egeria_intro_part2.md +0 -343
  320. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:05-product.md +0 -426
  321. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:56-product.md +0 -212
  322. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 09:43-product.md +0 -201
  323. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 14:55-product.md +0 -77
  324. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:05-product.md +0 -75
  325. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:11-product.md +0 -74
  326. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 20:40-collections.md +0 -49
  327. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +0 -719
  328. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +0 -41
  329. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +0 -33
  330. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +0 -192
  331. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +0 -486
  332. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +0 -486
  333. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +0 -486
  334. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +0 -486
  335. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +0 -486
  336. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +0 -486
  337. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +0 -486
  338. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-16 19:15-gov_def2.md +0 -527
  339. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 12:08-gov_def2.md +0 -527
  340. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 14:27-gov_def2.md +0 -485
  341. md_processing/dr_egeria_outbox/tuesday/processed-2025-08-19 10:55-product.md +0 -209
  342. md_processing/family_docs/Data Designer/Create_Data_Class.md +0 -164
  343. md_processing/family_docs/Data Designer/Create_Data_Dictionary.md +0 -30
  344. md_processing/family_docs/Data Designer/Create_Data_Field.md +0 -162
  345. md_processing/family_docs/Data Designer/Create_Data_Specification.md +0 -36
  346. md_processing/family_docs/Data Designer/Create_Data_Structure.md +0 -38
  347. md_processing/family_docs/Data Designer/View_Data_Classes.md +0 -78
  348. md_processing/family_docs/Data Designer/View_Data_Dictionaries.md +0 -78
  349. md_processing/family_docs/Data Designer/View_Data_Fields.md +0 -78
  350. md_processing/family_docs/Data Designer/View_Data_Specifications.md +0 -78
  351. md_processing/family_docs/Data Designer/View_Data_Structures.md +0 -78
  352. md_processing/family_docs/Data Designer.md +0 -842
  353. md_processing/family_docs/Digital Product Manager/Add_Member->Collection.md +0 -42
  354. md_processing/family_docs/Digital Product Manager/Attach_Collection->Resource.md +0 -36
  355. md_processing/family_docs/Digital Product Manager/Create_Agreement.md +0 -96
  356. md_processing/family_docs/Digital Product Manager/Create_Data_Sharing_Agreement.md +0 -72
  357. md_processing/family_docs/Digital Product Manager/Create_DigitalSubscription.md +0 -102
  358. md_processing/family_docs/Digital Product Manager/Create_Digital_Product.md +0 -134
  359. md_processing/family_docs/Digital Product Manager/Link_Agreement_Items.md +0 -60
  360. md_processing/family_docs/Digital Product Manager/Link_Contracts.md +0 -26
  361. md_processing/family_docs/Digital Product Manager/Link_Digital_Product_-_Digital_Product.md +0 -30
  362. md_processing/family_docs/Digital Product Manager/Link_Subscribers.md +0 -48
  363. md_processing/family_docs/Digital Product Manager.md +0 -668
  364. md_processing/family_docs/Glossary/Attach_Category_Parent.md +0 -18
  365. md_processing/family_docs/Glossary/Attach_Term-Term_Relationship.md +0 -26
  366. md_processing/family_docs/Glossary/Create_Category.md +0 -38
  367. md_processing/family_docs/Glossary/Create_Glossary.md +0 -42
  368. md_processing/family_docs/Glossary/Create_Term.md +0 -70
  369. md_processing/family_docs/Glossary.md +0 -206
  370. md_processing/family_docs/Governance Officer/Create_Business_Imperative.md +0 -106
  371. md_processing/family_docs/Governance Officer/Create_Certification_Type.md +0 -112
  372. md_processing/family_docs/Governance Officer/Create_Governance_Approach.md +0 -114
  373. md_processing/family_docs/Governance Officer/Create_Governance_Obligation.md +0 -114
  374. md_processing/family_docs/Governance Officer/Create_Governance_Principle.md +0 -114
  375. md_processing/family_docs/Governance Officer/Create_Governance_Procedure.md +0 -128
  376. md_processing/family_docs/Governance Officer/Create_Governance_Process.md +0 -122
  377. md_processing/family_docs/Governance Officer/Create_Governance_Processing_Purpose.md +0 -106
  378. md_processing/family_docs/Governance Officer/Create_Governance_Responsibility.md +0 -122
  379. md_processing/family_docs/Governance Officer/Create_Governance_Rule.md +0 -122
  380. md_processing/family_docs/Governance Officer/Create_Governance_Strategy.md +0 -106
  381. md_processing/family_docs/Governance Officer/Create_License_Type.md +0 -112
  382. md_processing/family_docs/Governance Officer/Create_Naming_Standard_Rule.md +0 -122
  383. md_processing/family_docs/Governance Officer/Create_Regulation_Article.md +0 -106
  384. md_processing/family_docs/Governance Officer/Create_Regulation_Definition.md +0 -118
  385. md_processing/family_docs/Governance Officer/Create_Security_Access_Control.md +0 -114
  386. md_processing/family_docs/Governance Officer/Create_Security_Group.md +0 -120
  387. md_processing/family_docs/Governance Officer/Create_Service_Level_Objectives.md +0 -122
  388. md_processing/family_docs/Governance Officer/Create_Threat_Definition.md +0 -106
  389. md_processing/family_docs/Governance Officer/Link_Governance_Controls.md +0 -32
  390. md_processing/family_docs/Governance Officer/Link_Governance_Drivers.md +0 -32
  391. md_processing/family_docs/Governance Officer/Link_Governance_Policies.md +0 -32
  392. md_processing/family_docs/Governance Officer/View_Governance_Definitions.md +0 -82
  393. md_processing/family_docs/Governance Officer.md +0 -2412
  394. md_processing/family_docs/Solution Architect/Create_Information_Supply_Chain.md +0 -70
  395. md_processing/family_docs/Solution Architect/Create_Solution_Blueprint.md +0 -44
  396. md_processing/family_docs/Solution Architect/Create_Solution_Component.md +0 -96
  397. md_processing/family_docs/Solution Architect/Create_Solution_Role.md +0 -66
  398. md_processing/family_docs/Solution Architect/Link_Information_Supply_Chain_Peers.md +0 -32
  399. md_processing/family_docs/Solution Architect/Link_Solution_Component_Peers.md +0 -32
  400. md_processing/family_docs/Solution Architect/View_Information_Supply_Chains.md +0 -32
  401. md_processing/family_docs/Solution Architect/View_Solution_Blueprints.md +0 -32
  402. md_processing/family_docs/Solution Architect/View_Solution_Components.md +0 -32
  403. md_processing/family_docs/Solution Architect/View_Solution_Roles.md +0 -32
  404. md_processing/family_docs/Solution Architect.md +0 -490
  405. md_processing/md_processing_utils/debug_log +0 -574
  406. md_processing/md_processing_utils/debug_log.log +0 -0
  407. md_processing/md_processing_utils/dr-egeria-help-2025-07-17T17:22:09.md +0 -2065
  408. md_processing/md_processing_utils/generated_help_terms.md +0 -842
  409. pyegeria/.DS_Store +0 -0
  410. pyegeria/README.md +0 -35
  411. pyegeria/_client_new.py +0 -1102
  412. pyegeria/_output_formats.py +0 -730
  413. pyegeria/asset_catalog_omvs.py +0 -864
  414. pyegeria/automated_curation_omvs.py +0 -3765
  415. pyegeria/config.py +0 -523
  416. pyegeria/egeria_my_client.py +0 -91
  417. pyegeria/feedback_manager_omvs.py +0 -4573
  418. pyegeria/load_config_orig.py +0 -218
  419. pyegeria/md_processing_helpers.py +0 -58
  420. pyegeria/md_processing_utils_orig.py +0 -1103
  421. pyegeria/metadata_explorer_omvs.py +0 -2326
  422. pyegeria/my_profile_omvs.py +0 -1022
  423. pyegeria/project_manager.py +0 -1591
  424. pyegeria/registered_info.py +0 -167
  425. pyegeria/template_manager_omvs.py +0 -1414
  426. pyegeria/utils.py +0 -256
  427. pyegeria-5.4.0.28.dist-info/METADATA +0 -77
  428. pyegeria-5.4.0.28.dist-info/RECORD +0 -343
  429. pyegeria-5.4.0.28.dist-info/entry_points.txt +0 -105
  430. /commands/cat/debug_log.log → /pyegeria/deprecated/__init__.py +0 -0
  431. /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
  432. /pyegeria/{collection_models.py → models/collection_models.py} +0 -0
  433. {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info/licenses}/LICENSE +0 -0
pyegeria/_client_new.py DELETED
@@ -1,1102 +0,0 @@
1
- """
2
- SPDX-License-Identifier: Apache-2.0
3
- Copyright Contributors to the ODPi Egeria project.
4
-
5
- This is a simple class to create and manage a connection to an Egeria backend. It is the Superclass for the
6
- different client capabilities. It also provides the common methods used to make restful self.session to Egeria.
7
-
8
- """
9
-
10
- import asyncio
11
- import inspect
12
- import json
13
- import os
14
- import re
15
- from collections.abc import Callable
16
- from typing import Any
17
-
18
- import httpcore
19
- import httpx
20
- from httpx import AsyncClient, Response, HTTPStatusError
21
- # from venv import logger
22
- from loguru import logger
23
- from pydantic import TypeAdapter
24
-
25
- from pyegeria._exceptions_new import (
26
- PyegeriaAPIException, PyegeriaConnectionException, PyegeriaInvalidParameterException,
27
- PyegeriaUnknownException, PyegeriaClientException
28
- )
29
- from pyegeria._globals import enable_ssl_check, max_paging_size, NO_ELEMENTS_FOUND
30
- from pyegeria._validators import (
31
- validate_name,
32
- validate_server_name,
33
- validate_url,
34
- validate_user_id,
35
- )
36
- from pyegeria.models import SearchStringRequestBody, FilterRequestBody, GetRequestBody, NewElementRequestBody, \
37
- TemplateRequestBody, UpdateStatusRequestBody, UpdateElementRequestBody, NewRelationshipRequestBody, \
38
- DeleteRequestBody, UpdateRelationshipRequestBody, ResultsRequestBody, NewClassificationRequestBody
39
- from pyegeria.utils import body_slimmer
40
-
41
- ...
42
-
43
-
44
- class Client2:
45
- """
46
- An abstract class used to establish connectivity for an Egeria Client
47
- for a particular server, platform and user.
48
-
49
- Attributes
50
- ----------
51
- server_name : str (required)
52
- Name of the OMAG server to use
53
- platform_url : str (required)
54
- URL of the server platform to connect to
55
- user_id : str
56
- The identity of the user calling the method - this sets a default optionally used by the methods
57
- when the user doesn't pass the user_id on a method call.
58
- user_pwd : str
59
- The password used to authenticate the server identity
60
-
61
- Methods
62
- -------
63
- create_egeria_bearer_token(user_Id: str, password: str = None) -> str
64
- Create a bearer token using the simple Egeria token service - store the bearer token in the object instance.
65
-
66
- refresh_egeria_bearer_token()-> None
67
- Refresh the bearer token using the attributes of the object instance.
68
-
69
- set_bearer_token(token: str) -> None
70
- Set the bearer token attribute in the object instance - used when the token is generated
71
- by an external service.
72
-
73
- get_token() -> str
74
- Retrieve the bearer token.
75
-
76
- make_request(request_type: str, endpoint: str, payload: str | dict = None,
77
- time_out: int = 30) -> Response
78
- Make an HTTP Restful request and handle potential errors and exceptions.
79
-
80
- """
81
-
82
- json_header = {"Content-Type": "application/json"}
83
-
84
- def __init__(
85
- self,
86
- server_name: str,
87
- platform_url: str,
88
- user_id: str = None,
89
- user_pwd: str = None,
90
- token: str = None,
91
- token_src: str = None,
92
- api_key: str = None,
93
- page_size: int = max_paging_size,
94
- ):
95
- self.server_name = validate_server_name(server_name)
96
- self.platform_url = validate_url(platform_url)
97
- self.user_id = user_id
98
- self.user_pwd = user_pwd
99
- self.page_size = page_size
100
- self.token_src = token_src
101
- self.token = token
102
- self.exc_type = None
103
- self.exc_value = None
104
- self.exc_tb = None
105
-
106
- #
107
- # I'm commenting this out since you should only have to use tokens if you want - just have to
108
- # create or set the token with the appropriate methods as desired.
109
- # if token is None:
110
- # token = os.environ.get("Egeria_Bearer_Token", None)
111
- # if token is None: # No token found - so make one
112
- # self.create_egeria_bearer_token(self.user_id, self.user_pwd)
113
- # else:
114
- # self.token = token
115
-
116
- if api_key is None:
117
- api_key = os.environ.get("API_KEY", None)
118
- self.api_key = api_key
119
-
120
- self.headers = {
121
- "Content-Type": "application/json",
122
- }
123
- self.text_headers = {
124
- "Content-Type": "text/plain",
125
- }
126
- if self.api_key is not None:
127
- self.headers["X-Api-Key"] = self.api_key
128
- self.text_headers["X-Api-Key"] = self.api_key
129
-
130
- if token is not None:
131
- self.headers["Authorization"] = f"Bearer {token}"
132
- self.text_headers["Authorization"] = f"Bearer {token}"
133
-
134
- v_url = validate_url(platform_url)
135
-
136
- if v_url:
137
- self.platform_url = platform_url
138
- if validate_server_name(server_name):
139
- self.server_name = server_name
140
- self.session = AsyncClient(verify=enable_ssl_check)
141
-
142
- self._search_string_request_adapter = TypeAdapter(SearchStringRequestBody)
143
- self._filter_request_adapter = TypeAdapter(FilterRequestBody)
144
- self._get_request_adapter = TypeAdapter(GetRequestBody)
145
- self._new_element_request_adapter = TypeAdapter(NewElementRequestBody)
146
- self._update_element_request_adapter = TypeAdapter(UpdateElementRequestBody)
147
- self._update_status_request_adapter = TypeAdapter(UpdateStatusRequestBody)
148
- self._new_relationship_request_adapter = TypeAdapter(NewRelationshipRequestBody)
149
- self._new_classification_request_adapter = TypeAdapter(NewClassificationRequestBody)
150
- self._delete_request_adapter = TypeAdapter(DeleteRequestBody)
151
- self._template_request_adapter = TypeAdapter(TemplateRequestBody)
152
- self._update_relationship_request_adapter = TypeAdapter(UpdateRelationshipRequestBody)
153
- self._results_request_adapter = TypeAdapter(ResultsRequestBody)
154
-
155
- def __enter__(self):
156
- return self
157
-
158
- def __exit__(self, exc_type, exc_val, exc_tb):
159
- self.session.aclose()
160
- if exc_type is not None:
161
- self.exc_type = exc_type
162
- self.exc_val = exc_val
163
- self.exc_tb = exc_tb
164
-
165
- return False # allows exceptions to propagate
166
-
167
- def __str__(self):
168
- return (f"EgeriaClient(server_name={self.server_name}, platform_url={self.platform_url}, "
169
- f"user_id={self.user_id}, page_size={self.page_size})")
170
-
171
- async def _async_close_session(self) -> None:
172
- """Close the session"""
173
- await self.session.aclose()
174
-
175
- def close_session(self) -> None:
176
- """Close the session"""
177
- loop = asyncio.get_event_loop()
178
- loop.run_until_complete(self._async_close_session())
179
- return
180
-
181
- async def _async_create_egeria_bearer_token(
182
- self, user_id: str = None, password: str = None
183
- ) -> str:
184
- """Create and set an Egeria Bearer Token for the user. Async version
185
- Parameters
186
- ----------
187
- user_id : str, opt
188
- The user id to authenticate with. If None, then user_id from class instance used.
189
- password : str, opt
190
- The password for the user. If None, then user_pwd from class instance is used.
191
-
192
- Returns
193
- -------
194
- token
195
- The bearer token for the specified user.
196
-
197
- Raises
198
- ------
199
- InvalidParameterException
200
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
201
- PropertyServerException
202
- Raised by the server when an issue arises in processing a valid request
203
- NotAuthorizedException
204
- The principle specified by the user_id does not have authorization for the requested action
205
- Notes
206
- -----
207
- This routine creates a new bearer token for the user and updates the object with it.
208
- It uses Egeria's mechanisms to create a token. This is useful if an Egeria token expires.
209
- A bearer token from another source can be set with the set_bearer_token() method.
210
-
211
- """
212
- if user_id is None:
213
- validate_user_id(self.user_id)
214
- user_id = self.user_id
215
- if password is None:
216
- validate_name(self.user_pwd)
217
- password = self.user_pwd
218
-
219
- url = f"{self.platform_url}/api/token"
220
- data = {"userId": user_id, "password": password}
221
- async with AsyncClient(verify=enable_ssl_check) as client:
222
- try:
223
- response = await client.post(url, json=data, headers=self.headers)
224
- token = response.text
225
- except httpx.HTTPError as e:
226
- print(e)
227
- return "FAILED"
228
-
229
- if token:
230
- self.token_src = "Egeria"
231
- self.headers["Authorization"] = f"Bearer {token}"
232
- self.text_headers["Authorization"] = f"Bearer {token}"
233
- return token
234
- else:
235
- additional_info = {"reason": "No token returned - request issue?"}
236
- raise PyegeriaInvalidParameterException(None, None, additional_info)
237
-
238
- def create_egeria_bearer_token(
239
- self, user_id: str = None, password: str = None
240
- ) -> str:
241
- """Create and set an Egeria Bearer Token for the user
242
- Parameters
243
- ----------
244
- user_id : str
245
- The user id to authenticate with.
246
- password : str
247
- The password for the user.
248
-
249
- Returns
250
- -------
251
- token
252
- The bearer token for the specified user.
253
-
254
- Raises
255
- ------
256
- InvalidParameterException
257
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
258
- PropertyServerException
259
- Raised by the server when an issue arises in processing a valid request
260
- NotAuthorizedException
261
- The principle specified by the user_id does not have authorization for the requested action
262
- Notes
263
- -----
264
- This routine creates a new bearer token for the user and updates the object with it.
265
- It uses Egeria's mechanisms to create a token. This is useful if an Egeria token expires.
266
- A bearer token from another source can be set with the set_bearer_token() method.
267
-
268
- """
269
- loop = asyncio.get_event_loop()
270
- response = loop.run_until_complete(
271
- self._async_create_egeria_bearer_token(user_id, password)
272
- )
273
- return response
274
-
275
- async def _async_refresh_egeria_bearer_token(self) -> str:
276
- """
277
- Refreshes the Egeria bearer token. Async version.
278
-
279
- This method is used to refresh the bearer token used for authentication with Egeria. It checks if the token
280
- source is 'Egeria', and if the user ID and password are valid. If all conditions are met, it calls the
281
- `create_egeria_bearer_token` method to create a new bearer token. Otherwise,
282
- it raises an `InvalidParameterException`.
283
-
284
- Parameters:
285
-
286
- Returns:
287
- None
288
-
289
- Raises:
290
- InvalidParameterException: If the token source is invalid.
291
- """
292
- if (
293
- (self.token_src == "Egeria")
294
- and validate_user_id(self.user_id)
295
- and validate_name(self.user_pwd)
296
- ):
297
- token = await self._async_create_egeria_bearer_token(
298
- self.user_id, self.user_pwd
299
- )
300
- return token
301
- else:
302
- additional_info = {"reason": "Invalid token source"}
303
- raise PyegeriaInvalidParameterException(None, None, additional_info)
304
-
305
- def refresh_egeria_bearer_token(self) -> None:
306
- """
307
- Refreshes the Egeria bearer token.
308
-
309
- This method is used to refresh the bearer token used for authentication with Egeria. It checks if the token
310
- source is 'Egeria', and if the user ID and password are valid. If all conditions are met, it calls the
311
- `create_egeria_bearer_token` method to create a new bearer token. Otherwise,
312
- it raises an `InvalidParameterException`.
313
-
314
- Parameters:
315
-
316
- Returns:
317
- None
318
-
319
- Raises:
320
- InvalidParameterException: If the token source is invalid.
321
- PropertyServerException
322
- Raised by the server when an issue arises in processing a valid request
323
- NotAuthorizedException
324
- The principle specified by the user_id does not have authorization for the requested action
325
- """
326
- loop = asyncio.get_event_loop()
327
- token = loop.run_until_complete(self._async_refresh_egeria_bearer_token())
328
- return token
329
-
330
- def set_bearer_token(self, token: str) -> None:
331
- """Retrieve and set a Bearer Token
332
- Parameters
333
- ----------
334
- token: str
335
- A bearer token supplied to the method.
336
-
337
- Returns
338
- -------
339
- None
340
- This method does not return anything.
341
-
342
- Raises
343
- ------
344
- InvalidParameterException
345
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
346
- PropertyServerException
347
- Raised by the server when an issue arises in processing a valid request
348
- NotAuthorizedException
349
- The principle specified by the user_id does not have authorization for the requested action
350
- Notes
351
- -----
352
- This routine sets the bearer token for the current object. The user is responsible for providing the token.
353
-
354
- """
355
- validate_name(token)
356
- self.headers["Authorization"] = f"Bearer {token}"
357
- self.text_headers["Authorization"] = f"Bearer {token}"
358
-
359
- def get_token(self) -> str:
360
- """Retrieve and return the bearer token"""
361
- return self.text_headers["Authorization"]
362
-
363
- def get_platform_origin(self):
364
- """Validate platform connectivity"""
365
- origin_url = f"{self.platform_url}/open-metadata/platform-services/users/{self.user_id}/server-platform/origin"
366
- response = self.make_request("GET", origin_url, is_json=False)
367
- if response.status_code == 200:
368
- logger.success(f"Got response from {origin_url}\n Response: {response.text}")
369
- if response.text.split()[0] == "Egeria":
370
- return True
371
- else:
372
- return False
373
- else:
374
- logger.info(f"Got response from {origin_url}\n status_code: {response.status_code}")
375
-
376
- # @logger.catch
377
- def make_request(
378
- self,
379
- request_type: str,
380
- endpoint: str,
381
- payload: str | dict = None,
382
- time_out: int = 30,
383
- is_json: bool = True
384
- ) -> Response | str:
385
- """Make a request to the Egeria API."""
386
- try:
387
- loop = asyncio.get_running_loop()
388
- if loop.is_running():
389
- coro = self._async_make_request(request_type, endpoint, payload, time_out, is_json)
390
- return asyncio.run_coroutine_threadsafe(coro, loop).result()
391
- else:
392
- return loop.run_until_complete(
393
- self._async_make_request(request_type, endpoint, payload, time_out, is_json))
394
- except RuntimeError:
395
- # No running loop exists; run the coroutine
396
- return asyncio.run(self._async_make_request(request_type, endpoint, payload, time_out, is_json))
397
-
398
- async def _async_make_request(
399
- self,
400
- request_type: str,
401
- endpoint: str,
402
- payload: str | dict = None,
403
- time_out: int = 30,
404
- is_json: bool = True
405
- ) -> Response | str:
406
- """Make a request to the Egeria API - Async Version
407
- Function to make an API call via the self.session Library. Raise an exception if the HTTP response code
408
- is not 200/201. IF there is a REST communication exception, raise InvalidParameterException.
409
-
410
- :param request_type: Type of Request.
411
- Supported Values - GET, POST, (not PUT, PATCH, DELETE).
412
- Type - String
413
- :param endpoint: API Endpoint. Type - String
414
- :param payload: API Request Parameters or Query String.
415
- Type - String or Dict
416
- :param time_out: Timeout in seconds. Type - Integer
417
- :param is_json: Whether the payload is JSON or not. Type - Boolean
418
- :return: Response. Type - JSON Formatted String
419
-
420
- """
421
- context: dict = {}
422
- context['class name'] = __class__.__name__
423
- context['caller method'] = inspect.currentframe().f_back.f_code.co_name
424
- response: Response
425
-
426
- try:
427
- if request_type == "GET":
428
- response = await self.session.get(
429
- endpoint, params=payload, headers=self.headers, timeout=time_out
430
- )
431
-
432
- elif request_type == "POST":
433
- if payload is None:
434
- response = await self.session.post(
435
- endpoint, headers=self.headers, timeout=time_out
436
- )
437
- elif type(payload) is dict:
438
- response = await self.session.post(
439
- endpoint, json=payload, headers=self.headers, timeout=time_out
440
- )
441
- elif type(payload) is str:
442
- # if is_json:
443
- # response = await self.session.post(
444
- # endpoint, json=payload, headers=self.headers, timeout=time_out
445
- # )
446
- # else:
447
- response = await self.session.post(
448
- endpoint,
449
- headers=self.headers,
450
- content=payload,
451
- timeout=time_out,
452
- )
453
- else:
454
- # response = await self.session.post(
455
- # endpoint, headers=self.headers, json=payload, timeout=time_out)
456
- raise TypeError(f"Invalid payload type {type(payload)}")
457
-
458
-
459
- elif request_type == "POST-DATA":
460
- if True:
461
- response = await self.session.post(
462
- endpoint, headers=self.headers, data=payload, timeout=time_out
463
- )
464
- elif request_type == "DELETE":
465
- if True:
466
- response = await self.session.delete(
467
- endpoint, headers=self.headers, timeout=time_out
468
- )
469
- response.raise_for_status()
470
-
471
- status_code = response.status_code
472
-
473
- except (httpx.TimeoutException, httpcore.ConnectError, httpx.ConnectError) as e:
474
- additional_info = {"endpoint": endpoint, "error_kind": "connection"}
475
- raise PyegeriaConnectionException(context, additional_info, e)
476
-
477
- except (HTTPStatusError, httpx.HTTPStatusError, httpx.RequestError) as e:
478
- # context["caught_exception"] = e
479
- # context['HTTPStatusCode'] = e.response.status_code
480
- additional_info = {"userid": self.user_id, "reason": response.text}
481
-
482
- raise PyegeriaClientException(response, context, additional_info, e)
483
- #
484
- # except json.JSONDecodeError as e:
485
- # # context["caught_exception"] = e
486
- # # context['HTTPStatusCode'] = e.response.status_code
487
- # additional_info = {"userid": self.user_id}
488
- # raise PyegeriaClientException(response, context, additional_info )
489
- #
490
- # except PyegeriaAPIException as e:
491
- # raise PyegeriaAPIException(response, context, additional_info=None)
492
-
493
- except Exception as e:
494
- additional_info = {"userid": self.user_id}
495
- if 'response' in locals() and response is not None:
496
- logger.error(f"Response error with code {response.status_code}")
497
- else:
498
- logger.error("Response object not available due to error")
499
- raise PyegeriaUnknownException(None, context, additional_info, e)
500
-
501
- if status_code in (200, 201):
502
- try:
503
- if is_json:
504
- json_response = response.json()
505
- related_http_code = json_response.get("relatedHTTPCode", 0)
506
- if related_http_code == 200:
507
- return response
508
- else:
509
- raise PyegeriaAPIException(response, context, additional_info=None)
510
-
511
- else: # Not JSON - Text?
512
- return response
513
-
514
-
515
- except json.JSONDecodeError as e:
516
- logger.error("Failed to decode JSON response from %s: %s", endpoint, response.text,
517
- exc_info=True)
518
- context['caught_exception'] = e
519
- raise PyegeriaInvalidParameterException(
520
- response, context, e=e
521
- )
522
-
523
- def build_global_guid_lists(self) -> None:
524
- global template_guids, integration_guids
525
-
526
- self.create_egeria_bearer_token(self.user_id, self.user_pwd)
527
- # get all technology types
528
- url = (
529
- f"{self.platform_url}/servers/{self.server_name}/api/open-metadata/automated-curation/technology-types/"
530
- f"by-search-string?startFrom=0&pageSize=0&startsWith=false&"
531
- f"endsWith=false&ignoreCase=true"
532
- )
533
- body = {"filter": ""}
534
-
535
- response = self.make_request("POST", url, body)
536
- tech_types = response.json().get("elements", "no tech found")
537
- if type(tech_types) is list:
538
- for tech_type in tech_types:
539
- # get tech type details
540
- display_name = tech_type["name"]
541
-
542
- url = (f"{self.platform_url}/servers/"
543
- f"{self.server_name}/api/open-metadata/automated-curation/technology-types/by-name")
544
- body = {"filter": display_name}
545
- response = self.make_request("POST", url, body)
546
- details = response.json().get("element", "no type found")
547
- if type(details) is str:
548
- continue
549
- # get templates and update the template_guids global
550
- templates = details.get("catalogTemplates", "Not Found")
551
- if type(templates) is str:
552
- template_guids[display_name] = None
553
- else:
554
- for template in templates:
555
- template_name = template.get("name", None)
556
- template_guid = template["relatedElement"]["guid"]
557
- template_guids[template_name] = template_guid
558
- # print(f"Added {template_name} template with GUID {template_guids[template_name]}")
559
-
560
- # Now find the integration connector guids
561
- resource_list = details.get("resourceList", " ")
562
- if type(resource_list) is str:
563
- integration_guids[display_name] = None
564
- else:
565
- for resource in resource_list:
566
- resource_guid = resource["relatedElement"]["guid"]
567
- resource_type = resource["relatedElement"]["type"]["typeName"]
568
- if resource_type == "IntegrationConnector":
569
- integration_guids[display_name] = resource_guid
570
- # print(f"Added {display_name} integration connector with GUID {integration_guids[
571
- # display_name]}")
572
-
573
- async def __async_get_guid__(
574
- self,
575
- guid: str = None,
576
- display_name: str = None,
577
- property_name: str = "qualifiedName",
578
- qualified_name: str = None,
579
- tech_type: str = None,
580
- ) -> str:
581
- """Helper function to return a server_guid - one of server_guid, qualified_name or display_name should
582
- contain information. If all are None, an exception will be thrown. If all contain
583
- values, server_guid will be used first, followed by qualified_name. If the tech_type is supplied and the
584
- property_name is qualifiedName then the display_name will be pre-pended with the tech_type name to form a
585
- qualifiedName.
586
-
587
- An InvalidParameter Exception is thrown if multiple matches
588
- are found for the given property name. If this occurs, use a qualified name for the property name.
589
- Async version.
590
- """
591
-
592
- if guid:
593
- return guid
594
-
595
- if qualified_name:
596
- body = {
597
- "class": "NameRequestBody",
598
- "name": qualified_name,
599
- "namePropertyName": "qualifiedName",
600
- "forLineage": False,
601
- "forDuplicateProcessing": False,
602
- "effectiveTime": None,
603
- }
604
- url = (
605
- f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/classification-manager/"
606
- f"elements/guid-by-unique-name?forLineage=false&forDuplicateProcessing=false"
607
- )
608
-
609
- result = await self._async_make_request("POST", url, body_slimmer(body))
610
- return result.json().get("guid", NO_ELEMENTS_FOUND)
611
-
612
- try:
613
- view_server = self.view_server
614
- except AttributeError:
615
- view_server = os.environ.get("EGERIA_VIEW_SERVER", "view-server")
616
-
617
- if (not qualified_name) and display_name:
618
- if (tech_type) and (property_name == "qualifiedName"):
619
- name = f"{tech_type}::{display_name}"
620
- body = {
621
- "class": "NameRequestBody",
622
- "displayName": name,
623
- "namePropertyName": property_name,
624
- "forLineage": False,
625
- "forDuplicateProcessing": False,
626
- "effectiveTime": None,
627
- }
628
- url = (
629
- f"{self.platform_url}/servers/{view_server}/api/open-metadata/classification-manager/"
630
- f"elements/guid-by-unique-name?forLineage=false&forDuplicateProcessing=false"
631
- )
632
-
633
- result = await self._async_make_request("POST", url, body_slimmer(body))
634
- return result.json().get("guid", NO_ELEMENTS_FOUND)
635
- else:
636
- body = {
637
- "class": "NameRequestBody",
638
- "name": display_name,
639
- "namePropertyName": property_name,
640
- "forLineage": False,
641
- "forDuplicateProcessing": False,
642
- "effectiveTime": None,
643
- }
644
- url = (
645
- f"{self.platform_url}/servers/{view_server}/api/open-metadata/classification-manager/"
646
- f"elements/guid-by-unique-name?forLineage=false&forDuplicateProcessing=false"
647
- )
648
-
649
- result = await self._async_make_request("POST", url, body_slimmer(body))
650
- return result.json().get("guid", NO_ELEMENTS_FOUND)
651
- else:
652
- additional_info = {
653
- "reason": "Neither server_guid nor server_name were provided - please provide.",
654
- "parameters": (f"GUID={guid}, display_name={display_name}, property_name={property_name},"
655
- f"qualified_name={qualified_name}, tech_type={tech_type}")
656
- }
657
- raise PyegeriaInvalidParameterException(None, None, additional_info)
658
-
659
- def __get_guid__(
660
- self,
661
- guid: str = None,
662
- display_name: str = None,
663
- property_name: str = "qualifiedName",
664
- qualified_name: str = None,
665
- tech_type: str = None,
666
- ) -> str:
667
- """Helper function to return a server_guid - one of server_guid, qualified_name or display_name should
668
- contain information. If all are None, an exception will be thrown. If all contain
669
- values, server_guid will be used first, followed by qualified_name. If the tech_type is supplied and the
670
- property_name is qualifiedName then the display_name will be pre-pended with the tech_type name to form a
671
- qualifiedName.
672
-
673
- An InvalidParameter Exception is thrown if multiple matches
674
- are found for the given property name. If this occurs, use a qualified name for the property name.
675
- Async version.
676
- """
677
- loop = asyncio.get_event_loop()
678
- result = loop.run_until_complete(
679
- self.__async_get_guid__(
680
- guid, display_name, property_name, qualified_name, tech_type
681
- )
682
- )
683
- return result
684
-
685
- def __create_qualified_name__(self, type: str, display_name: str, local_qualifier: str = None,
686
- version_identifier: str = None) -> str:
687
- """Helper function to create a qualified name for a given type and display name.
688
- If present, the local qualifier will be prepended to the qualified name."""
689
- EGERIA_LOCAL_QUALIFIER = os.environ.get("EGERIA_LOCAL_QUALIFIER", local_qualifier)
690
- display_name = re.sub(r'\s', '-', display_name.strip()) # This changes spaces between words to -; removing
691
- if display_name is None:
692
- additional_info = {"reason": "Display name is missing - please provide.", }
693
- raise PyegeriaInvalidParameterException(additional_info=additional_info)
694
- q_name = f"{type}::{display_name}"
695
- if EGERIA_LOCAL_QUALIFIER:
696
- q_name = f"{EGERIA_LOCAL_QUALIFIER}::{q_name}"
697
- if version_identifier:
698
- q_name = f"{q_name}::{version_identifier}"
699
- return q_name
700
-
701
- async def _async_get_element_by_guid_(self, element_guid: str) -> dict | str:
702
- """
703
- Simplified, internal version of get_element_by_guid found in Classification Manager.
704
- Retrieve an element by its guid. Async version.
705
-
706
- Parameters
707
- ----------
708
- element_guid: str
709
- - unique identifier for the element
710
-
711
- Returns
712
- -------
713
- dict | str
714
- Returns a string if no element found; otherwise a dict of the element.
715
-
716
- Raises
717
- ------
718
- InvalidParameterException
719
- one of the parameters is null or invalid or
720
- PropertyServerException
721
- There is a problem adding the element properties to the metadata repository or
722
- UserNotAuthorizedException
723
- the requesting user is not authorized to issue this request.
724
- """
725
-
726
- body = {
727
- "class": "EffectiveTimeQueryRequestBody",
728
- "effectiveTime": None,
729
- }
730
-
731
- url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/classification-manager/elements/"
732
- f"{element_guid}?forLineage=false&forDuplicateProcessing=false")
733
-
734
- response: Response = await self._async_make_request("POST", url, body_slimmer(body))
735
-
736
- elements = response.json().get("element", NO_ELEMENTS_FOUND)
737
-
738
- return elements
739
-
740
- def validate_new_element_request(self, body: dict | NewElementRequestBody,
741
- prop: list[str]) -> NewElementRequestBody | None:
742
- if isinstance(body, NewElementRequestBody):
743
- # if body.properties.class_ in prop:
744
- validated_body = body
745
- # else:
746
- # raise PyegeriaInvalidParameterException(additional_info=
747
- # {"reason": "unexpected property class name"})
748
-
749
- elif isinstance(body, dict):
750
- # if body.get("properties", {}).get("class", "") == prop:
751
- validated_body = self._new_element_request_adapter.validate_python(body)
752
- # else:
753
- # raise PyegeriaInvalidParameterException(additional_info=
754
- # {"reason": "unexpected property class name"})
755
- else:
756
- return None
757
- return validated_body
758
-
759
- def validate_new_element_from_template_request(self, body: dict | TemplateRequestBody
760
- ) -> NewElementRequestBody | None:
761
- if isinstance(body, TemplateRequestBody):
762
- validated_body = body
763
-
764
- elif isinstance(body, dict):
765
- # if body.get("properties", {}).get("class", "") == prop:
766
- validated_body = self._template_request_adapter.validate_python(body)
767
- else:
768
- return None
769
- return validated_body
770
-
771
- def validate_new_relationship_request(self, body: dict | NewRelationshipRequestBody,
772
- prop: str = None) -> NewRelationshipRequestBody | None:
773
- if isinstance(body, NewRelationshipRequestBody):
774
- if (prop and body.properties.class_ == prop) or (prop is None):
775
- validated_body = body
776
- else:
777
- raise PyegeriaInvalidParameterException(additional_info=
778
- {"reason": "unexpected property class name"})
779
-
780
- elif isinstance(body, dict):
781
- if body.get("properties", {}).get("class", "") == prop:
782
- validated_body = self._new_relationship_request_adapter.validate_python(body)
783
- else:
784
- raise PyegeriaInvalidParameterException(additional_info=
785
- {"reason": "unexpected property class name"})
786
- else:
787
- return None
788
-
789
- return validated_body
790
-
791
- def validate_new_classification_request(self, body: dict | NewClassificationRequestBody,
792
- prop: str = None) -> NewClassificationRequestBody | None:
793
- if isinstance(body, NewClassificationRequestBody):
794
- if (prop and body.properties.class_ == prop) or (prop is None):
795
- validated_body = body
796
- else:
797
- raise PyegeriaInvalidParameterException(additional_info=
798
- {"reason": "unexpected property class name"})
799
-
800
- elif isinstance(body, dict):
801
- if body.get("properties", {}).get("class", "") == prop:
802
- validated_body = self._new_classification_request_adapter.validate_python(body)
803
- else:
804
- raise PyegeriaInvalidParameterException(additional_info=
805
- {"reason": "unexpected property class name"})
806
- else:
807
- return None
808
-
809
- return validated_body
810
-
811
- def validate_delete_request(self, body: dict | DeleteRequestBody,
812
- cascade_delete: bool = False) -> DeleteRequestBody | None:
813
- if isinstance(body, DeleteRequestBody):
814
- validated_body = body
815
- elif isinstance(body, dict):
816
- validated_body = self._delete_request_adapter.validate_python(body)
817
- else: # handle case where body not provided
818
- body= {
819
- "class": "DeleteRequestBody",
820
- "cascadeDelete": cascade_delete
821
- }
822
- validated_body= DeleteRequestBody.model_validate(body)
823
- return validated_body
824
-
825
- def validate_update_element_request(self, body: dict | UpdateElementRequestBody,
826
- prop: list[str]) -> UpdateElementRequestBody | None:
827
- if isinstance(body, UpdateElementRequestBody):
828
- if body.properties.class_ in prop:
829
- validated_body = body
830
- else:
831
- raise PyegeriaInvalidParameterException(additional_info=
832
- {"reason": "unexpected property class name"})
833
-
834
- elif isinstance(body, dict):
835
- # if body.get("properties", {}).get("class", "") in prop:
836
- validated_body = self._update_element_request_adapter.validate_python(body)
837
- # else:
838
- # raise PyegeriaInvalidParameterException(additional_info=
839
- # {"reason": "unexpected property class name"})
840
- else:
841
- validated_body = None
842
- return validated_body
843
-
844
- def validate_update_status_request(self, status: str = None, body: dict | UpdateStatusRequestBody = None,
845
- prop: list[str] = None) -> UpdateStatusRequestBody | None:
846
- if isinstance(body, UpdateStatusRequestBody):
847
- validated_body = body
848
-
849
- elif isinstance(body, dict):
850
- validated_body = self._update_element_request_adapter.validate_python(body)
851
-
852
- elif status:
853
- body = {
854
- "class": "UpdateStatusRequestBody",
855
- "newStatus": status
856
- }
857
- validated_body = UpdateStatusRequestBody.model_validate(body)
858
- else:
859
- raise PyegeriaInvalidParameterException(additional_info={"reason": "invalid parameters"})
860
-
861
- return validated_body
862
-
863
- def validate_update_relationship_request(self, body: dict | UpdateRelationshipRequestBody,
864
- prop: [str]) -> UpdateRelationshipRequestBody | None:
865
- if isinstance(body, UpdateRelationshipRequestBody):
866
- # if body.properties.class_ == prop:
867
- validated_body = body
868
- # else:
869
- # raise PyegeriaInvalidParameterException(additional_info=
870
- # {"reason": "unexpected property class name"})
871
-
872
- elif isinstance(body, dict):
873
- # if body.get("properties", {}).get("class", "") == prop:
874
- validated_body = self._update_relationship_request_adapter.validate_python(body)
875
- # else:
876
- # raise PyegeriaInvalidParameterException(additional_info=
877
- # {"reason": "unexpected property class name"})
878
- else:
879
- validated_body = None
880
- return validated_body
881
-
882
- async def _async_find_request(self, url: str, _type: str, _gen_output: Callable[..., Any],
883
- search_string: str = '*', classification_names: list[str] = None,
884
- metadata_element_types: list[str] = None,
885
- starts_with: bool = True, ends_with: bool = False, ignore_case: bool = False,
886
- start_from: int = 0, page_size: int = 0, output_format: str = 'JSON',
887
- output_format_set: str | dict = None,
888
- body: dict | SearchStringRequestBody = None) -> Any:
889
-
890
- if isinstance(body, SearchStringRequestBody):
891
- validated_body = body
892
- elif isinstance(body, dict):
893
- validated_body = self._search_string_request_adapter.validate_python(body)
894
- else:
895
- search_string = None if search_string is "*" else search_string
896
- body = {
897
- "class": "SearchStringRequestBody",
898
- "search_string": search_string,
899
- "starts_with": starts_with,
900
- "ends_with": ends_with,
901
- "ignore_case": ignore_case,
902
- "start_from": start_from,
903
- "page_size": page_size,
904
- "include_only_classified_elements": classification_names,
905
- "metadata_element_subtype_names": metadata_element_types,
906
- }
907
- validated_body = SearchStringRequestBody.model_validate(body)
908
-
909
- # classification_names = validated_body.include_only_classified_elements
910
- # element_type_name = classification_names[0] if classification_names else _type
911
-
912
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
913
-
914
- response = await self._async_make_request("POST", url, json_body)
915
- elements = response.json().get("elements", NO_ELEMENTS_FOUND)
916
- if type(elements) is str:
917
- logger.info(NO_ELEMENTS_FOUND)
918
- return NO_ELEMENTS_FOUND
919
-
920
- if output_format.upper() != 'JSON': # return a simplified markdown representation
921
- # logger.info(f"Found elements, output format: {output_format} and output_format_set: {output_format_set}")
922
- return _gen_output(elements, search_string, _type,
923
- output_format, output_format_set)
924
- return elements
925
-
926
- async def _async_get_name_request(self, url: str, _type: str, _gen_output: Callable[..., Any],
927
- filter_string: str, classification_names: list[str] = None,
928
- start_from: int = 0, page_size: int = 0, output_format: str = 'JSON',
929
- output_format_set: str | dict = None,
930
- body: dict | FilterRequestBody = None) -> Any:
931
-
932
- if isinstance(body, FilterRequestBody):
933
- validated_body = body
934
- elif isinstance(body, dict):
935
- validated_body = self._filter_request_adapter.validate_python(body)
936
- else:
937
- filter_string = None if filter_string is "*" else filter_string
938
- classification_names = None if classification_names == [] else classification_names
939
- body = {
940
- "class": "FilterRequestBody",
941
- "filter": filter_string,
942
- "start_from": start_from,
943
- "page_size": page_size,
944
- "include_only_classified_elements": classification_names,
945
- }
946
- validated_body = FilterRequestBody.model_validate(body)
947
-
948
- # classification_names = validated_body.include_only_classified_elements
949
- # element_type_name = classification_names[0] if classification_names else _type
950
-
951
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
952
-
953
- response = await self._async_make_request("POST", url, json_body)
954
- elements = response.json().get("elements", NO_ELEMENTS_FOUND)
955
- if type(elements) is str:
956
- logger.info(NO_ELEMENTS_FOUND)
957
- return NO_ELEMENTS_FOUND
958
-
959
- if output_format != 'JSON': # return a simplified markdown representation
960
- logger.info(f"Found elements, output format: {output_format} and output_format_set: {output_format_set}")
961
- return _gen_output(elements, filter_string, _type,
962
- output_format, output_format_set)
963
- return elements
964
-
965
- async def _async_get_guid_request(self, url: str, _type: str, _gen_output: Callable[..., Any],
966
- output_format: str = 'JSON', output_format_set: str | dict = None,
967
- body: dict | GetRequestBody = None) -> Any:
968
-
969
- if isinstance(body, GetRequestBody):
970
- validated_body = body
971
- elif isinstance(body, dict):
972
- validated_body = self._filter_request_adapter.validate_python(body)
973
- else:
974
- body = {
975
- "class": "GetRequestBody",
976
- "metadataElementTypeName": _type
977
- }
978
- validated_body = GetRequestBody.model_validate(body)
979
-
980
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
981
-
982
- response = await self._async_make_request("POST", url, json_body)
983
- elements = response.json().get("element", NO_ELEMENTS_FOUND)
984
- if type(elements) is str:
985
- logger.info(NO_ELEMENTS_FOUND)
986
- return NO_ELEMENTS_FOUND
987
-
988
- if output_format != 'JSON': # return a simplified markdown representation
989
- logger.info(f"Found elements, output format: {output_format} and output_format_set: {output_format_set}")
990
- return _gen_output(elements, "GUID", _type, output_format, output_format_set)
991
- return elements
992
-
993
- async def _async_get_results_body_request(self, url: str, _type: str, _gen_output: Callable[..., Any],
994
- start_from: int = 0, page_size: int = 0, output_format: str = 'JSON',
995
- output_format_set: str | dict = None,
996
- body: dict | ResultsRequestBody = None) -> Any:
997
- if isinstance(body, ResultsRequestBody):
998
- validated_body = body
999
- elif isinstance(body, dict):
1000
- validated_body = self._results_request_adapter.validate_python(body)
1001
- else:
1002
- body = {
1003
- "class": "ResultsRequestBody",
1004
- "start_from": start_from,
1005
- "page_size": page_size,
1006
- }
1007
- validated_body = ResultsRequestBody.model_validate(body)
1008
-
1009
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1010
-
1011
- response = await self._async_make_request("POST", url, json_body)
1012
- elements = response.json().get("elements", None)
1013
- if elements is None:
1014
- elements = response.json().get("element", NO_ELEMENTS_FOUND)
1015
-
1016
- if type(elements) is str:
1017
- logger.info(NO_ELEMENTS_FOUND)
1018
- return NO_ELEMENTS_FOUND
1019
-
1020
- if output_format != 'JSON': # return a simplified markdown representation
1021
- logger.info(f"Found elements, output format: {output_format} and output_format_set: {output_format_set}")
1022
- return _gen_output(elements, "Members", _type,
1023
- output_format, output_format_set)
1024
- return elements
1025
-
1026
- async def _async_create_element_body_request(self, url: str, prop: list[str],
1027
- body: dict | NewElementRequestBody = None) -> str:
1028
- validated_body = self.validate_new_element_request(body, prop)
1029
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1030
- logger.info(json_body)
1031
- response = await self._async_make_request("POST", url, json_body)
1032
- logger.info(response.json())
1033
- return response.json().get("guid", "NO_GUID_RETURNED")
1034
-
1035
- async def _async_create_element_from_template(self, url: str, body: dict | TemplateRequestBody = None) -> str:
1036
- validated_body = self.validate_new_element_from_template_request(body)
1037
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1038
- logger.info(json_body)
1039
- response = await self._async_make_request("POST", url, json_body, is_json=True)
1040
- logger.info(response.json())
1041
- return response.json().get("guid", "NO_GUID_RETURNED")
1042
-
1043
- async def _async_update_element_body_request(self, url: str, prop: list[str],
1044
- body: dict | UpdateElementRequestBody = None) -> None:
1045
- validated_body = self.validate_update_element_request(body, prop)
1046
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1047
- logger.info(json_body)
1048
- response = await self._async_make_request("POST", url, json_body)
1049
- logger.info(response.json())
1050
-
1051
- async def _async_update_status_request(self, url: str, status: str = None,
1052
- body: dict | UpdateStatusRequestBody = None) -> None:
1053
- validated_body = self.validate_update_status_request(status, body)
1054
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1055
- logger.info(json_body)
1056
- response = await self._async_make_request("POST", url, json_body)
1057
- logger.info(response.json())
1058
-
1059
- async def _async_new_relationship_request(self, url: str, prop: list[str],
1060
- body: dict | NewRelationshipRequestBody = None) -> None:
1061
- validated_body = self.validate_new_relationship_request(body, prop)
1062
- if validated_body:
1063
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1064
- logger.info(json_body)
1065
- await self._async_make_request("POST", url, json_body)
1066
- else:
1067
- await self._async_make_request("POST", url)
1068
-
1069
- async def _async_new_classification_request(self, url: str, prop: str,
1070
- body: dict | NewRelationshipRequestBody = None) -> None:
1071
- validated_body = self.validate_new_classification_request(body, prop)
1072
- if validated_body:
1073
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1074
- logger.info(json_body)
1075
- await self._async_make_request("POST", url, json_body)
1076
- else:
1077
- await self._async_make_request("POST", url)
1078
-
1079
- async def _async_delete_request(self, url: str, body: dict | DeleteRequestBody = None,
1080
- cascade_delete: bool = False) -> None:
1081
- validated_body = self.validate_delete_request(body, cascade_delete)
1082
- if validated_body:
1083
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1084
- logger.info(json_body)
1085
- await self._async_make_request("POST", url, json_body)
1086
- else:
1087
- await self._async_make_request("POST", url)
1088
-
1089
-
1090
- async def _async_update_relationship_request(self, url: str, prop: str,
1091
- body: dict | UpdateRelationshipRequestBody = None) -> None:
1092
- validated_body = self.validate_update_relationship_request(body, prop)
1093
- if validated_body:
1094
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1095
- logger.info(json_body)
1096
- await self._async_make_request("POST", url, json_body)
1097
- else:
1098
- await self._async_make_request("POST", url)
1099
-
1100
-
1101
- if __name__ == "__main__":
1102
- print("Main-__client")