pyegeria 5.3.9.9.3__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 (272) hide show
  1. commands/__init__.py +24 -0
  2. commands/cat/Dr-Egeria_md-orig.py +2 -2
  3. commands/cat/__init__.py +1 -17
  4. commands/cat/collection_actions.py +197 -0
  5. commands/cat/dr_egeria_command_help.py +372 -0
  6. commands/cat/dr_egeria_jupyter.py +7 -7
  7. commands/cat/dr_egeria_md.py +27 -182
  8. commands/cat/exp_list_glossaries.py +11 -14
  9. commands/cat/get_asset_graph.py +37 -267
  10. commands/cat/{get_collection.py → get_collection_tree.py} +10 -18
  11. commands/cat/get_project_dependencies.py +14 -14
  12. commands/cat/get_project_structure.py +15 -14
  13. commands/cat/get_tech_type_elements.py +16 -116
  14. commands/cat/glossary_actions.py +145 -298
  15. commands/cat/list_assets.py +3 -11
  16. commands/cat/list_cert_types.py +17 -63
  17. commands/cat/list_collections.py +46 -138
  18. commands/cat/list_deployed_catalogs.py +15 -27
  19. commands/cat/list_deployed_database_schemas.py +27 -43
  20. commands/cat/list_deployed_databases.py +16 -31
  21. commands/cat/list_deployed_servers.py +35 -54
  22. commands/cat/list_glossaries.py +18 -17
  23. commands/cat/list_projects.py +10 -12
  24. commands/cat/list_tech_type_elements.py +21 -37
  25. commands/cat/list_tech_types.py +13 -25
  26. commands/cat/list_terms.py +38 -79
  27. commands/cat/list_todos.py +4 -11
  28. commands/cat/list_user_ids.py +3 -10
  29. commands/cat/my_reports.py +559 -0
  30. commands/cat/run_report.py +394 -0
  31. commands/cat/run_report_orig.py +528 -0
  32. commands/cli/egeria.py +222 -247
  33. commands/cli/egeria_cat.py +68 -81
  34. commands/cli/egeria_my.py +13 -0
  35. commands/cli/egeria_ops.py +69 -74
  36. commands/cli/egeria_tech.py +17 -93
  37. commands/cli/ops_config.py +3 -6
  38. commands/{cat/list_categories.py → deprecated/list_data_designer.py} +53 -64
  39. commands/{cat/list_data_structures.py → deprecated/list_data_structures_full.py} +3 -6
  40. commands/deprecated/old_get_asset_graph.py +315 -0
  41. commands/my/__init__.py +0 -2
  42. commands/my/list_my_profile.py +27 -34
  43. commands/my/list_my_roles.py +1 -7
  44. commands/my/monitor_my_todos.py +1 -7
  45. commands/my/monitor_open_todos.py +6 -7
  46. commands/my/todo_actions.py +4 -5
  47. commands/ops/__init__.py +0 -2
  48. commands/ops/gov_server_actions.py +17 -21
  49. commands/ops/list_archives.py +17 -38
  50. commands/ops/list_catalog_targets.py +33 -40
  51. commands/ops/load_archive.py +35 -26
  52. commands/ops/{monitor_engine_activity_c.py → monitor_active_engine_activity.py} +51 -82
  53. commands/ops/{monitor_integ_daemon_status.py → monitor_daemon_status.py} +35 -55
  54. commands/ops/monitor_engine_activity.py +79 -77
  55. commands/ops/{monitor_gov_eng_status.py → monitor_engine_status.py} +10 -7
  56. commands/ops/monitor_platform_status.py +38 -50
  57. commands/ops/monitor_server_startup.py +6 -11
  58. commands/ops/monitor_server_status.py +7 -11
  59. commands/ops/orig_monitor_server_list.py +8 -8
  60. commands/ops/orig_monitor_server_status.py +1 -5
  61. commands/ops/refresh_integration_daemon.py +5 -5
  62. commands/ops/restart_integration_daemon.py +5 -5
  63. commands/ops/table_integ_daemon_status.py +6 -6
  64. commands/ops/x_engine_actions.py +7 -7
  65. commands/tech/__init__.py +0 -2
  66. commands/tech/{generic_actions.py → element_actions.py} +6 -11
  67. commands/tech/get_element_info.py +20 -29
  68. commands/tech/get_guid_info.py +23 -42
  69. commands/tech/get_tech_details.py +20 -35
  70. commands/tech/get_tech_type_template.py +28 -39
  71. commands/tech/list_all_om_type_elements.py +24 -30
  72. commands/tech/list_all_om_type_elements_x.py +22 -28
  73. commands/tech/list_all_related_elements.py +19 -28
  74. commands/tech/list_anchored_elements.py +22 -30
  75. commands/tech/list_asset_types.py +19 -24
  76. commands/tech/list_elements_by_classification_by_property_value.py +26 -32
  77. commands/tech/list_elements_by_property_value.py +19 -25
  78. commands/tech/list_elements_by_property_value_x.py +20 -28
  79. commands/tech/list_elements_for_classification.py +28 -41
  80. commands/tech/list_gov_action_processes.py +16 -27
  81. commands/tech/list_information_supply_chains.py +22 -30
  82. commands/tech/list_registered_services.py +14 -26
  83. commands/tech/list_related_elements_with_prop_value.py +15 -25
  84. commands/tech/list_related_specification.py +1 -4
  85. commands/tech/list_relationship_types.py +15 -25
  86. commands/tech/list_relationships.py +20 -36
  87. commands/tech/list_solution_blueprints.py +28 -33
  88. commands/tech/list_solution_components.py +23 -29
  89. commands/tech/list_solution_roles.py +21 -32
  90. commands/tech/list_tech_templates.py +51 -54
  91. commands/tech/list_valid_metadata_values.py +5 -9
  92. commands/tech/table_tech_templates.py +2 -6
  93. commands/tech/x_list_related_elements.py +1 -4
  94. examples/GeoSpatial Products Example.py +524 -0
  95. examples/Jupyter Notebooks/P-egeria-server-config.ipynb +2137 -0
  96. examples/Jupyter Notebooks/README.md +2 -0
  97. examples/Jupyter Notebooks/common/P-environment-check.ipynb +115 -0
  98. examples/Jupyter Notebooks/common/__init__.py +14 -0
  99. examples/Jupyter Notebooks/common/common-functions.ipynb +4694 -0
  100. examples/Jupyter Notebooks/common/environment-check.ipynb +52 -0
  101. examples/Jupyter Notebooks/common/globals.ipynb +184 -0
  102. examples/Jupyter Notebooks/common/globals.py +154 -0
  103. examples/Jupyter Notebooks/common/orig_globals.py +152 -0
  104. examples/format_sets/all_format_sets.json +910 -0
  105. examples/format_sets/custom_format_sets.json +268 -0
  106. examples/format_sets/subset_format_sets.json +187 -0
  107. examples/format_sets_save_load_example.py +291 -0
  108. examples/jacquard_data_sets.py +129 -0
  109. examples/output_formats_example.py +193 -0
  110. examples/test_jacquard_data_sets.py +54 -0
  111. examples/test_jacquard_data_sets_scenarios.py +94 -0
  112. md_processing/__init__.py +90 -0
  113. md_processing/command_dispatcher.py +33 -0
  114. md_processing/command_mapping.py +221 -0
  115. md_processing/data/commands/commands_data_designer.json +537 -0
  116. md_processing/data/commands/commands_external_reference.json +733 -0
  117. md_processing/data/commands/commands_feedback.json +155 -0
  118. md_processing/data/commands/commands_general.json +204 -0
  119. md_processing/data/commands/commands_glossary.json +218 -0
  120. md_processing/data/commands/commands_governance.json +3678 -0
  121. md_processing/data/commands/commands_product_manager.json +865 -0
  122. md_processing/data/commands/commands_project.json +642 -0
  123. md_processing/data/commands/commands_solution_architect.json +366 -0
  124. md_processing/data/commands.json +17568 -0
  125. md_processing/data/commands_working.json +30641 -0
  126. md_processing/data/gened_report_specs.py +6584 -0
  127. md_processing/data/generated_format_sets.json +6533 -0
  128. md_processing/data/generated_format_sets_old.json +4137 -0
  129. md_processing/data/generated_format_sets_old.py +45 -0
  130. md_processing/dr_egeria.py +182 -0
  131. md_processing/md_commands/__init__.py +3 -0
  132. md_processing/md_commands/data_designer_commands.py +1276 -0
  133. md_processing/md_commands/ext_ref_commands.py +530 -0
  134. md_processing/md_commands/feedback_commands.py +726 -0
  135. md_processing/md_commands/glossary_commands.py +684 -0
  136. md_processing/md_commands/governance_officer_commands.py +600 -0
  137. md_processing/md_commands/product_manager_commands.py +1266 -0
  138. md_processing/md_commands/project_commands.py +383 -0
  139. md_processing/md_commands/solution_architect_commands.py +1184 -0
  140. md_processing/md_commands/view_commands.py +295 -0
  141. md_processing/md_processing_utils/__init__.py +4 -0
  142. md_processing/md_processing_utils/common_md_proc_utils.py +1249 -0
  143. md_processing/md_processing_utils/common_md_utils.py +578 -0
  144. md_processing/md_processing_utils/determine_width.py +103 -0
  145. md_processing/md_processing_utils/extraction_utils.py +547 -0
  146. md_processing/md_processing_utils/gen_report_specs.py +643 -0
  147. md_processing/md_processing_utils/generate_dr_help.py +193 -0
  148. md_processing/md_processing_utils/generate_md_cmd_templates.py +144 -0
  149. md_processing/md_processing_utils/generate_md_templates.py +83 -0
  150. md_processing/md_processing_utils/md_processing_constants.py +1228 -0
  151. md_processing/md_processing_utils/message_constants.py +19 -0
  152. pyegeria/__init__.py +201 -443
  153. pyegeria/core/__init__.py +40 -0
  154. pyegeria/core/_base_platform_client.py +574 -0
  155. pyegeria/core/_base_server_client.py +573 -0
  156. pyegeria/core/_exceptions.py +457 -0
  157. pyegeria/core/_globals.py +60 -0
  158. pyegeria/core/_server_client.py +6073 -0
  159. pyegeria/core/_validators.py +257 -0
  160. pyegeria/core/config.py +654 -0
  161. pyegeria/{create_tech_guid_lists.py → core/create_tech_guid_lists.py} +0 -1
  162. pyegeria/core/load_config.py +37 -0
  163. pyegeria/core/logging_configuration.py +207 -0
  164. pyegeria/core/mcp_adapter.py +144 -0
  165. pyegeria/core/mcp_server.py +212 -0
  166. pyegeria/core/utils.py +405 -0
  167. pyegeria/deprecated/__init__.py +0 -0
  168. pyegeria/{_client.py → deprecated/_client.py} +62 -24
  169. pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
  170. pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1988 -1878
  171. pyegeria/deprecated/output_formatter_with_machine_keys.py +1127 -0
  172. pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +216 -229
  173. pyegeria/{valid_metadata_omvs.py → deprecated/valid_metadata_omvs.py} +93 -93
  174. pyegeria/{x_action_author_omvs.py → deprecated/x_action_author_omvs.py} +2 -3
  175. pyegeria/egeria_cat_client.py +25 -51
  176. pyegeria/egeria_client.py +140 -98
  177. pyegeria/egeria_config_client.py +48 -24
  178. pyegeria/egeria_tech_client.py +170 -83
  179. pyegeria/models/__init__.py +150 -0
  180. pyegeria/models/collection_models.py +168 -0
  181. pyegeria/models/models.py +654 -0
  182. pyegeria/omvs/__init__.py +84 -0
  183. pyegeria/omvs/action_author.py +342 -0
  184. pyegeria/omvs/actor_manager.py +5980 -0
  185. pyegeria/omvs/asset_catalog.py +842 -0
  186. pyegeria/omvs/asset_maker.py +2736 -0
  187. pyegeria/omvs/automated_curation.py +4403 -0
  188. pyegeria/omvs/classification_manager.py +11213 -0
  189. pyegeria/omvs/collection_manager.py +5780 -0
  190. pyegeria/omvs/community_matters_omvs.py +468 -0
  191. pyegeria/{core_omag_server_config.py → omvs/core_omag_server_config.py} +157 -157
  192. pyegeria/{data_designer_omvs.py → omvs/data_designer.py} +1991 -1691
  193. pyegeria/omvs/data_discovery.py +869 -0
  194. pyegeria/omvs/data_engineer.py +372 -0
  195. pyegeria/omvs/digital_business.py +1133 -0
  196. pyegeria/omvs/external_links.py +1752 -0
  197. pyegeria/omvs/feedback_manager.py +834 -0
  198. pyegeria/{full_omag_server_config.py → omvs/full_omag_server_config.py} +73 -69
  199. pyegeria/omvs/glossary_manager.py +3231 -0
  200. pyegeria/omvs/governance_officer.py +3009 -0
  201. pyegeria/omvs/lineage_linker.py +314 -0
  202. pyegeria/omvs/location_arena.py +1525 -0
  203. pyegeria/omvs/metadata_expert.py +668 -0
  204. pyegeria/omvs/metadata_explorer_omvs.py +2943 -0
  205. pyegeria/omvs/my_profile.py +1042 -0
  206. pyegeria/omvs/notification_manager.py +358 -0
  207. pyegeria/omvs/people_organizer.py +394 -0
  208. pyegeria/{platform_services.py → omvs/platform_services.py} +113 -193
  209. pyegeria/omvs/product_manager.py +1825 -0
  210. pyegeria/omvs/project_manager.py +1907 -0
  211. pyegeria/omvs/reference_data.py +1140 -0
  212. pyegeria/omvs/registered_info.py +334 -0
  213. pyegeria/omvs/runtime_manager.py +2817 -0
  214. pyegeria/omvs/schema_maker.py +446 -0
  215. pyegeria/{server_operations.py → omvs/server_operations.py} +27 -26
  216. pyegeria/omvs/solution_architect.py +6490 -0
  217. pyegeria/omvs/specification_properties.py +37 -0
  218. pyegeria/omvs/subject_area.py +1042 -0
  219. pyegeria/omvs/template_manager_omvs.py +236 -0
  220. pyegeria/omvs/time_keeper.py +1761 -0
  221. pyegeria/omvs/valid_metadata.py +3221 -0
  222. pyegeria/omvs/valid_metadata_lists.py +37 -0
  223. pyegeria/omvs/valid_type_lists.py +37 -0
  224. pyegeria/view/__init__.py +28 -0
  225. pyegeria/view/_output_format_models.py +514 -0
  226. pyegeria/view/_output_formats.py +14 -0
  227. pyegeria/view/base_report_formats.py +2719 -0
  228. pyegeria/view/dr_egeria_reports.py +56 -0
  229. pyegeria/view/format_set_executor.py +397 -0
  230. pyegeria/{md_processing_utils.py → view/md_processing_utils.py} +5 -5
  231. pyegeria/{mermaid_utilities.py → view/mermaid_utilities.py} +2 -154
  232. pyegeria/view/output_formatter.py +1297 -0
  233. pyegeria-5.5.3.3.dist-info/METADATA +218 -0
  234. pyegeria-5.5.3.3.dist-info/RECORD +241 -0
  235. {pyegeria-5.3.9.9.3.dist-info → pyegeria-5.5.3.3.dist-info}/WHEEL +2 -1
  236. pyegeria-5.5.3.3.dist-info/entry_points.txt +103 -0
  237. pyegeria-5.5.3.3.dist-info/top_level.txt +4 -0
  238. commands/cat/.DS_Store +0 -0
  239. commands/cat/README.md +0 -16
  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/monitor_asset_events.py +0 -108
  244. commands/tech/README.md +0 -24
  245. pyegeria/.DS_Store +0 -0
  246. pyegeria/README.md +0 -35
  247. pyegeria/_globals.py +0 -47
  248. pyegeria/_validators.py +0 -385
  249. pyegeria/asset_catalog_omvs.py +0 -864
  250. pyegeria/automated_curation_omvs.py +0 -3765
  251. pyegeria/collection_manager_omvs.py +0 -2744
  252. pyegeria/dr.egeria spec.md +0 -9
  253. pyegeria/egeria_my_client.py +0 -56
  254. pyegeria/feedback_manager_omvs.py +0 -4573
  255. pyegeria/glossary_browser_omvs.py +0 -3728
  256. pyegeria/glossary_manager_omvs.py +0 -2440
  257. pyegeria/m_test.py +0 -118
  258. pyegeria/md_processing_helpers.py +0 -58
  259. pyegeria/md_processing_utils_orig.py +0 -1103
  260. pyegeria/metadata_explorer_omvs.py +0 -2326
  261. pyegeria/my_profile_omvs.py +0 -1022
  262. pyegeria/output_formatter.py +0 -389
  263. pyegeria/project_manager_omvs.py +0 -1933
  264. pyegeria/registered_info.py +0 -167
  265. pyegeria/solution_architect_omvs.py +0 -2156
  266. pyegeria/template_manager_omvs.py +0 -1414
  267. pyegeria/utils.py +0 -197
  268. pyegeria-5.3.9.9.3.dist-info/METADATA +0 -72
  269. pyegeria-5.3.9.9.3.dist-info/RECORD +0 -143
  270. pyegeria-5.3.9.9.3.dist-info/entry_points.txt +0 -99
  271. /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
  272. {pyegeria-5.3.9.9.3.dist-info → pyegeria-5.5.3.3.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,383 @@
1
+ """
2
+ This file contains project-related object_action functions for processing Egeria Markdown
3
+ """
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
11
+ from rich.markdown import Markdown
12
+
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
+
33
+
34
+
35
+ def process_project_upsert_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
36
+ """
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.
39
+
40
+ :param txt: A string representing the input cell to be processed for
41
+ extracting glossary-related attributes.
42
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
43
+ :return: A string summarizing the outcome of the processing.
44
+ """
45
+
46
+ command, object_type, object_action = extract_command_plus(txt)
47
+ print(Markdown(f"# {command}\n"))
48
+
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
+ #
70
+
71
+ if directive == "display":
72
+ return None
73
+ elif directive == "validate":
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"
78
+ return valid
79
+
80
+ elif directive == "process":
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))
110
+ return None
111
+ else:
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))
142
+ return None
143
+
144
+ else:
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)
160
+ else:
161
+ msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
162
+ logger.error(msg)
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"))
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}")
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