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,600 @@
1
+ """
2
+ This file contains term-related object_action functions for processing Egeria Markdown
3
+ """
4
+ import json
5
+ import os
6
+ from typing import Optional
7
+
8
+ from inflect import engine
9
+ from jsonschema import ValidationError
10
+ from loguru import logger
11
+ from rich import print
12
+ from rich.console import Console
13
+ from rich.markdown import Markdown
14
+
15
+ from md_processing.md_processing_utils.common_md_proc_utils import (parse_upsert_command, parse_view_command)
16
+ from md_processing.md_processing_utils.common_md_utils import (set_gov_prop_body,
17
+ set_update_body, set_create_body,
18
+ set_peer_gov_def_request_body, set_rel_prop_body,
19
+ set_rel_request_body,
20
+ ALL_GOVERNANCE_DEFINITIONS, set_delete_request_body)
21
+ from md_processing.md_processing_utils.extraction_utils import (extract_command_plus, update_a_command)
22
+ from md_processing.md_processing_utils.md_processing_constants import (load_commands)
23
+ from pyegeria import DEBUG_LEVEL, body_slimmer, PyegeriaException, print_basic_exception, print_validation_error
24
+ from pyegeria.egeria_tech_client import EgeriaTech
25
+ from pyegeria.core.utils import make_format_set_name_from_type
26
+
27
+ GERIA_METADATA_STORE = os.environ.get("EGERIA_METADATA_STORE", "active-metadata-store")
28
+ EGERIA_KAFKA_ENDPOINT = os.environ.get("KAFKA_ENDPOINT", "localhost:9092")
29
+ EGERIA_PLATFORM_URL = os.environ.get("EGERIA_PLATFORM_URL", "https://localhost:9443")
30
+ EGERIA_VIEW_SERVER = os.environ.get("EGERIA_VIEW_SERVER", "view-server")
31
+ EGERIA_VIEW_SERVER_URL = os.environ.get("EGERIA_VIEW_SERVER_URL", "https://localhost:9443")
32
+ EGERIA_INTEGRATION_DAEMON = os.environ.get("EGERIA_INTEGRATION_DAEMON", "integration-daemon")
33
+ EGERIA_INTEGRATION_DAEMON_URL = os.environ.get("EGERIA_INTEGRATION_DAEMON_URL", "https://localhost:9443")
34
+ EGERIA_ADMIN_USER = os.environ.get("ADMIN_USER", "garygeeke")
35
+ EGERIA_ADMIN_PASSWORD = os.environ.get("ADMIN_PASSWORD", "secret")
36
+ EGERIA_USER = os.environ.get("EGERIA_USER", "erinoverview")
37
+ EGERIA_USER_PASSWORD = os.environ.get("EGERIA_USER_PASSWORD", "secret")
38
+ EGERIA_WIDTH = os.environ.get("EGERIA_WIDTH", 220)
39
+ EGERIA_JUPYTER = os.environ.get("EGERIA_JUPYTER", False)
40
+ EGERIA_HOME_GLOSSARY_GUID = os.environ.get("EGERIA_HOME_GLOSSARY_GUID", None)
41
+ EGERIA_GLOSSARY_PATH = os.environ.get("EGERIA_GLOSSARY_PATH", None)
42
+ EGERIA_ROOT_PATH = os.environ.get("EGERIA_ROOT_PATH", "../../")
43
+ EGERIA_INBOX_PATH = os.environ.get("EGERIA_INBOX_PATH", "md_processing/dr_egeria_inbox")
44
+ EGERIA_OUTBOX_PATH = os.environ.get("EGERIA_OUTBOX_PATH", "md_processing/dr_egeria_outbox")
45
+
46
+ GENERAL_GOVERNANCE_DEFINITIONS = ["Business Imperative", "Regulation Article", "Threat", "Governance Principle",
47
+ "Governance Obligation", "Governance Approach", "Governance Processing Purpose"]
48
+
49
+ GOVERNANCE_CONTROLS = ["Governance Rule", "Service Level Objective", "Governance Process",
50
+ "Governance Responsibility", "Governance Procedure", "Security Access Control"]
51
+
52
+ load_commands('commands.json')
53
+ debug_level = DEBUG_LEVEL
54
+
55
+ console = Console(width=int(250))
56
+
57
+
58
+ #
59
+ # Helper functions for the governance officer commands
60
+ #
61
+
62
+ @logger.catch
63
+ def sync_gov_rel_elements(egeria_client: EgeriaTech, object_action: str, object_type: str, guid: str,
64
+ qualified_name: str, attributes: dict):
65
+ # TODO: when the next release is available, I should be able to more easily get the asis elements - so will
66
+ # TODO: hold off on implementing replace all
67
+ try:
68
+ merge_update = attributes.get("Merge Update", {}).get("value", True)
69
+ to_be_supports_policies = attributes.get("Supports Policies", {}).get("guid_list", None)
70
+ to_be_governance_drivers = attributes.get("Governance Drivers", {}).get("guid_list", None)
71
+
72
+ if merge_update or object_action == "Create":
73
+ if to_be_supports_policies:
74
+ for policy in to_be_supports_policies:
75
+ egeria_client.attach_supporting_definitions(policy, "GovernanceImplementation", guid)
76
+ print(f"Added `{policy}` to `{guid}`")
77
+ elif to_be_governance_drivers:
78
+ for policy in to_be_governance_drivers:
79
+ egeria_client.attach_supporting_definitions(policy, "GovernanceResponse", guid)
80
+ print(f"Added `{policy}` to `{guid}`")
81
+ except Exception as ex:
82
+ print(ex)
83
+
84
+
85
+ @logger.catch
86
+ def process_gov_definition_upsert_command(egeria_client: EgeriaTech, txt: str,
87
+ directive: str = "display") -> Optional[str]:
88
+ """
89
+ Processes a data specification create or update object_action by extracting key attributes.
90
+
91
+ :param txt: Command details in text format.
92
+ :param directive: An optional string indicating the directive - display, validate, or process.
93
+ :return: A string summarizing the outcome, or None if no processing is needed.
94
+ """
95
+ try:
96
+ # Extract basic command information
97
+ command, object_type, object_action = extract_command_plus(txt)
98
+ if not (command and object_type and object_action):
99
+ logger.error("Failed to parse `command`, `object_type`, or `object_action` from input text.")
100
+ return None
101
+ if object_type not in ALL_GOVERNANCE_DEFINITIONS:
102
+ logger.error(f"Invalid object type: {object_type}")
103
+ return None
104
+ # Log command details
105
+ print(Markdown(f"# {command}\n"))
106
+
107
+ # Parse command attributes
108
+ parsed_output = parse_upsert_command(egeria_client, object_type, object_action, txt, directive)
109
+ if not parsed_output or 'valid' not in parsed_output:
110
+ logger.error(f"Unable to parse command properly: {txt}")
111
+ return None
112
+
113
+ valid = parsed_output['valid']
114
+ exists = parsed_output['exists']
115
+ qualified_name = parsed_output.get('qualified_name')
116
+ display_name = parsed_output.get('attributes', {}).get('Display Name', {}).get('value')
117
+ guid = parsed_output.get('guid')
118
+
119
+ print(Markdown(parsed_output.get('display', '')))
120
+ logger.debug(json.dumps(parsed_output, indent=4))
121
+
122
+ if directive == "display":
123
+ logger.info("Directive set to display. No processing required.")
124
+ return None
125
+
126
+ elif directive == "validate":
127
+ if valid:
128
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
129
+ else:
130
+ logger.error(f"Validation failed for `{command}`.")
131
+ return valid
132
+
133
+ elif directive == "process":
134
+ output_set = make_format_set_name_from_type(object_type)
135
+
136
+ if object_action == "Update":
137
+ if not guid:
138
+ msg = (f"The `{object_type}` '{display_name}' does not yet exist.\n The result document has been "
139
+ f"updated to change `Update` to `Create` in processed output\n{'-' * 80}\n ")
140
+ logger.error(msg)
141
+ # print(msg)
142
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
143
+
144
+ if not valid:
145
+ logger.error("Invalid data for update action.")
146
+ return None
147
+
148
+ # Proceed with the update
149
+ update_body = set_update_body(object_type, parsed_output['attributes'])
150
+ update_body['properties'] = set_gov_prop_body(object_type, qualified_name, parsed_output['attributes'])
151
+ update_body = body_slimmer(update_body)
152
+ egeria_client.update_governance_definition(guid, update_body)
153
+ if status := parsed_output['attributes'].get('Status', {}).get('value', None):
154
+ egeria_client.update_element_status(guid, status)
155
+ logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}")
156
+ return egeria_client.get_governance_definition_by_guid(guid, output_format='MD',
157
+ report_spec=output_set)
158
+
159
+ elif object_action == "Create":
160
+ if valid is False and exists:
161
+ msg = (f"Failed to create `{object_type}` named `{display_name}` because it already exists.\n "
162
+ f"Result document has been updated to change `Create` to `Update` in processed o"
163
+ f"utput\n{'-' * 80}\n")
164
+ logger.error(msg)
165
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
166
+ elif valid is False:
167
+ msg = f" invalid data? - Correct and try again\n\n___"
168
+ logger.error(msg)
169
+ return None
170
+ else:
171
+ create_body = set_create_body(object_type, parsed_output['attributes'])
172
+ create_body['properties'] = set_gov_prop_body(object_type, qualified_name,
173
+ parsed_output['attributes'])
174
+ guid = egeria_client.create_governance_definition(body_slimmer(create_body))
175
+ if guid:
176
+ logger.success(f"Created {object_type} `{display_name}` with GUID {guid}")
177
+ return egeria_client.get_governance_definition_by_guid(guid, output_format='MD',
178
+ report_spec=output_set)
179
+ else:
180
+ logger.error(f"Failed to create {object_type} `{display_name}`.")
181
+ return None
182
+
183
+ else:
184
+ logger.error(f"Unsupported directive: {directive}")
185
+ return None
186
+
187
+ except PyegeriaException as e:
188
+ logger.error(f"PyegeriaException occurred: {e}")
189
+ print_basic_exception(e)
190
+ return None
191
+
192
+ except Exception as e:
193
+ logger.exception(f"Unexpected error: {e}")
194
+ print("Unexepected error occurred:\n {e}")
195
+ return None
196
+
197
+
198
+ @logger.catch
199
+ def process_gov_def_link_detach_command(egeria_client: EgeriaTech, txt: str,
200
+ directive: str = "display") -> Optional[str]:
201
+ """
202
+ Processes a link or unlink command to associate or break up peer governance definitions.
203
+
204
+ :param txt: A string representing the input cell to be processed for
205
+ extracting blueprint-related attributes.
206
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
207
+ :return: A string summarizing the outcome of the processing.
208
+ """
209
+ command, object_type, object_action = extract_command_plus(txt)
210
+ print(Markdown(f"# {command}\n"))
211
+
212
+ parsed_output = parse_view_command(egeria_client, object_type, object_action, txt, directive)
213
+
214
+ print(Markdown(parsed_output['display']))
215
+
216
+ logger.debug(json.dumps(parsed_output, indent=4))
217
+
218
+ attributes = parsed_output['attributes']
219
+
220
+ definition1 = attributes.get('Definition 1', {}).get('guid', None)
221
+ definition2 = attributes.get('Definition 2', {}).get('guid', None)
222
+ label = attributes.get('Link Label', {}).get('value', None)
223
+ description = attributes.get('Description', {}).get('value', None)
224
+
225
+ valid = parsed_output['valid']
226
+ exists = definition1 is not None and definition2 is not None
227
+
228
+ if directive == "display":
229
+
230
+ return None
231
+ elif directive == "validate":
232
+ if valid:
233
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
234
+ else:
235
+ msg = f"Validation failed for object_action `{command}`\n"
236
+ return valid
237
+
238
+ elif directive == "process":
239
+ # Initialize the inflect engine
240
+ inflector = engine()
241
+
242
+ # Split the object_type into words
243
+ object_type_parts = object_type.split()
244
+
245
+ # Determine which word to singularize (third word if present, otherwise fallback to last word)
246
+ if len(object_type_parts) >= 3:
247
+ word_to_singularize = object_type_parts[2]
248
+ else:
249
+ word_to_singularize = object_type_parts[-1] # Fallback to last word
250
+
251
+ # Singularize the selected word
252
+ singular_word = inflector.singular_noun(word_to_singularize) or word_to_singularize
253
+
254
+ # Construct gov_peer_relationship_type
255
+ gov_peer_relationship_type = f"Governance{singular_word}Link"
256
+
257
+ try:
258
+ if object_action == "Detach":
259
+ if not exists:
260
+ msg = (f" Link `{label}` does not exist! Updating result document with Link "
261
+ f"object_action\n")
262
+ logger.error(msg)
263
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
264
+ return out
265
+ elif not valid:
266
+ return None
267
+ else:
268
+ print(Markdown(
269
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
270
+ body = set_delete_request_body(object_type, attributes)
271
+
272
+ egeria_client.detach_peer_definitions(definition1, gov_peer_relationship_type,
273
+ definition2, body)
274
+
275
+ logger.success(f"===> Detached segment with {label} from `{definition1}`to {definition2}\n")
276
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
277
+
278
+ return (out)
279
+
280
+
281
+ elif object_action == "Link":
282
+ if valid is False and exists:
283
+ msg = (f"--> Link called `{label}` already exists and result document updated changing "
284
+ f"`Link` to `Detach` in processed output\n")
285
+ logger.error(msg)
286
+
287
+ elif valid is False:
288
+ msg = f"==>{object_type} Link with label `{label}` is not valid and can't be created"
289
+ logger.error(msg)
290
+ return
291
+
292
+ else:
293
+ body = set_peer_gov_def_request_body(object_type, attributes)
294
+ egeria_client.link_peer_definitions(definition1, gov_peer_relationship_type,
295
+ definition2, body)
296
+ msg = f"==>Created {object_type} link named `{label}`\n"
297
+ logger.success(msg)
298
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
299
+ return out
300
+
301
+ except ValidationError as e:
302
+ print_validation_error(e)
303
+ logger.error(f"Validation Error performing {command}: {e}")
304
+ return None
305
+ except PyegeriaException as e:
306
+ print_basic_exception(e)
307
+ logger.error(f"PyegeriaException occurred: {e}")
308
+ return None
309
+
310
+ except Exception as e:
311
+ logger.error(f"Error performing {command}: {e}")
312
+ return None
313
+ else:
314
+ return None
315
+
316
+
317
+ @logger.catch
318
+ def process_supporting_gov_def_link_detach_command(egeria_client: EgeriaTech, txt: str,
319
+ directive: str = "display") -> Optional[str]:
320
+ """
321
+ Processes a link or unlink command to associate or break up peer governance definitions.
322
+
323
+ :param txt: A string representing the input cell to be processed for
324
+ extracting blueprint-related attributes.
325
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
326
+ :return: A string summarizing the outcome of the processing.
327
+ """
328
+ command, object_type, object_action = extract_command_plus(txt)
329
+ print(Markdown(f"# {command}\n"))
330
+
331
+ parsed_output = parse_view_command(egeria_client, object_type, object_action, txt, directive)
332
+
333
+ print(Markdown(parsed_output['display']))
334
+
335
+ logger.debug(json.dumps(parsed_output, indent=4))
336
+
337
+ attributes = parsed_output['attributes']
338
+
339
+ definition1 = attributes.get('Definition 1', {}).get('guid', None)
340
+ definition2 = attributes.get('Definition 2', {}).get('guid', None)
341
+ label = attributes.get('Link Label', {}).get('value', None)
342
+ description = attributes.get('Description', {}).get('value', None)
343
+
344
+ valid = parsed_output['valid']
345
+ exists = definition1 is not None and definition2 is not None
346
+
347
+ if directive == "display":
348
+
349
+ return None
350
+ elif directive == "validate":
351
+ if valid:
352
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
353
+ else:
354
+ msg = f"Validation failed for object_action `{command}`\n"
355
+ return valid
356
+
357
+ elif directive == "process":
358
+
359
+ # Construct gov_peer_relationship_type
360
+ relationship_type_name = object_type.replace(' ', '')
361
+ print(f"relationship_type_name: {relationship_type_name}")
362
+ try:
363
+ if object_action == "Detach":
364
+ if not exists:
365
+ msg = (f" Link `{label}` does not exist! Updating result document with Link "
366
+ f"object_action\n")
367
+ logger.error(msg)
368
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
369
+ return out
370
+ elif not valid:
371
+ return None
372
+ else:
373
+ print(Markdown(
374
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
375
+ body = set_delete_request_body(object_type, attributes)
376
+
377
+ egeria_client.detach_supporting_definitions(definition1, relationship_type_name,
378
+ definition2, body)
379
+
380
+ logger.success(f"===> Detached segment with {label} from `{definition1}`to {definition2}\n")
381
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
382
+
383
+ return (out)
384
+
385
+
386
+ elif object_action == "Link":
387
+ if valid is False and exists:
388
+ msg = (f"--> Link called `{label}` already exists and result document updated changing "
389
+ f"`Link` to `Detach` in processed output\n")
390
+ logger.error(msg)
391
+
392
+ elif valid is False:
393
+ msg = f"==>{object_type} Link with label `{label}` is not valid and can't be created"
394
+ logger.error(msg)
395
+ return
396
+
397
+ else:
398
+ body_prop = {
399
+ "class": "SupportingDefinitionProperties",
400
+ "rationale": attributes.get('Rationale', {}).get('value', None),
401
+ "effectiveFrom": attributes.get('Effective From', {}).get('value', None),
402
+ "effectiveTo": attributes.get('Effective To', {}).get('value', None),
403
+ }
404
+
405
+ body = set_peer_gov_def_request_body(object_type, attributes)
406
+ body['properties'] = body_prop
407
+ egeria_client.attach_supporting_definitions(definition1, relationship_type_name,
408
+ definition2, body)
409
+ msg = f"==>Created {object_type} link named `{label}`\n"
410
+ logger.success(msg)
411
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
412
+ return out
413
+
414
+ except ValidationError as e:
415
+ print_validation_error(e)
416
+ logger.error(f"Validation Error performing {command}: {e}")
417
+ return None
418
+ except PyegeriaException as e:
419
+ print_basic_exception(e)
420
+ logger.error(f"PyegeriaException occurred: {e}")
421
+ return None
422
+
423
+ except Exception as e:
424
+ logger.error(f"Error performing {command}: {e}")
425
+ return None
426
+ else:
427
+ return None
428
+
429
+
430
+
431
+ @logger.catch
432
+ def process_governed_by_link_detach_command(egeria_client: EgeriaTech, txt: str,
433
+ directive: str = "display") -> Optional[str]:
434
+ """
435
+ Processes a link or unlink command to associate or break up peer governance definitions.
436
+
437
+ :param txt: A string representing the input cell to be processed for
438
+ extracting blueprint-related attributes.
439
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
440
+ :return: A string summarizing the outcome of the processing.
441
+ """
442
+ command, object_type, object_action = extract_command_plus(txt)
443
+ print(Markdown(f"# {command}\n"))
444
+
445
+ parsed_output = parse_view_command(egeria_client, object_type, object_action, txt, directive)
446
+
447
+ print(Markdown(parsed_output['display']))
448
+
449
+ logger.debug(json.dumps(parsed_output, indent=4))
450
+
451
+ attributes = parsed_output['attributes']
452
+
453
+ element_guid = attributes.get('Referenceable', {}).get('guid', None)
454
+ definition_guid = attributes.get('Governance Definition', {}).get('guid', None)
455
+ label = attributes.get('Link Label', {}).get('value', None)
456
+ description = attributes.get('Description', {}).get('value', None)
457
+
458
+ valid = parsed_output['valid']
459
+ exists = element_guid is not None and definition_guid is not None
460
+
461
+ if directive == "display":
462
+
463
+ return None
464
+ elif directive == "validate":
465
+ if valid:
466
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
467
+ else:
468
+ msg = f"Validation failed for object_action `{command}`\n"
469
+ return valid
470
+
471
+ elif directive == "process":
472
+
473
+
474
+ try:
475
+ if object_action == "Detach":
476
+ if not exists:
477
+ msg = (f" Link `{label}` does not exist! Updating result document with Link "
478
+ f"object_action\n")
479
+ logger.error(msg)
480
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
481
+ return out
482
+ elif not valid:
483
+ return None
484
+ else:
485
+ print(Markdown(
486
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
487
+ body = set_delete_request_body(object_type, attributes)
488
+
489
+ egeria_client.detach_governed_by_definitions(element_guid, definition_guid, body)
490
+
491
+ logger.success(f"===> Detached segment with {label} from `{definition1}`to {definition2}\n")
492
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
493
+
494
+ return (out)
495
+
496
+
497
+ elif object_action == "Link":
498
+ if valid is False and exists:
499
+ msg = (f"--> Link called `{label}` already exists and result document updated changing "
500
+ f"`Link` to `Detach` in processed output\n")
501
+ logger.error(msg)
502
+
503
+ elif valid is False:
504
+ msg = f"==>{object_type} Link with label `{label}` is not valid and can't be created"
505
+ logger.error(msg)
506
+ return
507
+
508
+ else:
509
+ body_prop = set_rel_prop_body(object_type, attributes)
510
+
511
+ body = set_rel_request_body(object_type, attributes)
512
+ body['properties'] = body_prop
513
+ body = body_slimmer(body)
514
+ egeria_client.attach_governed_by_definition(element_guid, definition_guid, body)
515
+ msg = f"==>Created {object_type} link named `{label}`\n"
516
+ logger.success(msg)
517
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
518
+ return out
519
+
520
+ except ValidationError as e:
521
+ print_validation_error(e)
522
+ logger.error(f"Validation Error performing {command}: {e}")
523
+ return None
524
+ except PyegeriaException as e:
525
+ print_basic_exception(e)
526
+ logger.error(f"PyegeriaException occurred: {e}")
527
+ return None
528
+
529
+ except Exception as e:
530
+ logger.error(f"Error performing {command}: {e}")
531
+ return None
532
+ else:
533
+ return None
534
+
535
+
536
+
537
+ @logger.catch
538
+ def process_gov_def_context_command(egeria_client: EgeriaTech, txt: str,
539
+ directive: str = "display") -> Optional[str]:
540
+ """
541
+ Retrieves the context graph for a governance definition.
542
+
543
+ :param txt: A string representing the input cell to be processed for
544
+ extracting term-related attributes.
545
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
546
+ :return: A string summarizing the outcome of the processing.
547
+ """
548
+ command, object_type, object_action = extract_command_plus(txt)
549
+ print(Markdown(f"# {command}\n"))
550
+
551
+ parsed_output = parse_view_command(egeria_client, object_type, object_action, txt, directive)
552
+
553
+ valid = parsed_output['valid']
554
+ exists = parsed_output['exists']
555
+ qualified_name = parsed_output.get('qualified_name', None)
556
+ display_name = parsed_output.get('display_name', None)
557
+ guid = parsed_output.get('guid', None)
558
+
559
+ print(Markdown(parsed_output['display']))
560
+
561
+ attr = parsed_output.get('attributes', {})
562
+
563
+ output_format = attr.get('Output Format', {}).get('value', 'LIST')
564
+ detailed = attr.get('Detailed', {}).get('value', False)
565
+
566
+ if directive == "display":
567
+ return None
568
+ elif directive == "validate":
569
+ if valid:
570
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
571
+ else:
572
+ msg = f"Validation failed for object_action `{command}`\n"
573
+ logger.error(msg)
574
+ return valid
575
+
576
+ elif directive == "process":
577
+ try:
578
+ if not valid: # First validate the command before we process it
579
+ msg = f"Validation failed for {object_action} `{object_type}`\n"
580
+ logger.error(msg)
581
+ return None
582
+
583
+ list_md = f"\n# `{object_type}` with Qualified Name: `{qualified_name}`\n\n"
584
+ body = set_update_body(object_type, attr)
585
+
586
+ struct = egeria_client.get_gov_def_in_context(guid, body=body, output_format=output_format)
587
+ if output_format.upper() == "DICT":
588
+ list_md += f"```\n{json.dumps(struct, indent=4)}\n```\n"
589
+ else:
590
+ list_md += struct
591
+ logger.info(f"Wrote `{object_type}` graph for : `{qualified_name}`")
592
+
593
+ return list_md
594
+
595
+ except Exception as e:
596
+ logger.error(f"Error performing {command}: {e}")
597
+ console.print_exception(show_locals=True)
598
+ return None
599
+ else:
600
+ return None