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
@@ -3,7 +3,6 @@ This file contains product manager commands for processing Egeria Markdown
3
3
  """
4
4
  import json
5
5
  import os
6
- import sys
7
6
  from typing import Optional
8
7
 
9
8
  from loguru import logger
@@ -12,14 +11,14 @@ from rich.console import Console
12
11
  from rich.markdown import Markdown
13
12
 
14
13
  from md_processing.md_processing_utils.common_md_proc_utils import (parse_upsert_command, parse_view_command)
15
- from md_processing.md_processing_utils.common_md_utils import update_element_dictionary, setup_log, set_update_body, \
16
- set_element_status_request_body, set_prop_body, set_delete_request_body, set_rel_request_body, set_peer_gov_def_request_body, \
17
- set_rel_request_body, set_create_body, set_collection_classifications, set_product_body
18
-
14
+ from md_processing.md_processing_utils.common_md_utils import update_element_dictionary, set_update_body, \
15
+ set_element_prop_body, set_delete_request_body, set_rel_request_body, set_create_body, set_object_classifications, \
16
+ set_product_body
19
17
  from md_processing.md_processing_utils.extraction_utils import (extract_command_plus, update_a_command)
20
- from md_processing.md_processing_utils.md_processing_constants import (load_commands, ERROR)
21
- from pyegeria import DEBUG_LEVEL, body_slimmer, to_pascal_case, PyegeriaException, print_basic_exception, print_exception_table
18
+ from md_processing.md_processing_utils.md_processing_constants import (load_commands)
19
+ from pyegeria import DEBUG_LEVEL, body_slimmer, PyegeriaException, print_basic_exception, print_exception_table
22
20
  from pyegeria.egeria_tech_client import EgeriaTech
21
+ from pyegeria.core.utils import make_format_set_name_from_type
23
22
 
24
23
  EGERIA_METADATA_STORE = os.environ.get("EGERIA_METADATA_STORE", "active-metadata-store")
25
24
  EGERIA_KAFKA_ENDPOINT = os.environ.get("KAFKA_ENDPOINT", "localhost:9092")
@@ -39,12 +38,12 @@ EGERIA_GLOSSARY_PATH = os.environ.get("EGERIA_GLOSSARY_PATH", None)
39
38
  EGERIA_ROOT_PATH = os.environ.get("EGERIA_ROOT_PATH", "../../")
40
39
  EGERIA_INBOX_PATH = os.environ.get("EGERIA_INBOX_PATH", "md_processing/dr_egeria_inbox")
41
40
  EGERIA_OUTBOX_PATH = os.environ.get("EGERIA_OUTBOX_PATH", "md_processing/dr_egeria_outbox")
41
+ LOCAL_QUALIFIER = os.environ.get("EGERIA_LOCAL_QUALIFIER", None)
42
42
 
43
43
  load_commands('commands.json')
44
44
  debug_level = DEBUG_LEVEL
45
45
 
46
46
  console = Console(width=int(200))
47
- setup_log()
48
47
 
49
48
 
50
49
  #
@@ -52,7 +51,7 @@ setup_log()
52
51
  #
53
52
  @logger.catch
54
53
  def add_member_to_collections(egeria_client: EgeriaTech, collection_list: list, display_name: str,
55
- guid: str) -> None:
54
+ guid: str) -> None:
56
55
  """
57
56
  Add member to data dictionaries and data specifications.
58
57
  """
@@ -60,8 +59,8 @@ def add_member_to_collections(egeria_client: EgeriaTech, collection_list: list,
60
59
  "class": "NewRelationshipRequestBody", "properties": {
61
60
  "class": "CollectionMembershipProperties", "membershipRationale": "User Specified",
62
61
  "notes": "Added by Dr.Egeria"
63
- }
64
62
  }
63
+ }
65
64
  try:
66
65
  if collection_list is not None:
67
66
  for collection in collection_list:
@@ -78,7 +77,7 @@ def add_member_to_collections(egeria_client: EgeriaTech, collection_list: list,
78
77
 
79
78
  @logger.catch
80
79
  def remove_member_from_collections(egeria_client: EgeriaTech, collection_list: list, display_name: str,
81
- guid: str) -> None:
80
+ guid: str) -> None:
82
81
  try:
83
82
  for collection in collection_list:
84
83
  egeria_client.remove_from_collection(collection, guid)
@@ -96,8 +95,8 @@ def update_data_collection_memberships(egeria_client: EgeriaTech, entity_type: s
96
95
  replace_all_props: bool = True) -> None:
97
96
  """ update the collection membership of the element
98
97
 
99
- If replace_all_props is set to True, all existing memberships are removed and new memberships are added.
100
- If replace_all_props is set to False, only the new memberships are added.
98
+ If merge_update is set to True, all existing memberships are removed and new memberships are added.
99
+ If merge_update is set to False, only the new memberships are added.
101
100
  """
102
101
 
103
102
  if replace_all_props:
@@ -170,16 +169,30 @@ def process_collection_upsert_command(egeria_client: EgeriaTech, txt: str, direc
170
169
  exists = parsed_output['exists']
171
170
 
172
171
  qualified_name = parsed_output.get('qualified_name', None)
173
- guid = parsed_output.get('guid', None)
174
172
 
175
- print(Markdown(parsed_output['display']))
173
+ guid = parsed_output.get('guid', None)
176
174
 
177
175
  logger.debug(json.dumps(parsed_output, indent=4))
178
176
 
179
177
  attributes = parsed_output['attributes']
180
178
 
181
179
  display_name = attributes['Display Name'].get('value', None)
180
+ version = attributes['Version Identifier'].get('value', None)
182
181
  status = attributes.get('Status', {}).get('value', None)
182
+ output_set = make_format_set_name_from_type(object_type)
183
+ if object_type in ["Root Collection", "Folder"]:
184
+ obj = "Collection"
185
+ if object_type == "Folder":
186
+ qn_prefix = "Folder"
187
+ elif object_type == "Root Collection":
188
+ qn_prefix = "Root"
189
+
190
+ qualified_name = egeria_client.__create_qualified_name__(qn_prefix, display_name, LOCAL_QUALIFIER,
191
+ version_identifier=version)
192
+
193
+ else:
194
+ obj = object_type
195
+ print(Markdown(parsed_output['display']))
183
196
 
184
197
  if directive == "display":
185
198
 
@@ -193,10 +206,6 @@ def process_collection_upsert_command(egeria_client: EgeriaTech, txt: str, direc
193
206
 
194
207
  elif directive == "process":
195
208
  try:
196
- if object_type in ["Root Collection", "Folder"]:
197
- obj = "Collection"
198
- else:
199
- obj = object_type
200
209
 
201
210
  if object_action == "Update":
202
211
  if not exists:
@@ -209,10 +218,10 @@ def process_collection_upsert_command(egeria_client: EgeriaTech, txt: str, direc
209
218
  else:
210
219
  print(Markdown(
211
220
  f"==> Validation of `{command}` completed successfully! Proceeding to apply the changes.\n"))
212
- prop_body = set_prop_body(obj,qualified_name,attributes)
221
+ prop_body = set_element_prop_body(obj, qualified_name, attributes)
213
222
 
214
223
  body = set_update_body(obj, attributes)
215
- body['properties'] = set_prop_body(obj,qualified_name,attributes)
224
+ body['properties'] = set_element_prop_body(obj, qualified_name, attributes)
216
225
 
217
226
  egeria_client.update_collection(guid, body)
218
227
  if status:
@@ -221,9 +230,9 @@ def process_collection_upsert_command(egeria_client: EgeriaTech, txt: str, direc
221
230
  logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
222
231
  update_element_dictionary(qualified_name, {
223
232
  'guid': guid, 'display_name': display_name
224
- })
225
- return egeria_client.get_collection_by_guid(guid, element_type='Data Specification',
226
- output_format='MD')
233
+ })
234
+ return egeria_client.get_collection_by_guid(guid, element_type=obj,
235
+ output_format='MD', report_spec=output_set)
227
236
 
228
237
 
229
238
  elif object_action == "Create":
@@ -234,21 +243,29 @@ def process_collection_upsert_command(egeria_client: EgeriaTech, txt: str, direc
234
243
  return update_a_command(txt, object_action, object_type, qualified_name, guid)
235
244
 
236
245
  else:
237
- body = set_create_body(object_type,attributes)
246
+ body = set_create_body(object_type, attributes)
238
247
 
239
248
  # if this is a root or folder (maybe more in the future), then make sure that the classification is set.
240
- body["initialClassifications"] = set_collection_classifications(object_type, attributes, ["Folder", "Root Collection"])
241
- body["properties"] = set_prop_body(obj, qualified_name,attributes)
242
-
243
-
244
- guid = egeria_client.create_collection(body = body)
249
+ body["initialClassifications"] = set_object_classifications(object_type, attributes,
250
+ ["Folder", "Root Collection"])
251
+ body["properties"] = set_element_prop_body(obj, qualified_name, attributes)
252
+ parent_guid = body.get('parentGuid', None)
253
+ if parent_guid:
254
+ body['parentRelationshipTypeName'] = "CollectionMembership"
255
+ body['parentAtEnd1'] = True
256
+
257
+ guid = egeria_client.create_collection(body=body)
245
258
  if guid:
246
259
  update_element_dictionary(qualified_name, {
247
260
  'guid': guid, 'display_name': display_name
248
- })
249
- msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
261
+ })
262
+ msg = f"\nCreated Element `{display_name}` with GUID {guid}\n\n___"
263
+ # todo - add the source member asset to the product manager
264
+ # create_elem_from_template
265
+ # add this guid to the product collection
250
266
  logger.success(msg)
251
- return egeria_client.get_collection_by_guid(guid, obj, output_format='MD')
267
+ return egeria_client.get_collection_by_guid(guid, obj, output_format='MD',
268
+ report_spec=output_set)
252
269
  else:
253
270
  msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
254
271
  logger.error(msg)
@@ -263,8 +280,10 @@ def process_collection_upsert_command(egeria_client: EgeriaTech, txt: str, direc
263
280
  else:
264
281
  return None
265
282
 
283
+
266
284
  @logger.catch
267
- def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
285
+ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
286
+ directive: str = "display") -> Optional[str]:
268
287
  """
269
288
  Processes a digital product create or update object_action by extracting key attributes such as
270
289
  spec name, parent_guid, parent_relationship_type, parent_at_end_1, category
@@ -286,7 +305,6 @@ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
286
305
  qualified_name = parsed_output.get('qualified_name', None)
287
306
  guid = parsed_output.get('guid', None)
288
307
 
289
-
290
308
  print(Markdown(parsed_output['display']))
291
309
 
292
310
  logger.debug(json.dumps(parsed_output, indent=4))
@@ -294,8 +312,9 @@ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
294
312
  attributes = parsed_output['attributes']
295
313
 
296
314
  display_name = attributes['Display Name'].get('value', None)
297
- product_manager = attributes.get('Product Manager',{}).get('value', None)
298
- product_status = attributes.get('Product Status',{}).get('value', None)
315
+ product_manager = attributes.get('Product Manager', {}).get('value', None)
316
+ product_status = attributes.get('Product Status', {}).get('value', None)
317
+ output_set = make_format_set_name_from_type(object_type)
299
318
 
300
319
  if directive == "display":
301
320
 
@@ -308,6 +327,7 @@ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
308
327
  return valid
309
328
 
310
329
  elif directive == "process":
330
+
311
331
  try:
312
332
  prop_body = set_product_body(object_type, qualified_name, attributes)
313
333
 
@@ -331,13 +351,12 @@ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
331
351
  # if product_status:
332
352
  # egeria_client.update_digital_product_status(guid, product_status)
333
353
 
334
-
335
354
  logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
336
355
  update_element_dictionary(qualified_name, {
337
356
  'guid': guid, 'display_name': display_name
338
- })
357
+ })
339
358
  return egeria_client.get_collection_by_guid(guid, element_type='Digital Product',
340
- output_format='MD')
359
+ output_format='MD', report_spec=output_set)
341
360
 
342
361
 
343
362
  elif object_action == "Create":
@@ -349,7 +368,7 @@ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
349
368
 
350
369
  else:
351
370
  body = set_create_body(object_type, attributes)
352
- body["initialClassifications"] = set_collection_classifications(object_type, attributes,[])
371
+ body["initialClassifications"] = set_object_classifications(object_type, attributes, [])
353
372
 
354
373
  body["properties"] = prop_body
355
374
 
@@ -357,13 +376,13 @@ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
357
376
  if guid:
358
377
  update_element_dictionary(qualified_name, {
359
378
  'guid': guid, 'display_name': display_name
360
- })
379
+ })
361
380
  # Todo: Add product manager link later? Agreements?
362
381
 
363
382
  msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
364
383
  logger.success(msg)
365
384
  return egeria_client.get_collection_by_guid(guid, element_type='Digital Product',
366
- output_format='MD')
385
+ output_format='MD', report_spec=output_set)
367
386
  else:
368
387
  msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
369
388
  logger.error(msg)
@@ -375,6 +394,120 @@ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
375
394
  else:
376
395
  return None
377
396
 
397
+ # @logger.catch
398
+ # def process_digital_product_catalog_upsert_command(egeria_client: EgeriaTech, txt: str,
399
+ # directive: str = "display") -> Optional[str]:
400
+ # """
401
+ # Processes a digital product catalog create or update object_action by extracting key attributes such as
402
+ # spec name, parent_guid, parent_relationship_type, parent_at_end_1, category
403
+ #
404
+ # :param txt: A string representing the input cell to be processed for
405
+ # extracting glossary-related attributes.
406
+ # :param directive: an optional string indicating the directive to be used - display, validate or execute
407
+ # :return: A string summarizing the outcome of the processing.
408
+ # """
409
+ #
410
+ # command, object_type, object_action = extract_command_plus(txt)
411
+ # print(Markdown(f"# {command}\n"))
412
+ #
413
+ # parsed_output = parse_upsert_command(egeria_client, object_type, object_action, txt, directive)
414
+ #
415
+ # valid = parsed_output['valid']
416
+ # exists = parsed_output['exists']
417
+ #
418
+ # qualified_name = parsed_output.get('qualified_name', None)
419
+ # guid = parsed_output.get('guid', None)
420
+ #
421
+ # print(Markdown(parsed_output['display']))
422
+ #
423
+ # logger.debug(json.dumps(parsed_output, indent=4))
424
+ #
425
+ # attributes = parsed_output['attributes']
426
+ #
427
+ # display_name = attributes['Display Name'].get('value', None)
428
+ #
429
+ # output_set = make_format_set_name_from_type(object_type)
430
+ #
431
+ # if directive == "display":
432
+ #
433
+ # return None
434
+ # elif directive == "validate":
435
+ # if valid:
436
+ # print(Markdown(f"==> Validation of {command} completed successfully!\n"))
437
+ # else:
438
+ # msg = f"Validation failed for object_action `{command}`\n"
439
+ # return valid
440
+ #
441
+ # elif directive == "process":
442
+ # try:
443
+ # prop_body = set_product_body(object_type, qualified_name, attributes)
444
+ #
445
+ # if object_action == "Update":
446
+ # if not exists:
447
+ # msg = (f" Element `{display_name}` does not exist! Updating result document with Create "
448
+ # f"object_action\n")
449
+ # logger.error(msg)
450
+ # return update_a_command(txt, object_action, object_type, qualified_name, guid)
451
+ # elif not valid:
452
+ # return None
453
+ # else:
454
+ # print(Markdown(
455
+ # f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
456
+ #
457
+ # body = set_update_body(object_type, attributes)
458
+ # body['properties'] = prop_body
459
+ # # Todo: Update product manager later?
460
+ #
461
+ # egeria_client.update_digital_product(guid, body)
462
+ # # if product_status:
463
+ # # egeria_client.update_digital_product_status(guid, product_status)
464
+ #
465
+ # logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
466
+ # update_element_dictionary(qualified_name, {
467
+ # 'guid': guid, 'display_name': display_name
468
+ # })
469
+ # return egeria_client.get_collection_by_guid(guid, element_type='Digital Product',
470
+ # output_format='MD', report_spec=output_set)
471
+ #
472
+ #
473
+ # elif object_action == "Create":
474
+ # if valid is False and exists:
475
+ # msg = (
476
+ # f" Digital Product `{display_name}` already exists and result document updated changing "
477
+ # f"`Create` to `Update` in processed output\n\n___")
478
+ # logger.error(msg)
479
+ # return update_a_command(txt, object_action, object_type, qualified_name, guid)
480
+ #
481
+ # else:
482
+ # body = set_create_body(object_type, attributes)
483
+ # body["initialClassifications"] = set_object_classifications(object_type, attributes, [])
484
+ #
485
+ # body["properties"] = prop_body
486
+ #
487
+ # guid = egeria_client.create_digital_product(body_slimmer(body))
488
+ # if guid:
489
+ # update_element_dictionary(qualified_name, {
490
+ # 'guid': guid, 'display_name': display_name
491
+ # })
492
+ # # Todo: Add product manager link later? Agreements?
493
+ #
494
+ # msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
495
+ # logger.success(msg)
496
+ # return egeria_client.get_collection_by_guid(guid, element_type='Digital Product',
497
+ # output_format='MD',
498
+ # report_spec=output_set)
499
+ # else:
500
+ # msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
501
+ # logger.error(msg)
502
+ # return None
503
+ #
504
+ # except Exception as e:
505
+ # logger.error(f"Error performing {command}: {e}")
506
+ # return None
507
+ # else:
508
+ # return None
509
+
510
+
378
511
  @logger.catch
379
512
  def process_agreement_upsert_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
380
513
  """
@@ -408,6 +541,7 @@ def process_agreement_upsert_command(egeria_client: EgeriaTech, txt: str, direct
408
541
 
409
542
  display_name = attributes['Display Name'].get('value', None)
410
543
  status = attributes.get('Status', {}).get('value', None)
544
+ output_set = make_format_set_name_from_type(object_type)
411
545
 
412
546
  if directive == "display":
413
547
 
@@ -437,10 +571,10 @@ def process_agreement_upsert_command(egeria_client: EgeriaTech, txt: str, direct
437
571
  else:
438
572
  print(Markdown(
439
573
  f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
440
- prop_body = set_prop_body(obj, qualified_name, attributes)
574
+ prop_body = set_element_prop_body(obj, qualified_name, attributes)
441
575
 
442
576
  body = set_update_body(object_type, attributes)
443
- body['properties'] = set_prop_body(object_type, qualified_name, attributes)
577
+ body['properties'] = set_element_prop_body(object_type, qualified_name, attributes)
444
578
 
445
579
  egeria_client.update_agreement(guid, body)
446
580
  # if status is not None and status !={}:
@@ -449,9 +583,9 @@ def process_agreement_upsert_command(egeria_client: EgeriaTech, txt: str, direct
449
583
  logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
450
584
  update_element_dictionary(qualified_name, {
451
585
  'guid': guid, 'display_name': display_name
452
- })
586
+ })
453
587
  return egeria_client.get_collection_by_guid(guid, element_type='Data Specification',
454
- output_format='MD')
588
+ output_format='MD', report_spec=output_set)
455
589
 
456
590
 
457
591
  elif object_action == "Create":
@@ -465,18 +599,19 @@ def process_agreement_upsert_command(egeria_client: EgeriaTech, txt: str, direct
465
599
  body = set_create_body(object_type, attributes)
466
600
 
467
601
  # if this is a root or folder (maybe more in the future), then make sure that the classification is set.
468
- body["initialClassifications"] = set_collection_classifications(object_type, attributes,
469
- ["Data Sharing Agreement"])
470
- body["properties"] = set_prop_body(obj, qualified_name, attributes)
602
+ body["initialClassifications"] = set_object_classifications(object_type, attributes,
603
+ ["Data Sharing Agreement"])
604
+ body["properties"] = set_element_prop_body(obj, qualified_name, attributes)
471
605
 
472
606
  guid = egeria_client.create_agreement(body=body)
473
607
  if guid:
474
608
  update_element_dictionary(qualified_name, {
475
609
  'guid': guid, 'display_name': display_name
476
- })
610
+ })
477
611
  msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
478
612
  logger.success(msg)
479
- return egeria_client.get_collection_by_guid(guid, obj, output_format='MD')
613
+ return egeria_client.get_collection_by_guid(guid, obj, output_format='MD',
614
+ report_spec=output_set)
480
615
  else:
481
616
  msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
482
617
  logger.error(msg)
@@ -492,7 +627,107 @@ def process_agreement_upsert_command(egeria_client: EgeriaTech, txt: str, direct
492
627
  return None
493
628
 
494
629
 
630
+ @logger.catch
631
+ def process_csv_element_upsert_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[
632
+ str]:
633
+ """
634
+ Processes a create CSV element command by extracting key attributes and calling the pyegeria
635
+ api that creates a csv element from template.
636
+
637
+ :param txt: A string representing the input cell to be processed for
638
+ extracting glossary-related attributes.
639
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
640
+ :return: A string summarizing the outcome of the processing.
641
+ """
642
+ command, object_type, object_action = extract_command_plus(txt)
643
+ print(Markdown(f"# {command}\n"))
644
+
645
+ parsed_output = parse_upsert_command(egeria_client, object_type, object_action, txt, directive)
646
+ if not parsed_output:
647
+ logger.error(f"No output for `{object_action}`")
648
+ return None
649
+
650
+ valid = parsed_output['valid']
651
+ exists = parsed_output['exists']
652
+
653
+ qualified_name = parsed_output.get('qualified_name', None)
654
+ guid = parsed_output.get('guid', None)
655
+
656
+ print(Markdown(parsed_output['display']))
657
+
658
+ logger.debug(json.dumps(parsed_output, indent=4))
659
+
660
+ attributes = parsed_output['attributes']
661
+
662
+ display_name = attributes['Display Name'].get('value', None)
663
+ status = attributes.get('Status', {}).get('value', None)
664
+ output_set = make_format_set_name_from_type(object_type)
665
+
666
+ file_name = attributes.get('File Name', {}).get('value', None)
667
+ file_type = attributes.get('File Type', {}).get('value', None)
668
+ file_path = attributes.get('File Path', {}).get('value', None)
669
+ file_encoding = attributes.get('File Encoding', {}).get('value', 'UTF-8')
670
+ file_extension = attributes.get('File Extension', {}).get('value', 'csv')
671
+ file_system_name = attributes.get('File System Name', {}).get('value', None)
672
+ version_identifier = attributes.get('Version Identifier', {}).get('value', None)
673
+ description = attributes.get('Description', {}).get('value', None)
674
+
675
+ if directive == "display":
676
+
677
+ return None
678
+ elif directive == "validate":
679
+ if valid:
680
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
681
+ else:
682
+ msg = f"Validation failed for object_action `{command}`\n"
683
+ return valid
684
+
685
+ elif directive == "process":
686
+ try:
687
+
688
+ if object_action == "Create":
689
+ if valid is False and exists:
690
+ msg = (f" Element `{display_name}` already exists and result document updated changing "
691
+ f"`Create` to `Update` in processed output\n\n___")
692
+ logger.error(msg)
693
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
694
+
695
+ else:
696
+ guid = egeria_client.get_create_csv_data_file_element_from_template(
697
+ file_name, file_type, file_path, version_identifier, file_encoding, file_extension,
698
+ file_system_name, description)
699
+
700
+ if guid:
701
+ update_element_dictionary(qualified_name, {
702
+ 'guid': guid, 'display_name': display_name
703
+ })
704
+ msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
705
+ logger.success(msg)
706
+ output_md = (f"# Create CSV File\n\n## Display Name:\n\n {display_name}\n\n"
707
+ f"## File Type:\n\n {file_type}\n\n## File Path:\n\n {file_path}\n\n"
708
+ f"## File Encoding:\n\n {file_encoding}\n\n## File Extension:\n\n {file_extension}\n\n"
709
+ f"## File System Name:\n\n {file_system_name}\n\n## Version Identifier:\n\n {version_identifier}\n\n"
710
+ f"## Description:\n\n {description}\n\n"
711
+ f"## Qualified Name\n\n {qualified_name}\n\n"
712
+ f"## GUID:\n\n {guid}\n\n"
713
+ )
714
+ return output_md
715
+ else:
716
+ msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
717
+ logger.error(msg)
718
+ return None
719
+ else:
720
+ logger.error(f"Currently only the Create action is supported for this command: {command}")
495
721
 
722
+ except PyegeriaException as e:
723
+ logger.error(f"Pyegeria error performing {command}: {e}")
724
+ print_exception_table(e)
725
+ return None
726
+ except Exception as e:
727
+ logger.error(f"Error performing {command}: {e}")
728
+ else:
729
+ logger.error(f"Invalid directive `{directive}`")
730
+ return None
496
731
 
497
732
 
498
733
  def process_link_agreement_item_command(egeria_client: EgeriaTech, txt: str,
@@ -515,16 +750,15 @@ def process_link_agreement_item_command(egeria_client: EgeriaTech, txt: str,
515
750
  logger.debug(json.dumps(parsed_output, indent=4))
516
751
 
517
752
  attributes = parsed_output['attributes']
518
- agreement = attributes.get('Agreement Name',{}).get('value', None)
753
+ agreement = attributes.get('Agreement Name', {}).get('value', None)
519
754
  agreement_guid = attributes.get('Agreement Name', {}).get('guid', None)
520
- item = attributes.get('Item Name',{}).get('value', None)
755
+ item = attributes.get('Item Name', {}).get('value', None)
521
756
  item_guid = attributes.get('Item Name', {}).get('guid', None)
522
757
  label = attributes.get('Link Label', {}).get('value', None)
523
758
  description = attributes.get('Description', {}).get('value', None)
524
759
 
525
760
  valid = parsed_output['valid']
526
- exists = agreement_guid is not None and item_guid is not None
527
-
761
+ exists = agreement_guid is not None and item_guid is not None
528
762
 
529
763
  if directive == "display":
530
764
 
@@ -553,7 +787,7 @@ def process_link_agreement_item_command(egeria_client: EgeriaTech, txt: str,
553
787
  f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
554
788
  body = set_delete_request_body(object_type, attributes)
555
789
 
556
- egeria_client.detach_agreement_item(agreement_guid, item_guid,body)
790
+ egeria_client.detach_agreement_item(agreement_guid, item_guid, body)
557
791
 
558
792
  logger.success(f"===> Detached agreement item `{item}` from agreement `{agreement}`\n")
559
793
  out = parsed_output['display'].replace('Unlink', 'Link', 1)
@@ -575,21 +809,21 @@ def process_link_agreement_item_command(egeria_client: EgeriaTech, txt: str,
575
809
  body = set_rel_request_body(object_type, attributes)
576
810
  item_props = {
577
811
  "class": "AgreementItemProperties",
578
- "agreementItemId": attributes.get("Agreement Item Id",{}).get("value", None),
579
- "agreementItemTypeName": attributes.get("Agreement Item Type",{}).get("value", None),
580
- "agreementStart": attributes.get("Agreement Start",{}).get("value", None),
581
- "agreementEnd": attributes.get("Agreement End",{}).get("value", None),
582
- "restrictions": attributes.get("Restrictions",{}).get("value", None),
583
- "obligations": attributes.get("Obligations",{}).get("value", None),
584
- "entitlements": attributes.get("Entitlements",{}).get("value", None),
585
- "usageMeasurements": attributes.get("Usage Measurements",{}).get("value", None),
586
- "effectiveFrom": attributes.get("Effective From",{}).get("value", None),
587
- "effectiveTo": attributes.get("Effective To",{}).get("value", None)
812
+ "agreementItemId": attributes.get("Agreement Item Id", {}).get("value", None),
813
+ "agreementItemTypeName": attributes.get("Agreement Item Type", {}).get("value", None),
814
+ "agreementStart": attributes.get("Agreement Start", {}).get("value", None),
815
+ "agreementEnd": attributes.get("Agreement End", {}).get("value", None),
816
+ "restrictions": attributes.get("Restrictions", {}).get("value", None),
817
+ "obligations": attributes.get("Obligations", {}).get("value", None),
818
+ "entitlements": attributes.get("Entitlements", {}).get("value", None),
819
+ "usageMeasurements": attributes.get("Usage Measurements", {}).get("value", None),
820
+ "effectiveFrom": attributes.get("Effective From", {}).get("value", None),
821
+ "effectiveTo": attributes.get("Effective To", {}).get("value", None)
588
822
 
589
823
  }
590
824
  body['properties'] = item_props
591
825
  egeria_client.link_agreement_item(agreement_guid,
592
- item_guid, body)
826
+ item_guid, body)
593
827
  msg = f"==>Linked {object_type} `{agreement} to item {item}\n"
594
828
  logger.success(msg)
595
829
  out = parsed_output['display'].replace('Link', 'Detach', 1)
@@ -602,8 +836,9 @@ def process_link_agreement_item_command(egeria_client: EgeriaTech, txt: str,
602
836
  else:
603
837
  return None
604
838
 
839
+
605
840
  def process_add_to_collection_command(egeria_client: EgeriaTech, txt: str,
606
- directive: str = "display") -> Optional[str]:
841
+ directive: str = "display") -> Optional[str]:
607
842
  """
608
843
  Processes a link or unlink command to add or remove a member to/from a collection..
609
844
 
@@ -622,9 +857,9 @@ def process_add_to_collection_command(egeria_client: EgeriaTech, txt: str,
622
857
  logger.debug(json.dumps(parsed_output, indent=4))
623
858
 
624
859
  attributes = parsed_output['attributes']
625
- element_guid = attributes.get('Element Id',{}).get('guid', None)
860
+ element_guid = attributes.get('Element Id', {}).get('guid', None)
626
861
  collection_guid = attributes.get('Collection Id', {}).get('guid', None)
627
- membership_rationale = attributes.get('Membership Rationale',{}).get('value', None)
862
+ membership_rationale = attributes.get('Membership Rationale', {}).get('value', None)
628
863
  expression = attributes.get('Expression', {}).get('value', None)
629
864
  confidence = attributes.get('Confidence', {}).get('value', None)
630
865
  membership_status = attributes.get('Membership Status', {}).get('value', None)
@@ -637,10 +872,9 @@ def process_add_to_collection_command(egeria_client: EgeriaTech, txt: str,
637
872
  glossary_term = attributes.get('Glossary Term', {}).get('value', None)
638
873
  journal_entry = attributes.get('Journal Entry', {}).get('value', None)
639
874
 
640
-
641
875
  valid = parsed_output['valid']
642
- exists = agreement_guid is not None and item_guid is not None
643
-
876
+ # exists = agreement_guid is not None and item_guid is not None
877
+ exists = collection_guid is not None and element_guid is not None
644
878
 
645
879
  if directive == "display":
646
880
 
@@ -654,7 +888,7 @@ def process_add_to_collection_command(egeria_client: EgeriaTech, txt: str,
654
888
 
655
889
  elif directive == "process":
656
890
  prop_body = {
657
- "class" : "CollectionMembershipProperties",
891
+ "class": "CollectionMembershipProperties",
658
892
  "membershipRationale": membership_rationale,
659
893
  "expression": expression,
660
894
  "membershipStatus": membership_status,
@@ -665,9 +899,10 @@ def process_add_to_collection_command(egeria_client: EgeriaTech, txt: str,
665
899
  "stewardPropertyName": steward_property_name,
666
900
  "source": source,
667
901
  "notes": notes,
668
- }
902
+ }
903
+ label = "Add Member"
669
904
  try:
670
- if object_action == "Detach":
905
+ if object_action in ["Detach", "Unlink", "Remove"]:
671
906
  if not exists:
672
907
  msg = (f" Link `{label}` does not exist! Updating result document with Link "
673
908
  f"object_action\n")
@@ -681,14 +916,18 @@ def process_add_to_collection_command(egeria_client: EgeriaTech, txt: str,
681
916
  f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
682
917
  body = set_delete_request_body(object_type, attributes)
683
918
 
684
- egeria_client.remove_from_collection(collection_guid, element_guid,body)
919
+ egeria_client.remove_from_collection(collection_guid, element_guid, body)
685
920
 
686
921
  logger.success(f"===> Detached element `{element_guid}` from collection `{collection_guid}`\n")
687
922
  out = parsed_output['display'].replace('Unlink', 'Link', 1)
688
923
 
689
924
  return (out)
690
925
 
691
- elif object_action == "Link":
926
+ elif object_action in ["Link", "Add", "Attach"]:
927
+ if valid is False and exists:
928
+ msg = (f"--> Link called `{label}` already exists and result document updated changing "
929
+ f"`Link` to `Detach` in processed output\n")
930
+ logger.error(msg)
692
931
  if valid is False and exists:
693
932
  msg = (f"--> Link called `{label}` already exists and result document updated changing "
694
933
  f"`Link` to `Detach` in processed output\n")
@@ -703,8 +942,9 @@ def process_add_to_collection_command(egeria_client: EgeriaTech, txt: str,
703
942
  body = set_rel_request_body(object_type, attributes)
704
943
 
705
944
  body['properties'] = prop_body
945
+ body = body_slimmer(body)
706
946
  egeria_client.add_to_collection(collection_guid,
707
- element_guid, body)
947
+ element_guid, body)
708
948
  msg = f"==>Linked `{element_guid}` to collection `{collection_guid}` \n"
709
949
  logger.success(msg)
710
950
  out = parsed_output['display'].replace('Link', 'Detach', 1)
@@ -717,8 +957,9 @@ def process_add_to_collection_command(egeria_client: EgeriaTech, txt: str,
717
957
  else:
718
958
  return None
719
959
 
960
+
720
961
  def process_product_dependency_command(egeria_client: EgeriaTech, txt: str,
721
- directive: str = "display") -> Optional[str]:
962
+ directive: str = "display") -> Optional[str]:
722
963
  """
723
964
  Processes a link or unlink command to associate or break up a dependency between digital products..
724
965
 
@@ -739,15 +980,13 @@ def process_product_dependency_command(egeria_client: EgeriaTech, txt: str,
739
980
  attributes = parsed_output['attributes']
740
981
  digital_product1_guid = attributes.get('Digital Product 1', None)
741
982
  digital_product2_guid = attributes.get('Digital Product 2', None)
742
- label = attributes.get('Label',{}).get('value', None)
983
+ label = attributes.get('Label', {}).get('value', None)
743
984
  description = attributes.get('Description', {}).get('value', None)
744
985
  effective_from = attributes.get('Effective From', {}).get('value', None)
745
986
  effective_to = attributes.get('Effective To', {}).get('value', None)
746
987
 
747
-
748
988
  valid = parsed_output['valid']
749
- exists = agreement_guid is not None and item_guid is not None
750
-
989
+ exists = digital_product1_guid is not None and digital_product2_guid is not None
751
990
 
752
991
  if directive == "display":
753
992
 
@@ -761,12 +1000,12 @@ def process_product_dependency_command(egeria_client: EgeriaTech, txt: str,
761
1000
 
762
1001
  elif directive == "process":
763
1002
  prop_body = {
764
- "class" : "DigitalProductDependencyProperties",
1003
+ "class": "DigitalProductDependencyProperties",
765
1004
  "label": label,
766
1005
  "description": description,
767
1006
  "effectiveFrom": effective_from,
768
1007
  "effectiveTo": effective_to
769
- }
1008
+ }
770
1009
 
771
1010
  try:
772
1011
  if object_action == "Detach":
@@ -783,9 +1022,10 @@ def process_product_dependency_command(egeria_client: EgeriaTech, txt: str,
783
1022
  f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
784
1023
  body = set_delete_request_body(object_type, attributes)
785
1024
 
786
- egeria_client.detach_digital_product_dependency(digital_product1_guid, digital_product2_guid,body)
1025
+ egeria_client.detach_digital_product_dependency(digital_product1_guid, digital_product2_guid, body)
787
1026
 
788
- logger.success(f"===> Detached dependency between products `{digital_product1_guid}` and `{digital_product2_guid}`\n")
1027
+ logger.success(
1028
+ f"===> Detached dependency between products `{digital_product1_guid}` and `{digital_product2_guid}`\n")
789
1029
  out = parsed_output['display'].replace('Unlink', 'Link', 1)
790
1030
 
791
1031
  return (out)
@@ -806,7 +1046,7 @@ def process_product_dependency_command(egeria_client: EgeriaTech, txt: str,
806
1046
 
807
1047
  body['properties'] = prop_body
808
1048
  egeria_client.link_digital_product_dependency(digital_product1_guid,
809
- digital_product2_guid, body)
1049
+ digital_product2_guid, body)
810
1050
  msg = f"==>Linked dependency from digital product `{digital_product1_guid}` to product `{digital_product2_guid}` \n"
811
1051
  logger.success(msg)
812
1052
  out = parsed_output['display'].replace('Link', 'Detach', 1)
@@ -819,8 +1059,9 @@ def process_product_dependency_command(egeria_client: EgeriaTech, txt: str,
819
1059
  else:
820
1060
  return None
821
1061
 
1062
+
822
1063
  def process_attach_collection_command(egeria_client: EgeriaTech, txt: str,
823
- directive: str = "display") -> Optional[str]:
1064
+ directive: str = "display") -> Optional[str]:
824
1065
  """
825
1066
  Processes a link or unlink command to attach a collection to a resources.
826
1067
 
@@ -847,10 +1088,8 @@ def process_attach_collection_command(egeria_client: EgeriaTech, txt: str,
847
1088
  effective_from = attributes.get('Effective From', {}).get('value', None)
848
1089
  effective_to = attributes.get('Effective To', {}).get('value', None)
849
1090
 
850
-
851
1091
  valid = parsed_output['valid']
852
- exists = agreement_guid is not None and item_guid is not None
853
-
1092
+ exists = collection_guid is not None and resource_guid is not None
854
1093
 
855
1094
  if directive == "display":
856
1095
 
@@ -864,18 +1103,18 @@ def process_attach_collection_command(egeria_client: EgeriaTech, txt: str,
864
1103
 
865
1104
  elif directive == "process":
866
1105
  prop_body = {
867
- "class" : "ResourceListProperties",
1106
+ "class": "ResourceListProperties",
868
1107
  "resourceUse": resource_use,
869
1108
  "resourceDescription": resource_description,
870
1109
  "resourceProperties": resource_properties,
871
1110
  "effectiveFrom": effective_from,
872
1111
  "effectiveTo": effective_to
873
- }
1112
+ }
874
1113
 
875
1114
  try:
876
1115
  if object_action == "Detach":
877
1116
  if not exists:
878
- msg = (f" Link `{label}` does not exist! Updating result document with Link "
1117
+ msg = (f" Link `Attach Resource to Collection` does not exist! Updating result document with Link "
879
1118
  f"object_action\n")
880
1119
  logger.error(msg)
881
1120
  out = parsed_output['display'].replace('Link', 'Detach', 1)
@@ -887,21 +1126,23 @@ def process_attach_collection_command(egeria_client: EgeriaTech, txt: str,
887
1126
  f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
888
1127
  body = set_delete_request_body(object_type, attributes)
889
1128
 
890
- egeria_client.detach_collection(resource_guid, collection_guid,body)
1129
+ egeria_client.detach_collection(resource_guid, collection_guid, body)
891
1130
 
892
- logger.success(f"===> Detached linkage between resource `{resource_guid}` and collection`{collection_guid}`\n")
1131
+ logger.success(
1132
+ f"===> Detached linkage between resource `{resource_guid}` and collection`{collection_guid}`\n")
893
1133
  out = parsed_output['display'].replace('Unlink', 'Link', 1)
894
1134
 
895
1135
  return (out)
896
1136
 
897
1137
  elif object_action == "Link":
898
1138
  if valid is False and exists:
899
- msg = (f"--> Link called `{label}` already exists and result document updated changing "
900
- f"`Link` to `Detach` in processed output\n")
1139
+ msg = (
1140
+ f"--> Link called `Attach Resource to Collection` already exists and result document updated changing "
1141
+ f"`Link` to `Detach` in processed output\n")
901
1142
  logger.error(msg)
902
1143
 
903
1144
  elif valid is False:
904
- msg = f"==>{object_type} Link with label `{label}` is not valid and can't be created"
1145
+ msg = f"==>{object_type} Link with label `Attach Resource to Collection` is not valid and can't be created"
905
1146
  logger.error(msg)
906
1147
  return
907
1148
 
@@ -910,7 +1151,7 @@ def process_attach_collection_command(egeria_client: EgeriaTech, txt: str,
910
1151
 
911
1152
  body['properties'] = prop_body
912
1153
  egeria_client.attach_collection(resource_guid,
913
- collection_guid, body)
1154
+ collection_guid, body)
914
1155
  msg = f"==>Attached collection `{collection_guid}` to resource `{resource_guid}` \n"
915
1156
  logger.success(msg)
916
1157
  out = parsed_output['display'].replace('Link', 'Detach', 1)
@@ -923,8 +1164,9 @@ def process_attach_collection_command(egeria_client: EgeriaTech, txt: str,
923
1164
  else:
924
1165
  return None
925
1166
 
1167
+
926
1168
  def process_attach_subscriber_command(egeria_client: EgeriaTech, txt: str,
927
- directive: str = "display") -> Optional[str]:
1169
+ directive: str = "display") -> Optional[str]:
928
1170
  """
929
1171
  Processes a link or unlink command to attach a subscriber to a subscription.
930
1172
 
@@ -937,17 +1179,20 @@ def process_attach_subscriber_command(egeria_client: EgeriaTech, txt: str,
937
1179
  print(Markdown(f"# {command}\n"))
938
1180
 
939
1181
  parsed_output = parse_view_command(egeria_client, object_type, object_action, txt, directive)
1182
+ if parsed_output is None:
1183
+ logger.error(f"Input error in command `{txt}`")
1184
+ return None
940
1185
 
941
1186
  print(Markdown(parsed_output['display']))
942
1187
 
943
1188
  logger.debug(json.dumps(parsed_output, indent=4))
944
1189
 
945
1190
  attributes = parsed_output['attributes']
946
- subscriber_guid = attributes.get('Subscriber', {}).get('guid', None)
1191
+ subscriber_guid = attributes.get('Subscriber Id', {}).get('guid', None)
947
1192
  subscription_guid = attributes.get('Subscription', {}).get('guid', None)
948
1193
 
949
1194
  valid = parsed_output['valid']
950
-
1195
+ exists = subscriber_guid is not None and subscription_guid is not None
951
1196
  if directive == "display":
952
1197
 
953
1198
  return None
@@ -961,7 +1206,7 @@ def process_attach_subscriber_command(egeria_client: EgeriaTech, txt: str,
961
1206
  elif directive == "process":
962
1207
  prop_body = {
963
1208
  "class": "DigitalSubscriberProperties",
964
- "subscriberId": attributes.get('Subscriber Id', {}).get('value', None),
1209
+ "subscriberId": attributes.get('Subscriber Id', {}).get('value', None),
965
1210
  "effectiveFrom": attributes.get('Effective From', {}).get('value', None),
966
1211
  "effectiveTo": attributes.get('Effective To', {}).get('value', None),
967
1212
  }
@@ -969,8 +1214,9 @@ def process_attach_subscriber_command(egeria_client: EgeriaTech, txt: str,
969
1214
  try:
970
1215
  if object_action == "Detach":
971
1216
  if not exists:
972
- msg = (f" Link `{label}` does not exist! Updating result document with Link "
973
- f"object_action\n")
1217
+ msg = (
1218
+ f" Link `Attach Subscriber to Subscription` does not exist! Updating result document with Link "
1219
+ f"object_action\n")
974
1220
  logger.error(msg)
975
1221
  out = parsed_output['display'].replace('Link', 'Detach', 1)
976
1222
  return out
@@ -981,17 +1227,19 @@ def process_attach_subscriber_command(egeria_client: EgeriaTech, txt: str,
981
1227
  f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
982
1228
  body = set_delete_request_body(object_type, attributes)
983
1229
 
984
- egeria_client.detach_subscriber(subscriber_guid, subscription_guid,body)
1230
+ egeria_client.detach_subscriber(subscriber_guid, subscription_guid, body)
985
1231
 
986
- logger.success(f"===> Detached linkage between subscriber `{subscriber_guid}` and subscription`{subscription_guid}`\n")
1232
+ logger.success(
1233
+ f"===> Detached linkage between subscriber `{subscriber_guid}` and subscription`{subscription_guid}`\n")
987
1234
  out = parsed_output['display'].replace('Unlink', 'Link', 1)
988
1235
 
989
1236
  return (out)
990
1237
 
991
1238
  elif object_action == "Link":
992
1239
  if valid is False and exists:
993
- msg = (f"--> Link called `{label}` already exists and result document updated changing "
994
- f"`Link` to `Detach` in processed output\n")
1240
+ msg = (
1241
+ f"--> Link called `Attach Subscriber to Subscription` already exists and result document updated changing "
1242
+ f"`Link` to `Detach` in processed output\n")
995
1243
  logger.error(msg)
996
1244
 
997
1245
  elif valid is False:
@@ -1004,7 +1252,7 @@ def process_attach_subscriber_command(egeria_client: EgeriaTech, txt: str,
1004
1252
 
1005
1253
  body['properties'] = prop_body
1006
1254
  egeria_client.link_subscriber(subscriber_guid,
1007
- subscription_guid, body)
1255
+ subscription_guid, body)
1008
1256
  msg = f"==>Attached subscriber `{subscriber_guid}` to subscription `{subscriber_guid}` \n"
1009
1257
  logger.success(msg)
1010
1258
  out = parsed_output['display'].replace('Link', 'Detach', 1)
@@ -1016,4 +1264,3 @@ def process_attach_subscriber_command(egeria_client: EgeriaTech, txt: str,
1016
1264
  return None
1017
1265
  else:
1018
1266
  return None
1019
-