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
@@ -2,165 +2,382 @@
2
2
  This file contains project-related object_action functions for processing Egeria Markdown
3
3
  """
4
4
 
5
+ import json
6
+ from typing import Optional
7
+
8
+ from loguru import logger
9
+ from pydantic import ValidationError
10
+ from rich import print
5
11
  from rich.markdown import Markdown
6
12
 
7
- from md_processing.md_processing_utils.common_md_utils import (debug_level, print_msg, is_valid_iso_date, setup_log)
8
- from md_processing.md_processing_utils.extraction_utils import (extract_command, process_simple_attribute)
9
- from md_processing.md_processing_utils.md_processing_constants import ALWAYS, ERROR, INFO, pre_command
10
- from pyegeria._globals import NO_PROJECTS_FOUND
11
- from pyegeria.project_manager import ProjectManager
13
+ from md_processing.md_processing_utils.common_md_proc_utils import (parse_upsert_command, parse_view_command)
14
+ from md_processing.md_processing_utils.common_md_utils import set_update_body, \
15
+ set_element_prop_body, set_delete_request_body, set_create_body, set_object_classifications, \
16
+ set_rel_request_body_for_type
17
+
18
+
19
+ from pyegeria import PyegeriaException, print_basic_exception, \
20
+ print_validation_error
21
+
22
+ from md_processing.md_processing_utils.common_md_utils import (update_element_dictionary,
23
+ )
24
+ from md_processing.md_processing_utils.extraction_utils import (extract_command_plus, update_a_command)
25
+
26
+ from pyegeria.egeria_tech_client import EgeriaTech
27
+ from pyegeria.core.utils import make_format_set_name_from_type, body_slimmer
28
+
29
+
30
+ # EGERIA_WIDTH = int(os.environ.get("EGERIA_WIDTH", "170"))
31
+ # console = Console(width=EGERIA_WIDTH)
32
+
12
33
 
13
- setup_log()
14
34
 
15
- def process_per_proj_upsert_command(egeria_client: ProjectManager, txt: str, directive: str = "display") -> str | None:
35
+ def process_project_upsert_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
16
36
  """
17
- Processes a personal project create or update object_action by extracting key attributes such as
18
- glossary name, language, description, and usage from the given cell.
37
+ Processes a project create or update object_action by extracting key attributes such as
38
+ glossary name, language, description, and usage from the given text.
19
39
 
20
40
  :param txt: A string representing the input cell to be processed for
21
41
  extracting glossary-related attributes.
22
42
  :param directive: an optional string indicating the directive to be used - display, validate or execute
23
43
  :return: A string summarizing the outcome of the processing.
24
44
  """
25
- from md_processing.md_processing_utils.common_md_utils import set_debug_level
26
45
 
27
- command = extract_command(txt)
46
+ command, object_type, object_action = extract_command_plus(txt)
28
47
  print(Markdown(f"# {command}\n"))
29
48
 
30
- object = command.split()
31
- object_type = f"{object[1]} {object[2]}"
32
- object_action = object[0]
33
- set_debug_level(directive)
34
-
35
- project_name = process_simple_attribute(txt, ['Project Name'])
36
- description = process_simple_attribute(txt, ['Description'])
37
- project_identifier = process_simple_attribute(txt, ['Project Identifier'])
38
- project_status = process_simple_attribute(txt, ['Status'])
39
- project_phase = process_simple_attribute(txt, ['Project Phase'])
40
- project_health = process_simple_attribute(txt, ['Project Health'])
41
- start_date = process_simple_attribute(txt, ['Start Date'])
42
- planned_end_date = process_simple_attribute(txt, ['Planned End Date'])
43
- print(Markdown(f"{pre_command} `\'{command}\'` for project: `{project_name}` with directive: `{directive}` "))
44
-
45
- project_display = (f"\n* Command: {command}\n\t* Project: {project_name}\n\t"
46
- f"* Status: {project_status}\n\t* Description: {description}\n\t"
47
- f"* Phase: {project_phase}\n\t* Health: {project_health}\n\t"
48
- f"* Start Date: {start_date}\n\t* Planned End Date: {planned_end_date}\n")
49
-
50
- def validate_project(obj_action: str) -> tuple[bool, bool, str, str]:
51
- valid = True
52
- msg = ""
53
- known_guid = None
54
- known_q_name = None
55
-
56
- project_details = egeria_client.get_projects_by_name(project_name)
57
- if project_details == NO_PROJECTS_FOUND:
58
- project_exists = False
59
- else:
60
- project_exists = True
61
-
62
- if project_name is None:
63
- msg = f"* {ERROR}Project name is missing\n"
64
- valid = False
65
- if project_status is None:
66
- msg += f"* {INFO}No Project status found\n"
67
-
68
- if description is None:
69
- msg += f"* {INFO}No Description found\n"
70
-
71
- if project_identifier is None:
72
- msg += f"* {INFO}No Project Identifier found\n"
73
-
74
- if project_phase is None:
75
- msg += f"* {INFO}No Project Phase found\n"
76
-
77
- if project_health is None:
78
- msg += f"* {INFO}No Project Health found\n"
79
-
80
- if start_date is None:
81
- msg += f"* {INFO}No Start Date found\n"
82
- elif not is_valid_iso_date(start_date):
83
- msg += f"* {ERROR}Start Date is not a valid ISO date of form YYYY-MM-DD\n"
84
- valid = False
85
-
86
- if planned_end_date is None:
87
- msg += f"* {INFO} No Planned End Date found\n"
88
- elif not is_valid_iso_date(planned_end_date):
89
- msg += f"* {ERROR}Planned End Date is not a valid ISO date of form YYYY-MM-DD\n"
90
- valid = False
91
-
92
- if obj_action == "Update":
93
- q_name = process_simple_attribute(txt, 'Qualified Name')
94
-
95
- if not project_exists:
96
- msg += f"* {ERROR}Project {project_name} does not exist\n"
97
- valid = False
98
- if len(project_details) > 1 and project_exists:
99
- msg += f"* {ERROR}More than one project with name {project_name} found\n"
100
- valid = False
101
- if len(project_details) == 1:
102
- known_guid = project_details[0]['elementHeader'].get('guid', None)
103
- known_q_name = project_details[0]['glossaryProperties'].get('qualifiedName', None)
104
- if q_name is None:
105
- msg += f"* {INFO}Qualified Name is missing => can use known qualified name of {known_q_name}\n"
106
- valid = True
107
- elif q_name != known_q_name:
108
- msg += (f"* {ERROR}Project {project_name} qualifiedName mismatch between {q_name} and {known_q_name}\n")
109
- valid = False
110
- if valid:
111
- msg += project_display
112
- msg += f"* -->Project {project_name} exists and can be updated\n"
113
- else:
114
- msg += f"* --> validation failed\n"
115
- msg += '---'
116
- print(Markdown(msg))
117
- return valid, project_exists, known_guid, known_q_name
118
-
119
- elif obj_action == "Create":
120
- if project_exists:
121
- msg += f"\n{ERROR}Project {project_name} already exists"
122
- else:
123
- msg += f"\n-->It is valid to create Project \'{project_name}\' with:\n"
124
- print(Markdown(msg))
125
- return valid, project_exists, known_guid, known_q_name
49
+ parsed_output = parse_upsert_command(egeria_client, object_type, object_action, txt, directive)
50
+ if not parsed_output:
51
+ logger.error(f"No output for `{object_action}`")
52
+ return None
53
+
54
+ valid = parsed_output['valid']
55
+ exists = parsed_output['exists']
56
+
57
+ qualified_name = parsed_output.get('qualified_name', None)
58
+ guid = parsed_output.get('guid', None)
59
+
60
+ print(Markdown(parsed_output['display']))
61
+
62
+ logger.debug(json.dumps(parsed_output, indent=4))
63
+
64
+ attributes = parsed_output['attributes']
65
+
66
+ display_name = attributes['Display Name'].get('value', None)
67
+ status = attributes.get('Status', {}).get('value', None)
68
+ output_set = make_format_set_name_from_type(object_type)
69
+ #
126
70
 
127
71
  if directive == "display":
128
- print(Markdown(project_display))
129
72
  return None
130
73
  elif directive == "validate":
131
- valid, project_exists, known_guid, known_q_name = validate_project(object_action)
74
+ if valid:
75
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
76
+ else:
77
+ msg = f"Validation failed for object_action `{command}`\n"
132
78
  return valid
79
+
133
80
  elif directive == "process":
134
- valid, project_exists, known_guid, known_q_name = validate_project(object_action)
135
- if valid:
136
- if object_action == "Create":
137
- if project_exists:
138
- print(f"\n{ERROR}Project {project_name} already exists\n")
81
+ try:
82
+ obj = "Project"
83
+ project_types = ["Campaign", "Task", "Personal Project", "Study Project"]
84
+
85
+
86
+ # Set the property body for a glossary collection
87
+ #
88
+ prop_body = set_element_prop_body(obj, qualified_name, attributes)
89
+ prop_body["identifier"] = attributes.get('Identifier', {}).get('value', None)
90
+ prop_body["mission"] = attributes.get('Mission', {}).get('value', None)
91
+ prop_body["purposes"] = attributes.get('Purposes', {}).get('value', None)
92
+ prop_body["startDate"] = attributes.get('Start Date', {}).get('value', None)
93
+ prop_body["endDate"] = attributes.get('End Date', {}).get('value', None)
94
+ prop_body["priority"] = attributes.get('Priority', {}).get('value', None)
95
+ prop_body["projectPhase"] = attributes.get('Project Phase', {}).get('value', None)
96
+ prop_body["projectStatus"] = attributes.get('Project Status', {}).get('value', None)
97
+ prop_body["projectHealth"] = attributes.get('Project Health', {}).get('value', None)
98
+
99
+ if object_action == "Update":
100
+ if not exists:
101
+ msg = (f" Element `{display_name}` does not exist! Updating result document with Create "
102
+ f"{object_action}\n")
103
+ logger.error(msg)
104
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
105
+ elif not valid:
106
+ msg = (" The input data is invalid and cannot be processed. \nPlease review")
107
+ logger.error(msg)
108
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
109
+ print(Markdown(msg))
139
110
  return None
140
111
  else:
141
- project_guid = egeria_client.create_personal_project(project_name, description, project_identifier,
142
- project_status, project_phase, project_health,
143
- start_date, planned_end_date)
144
- if project_guid:
145
- print_msg(ALWAYS, f"Created Project {project_name} with GUID {project_guid}", debug_level)
146
- return egeria_client.get_project_by_guid(project_guid, output_format='MD')
147
- else:
148
- print_msg(ERROR, f"Failed to create Project {project_name}", debug_level)
149
- return None
150
- elif object_action == "Update":
151
- if not project_exists:
152
- print(f"\n{ERROR}Project {project_name} does not exist\n")
112
+ print(Markdown(
113
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
114
+
115
+
116
+ body = set_update_body(obj, attributes)
117
+ body['properties'] = prop_body
118
+
119
+ egeria_client.update_project(guid, body)
120
+ # if status:
121
+ # egeria_client.update_project_status(guid, status)
122
+
123
+ logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
124
+ update_element_dictionary(qualified_name, {
125
+ 'guid': guid, 'display_name': display_name
126
+ })
127
+ return egeria_client.get_project_by_guid(guid, element_type='Project',
128
+ output_format='MD', report_spec = output_set)
129
+
130
+
131
+ elif object_action == "Create":
132
+ if valid is False and exists:
133
+ msg = (f"Project `{display_name}` already exists and result document updated changing "
134
+ f"`Create` to `Update` in processed output\n\n___")
135
+ logger.error(msg)
136
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
137
+ elif not valid:
138
+ msg = ("The input data is invalid and cannot be processed. \nPlease review")
139
+ logger.error(msg)
140
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
141
+ print(Markdown(msg))
153
142
  return None
143
+
154
144
  else:
155
- project_guid = egeria_client.update_personal_project(known_guid, project_name, description,
156
- project_identifier, project_status,
157
- project_phase, project_health, start_date,
158
- planned_end_date)
159
- if project_guid:
160
- print_msg(ALWAYS, f"Updated Project {project_name} with GUID {project_guid}", debug_level)
161
- return egeria_client.get_project_by_guid(project_guid, output_format='MD')
145
+ body = set_create_body(object_type,attributes)
146
+
147
+ # if this is a root or folder (maybe more in the future), then make sure that the classification is set.
148
+ body["initialClassifications"] = set_object_classifications(object_type, attributes, project_types)
149
+
150
+ body["properties"] = prop_body
151
+ slim_body = body_slimmer(body)
152
+ guid = egeria_client.create_project(body = slim_body)
153
+ if guid:
154
+ update_element_dictionary(qualified_name, {
155
+ 'guid': guid, 'display_name': display_name
156
+ })
157
+ msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
158
+ logger.success(msg)
159
+ return egeria_client.get_project_by_guid(guid, output_format='MD', report_spec = output_set)
162
160
  else:
163
- print_msg(ERROR, f"Failed to update Project {project_name}", debug_level)
161
+ msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
162
+ logger.error(msg)
164
163
  return None
164
+
165
+ except PyegeriaException as e:
166
+ logger.error(f"Pyegeria error performing {command}: {e}")
167
+ print_basic_exception(e)
168
+ return None
169
+ except Exception as e:
170
+ logger.error(f"Error performing {command}: {e}")
171
+ else:
172
+ return None
173
+
174
+
175
+
176
+ def process_link_project_hierarchy_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
177
+
178
+ # """ Set one project to manage another."""
179
+ #
180
+ command, object_type, object_action = extract_command_plus(txt)
181
+ print(Markdown(f"# {command}\n"))
182
+
183
+ parsed_output = parse_view_command(egeria_client, object_type, object_action,
184
+ txt, directive)
185
+
186
+ if not parsed_output:
187
+ logger.error(f"No output for `{object_action}`")
188
+ print(Markdown("## Parsing failed"))
189
+ return None
190
+
191
+ print(Markdown(parsed_output['display']))
192
+
193
+ logger.debug(json.dumps(parsed_output, indent=4))
194
+
195
+ attributes = parsed_output['attributes']
196
+
197
+ parent_project_guid = attributes.get('Parent Project', {}).get('guid', None)
198
+ child_project_guid = attributes.get('Child Project', {}).get('guid', None)
199
+ label = attributes.get('Link Label', {}).get('value', "")
200
+
201
+ valid = parsed_output['valid']
202
+ exists = parent_project_guid is not None and child_project_guid is not None
203
+
204
+ if directive == "display":
205
+
206
+ return None
207
+ elif directive == "validate":
208
+ if valid:
209
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
210
+ else:
211
+ msg = f"Validation failed for object_action `{command}`\n"
212
+ logger.error(msg)
213
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
214
+ return valid
215
+
216
+ elif directive == "process":
217
+
218
+
219
+ try:
220
+ if object_action == "Detach":
221
+ if not exists:
222
+ msg = (f" Link `{label}` does not exist! Updating result document with Link "
223
+ f"object_action\n")
224
+ logger.error(msg)
225
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
226
+ return out
227
+ elif not valid:
228
+ return None
229
+ else:
230
+ print(Markdown(
231
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
232
+ body = set_delete_request_body(object_type, attributes)
233
+
234
+ egeria_client.clear_project_hierarchy(child_project_guid, parent_project_guid,body)
235
+
236
+ logger.success(f"===> Detached segment with {label} from `{child_project_guid}`to {parent_project_guid}\n")
237
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
238
+
239
+ return (out)
240
+
241
+
242
+ elif object_action == "Link":
243
+ if valid is False and exists:
244
+ msg = (f"--> Link called `{label}` already exists and result document updated changing "
245
+ f"`Link` to `Detach` in processed output\n")
246
+ logger.error(msg)
247
+
248
+ elif valid is False:
249
+ msg = f"==>{object_type} Link with label `{label}` is not valid and can't be created"
250
+ logger.error(msg)
251
+ return
252
+
253
+ else:
254
+ body = set_rel_request_body_for_type("ProjectHierarchy", attributes)
255
+
256
+ egeria_client.set_project_hierarchy(project_guid =child_project_guid,
257
+ parent_project_guid = parent_project_guid)
258
+ # body=body_slimmer(body))
259
+ msg = f"==>Created {object_type} link named `{label}`\n"
260
+ logger.success(msg)
261
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
262
+ return out
263
+
264
+ except ValidationError as e:
265
+ print_validation_error(e)
266
+ logger.error(f"Validation Error performing {command}: {e}")
267
+ return None
268
+ except PyegeriaException as e:
269
+ print_basic_exception(e)
270
+ logger.error(f"PyegeriaException occurred: {e}")
271
+ return None
272
+
273
+ except Exception as e:
274
+ logger.error(f"Error performing {command}: {e}")
275
+ return None
276
+ else:
277
+ return None
278
+
279
+
280
+
281
+ def process_link_project_dependency_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
282
+
283
+ # """ Set one project dependence on another."""
284
+ #
285
+
286
+ command, object_type, object_action = extract_command_plus(txt)
287
+ print(Markdown(f"# {command}\n"))
288
+
289
+ parsed_output = parse_view_command(egeria_client, object_type, object_action,
290
+ txt, directive)
291
+
292
+ if not parsed_output:
293
+ logger.error(f"No output for `{object_action}`")
294
+ print(Markdown("## Parsing failed"))
295
+ return None
296
+
297
+ print(Markdown(parsed_output['display']))
298
+
299
+ logger.debug(json.dumps(parsed_output, indent=4))
300
+
301
+ attributes = parsed_output['attributes']
302
+
303
+ parent_project_guid = attributes.get('Parent Project', {}).get('guid', None)
304
+ child_project_guid = attributes.get('Child Project', {}).get('guid', None)
305
+ label = attributes.get('Link Label', {}).get('value', "")
306
+
307
+ valid = parsed_output['valid']
308
+ exists = parent_project_guid is not None and child_project_guid is not None
309
+
310
+ if directive == "display":
311
+
312
+ return None
313
+ elif directive == "validate":
314
+ if valid:
315
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
165
316
  else:
317
+ msg = f"Validation failed for object_action `{command}`\n"
318
+ logger.error(msg)
319
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
320
+ return valid
321
+
322
+ elif directive == "process":
323
+
324
+
325
+ try:
326
+ if object_action == "Detach":
327
+ if not exists:
328
+ msg = (f" Link `{label}` does not exist! Updating result document with Link "
329
+ f"object_action\n")
330
+ logger.error(msg)
331
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
332
+ return out
333
+ elif not valid:
334
+ return None
335
+ else:
336
+ print(Markdown(
337
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
338
+ body = set_delete_request_body(object_type, attributes)
339
+
340
+ egeria_client.clear_project_dependency(child_project_guid, parent_project_guid,body)
341
+
342
+ logger.success(f"===> Detached segment with {label} from `{child_project_guid}`to {parent_project_guid}\n")
343
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
344
+
345
+ return (out)
346
+
347
+
348
+ elif object_action == "Link":
349
+ if valid is False and exists:
350
+ msg = (f"--> Link called `{label}` already exists and result document updated changing "
351
+ f"`Link` to `Detach` in processed output\n")
352
+ logger.error(msg)
353
+
354
+ elif valid is False:
355
+ msg = f"==>{object_type} Link with label `{label}` is not valid and can't be created"
356
+ logger.error(msg)
357
+ return
358
+
359
+ else:
360
+ body = set_rel_request_body_for_type("ProjectDependency", attributes)
361
+
362
+ egeria_client.set_project_dependency(project_guid =child_project_guid,
363
+ upstream_project_guid = parent_project_guid,
364
+ body=body_slimmer(body))
365
+ msg = f"==>Created {object_type} link named `{label}`\n"
366
+ logger.success(msg)
367
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
368
+ return out
369
+
370
+ except ValidationError as e:
371
+ print_validation_error(e)
372
+ logger.error(f"Validation Error performing {command}: {e}")
373
+ return None
374
+ except PyegeriaException as e:
375
+ print_basic_exception(e)
376
+ logger.error(f"PyegeriaException occurred: {e}")
166
377
  return None
378
+
379
+ except Exception as e:
380
+ logger.error(f"Error performing {command}: {e}")
381
+ return None
382
+ else:
383
+ return None