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,394 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ SPDX-License-Identifier: Apache-2.0
4
+ Copyright Contributors to the ODPi Egeria project.
5
+
6
+ Generic list command that wraps exec_report_spec and adds TABLE output.
7
+
8
+ - TABLE: renders results as a paged Rich table; table title comes from get_report_spec_heading().
9
+ - MD, REPORT, FORM, HTML, MERMAID, LIST: writes the output to a timestamped file in the outbox.
10
+
11
+ Environment variables used (with defaults aligned to other commands):
12
+ - EGERIA_VIEW_SERVER, EGERIA_VIEW_SERVER_URL
13
+ - EGERIA_USER, EGERIA_USER_PASSWORD
14
+ - EGERIA_WIDTH, EGERIA_JUPYTER
15
+ - EGERIA_ROOT_PATH, EGERIA_OUTBOX_PATH
16
+ """
17
+ from __future__ import annotations
18
+
19
+ import argparse
20
+ import json
21
+ import os
22
+ import sys
23
+ import time
24
+ from typing import Any, Dict, List, Mapping, Sequence
25
+
26
+ from rich import box
27
+ from rich.console import Console
28
+ from rich.table import Table
29
+ from rich.prompt import Prompt
30
+
31
+ from pyegeria.core.config import settings
32
+ from pyegeria.core._exceptions import PyegeriaException, print_exception_response
33
+ from pyegeria.view.base_report_formats import get_report_spec_heading, select_report_spec
34
+ from pyegeria.view.format_set_executor import exec_report_spec
35
+ EGERIA_USER = os.environ.get("EGERIA_USER", "erinoverview")
36
+ EGERIA_USER_PASSWORD = os.environ.get("EGERIA_USER_PASSWORD", "secret")
37
+
38
+
39
+ app_config = settings.Environment
40
+ # config_logging()
41
+
42
+ TEXT_FILE_FORMATS = {"MD", "REPORT", "FORM", "HTML", "MERMAID", "LIST", "DICT", "JSON"}
43
+
44
+
45
+ def list_generic(
46
+ report_spec: str,
47
+ *,
48
+ output_format: str = "TABLE",
49
+ params: Dict[str, Any] | None = None,
50
+ view_server: str = app_config.egeria_view_server,
51
+ view_url: str = app_config.egeria_view_server_url,
52
+ user: str = EGERIA_USER,
53
+ user_pass: str = EGERIA_USER_PASSWORD,
54
+ jupyter: bool = app_config.egeria_jupyter,
55
+ width: int = app_config.console_width,
56
+ prompt_missing: bool = False,
57
+ write_file: bool = False,
58
+ render_table: bool = False,
59
+ table_caption: str | None = None,
60
+ use_pager: bool = True,
61
+ ) -> Dict[str, Any]:
62
+ """
63
+ Execute a report spec and return results, usable both as a library function and CLI.
64
+
65
+ Required vs Optional parameters are derived from the report spec's action:
66
+ - Required: fmt.action.required_params (or action.user_params) not supplied by spec_params.
67
+ - Optional: fmt.action.optional_params.
68
+
69
+ Behavior:
70
+ - If prompt_missing is True, will interactively Prompt.ask for any missing required params.
71
+ - If prompt_missing is False and required params are missing, raises ValueError.
72
+ - For output_format == "TABLE": returns a JSON payload for table rendering; no file I/O by default.
73
+ - If render_table=True, this function will also render a Rich table immediately (useful for remote/programmatic calls).
74
+ You can customize rendering via table_caption and use_pager.
75
+ - For narrative formats (MD, REPORT, FORM, MERMAID, LIST, HTML):
76
+ - If write_file=True, writes to outbox and returns the file path in the result.
77
+ - Otherwise returns the text content in the result.
78
+
79
+ Parameters (additional rendering options)
80
+ - render_table: bool (default False) — when True and output_format==TABLE, render the Rich table directly.
81
+ - table_caption: Optional[str] — custom caption; defaults to "View Server '{view_server}' @ Platform - {view_url}".
82
+ - use_pager: bool (default True) — wrap the table output in console.pager().
83
+
84
+ Returns a dict with keys like:
85
+ {"kind": "table"|"text"|"json"|"empty", "data"|"content", "file_path"?, "heading", "required", "optional", "rendered"?}
86
+ """
87
+ params = dict(params or {})
88
+ ofmt = (output_format or "TABLE").upper()
89
+
90
+ # Load format spec to introspect required/optional params
91
+ fmt = select_report_spec(report_spec, ofmt if ofmt not in {"TABLE", "MD", "FORM", "LIST"} else "DICT")
92
+ if not fmt:
93
+ raise ValueError(f"Report spec '{report_spec}' not found for format '{ofmt}'.")
94
+ action = fmt.get("action", {}) or {}
95
+ required_params = action.get("required_params", action.get("user_params", [])) or []
96
+ optional_params = action.get("optional_params", []) or []
97
+ spec_params = action.get("spec_params", {}) or {}
98
+
99
+ # Identify missing required params (not provided by caller and not satisfied by spec_params)
100
+ missing = [p for p in required_params if params.get(p) in (None, "") and p not in spec_params]
101
+
102
+ if missing:
103
+ if prompt_missing:
104
+ # Prompt user for each missing required param
105
+ for p in missing:
106
+ val = Prompt.ask(f"Enter value for required parameter '{p}'")
107
+ params[p] = val
108
+ else:
109
+ raise ValueError(f"Missing required parameter(s): {', '.join(missing)}")
110
+
111
+ # Map only TABLE to DICT for data retrieval; pass through other formats
112
+ # mapped_format = "DICT" if ofmt == "TABLE" else ofmt
113
+ mapped_format = ofmt
114
+ try:
115
+ # Execute
116
+ result = exec_report_spec(
117
+ report_spec,
118
+ output_format=mapped_format,
119
+ params=params,
120
+ view_server=view_server,
121
+ view_url=view_url,
122
+ user=user,
123
+ user_pass=user_pass,
124
+ )
125
+ except ValueError as e:
126
+ console = Console(
127
+ style="bold bright_white on black",
128
+ )
129
+ console.print(f"Error executing report: {e}")
130
+ sys.exit(1)
131
+
132
+ # Normalize/augment response
133
+ if result is None:
134
+ return {
135
+ "kind": "empty",
136
+ "heading": get_report_spec_heading(report_spec) or f"Report: {report_spec}",
137
+ "required": required_params,
138
+ "optional": optional_params,
139
+ }
140
+ if result.get("kind") == "empty":
141
+ return {
142
+ "kind": "empty",
143
+ "heading": get_report_spec_heading(report_spec) or f"Report: {report_spec}",
144
+ "required": required_params,
145
+ "optional": optional_params,
146
+ }
147
+
148
+ # For TABLE, optionally render Rich table and return json data for caller
149
+ if ofmt == "TABLE":
150
+ if result.get("kind") == "json":
151
+ heading = get_report_spec_heading(report_spec) or f"Report: {report_spec}"
152
+ data = result.get("data")
153
+ rendered = False
154
+ if render_table:
155
+ console = Console(
156
+ style="bold bright_white on black",
157
+ width=width,
158
+ force_terminal=not jupyter,
159
+ )
160
+ caption = table_caption or f"View Server '{view_server}' @ Platform - {view_url}"
161
+ _render_table(console, heading, caption, data, use_pager=use_pager)
162
+ rendered = True
163
+ return {
164
+ "kind": "table",
165
+ "heading": heading,
166
+ "data": data,
167
+ "required": required_params,
168
+ "optional": optional_params,
169
+ "rendered": rendered,
170
+ }
171
+ # Fallback: unexpected shape
172
+ return {
173
+ "kind": "unknown",
174
+ "raw": result,
175
+ "required": required_params,
176
+ "optional": optional_params,
177
+ }
178
+
179
+ # Narrative formats (all non-TABLE should generate files)
180
+ content: str = ""
181
+ if result.get("kind") == "text":
182
+ # Already-rendered text like Markdown or HTML
183
+ content = str(result.get("content", ""))
184
+ elif result.get("kind") == "json":
185
+ data = result.get("data")
186
+ # For DICT/JSON explicitly produce raw JSON text; otherwise fallback to fenced JSON
187
+ if ofmt in {"DICT", "JSON"}:
188
+ content = json.dumps(data, indent=2)
189
+ else:
190
+ content = "```json\n" + json.dumps(data, indent=2) + "\n```"
191
+ else:
192
+ content = json.dumps(result, indent=2, default=str)
193
+
194
+ if write_file or ofmt in TEXT_FILE_FORMATS:
195
+ # Determine suffix for file naming
196
+ suffix = ofmt
197
+ path = write_output_file(content, report_spec, suffix)
198
+ return {
199
+ "kind": "text" if ofmt not in {"DICT", "JSON"} else "json",
200
+ "content": content,
201
+ "file_path": path,
202
+ "heading": get_report_spec_heading(report_spec) or f"Report: {report_spec}",
203
+ "required": required_params,
204
+ "optional": optional_params,
205
+ }
206
+
207
+ return {
208
+ "kind": "text",
209
+ "content": content,
210
+ "heading": get_report_spec_heading(report_spec) or f"Report: {report_spec}",
211
+ "required": required_params,
212
+ "optional": optional_params,
213
+ }
214
+
215
+
216
+ def _flatten(item: Any, parent_key: str = "", sep: str = ".") -> Dict[str, Any]:
217
+ """Flatten nested dict-like objects into a single level using dot-notation keys."""
218
+ flat: Dict[str, Any] = {}
219
+ if isinstance(item, Mapping):
220
+ for k, v in item.items():
221
+ new_key = f"{parent_key}{sep}{k}" if parent_key else str(k)
222
+ flat.update(_flatten(v, new_key, sep))
223
+ elif isinstance(item, (list, tuple)):
224
+ # Represent short sequences inline; longer ones as counts
225
+ if len(item) <= 3:
226
+ flat[parent_key or "list"] = ", ".join([str(x) for x in item])
227
+ else:
228
+ flat[parent_key or "list"] = f"{len(item)} items"
229
+ else:
230
+ flat[parent_key or "value"] = item
231
+ return flat
232
+
233
+
234
+ def _collect_columns(rows: Sequence[Mapping[str, Any]], max_cols: int = 12) -> List[str]:
235
+ """Collect a union of keys across rows, up to max_cols, keeping a stable ordering."""
236
+ seen: List[str] = []
237
+ for row in rows:
238
+ for k in row.keys():
239
+ if k not in seen:
240
+ seen.append(k)
241
+ if len(seen) >= max_cols:
242
+ return seen
243
+ return seen
244
+
245
+
246
+ def _ensure_rows(data: Any) -> List[Mapping[str, Any]]:
247
+ """Convert result data into a list of row mappings suitable for table rendering."""
248
+ if data is None:
249
+ return []
250
+ if isinstance(data, list):
251
+ rows: List[Mapping[str, Any]] = []
252
+ for item in data:
253
+ if isinstance(item, Mapping):
254
+ rows.append(_flatten(item))
255
+ else:
256
+ rows.append({"value": item})
257
+ return rows
258
+ if isinstance(data, Mapping):
259
+ # If a single object contains a list-like 'elements' or similar, prefer that
260
+ for key in ("elements", "items", "results"):
261
+ if isinstance(data.get(key), list):
262
+ return _ensure_rows(data[key])
263
+ return [_flatten(data)]
264
+ # Fallback: scalar
265
+ return [{"value": data}]
266
+
267
+
268
+ def _render_table(console: Console, title: str, caption: str, data: Any, use_pager: bool = True) -> None:
269
+ rows = _ensure_rows(data)
270
+ if not rows:
271
+ console.print("No results found.")
272
+ return
273
+
274
+ columns = _collect_columns(rows)
275
+
276
+ table = Table(
277
+ title=title,
278
+ style="bright_white on black",
279
+ header_style="bright_white on dark_blue",
280
+ title_style="bold white on black",
281
+ caption_style="white on black",
282
+ show_lines=True,
283
+ box=box.ROUNDED,
284
+ caption=caption,
285
+ expand=True,
286
+ )
287
+ for col in columns:
288
+ table.add_column(str(col))
289
+
290
+ for row in rows:
291
+ table.add_row(*[str(row.get(col, "")) for col in columns])
292
+
293
+ # Page the table if it's large
294
+ if use_pager:
295
+ with console.pager():
296
+ console.print(table)
297
+ else:
298
+ console.print(table)
299
+
300
+
301
+ def write_output_file(content: str, report_spec: str, suffix: str) -> str:
302
+ # Base directory is outbox/report_spec specific folder
303
+ file_path = os.path.join(app_config.pyegeria_root, app_config.dr_egeria_outbox, f"{report_spec}")
304
+ ts = time.strftime("%Y-%m-%d-%H-%M-%S")
305
+ safe_spec = "".join(c for c in report_spec if c.isalnum() or c in ("-", "_", "+", ".", " ")).strip().replace(" ", "_")
306
+ # Determine extension by content type rules
307
+ if suffix in {"MD", "REPORT", "FORM", "MERMAID", "LIST"}:
308
+ ext = ".md"
309
+ elif suffix in {"HTML"}:
310
+ ext = ".html"
311
+ elif suffix in {"DICT", "JSON"}:
312
+ ext = ".json"
313
+ else:
314
+ ext = ".txt"
315
+ file_name = f"{safe_spec}-{ts}-{suffix}{ext}"
316
+ full_file_path = os.path.join(file_path, file_name)
317
+ os.makedirs(os.path.dirname(full_file_path), exist_ok=True)
318
+ with open(full_file_path, "w", encoding="utf-8") as f:
319
+ f.write(content)
320
+ return full_file_path
321
+
322
+
323
+ def main():
324
+ parser = argparse.ArgumentParser(description="Generic list command using exec_report_spec")
325
+ parser.add_argument("--report", dest="report_spec", help="Report spec name to execute (see report specs)")
326
+ parser.add_argument("--output-format", dest="output_format", default="TABLE",
327
+ choices=["TABLE", "MD", "REPORT", "FORM", "HTML", "MERMAID", "LIST", "JSON", "DICT"],
328
+ help="Output rendering format")
329
+ parser.add_argument("--server", dest="server", help="Egeria view server name", default=app_config.egeria_view_server)
330
+ parser.add_argument("--url", dest="url", help="Egeria platform URL", default=app_config.egeria_view_server_url)
331
+ parser.add_argument("--userid", dest="user", help="User Id", default=EGERIA_USER)
332
+ parser.add_argument("--password", dest="password", help="User Password", default=EGERIA_USER_PASSWORD)
333
+ # Allow arbitrary parameters as JSON or repeated key=value
334
+ parser.add_argument("--params-json", dest="params_json", help="JSON string of parameters for the report spec")
335
+ parser.add_argument("--param", dest="params_kv", action="append", default=[], help="Repeated key=value parameters")
336
+
337
+ args = parser.parse_args()
338
+
339
+ # Prompt for report spec if not provided
340
+ report_spec = args.report_spec or Prompt.ask("Enter the report spec to execute").strip()
341
+ output_format = (args.output_format or "TABLE").upper()
342
+
343
+ # Build params dict
344
+ params: Dict[str, Any] = {}
345
+ if args.params_json:
346
+ try:
347
+ parsed = json.loads(args.params_json)
348
+ if isinstance(parsed, dict):
349
+ params.update(parsed)
350
+ except Exception:
351
+ pass
352
+ for kv in (args.params_kv or []):
353
+ if "=" in kv:
354
+ k, v = kv.split("=", 1)
355
+ params[k.strip()] = v.strip()
356
+
357
+ console = Console(
358
+ style="bold bright_white on black",
359
+ width=app_config.console_width,
360
+ force_terminal=not app_config.egeria_jupyter,
361
+ )
362
+
363
+ try:
364
+ # Use shared function with prompting enabled for missing required params
365
+ write_file = output_format in TEXT_FILE_FORMATS
366
+ result = list_generic(report_spec, output_format=output_format, params=params, view_server=args.server,
367
+ view_url=args.url, user=args.user, user_pass=args.password, jupyter=app_config.egeria_jupyter,
368
+ width=app_config.console_width, prompt_missing=True, write_file=write_file)
369
+
370
+ if result.get("kind") == "empty":
371
+ console.print("No results found.")
372
+ return
373
+
374
+ if output_format == "TABLE":
375
+ heading = result.get("heading") or (get_report_spec_heading(report_spec) or f"Report: {report_spec}")
376
+ caption = f"View Server '{args.server}' @ Platform - {args.url}"
377
+ _render_table(console, heading, caption, result.get("data"))
378
+ return
379
+
380
+ # For narrative formats, either a file was written or content is returned
381
+ fpath = result.get("file_path")
382
+ if fpath:
383
+ print(f"\n==> Output written to {fpath}")
384
+ else:
385
+ print(result.get("content", ""))
386
+
387
+ except PyegeriaException as e:
388
+ print_exception_response(e)
389
+ except KeyboardInterrupt:
390
+ pass
391
+
392
+
393
+ if __name__ == "__main__":
394
+ main()