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
@@ -0,0 +1,573 @@
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
+
15
+ import httpcore
16
+ import httpx
17
+ from httpx import AsyncClient, Response, HTTPStatusError
18
+ from loguru import logger
19
+
20
+ from pyegeria.core._exceptions import (
21
+ PyegeriaAPIException, PyegeriaConnectionException, PyegeriaInvalidParameterException,
22
+ PyegeriaUnknownException, PyegeriaClientException
23
+ )
24
+ from pyegeria.core._globals import enable_ssl_check, max_paging_size
25
+ from pyegeria.core._validators import (
26
+ validate_name,
27
+ validate_server_name,
28
+ validate_url,
29
+ validate_user_id,
30
+ )
31
+
32
+ ...
33
+
34
+
35
+ class BaseServerClient:
36
+ """
37
+ An abstract class used to establish connectivity for an Egeria Client
38
+ for a particular server, platform and user. This is a base client that more functional clients inherit from.
39
+
40
+ Attributes
41
+ ----------
42
+ server_name : str
43
+ Name of the OMAG server to use
44
+ platform_url : str
45
+ URL of the server platform to connect to
46
+ user_id : str
47
+ The identity of the user calling the method - this sets a default optionally used by the methods
48
+ when the user doesn't pass the user_id on a method call.
49
+ user_pwd : str
50
+ The password used to authenticate the server identity
51
+ page_size : int
52
+ The default page size for paged requests.
53
+ token : str
54
+ An optional bearer token for authentication.
55
+ token_src : str
56
+ The source of the bearer token (e.g., 'Egeria').
57
+ api_key : str
58
+ An optional API key for authentication.
59
+
60
+ """
61
+
62
+ json_header = {"Content-Type": "application/json"}
63
+
64
+ def __init__(
65
+ self,
66
+ server_name: str,
67
+ platform_url: str,
68
+ user_id: str = None,
69
+ user_pwd: str = None,
70
+ token: str = None,
71
+ token_src: str = None,
72
+ api_key: str = None,
73
+ page_size: int = max_paging_size,
74
+ ):
75
+ self.server_name = validate_server_name(server_name)
76
+ self.platform_url = validate_url(platform_url)
77
+ self.user_id = user_id
78
+ self.user_pwd = user_pwd
79
+ self.page_size = page_size
80
+ self.token_src = token_src
81
+ self.token = token
82
+ self.exc_type = None
83
+ self.exc_value = None
84
+ self.exc_tb = None
85
+
86
+ #
87
+ # I'm commenting this out since you should only have to use tokens if you want - just have to
88
+ # create or set the token with the appropriate methods as desired.
89
+ # if token is None:
90
+ # token = os.environ.get("Egeria_Bearer_Token", None)
91
+ # if token is None: # No token found - so make one
92
+ # self.create_egeria_bearer_token(self.user_id, self.user_pwd)
93
+ # else:
94
+ # self.token = token
95
+
96
+ if api_key is None:
97
+ api_key = os.environ.get("API_KEY", None)
98
+ self.api_key = api_key
99
+
100
+ self.headers = {
101
+ "Content-Type": "application/json",
102
+ }
103
+ self.text_headers = {
104
+ "Content-Type": "text/plain",
105
+ }
106
+ if self.api_key is not None:
107
+ self.headers["X-Api-Key"] = self.api_key
108
+ self.text_headers["X-Api-Key"] = self.api_key
109
+
110
+ if token is not None:
111
+ self.headers["Authorization"] = f"Bearer {token}"
112
+ self.text_headers["Authorization"] = f"Bearer {token}"
113
+
114
+ v_url = validate_url(platform_url)
115
+
116
+ if v_url:
117
+ self.platform_url = platform_url
118
+ if validate_server_name(server_name):
119
+ self.server_name = server_name
120
+ self.session = AsyncClient(verify=enable_ssl_check)
121
+ self.command_root: str = f"{self.platform_url}/servers/{self.server_name}/api/open-metadata/"
122
+
123
+ try:
124
+ result = self.check_connection()
125
+ logger.debug(f"client initialized, platform origin is: {result}")
126
+ except PyegeriaConnectionException as e:
127
+ raise
128
+
129
+ async def _async_check_connection(self) -> str:
130
+ """Check if the connection is working. Async version.
131
+
132
+ Returns
133
+ -------
134
+ str
135
+ The platform origin string if reachable, otherwise an empty string.
136
+
137
+ Raises
138
+ ------
139
+ PyegeriaConnectionException
140
+ If the connection to the platform fails.
141
+ """
142
+ try:
143
+ response = await self.async_get_platform_origin()
144
+ return response
145
+
146
+ except PyegeriaConnectionException as e:
147
+ raise
148
+ def check_connection(self) -> str:
149
+ """Check if the connection is working.
150
+
151
+ Returns
152
+ -------
153
+ str
154
+ The platform origin string if reachable, otherwise an empty string.
155
+
156
+ Raises
157
+ ------
158
+ PyegeriaConnectionException
159
+ If the connection to the platform fails.
160
+ """
161
+ loop = asyncio.get_event_loop()
162
+ response = loop.run_until_complete(self._async_check_connection())
163
+ return response
164
+
165
+ def __enter__(self):
166
+ return self
167
+
168
+ def __exit__(self, exc_type, exc_val, exc_tb):
169
+ self.session.aclose()
170
+ if exc_type is not None:
171
+ self.exc_type = exc_type
172
+ self.exc_val = exc_val
173
+ self.exc_tb = exc_tb
174
+
175
+ return False # allows exceptions to propagate
176
+
177
+ def __str__(self):
178
+ return (f"EgeriaClient(server_name={self.server_name}, platform_url={self.platform_url}, "
179
+ f"user_id={self.user_id}, page_size={self.page_size})")
180
+
181
+ async def _async_close_session(self) -> None:
182
+ """Close the session"""
183
+ await self.session.aclose()
184
+
185
+ def close_session(self) -> None:
186
+ """Close the session"""
187
+ loop = asyncio.get_event_loop()
188
+ loop.run_until_complete(self._async_close_session())
189
+ return
190
+
191
+ async def _async_create_egeria_bearer_token(
192
+ self, user_id: str , password: str
193
+ ) -> str:
194
+ """Create and set an Egeria Server Bearer Token for the user. Async version
195
+ Parameters
196
+ ----------
197
+ user_id : str, opt
198
+ The user id to authenticate with. If None, then user_id from class instance used.
199
+ password : str, opt
200
+ The password for the user. If None, then user_pwd from class instance is used.
201
+
202
+ Returns
203
+ -------
204
+ token
205
+ The bearer token for the specified user.
206
+
207
+ Raises
208
+ ------
209
+ PyegeriaInvalidParameterException
210
+ If the client passes incorrect parameters on the request - such as bad URLs or invalid values
211
+ PyegeriaAPIException
212
+ Raised by the server when an issue arises in processing a valid request
213
+ NotAuthorizedException
214
+ The principle specified by the user_id does not have authorization for the requested action
215
+ Notes
216
+ -----
217
+ This routine creates a new bearer token for the user and updates the object with it.
218
+ It uses Egeria's mechanisms to create a token. This is useful if an Egeria token expires.
219
+ A bearer token from another source can be set with the set_bearer_token() method.
220
+
221
+ """
222
+ if user_id is None:
223
+ user_id = self.user_id
224
+ if password is None:
225
+ password = self.user_pwd
226
+
227
+ url = f"{self.platform_url}/servers/{self.server_name}/api/token"
228
+ data = {"userId": user_id, "password": password}
229
+ async with AsyncClient(verify=enable_ssl_check) as client:
230
+ try:
231
+ response = await client.post(url, json=data, headers=self.headers)
232
+ token = response.text
233
+ except httpx.HTTPError as e:
234
+ print(e)
235
+ return "FAILED"
236
+
237
+ if token:
238
+ self.token_src = "Egeria"
239
+ self.headers["Authorization"] = f"Bearer {token}"
240
+ self.text_headers["Authorization"] = f"Bearer {token}"
241
+ return token
242
+ else:
243
+ additional_info = {"reason": "No token returned - request issue?"}
244
+ raise PyegeriaInvalidParameterException(None, None, additional_info)
245
+
246
+ def create_egeria_bearer_token(
247
+ self, user_id: str = None, password: str = None
248
+ ) -> str:
249
+ """Create and set an Egeria Server Bearer Token for the user
250
+ Parameters
251
+ ----------
252
+ user_id : str, optional
253
+ The user id to authenticate with. If None, then user_id from class instance used.
254
+ password : str, optional
255
+ The password for the user. If None, then user_pwd from class instance is used.
256
+
257
+ Returns
258
+ -------
259
+ token
260
+ The server bearer token for the specified user.
261
+
262
+ Raises
263
+ ------
264
+ PyegeriaInvalidParameterException
265
+ If the client passes incorrect parameters on the request - such as bad URLs or invalid values
266
+ PyegeriaAPIException
267
+ Raised by the server when an issue arises in processing a valid request
268
+ NotAuthorizedException
269
+ The principle specified by the user_id does not have authorization for the requested action
270
+ Notes
271
+ -----
272
+ This routine creates a new bearer token for the user and updates the object with it.
273
+ It uses Egeria's mechanisms to create a token. This is useful if an Egeria token expires.
274
+ A bearer token from another source can be set with the set_bearer_token() method.
275
+
276
+ """
277
+ loop = asyncio.get_event_loop()
278
+ response = loop.run_until_complete(
279
+ self._async_create_egeria_bearer_token(user_id, password)
280
+ )
281
+ return response
282
+
283
+ async def _async_refresh_egeria_bearer_token(self) -> str:
284
+ """
285
+ Refreshes the Egeria bearer token. Async version.
286
+
287
+ This method is used to refresh the bearer token used for authentication with Egeria. It checks if the token
288
+ source is 'Egeria', and if the user ID and password are valid. If all conditions are met, it calls the
289
+ `create_egeria_bearer_token` method to create a new bearer token.
290
+
291
+ Returns
292
+ -------
293
+ str
294
+ The new platform bearer token.
295
+
296
+ Raises
297
+ ------
298
+ PyegeriaInvalidParameterException
299
+ If the token source is invalid or user credentials are missing.
300
+ """
301
+ if (
302
+ (self.token_src == "Egeria")
303
+ and validate_user_id(self.user_id)
304
+ and validate_name(self.user_pwd)
305
+ ):
306
+ token = await self._async_create_egeria_bearer_token(
307
+ self.user_id, self.user_pwd
308
+ )
309
+ return token
310
+ else:
311
+ additional_info = {"reason": "Invalid token source"}
312
+ raise PyegeriaInvalidParameterException(None, None, additional_info)
313
+
314
+ def refresh_egeria_bearer_token(self) -> str:
315
+ """
316
+ Refreshes the Egeria bearer token.
317
+
318
+ This method is used to refresh the bearer token used for authentication with Egeria. It checks if the token
319
+ source is 'Egeria', and if the user ID and password are valid. If all conditions are met, it calls the
320
+ `create_egeria_bearer_token` method to create a new bearer token.
321
+
322
+ Returns
323
+ -------
324
+ str
325
+ The new platform bearer token.
326
+
327
+ Raises
328
+ ------
329
+ PyegeriaInvalidParameterException
330
+ If the token source is invalid or user credentials are missing.
331
+ PyegeriaAPIException
332
+ Raised by the server when an issue arises in processing a valid request
333
+ PyegeriaNotAuthorizedException
334
+ The principle specified by the user_id does not have authorization for the requested action
335
+ """
336
+ loop = asyncio.get_event_loop()
337
+ token = loop.run_until_complete(self._async_refresh_egeria_bearer_token())
338
+ return token
339
+
340
+ def set_bearer_token(self, token: str) -> None:
341
+ """Set the Bearer Token for the client.
342
+
343
+ Parameters
344
+ ----------
345
+ token : str
346
+ A bearer token supplied to the method.
347
+
348
+ Raises
349
+ ------
350
+ PyegeriaInvalidParameterException
351
+ If the token is invalid.
352
+ """
353
+ validate_name(token)
354
+ self.headers["Authorization"] = f"Bearer {token}"
355
+ self.text_headers["Authorization"] = f"Bearer {token}"
356
+
357
+ def get_token(self) -> str:
358
+ """Retrieve and return the current bearer token.
359
+
360
+ Returns
361
+ -------
362
+ str
363
+ The current bearer token.
364
+ """
365
+ return self.text_headers["Authorization"]
366
+
367
+ async def async_get_platform_origin(self) -> str:
368
+ """Return the platform origin string if reachable. Async version.
369
+
370
+ Returns
371
+ -------
372
+ str
373
+ The platform origin string if reachable, otherwise an empty string.
374
+ """
375
+ origin_url = f"{self.platform_url}/api/about"
376
+ response = await self._async_make_request("GET", origin_url, is_json=False)
377
+ if response.status_code == 200:
378
+ text = response.text.strip()
379
+ logger.debug(f"Got response from {origin_url}\n Response: {text}")
380
+ return text
381
+ else:
382
+ logger.debug(f"Got response from {origin_url}\n status_code: {response.status_code}")
383
+ return ""
384
+
385
+
386
+ def get_platform_origin(self) -> str:
387
+ """Return the platform origin string if reachable.
388
+
389
+ Returns
390
+ -------
391
+ str
392
+ The platform origin string if reachable, otherwise an empty string.
393
+ """
394
+ loop = asyncio.get_event_loop()
395
+ response = loop.run_until_complete(self.async_get_platform_origin())
396
+ return response
397
+
398
+ # @logger.catch
399
+ def make_request(
400
+ self,
401
+ request_type: str,
402
+ endpoint: str,
403
+ payload: str | dict = None,
404
+ time_out: int = 30,
405
+ is_json: bool = True,
406
+ params: dict | None = None
407
+ ) -> Response | str:
408
+ """Make a synchronous request to the Egeria API.
409
+
410
+ Parameters
411
+ ----------
412
+ request_type : str
413
+ The type of HTTP request (e.g., 'GET', 'POST').
414
+ endpoint : str
415
+ The API endpoint URL.
416
+ payload : str | dict, optional
417
+ The request payload.
418
+ time_out : int, optional
419
+ The timeout for the request in seconds (default is 30).
420
+ is_json : bool, optional
421
+ Whether the payload is in JSON format (default is True).
422
+ params : dict, optional
423
+ Query parameters for the request.
424
+
425
+ Returns
426
+ -------
427
+ Response | str
428
+ The response from the API.
429
+
430
+ Raises
431
+ ------
432
+ PyegeriaException
433
+ If the request fails.
434
+ """
435
+ try:
436
+ loop = asyncio.get_running_loop()
437
+ if loop.is_running():
438
+ coro = self._async_make_request(request_type, endpoint, payload, time_out, is_json, params)
439
+ return asyncio.run_coroutine_threadsafe(coro, loop).result()
440
+ else:
441
+ return loop.run_until_complete(
442
+ self._async_make_request(request_type, endpoint, payload, time_out, is_json, params))
443
+ except RuntimeError:
444
+ # No running loop exists; run the coroutine
445
+ return asyncio.run(self._async_make_request(request_type, endpoint, payload, time_out, is_json, params))
446
+
447
+
448
+ async def _async_make_request(
449
+ self,
450
+ request_type: str,
451
+ endpoint: str,
452
+ payload: str | dict = None,
453
+ time_out: int = 30,
454
+ is_json: bool = True,
455
+ params: dict | None = None
456
+ ) -> Response | str:
457
+ """Make an asynchronous request to the Egeria API.
458
+
459
+ Parameters
460
+ ----------
461
+ request_type : str
462
+ The type of HTTP request (e.g., 'GET', 'POST').
463
+ endpoint : str
464
+ The API endpoint URL.
465
+ payload : str | dict, optional
466
+ The request payload.
467
+ time_out : int, optional
468
+ The timeout for the request in seconds (default is 30).
469
+ is_json : bool, optional
470
+ Whether the payload is in JSON format (default is True).
471
+ params : dict, optional
472
+ Query parameters for the request.
473
+
474
+ Returns
475
+ -------
476
+ Response | str
477
+ The response from the API.
478
+
479
+ Raises
480
+ ------
481
+ PyegeriaAPIException
482
+ If the server returns an error.
483
+ PyegeriaConnectionException
484
+ If there is a connection issue.
485
+ PyegeriaInvalidParameterException
486
+ If the request parameters are invalid.
487
+ """
488
+ context: dict = {}
489
+ context['class name'] = __class__.__name__
490
+ context['caller method'] = inspect.currentframe().f_back.f_code.co_name
491
+ response: Response = None # Initialize to None to avoid UnboundLocalError
492
+
493
+ try:
494
+ if request_type == "GET":
495
+ response = await self.session.get(
496
+ endpoint, params=params, headers=self.headers, timeout=time_out,
497
+ )
498
+
499
+ elif request_type == "POST":
500
+ if payload is None:
501
+ response = await self.session.post(
502
+ endpoint, headers=self.headers, timeout=time_out, params = params
503
+ )
504
+ elif type(payload) is dict:
505
+ response = await self.session.post(
506
+ endpoint, json=payload, headers=self.headers, timeout=time_out
507
+ )
508
+ elif type(payload) is str:
509
+ response = await self.session.post(
510
+ endpoint,
511
+ headers=self.headers,
512
+ content=payload,
513
+ timeout=time_out,
514
+ params=params
515
+ )
516
+ else:
517
+ raise TypeError(f"Invalid payload type {type(payload)}")
518
+
519
+
520
+ elif request_type == "POST-DATA":
521
+ if True:
522
+ response = await self.session.post(
523
+ endpoint, headers=self.headers, data=payload, timeout=time_out
524
+ )
525
+ elif request_type == "DELETE":
526
+ if True:
527
+ response = await self.session.delete(
528
+ endpoint, headers=self.headers, timeout=time_out
529
+ )
530
+ response.raise_for_status()
531
+
532
+ status_code = response.status_code
533
+
534
+ except (httpx.TimeoutException, httpcore.ConnectError, httpx.ConnectError) as e:
535
+ additional_info = {"endpoint": endpoint, "error_kind": "connection"}
536
+ raise PyegeriaConnectionException(context, additional_info, e)
537
+
538
+ except (HTTPStatusError, httpx.HTTPStatusError, httpx.RequestError) as e:
539
+ additional_info = {"userid": self.user_id}
540
+ if response is not None:
541
+ additional_info["reason"] = response.text
542
+
543
+ raise PyegeriaClientException(response, context, additional_info, e)
544
+
545
+ except Exception as e:
546
+ additional_info = {"userid": self.user_id}
547
+ if response is not None:
548
+ logger.error(f"Response error with code {response.status_code}")
549
+ else:
550
+ logger.error("Response object not available due to error")
551
+ raise PyegeriaUnknownException(response, context, additional_info, e)
552
+
553
+ if status_code in (200, 201):
554
+ try:
555
+ if is_json:
556
+ json_response = response.json()
557
+ related_http_code = json_response.get("relatedHTTPCode", 0)
558
+ if related_http_code == 200:
559
+ return response
560
+ else:
561
+ raise PyegeriaAPIException(response, context, additional_info=None)
562
+
563
+ else: # Not JSON - Text?
564
+ return response
565
+
566
+
567
+ except json.JSONDecodeError as e:
568
+ logger.error("Failed to decode JSON response from %s: %s", endpoint, response.text,
569
+ exc_info=True)
570
+ context['caught_exception'] = e
571
+ raise PyegeriaInvalidParameterException(
572
+ response, context, e=e
573
+ )