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,726 @@
1
+ """
2
+ This file contains feedback-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_rel_request_body_for_type
16
+
17
+
18
+ from pyegeria import PyegeriaException, print_basic_exception, \
19
+ print_validation_error, COMMENT_TYPES
20
+
21
+ from md_processing.md_processing_utils.common_md_utils import (update_element_dictionary,
22
+ )
23
+ from md_processing.md_processing_utils.extraction_utils import (extract_command_plus, update_a_command)
24
+
25
+
26
+ from pyegeria.egeria_tech_client import EgeriaTech
27
+ from pyegeria.core.utils import body_slimmer
28
+
29
+
30
+
31
+ def process_add_comment_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
32
+ """
33
+ Processes a comment create or update object_action by extracting key attributes such as
34
+ from the given text. If the Parent Comment is provided, then this comment will be a `reply` and the `Associated Element`
35
+ will be ignored. One of `Associated Element` and `Parent Comment` must be provided.
36
+
37
+ :param txt: A string representing the input cell to be processed for
38
+ extracting glossary-related attributes.
39
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
40
+ :return: A string summarizing the outcome of the processing.
41
+ """
42
+
43
+ command, object_type, object_action = extract_command_plus(txt)
44
+ print(Markdown(f"# {command}\n"))
45
+
46
+ parsed_output = parse_upsert_command(egeria_client, object_type, object_action, txt, directive)
47
+ if not parsed_output:
48
+ logger.error(f"No output for `{object_action}`")
49
+ return None
50
+
51
+ attributes = parsed_output['attributes']
52
+
53
+ valid = parsed_output['valid']
54
+ exists = parsed_output['exists']
55
+
56
+ qualified_name = parsed_output.get('qualified_name', None)
57
+ guid = parsed_output.get('guid', None)
58
+
59
+ print(Markdown(parsed_output['display']))
60
+
61
+ logger.debug(json.dumps(parsed_output, indent=4))
62
+
63
+
64
+
65
+ display_name = attributes['Display Name'].get('value', None)
66
+ associated_element = attributes.get('Associated Element', {}).get('value', None)
67
+ associated_element_guid = attributes.get('Associated Element', {}).get('guid', None)
68
+ description = attributes.get('Comment Text', {}).get('value', None)
69
+ comment_type = attributes.get('Comment Type', {}).get('value', None).strip()
70
+
71
+
72
+ # if associated_element_guid is None and parent_comment_guid is None:
73
+ # valid = False
74
+ # msg = f"Validation failed for {command} - One of `Associated Element` or `Parent Comment` must be specified\n"
75
+ # logger.error(msg)
76
+ # print(msg)
77
+ # else:
78
+ # if description:
79
+ # valid = True
80
+ # exists = True
81
+ #
82
+
83
+ if directive == "display":
84
+ return None
85
+ elif directive == "validate":
86
+ if valid:
87
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
88
+ else:
89
+ msg = f"Validation failed for object_action `{command}`\n"
90
+ return valid
91
+
92
+ elif directive == "process":
93
+ try:
94
+
95
+ obj = "Comment"
96
+ if comment_type not in COMMENT_TYPES:
97
+ raise ValueError(f"Invalid comment type: {comment_type}")
98
+ # target_guid = parent_comment_guid if parent_comment_guid else associated_element_guid
99
+ if qualified_name is None:
100
+ qualified_name = egeria_client.make_feedback_qn("Comment",associated_element_guid,display_name)
101
+ # Set the property body for a glossary collection
102
+ #
103
+ prop_body = {
104
+ "class": "CommentProperties",
105
+ "displayName": display_name,
106
+ "qualifiedName": qualified_name,
107
+ "description": description,
108
+ "commentType": comment_type
109
+ }
110
+
111
+ if object_action == "Update":
112
+ if not exists:
113
+ msg = (f" Element `{display_name}` does not exist! Updating result document with Create "
114
+ f"{object_action}\n")
115
+ logger.error(msg)
116
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
117
+ elif not valid:
118
+ msg = (" The input data is invalid and cannot be processed. \nPlease review")
119
+ logger.error(msg)
120
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
121
+ print(Markdown(msg))
122
+ return None
123
+ else:
124
+ print(Markdown(
125
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
126
+
127
+
128
+ body = set_update_body(obj, attributes)
129
+ body['properties'] = prop_body
130
+
131
+ egeria_client.update_comment(guid, body)
132
+
133
+ logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
134
+ update_element_dictionary(qualified_name, {
135
+ 'guid': guid, 'display_name': display_name
136
+ })
137
+ return egeria_client.get_comment_by_guid(guid, element_type='Comment',
138
+ output_format='MD', report_spec = "Comments-DrE")
139
+
140
+
141
+ elif object_action == "Create":
142
+ if valid is False and exists:
143
+ msg = (f"Project `{display_name}` already exists and result document updated changing "
144
+ f"`Create` to `Update` in processed output\n\n___")
145
+ logger.error(msg)
146
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
147
+ elif not valid:
148
+ msg = ("The input data is invalid and cannot be processed. \nPlease review")
149
+ logger.error(msg)
150
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
151
+ print(Markdown(msg))
152
+ return None
153
+
154
+ else:
155
+
156
+ body = set_create_body(object_type,attributes)
157
+ body['class'] = "NewAttachmentRequestBody"
158
+ body["properties"] = prop_body
159
+ slim_body = body_slimmer(body)
160
+ # if parent_comment_guid:
161
+ # guid = egeria_client.add_comment_reply(element_guid = parent_comment_guid, body = slim_body)
162
+ # else:
163
+ guid = egeria_client.add_comment_to_element(element_guid = associated_element_guid, body =slim_body)
164
+
165
+ if guid:
166
+ update_element_dictionary(qualified_name, {
167
+ 'guid': guid, 'display_name': display_name
168
+ })
169
+ msg = f"## ==> Created Element `{display_name}` with GUID {guid}\n\n___"
170
+ logger.success(msg)
171
+ print(Markdown(msg))
172
+ return egeria_client.get_comment_by_guid(guid, output_format='MD', report_spec = "Comments-DrE")
173
+ else:
174
+ msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
175
+ logger.error(msg)
176
+ return None
177
+
178
+ except PyegeriaException as e:
179
+ logger.error(f"Pyegeria error performing {command}: {e}")
180
+ print_basic_exception(e)
181
+ return None
182
+ except Exception as e:
183
+ logger.error(f"Error performing {command}: {e}")
184
+ else:
185
+ return None
186
+
187
+ def process_journal_entry_command(egeria_client: EgeriaTech, txt: str,
188
+ directive: str = "display") -> Optional[str]:
189
+ """
190
+ Creates or updates a journal entry. If the journal (NoteLog) doesn't exist, then it will be created. Each journal
191
+ entry is a note in a NoteLog.
192
+
193
+ :param txt: A string representing the input cell to be processed for
194
+ extracting glossary-related attributes.
195
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
196
+ :return: A string summarizing the outcome of the processing.
197
+ """
198
+
199
+ command, object_type, object_action = extract_command_plus(txt)
200
+ print(Markdown(f"# {command}\n"))
201
+
202
+ parsed_output = parse_upsert_command(egeria_client, object_type, object_action, txt, directive)
203
+ if not parsed_output:
204
+ logger.error(f"No output for `{object_action}`")
205
+ return None
206
+
207
+ valid = parsed_output['valid']
208
+ exists = parsed_output['exists']
209
+
210
+ qualified_name = parsed_output.get('qualified_name', None)
211
+ guid = parsed_output.get('guid', None)
212
+
213
+ print(Markdown(parsed_output['display']))
214
+
215
+ logger.debug(json.dumps(parsed_output, indent=4))
216
+
217
+ attributes = parsed_output['attributes']
218
+
219
+ journal_name = attributes['Journal Name'].get('value', None)
220
+ journal_qn = attributes['Journal Name'].get('qualified_name', None)
221
+ journal_exists = attributes['Journal Name'].get('Exists', False)
222
+ note_entry = attributes['Note Entry'].get('value', None)
223
+ journal_description = attributes['Journal Description'].get('value', None)
224
+
225
+ associated_element = attributes.get('Associated Element', {}).get('value', None)
226
+ associated_element_qn = attributes.get('Associated Element', {}).get('qualified_name', None)
227
+
228
+ if journal_exists is False:
229
+ qualified_name = None
230
+ journal_qn = None
231
+
232
+
233
+ if journal_name and note_entry:
234
+ valid = True
235
+ else:
236
+ valid = False
237
+ #
238
+
239
+ if directive == "display":
240
+ return None
241
+ elif directive == "validate":
242
+ if valid:
243
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
244
+ else:
245
+ msg = f"Validation failed for object_action `{command}`\n"
246
+ return valid
247
+
248
+ elif directive == "process":
249
+ try:
250
+
251
+ if object_action == "Create":
252
+ if valid is False:
253
+ msg = "Journal name or Journal entry are missing."
254
+ logger.error(msg)
255
+ print(msg)
256
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
257
+ return None
258
+
259
+ else:
260
+
261
+ note_guid = egeria_client.add_journal_entry(note_log_qn = journal_qn,
262
+ element_qn = associated_element_qn,
263
+ note_log_display_name = journal_name,
264
+ note_entry = note_entry )
265
+ if note_guid:
266
+ msg = f"Created entry in `{journal_name}` with GUID {note_guid}\n\n___"
267
+ logger.success(msg)
268
+ print(Markdown(msg))
269
+ return egeria_client.get_note_by_guid(note_guid,
270
+ output_format='MD', report_spec = "Journal-Entry-DrE")
271
+ else:
272
+ msg = f"Failed to create entry for `{journal_name}`\n\n___"
273
+ logger.error(msg)
274
+ return None
275
+
276
+ except PyegeriaException as e:
277
+ logger.error(f"Pyegeria error performing {command}: {e}")
278
+ print_basic_exception(e)
279
+ return None
280
+ except Exception as e:
281
+ logger.error(f"Error performing {command}: {e}")
282
+ else:
283
+ return None
284
+
285
+
286
+ def process_upsert_note_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
287
+ """
288
+ Processes a NoteLog Note request to create or update object_action from the given text.
289
+
290
+ :param txt: A string representing the input cell to be processed for
291
+ extracting glossary-related attributes.
292
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
293
+ :return: A string summarizing the outcome of the processing.
294
+ """
295
+
296
+ command, object_type, object_action = extract_command_plus(txt)
297
+ print(Markdown(f"# {command}\n"))
298
+
299
+ parsed_output = parse_upsert_command(egeria_client, object_type, object_action, txt, directive)
300
+ if not parsed_output:
301
+ logger.error(f"No output for `{object_action}`")
302
+ return None
303
+
304
+ valid = parsed_output['valid']
305
+ exists = parsed_output['exists']
306
+
307
+ qualified_name = parsed_output.get('qualified_name', None)
308
+ guid = parsed_output.get('guid', None)
309
+
310
+ print(Markdown(parsed_output['display']))
311
+
312
+ logger.debug(json.dumps(parsed_output, indent=4))
313
+
314
+ attributes = parsed_output['attributes']
315
+
316
+ display_name = attributes['Display Name'].get('value', None)
317
+ note_log = attributes.get('Note Log',{}).get('value', {})
318
+ note_log_guid = attributes.get('Note Log',{}).get('guid', None)
319
+ #
320
+
321
+ if directive == "display":
322
+ return None
323
+ elif directive == "validate":
324
+ if valid:
325
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
326
+ else:
327
+ msg = f"Validation failed for object_action `{command}`\n"
328
+ return valid
329
+
330
+ elif directive == "process":
331
+ try:
332
+ obj = "Notification"
333
+
334
+ # Set the property body for a glossary collection
335
+ #
336
+ prop_body = set_element_prop_body(obj, qualified_name, attributes)
337
+
338
+ if object_action == "Update":
339
+ if not exists:
340
+ msg = (f" Element `{display_name}` does not exist! Updating result document with Create "
341
+ f"{object_action}\n")
342
+ logger.error(msg)
343
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
344
+ elif not valid:
345
+ msg = (" The input data is invalid and cannot be processed. \nPlease review")
346
+ logger.error(msg)
347
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
348
+ print(Markdown(msg))
349
+ return None
350
+ else:
351
+ print(Markdown(
352
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
353
+
354
+
355
+ body = set_update_body(obj, attributes)
356
+ body['properties'] = prop_body
357
+ slim_body = body_slimmer(body)
358
+ egeria_client.update_note(guid, slim_body)
359
+
360
+
361
+ logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
362
+ update_element_dictionary(qualified_name, {
363
+ 'guid': guid, 'display_name': display_name
364
+ })
365
+ return egeria_client.get_note_by_guid(guid, output_format='MD', report_spec = "Note-DrE")
366
+
367
+
368
+ elif object_action == "Create":
369
+ if valid is False and exists:
370
+ msg = (f"Project `{display_name}` already exists and result document updated changing "
371
+ f"`Create` to `Update` in processed output\n\n___")
372
+ logger.error(msg)
373
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
374
+ elif not valid:
375
+ msg = ("The input data is invalid and cannot be processed. \nPlease review")
376
+ logger.error(msg)
377
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
378
+ print(Markdown(msg))
379
+ return None
380
+
381
+ else:
382
+ body = set_create_body(object_type,attributes)
383
+
384
+ body["properties"] = prop_body
385
+ slim_body = body_slimmer(body)
386
+ guid = egeria_client.create_project(body = slim_body)
387
+ if guid:
388
+ update_element_dictionary(qualified_name, {
389
+ 'guid': guid, 'display_name': display_name
390
+ })
391
+ msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
392
+ logger.success(msg)
393
+ return egeria_client.get_note_by_guid(guid, output_format='MD', report_spec = "Note-DrE")
394
+ else:
395
+ msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
396
+ logger.error(msg)
397
+ return None
398
+
399
+ except PyegeriaException as e:
400
+ logger.error(f"Pyegeria error performing {command}: {e}")
401
+ print_basic_exception(e)
402
+ return None
403
+ except Exception as e:
404
+ logger.error(f"Error performing {command}: {e}")
405
+ else:
406
+ return None
407
+
408
+ def process_attach_note_log_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
409
+
410
+ # """ Set one project to manage another."""
411
+ #
412
+ command, object_type, object_action = extract_command_plus(txt)
413
+ print(Markdown(f"# {command}\n"))
414
+
415
+ parsed_output = parse_view_command(egeria_client, object_type, object_action,
416
+ txt, directive)
417
+
418
+ if not parsed_output:
419
+ logger.error(f"No output for `{object_action}`")
420
+ print(Markdown("## Parsing failed"))
421
+ return None
422
+
423
+ print(Markdown(parsed_output['display']))
424
+
425
+ logger.debug(json.dumps(parsed_output, indent=4))
426
+
427
+ attributes = parsed_output['attributes']
428
+
429
+ parent_project_guid = attributes.get('Parent Project', {}).get('guid', None)
430
+ child_project_guid = attributes.get('Child Project', {}).get('guid', None)
431
+ label = attributes.get('Link Label', {}).get('value', "")
432
+
433
+ valid = parsed_output['valid']
434
+ exists = parent_project_guid is not None and child_project_guid is not None
435
+
436
+ if directive == "display":
437
+
438
+ return None
439
+ elif directive == "validate":
440
+ if valid:
441
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
442
+ else:
443
+ msg = f"Validation failed for object_action `{command}`\n"
444
+ logger.error(msg)
445
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
446
+ return valid
447
+
448
+ elif directive == "process":
449
+
450
+
451
+ try:
452
+ if object_action == "Detach":
453
+ if not exists:
454
+ msg = (f" Link `{label}` does not exist! Updating result document with Link "
455
+ f"object_action\n")
456
+ logger.error(msg)
457
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
458
+ return out
459
+ elif not valid:
460
+ return None
461
+ else:
462
+ print(Markdown(
463
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
464
+ body = set_delete_request_body(object_type, attributes)
465
+
466
+ egeria_client.clear_project_hierarchy(child_project_guid, parent_project_guid,body)
467
+
468
+ logger.success(f"===> Detached segment with {label} from `{child_project_guid}`to {parent_project_guid}\n")
469
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
470
+
471
+ return (out)
472
+
473
+
474
+ elif object_action == "Link":
475
+ if valid is False and exists:
476
+ msg = (f"--> Link called `{label}` already exists and result document updated changing "
477
+ f"`Link` to `Detach` in processed output\n")
478
+ logger.error(msg)
479
+
480
+ elif valid is False:
481
+ msg = f"==>{object_type} Link with label `{label}` is not valid and can't be created"
482
+ logger.error(msg)
483
+ return
484
+
485
+ else:
486
+ body = set_rel_request_body_for_type("ProjectHierarchy", attributes)
487
+
488
+ egeria_client.set_project_hierarchy(project_guid =child_project_guid,
489
+ parent_project_guid = parent_project_guid)
490
+ # body=body_slimmer(body))
491
+ msg = f"==>Created {object_type} link named `{label}`\n"
492
+ logger.success(msg)
493
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
494
+ return out
495
+
496
+ except ValidationError as e:
497
+ print_validation_error(e)
498
+ logger.error(f"Validation Error performing {command}: {e}")
499
+ return None
500
+ except PyegeriaException as e:
501
+ print_basic_exception(e)
502
+ logger.error(f"PyegeriaException occurred: {e}")
503
+ return None
504
+
505
+ except Exception as e:
506
+ logger.error(f"Error performing {command}: {e}")
507
+ return None
508
+ else:
509
+ return None
510
+
511
+ def process_upsert_informal_tag_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
512
+ """
513
+ Processes a informal tag create or update object_action by extracting key attributes such as
514
+ from the given text.
515
+
516
+ :param txt: A string representing the input cell to be processed for
517
+ extracting glossary-related attributes.
518
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
519
+ :return: A string summarizing the outcome of the processing.
520
+ """
521
+
522
+ command, object_type, object_action = extract_command_plus(txt)
523
+ print(Markdown(f"# {command}\n"))
524
+
525
+ parsed_output = parse_upsert_command(egeria_client, object_type, object_action, txt, directive)
526
+ if not parsed_output:
527
+ logger.error(f"No output for `{object_action}`")
528
+ return None
529
+
530
+ valid = parsed_output['valid']
531
+ exists = parsed_output['exists']
532
+
533
+ qualified_name = parsed_output.get('qualified_name', None)
534
+
535
+ guid = parsed_output.get('guid', None)
536
+
537
+ print(Markdown(parsed_output['display']))
538
+
539
+ logger.debug(json.dumps(parsed_output, indent=4))
540
+
541
+ attributes = parsed_output['attributes']
542
+
543
+ display_name = attributes['Display Name'].get('value', None)
544
+ description = attributes['Description'].get('value', None)
545
+ #
546
+
547
+ if directive == "display":
548
+ return None
549
+ elif directive == "validate":
550
+ if valid:
551
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
552
+ else:
553
+ msg = f"Validation failed for object_action `{command}`\n"
554
+ return valid
555
+
556
+ elif directive == "process":
557
+ try:
558
+ obj = "InformalTag"
559
+
560
+ # Set the property body for a glossary collection
561
+ #
562
+ prop_body = set_element_prop_body(obj, qualified_name, attributes)
563
+
564
+ if object_action == "Update":
565
+ if not exists:
566
+ msg = (f" Element `{display_name}` does not exist! Updating result document with Create "
567
+ f"{object_action}\n")
568
+ logger.error(msg)
569
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
570
+ elif not valid:
571
+ msg = (" The input data is invalid and cannot be processed. \nPlease review")
572
+ logger.error(msg)
573
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
574
+ print(Markdown(msg))
575
+ return None
576
+ else:
577
+ print(Markdown(
578
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
579
+
580
+ egeria_client.update_tag_description(guid, description)
581
+
582
+ logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
583
+ update_element_dictionary(qualified_name, {
584
+ 'guid': guid, 'display_name': display_name
585
+ })
586
+ return egeria_client.get_tag_by_guid(guid, element_type='InformalTag',
587
+ output_format='MD', report_spec = "Informal-Tag-DrE")
588
+
589
+
590
+ elif object_action == "Create":
591
+ if valid is False and exists:
592
+ msg = (f"Informal Tag `{display_name}` already exists and result document updated changing "
593
+ f"`Create` to `Update` in processed output\n\n___")
594
+ logger.error(msg)
595
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
596
+ elif not valid:
597
+ msg = ("The input data is invalid and cannot be processed. \nPlease review")
598
+ logger.error(msg)
599
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
600
+ print(Markdown(msg))
601
+ return None
602
+
603
+ else:
604
+
605
+ guid = egeria_client.create_informal_tag(display_name, description, qualified_name)
606
+ if guid:
607
+ update_element_dictionary(qualified_name, {
608
+ 'guid': guid, 'display_name': display_name
609
+ })
610
+ msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
611
+ print(Markdown(msg))
612
+ logger.success(msg)
613
+ return egeria_client.get_tag_by_guid(guid, output_format='MD', report_spec = "Informal-Tags-DrE")
614
+ else:
615
+ msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
616
+ logger.error(msg)
617
+ return None
618
+
619
+ except PyegeriaException as e:
620
+ logger.error(f"Pyegeria error performing {command}: {e}")
621
+ print_basic_exception(e)
622
+ return None
623
+ except Exception as e:
624
+ logger.error(f"Error performing {command}: {e}")
625
+ else:
626
+ return None
627
+
628
+
629
+ def process_tag_element_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
630
+
631
+ # """ Tag an Element with the specified Informal Tag."""
632
+ #
633
+ command, object_type, object_action = extract_command_plus(txt)
634
+ print(Markdown(f"# {command}\n"))
635
+
636
+ parsed_output = parse_view_command(egeria_client, object_type, object_action,
637
+ txt, directive)
638
+ tag_id = parsed_output['attributes']['Tag ID'].get('value', None)
639
+ tag_guid = parsed_output['attributes']['Tag ID'].get('guid', None)
640
+ element_id = parsed_output['attributes']['Element ID'].get('value', None)
641
+ element_guid = parsed_output['attributes']['Element ID'].get('guid', None)
642
+
643
+ if not parsed_output:
644
+ logger.error(f"No output for `{object_action}`")
645
+ print(Markdown("## Parsing failed"))
646
+ return None
647
+
648
+ print(Markdown(parsed_output['display']))
649
+
650
+ logger.debug(json.dumps(parsed_output, indent=4))
651
+
652
+ valid = parsed_output['valid']
653
+ exists = tag_guid is not None and element_guid is not None
654
+
655
+ if directive == "display":
656
+
657
+ return None
658
+ elif directive == "validate":
659
+ if valid:
660
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
661
+ else:
662
+ msg = f"Validation failed for object_action `{command}`\n"
663
+ logger.error(msg)
664
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
665
+ return valid
666
+
667
+ elif directive == "process":
668
+
669
+ try:
670
+ if object_action == "Detach":
671
+ if not exists:
672
+ msg = (f" The tag or element do not exist! Updating result document with Link "
673
+ f"object_action\n")
674
+ logger.error(msg)
675
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
676
+ return out
677
+ elif not valid:
678
+ return None
679
+ else:
680
+ print(Markdown(
681
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
682
+
683
+ egeria_client.remove_tag_from_element(element_guid, tag_guid)
684
+
685
+ logger.success(f"===> Detached tab {tag_id} from `{element_id}`\n")
686
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
687
+
688
+ return (out)
689
+
690
+
691
+ elif object_action == "Link":
692
+ if valid is False and exists:
693
+ msg = ("--> Link already exists and result document updated changing "
694
+ "`Link` to `Detach` in processed output\n")
695
+ logger.error(msg)
696
+
697
+ elif valid is False:
698
+ msg = f"==>{object_type} Add link request is not valid and can't be created"
699
+ logger.error(msg)
700
+ return
701
+
702
+ else:
703
+ egeria_client.add_tag_to_element(element_guid =element_guid,
704
+ tag_guid = tag_guid)
705
+
706
+ msg = f"==>Created {object_type} link \n"
707
+ logger.success(msg)
708
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
709
+ return out
710
+
711
+ except ValidationError as e:
712
+ print_validation_error(e)
713
+ logger.error(f"Validation Error performing {command}: {e}")
714
+ return None
715
+ except PyegeriaException as e:
716
+ print_basic_exception(e)
717
+ logger.error(f"PyegeriaException occurred: {e}")
718
+ return None
719
+
720
+ except Exception as e:
721
+ logger.error(f"Error performing {command}: {e}")
722
+ return None
723
+ else:
724
+ return None
725
+
726
+