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,530 @@
1
+ """
2
+ This file contains Dr. Egeria commands for working with External References.
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
+ )
15
+ from md_processing.md_processing_utils.common_md_utils import (set_update_body, set_element_prop_body,
16
+ set_delete_request_body, set_create_body,
17
+ set_rel_request_body_for_type,
18
+ set_rel_prop_body, )
19
+ from md_processing.md_processing_utils.common_md_utils import (update_element_dictionary,
20
+ )
21
+ from md_processing.md_processing_utils.extraction_utils import (extract_command_plus, update_a_command)
22
+
23
+ from pyegeria import 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, body_slimmer
26
+
27
+
28
+ # EGERIA_WIDTH = int(os.environ.get("EGERIA_WIDTH", "170"))
29
+ # console = Console(width=EGERIA_WIDTH)
30
+
31
+
32
+
33
+ def process_external_reference_upsert_command(egeria_client: EgeriaTech, txt: str,
34
+ directive: str = "display") -> Optional[str]:
35
+ """
36
+ Processes a project create or update object_action by extracting key attributes such as
37
+ glossary name, language, description, and usage from the given text.
38
+
39
+ :param txt: A string representing the input cell to be processed for
40
+ extracting glossary-related attributes.
41
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
42
+ :return: A string summarizing the outcome of the processing.
43
+ """
44
+
45
+ command, object_type, object_action = extract_command_plus(txt)
46
+ print(Markdown(f"# {command}\n"))
47
+
48
+ parsed_output = parse_upsert_command(egeria_client, object_type, object_action, txt, directive)
49
+ if not parsed_output:
50
+ logger.error(f"No output for `{object_action}`")
51
+ return None
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
+ attributes = parsed_output['attributes']
64
+
65
+ display_name = attributes['Display Name'].get('value', None)
66
+ status = attributes.get('Status', {}).get('value', None)
67
+ output_set = make_format_set_name_from_type(object_type)
68
+ #
69
+
70
+ if directive == "display":
71
+ return None
72
+ elif directive == "validate":
73
+ if valid:
74
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
75
+ else:
76
+ msg = f"Validation failed for object_action `{command}`\n"
77
+ return valid
78
+
79
+ elif directive == "process":
80
+ try:
81
+ obj = "External Reference"
82
+ EXTERNAL_REFERENCE_PROPS = ["ExternalReferenceProperties", "ExternalDataSourceProperties",
83
+ "ExternalModelSourceProperties",
84
+ "RelatedMediaProperties", "CitedDocumentProperties"]
85
+
86
+ EXTERNAL_REFERENCE_TYPES = ["ExternalReference", "ExternalDataSource", "ExternalModelSource",
87
+ "RelatedMedia", "CitedDocument"]
88
+
89
+
90
+ # Set the property body for a glossary collection
91
+ #
92
+ prop_body = set_element_prop_body(obj, qualified_name, attributes)
93
+ prop_body["referenceTitle"] = attributes.get('Reference Title', {}).get('value', None)
94
+ prop_body["referenceAbstract"] = attributes.get('Reference Abstract', {}).get('value', None)
95
+ prop_body["authors"] = attributes.get('Authors', {}).get('value', None)
96
+ prop_body["organization"] = attributes.get('Organization', {}).get('value', None)
97
+ prop_body["url"] = attributes.get('URL', {}).get('value', None)
98
+ prop_body["sources"] = attributes.get('Sources', {}).get('value', None)
99
+ prop_body["license"] = attributes.get('License', {}).get('value', None)
100
+ prop_body["copyright"] = attributes.get('Copyright', {}).get('value', None)
101
+ prop_body["attribution"] = attributes.get('Attribution', {}).get('value', None)
102
+
103
+ if object_type in ["RelatedMedia", "Related Media"]:
104
+ object_type = "RelatedMedia"
105
+ prop_body["class"] = "RelatedProperties"
106
+ prop_body["mediaType"] = attributes.get('Media Type', {}).get('value', None)
107
+ prop_body["mediaTypeOtherId"] = attributes.get('Media Type Other ID', {}).get('value', None)
108
+ prop_body["defaultMediaUsage"]= attributes.get('Default Media Usage', {}).get('value', None)
109
+ prop_body["defaultMediaUsageOtherId"] = attributes.get('Default Media Usage Other ID', {}).get('value', None)
110
+ elif object_type in ["CitedDocument", "Cited Document"]:
111
+ object_type = "CitedDocument"
112
+ prop_body["class"] = "CitedDocumentProperties"
113
+ prop_body["numberOfPages"] = attributes.get('Number of Pages', {}).get('value', None)
114
+ prop_body["pageRange"] = attributes.get('Page Range', {}).get('value', None)
115
+ prop_body["publicationSeries"] = attributes.get('Publication Series', {}).get('value', None)
116
+ prop_body["publicationSeriesVolume"] = attributes.get('Publication Series Volume', {}).get('value', None)
117
+ prop_body["publisher"] = attributes.get('Publisher', {}).get('value', None)
118
+ prop_body["edition"] = attributes.get('Edition', {}).get('value', None)
119
+ prop_body["firstPublicationDate"] = attributes.get('First Publication Date', {}).get('value', None)
120
+ prop_body["publicationDate"] = attributes.get('Publication Date', {}).get('value', None)
121
+ prop_body["publicationCity"] = attributes.get('Publication City', {}).get('value', None)
122
+ prop_body["publicationYear"] = attributes.get('Publication Year', {}).get('value', None)
123
+ prop_body["publicationNumbers"]= attributes.get('Publication Numbers', {}).get('value', None)
124
+ elif object_type in ["ExternalReference", "External Reference"]:
125
+ object_type = "ExternalReference"
126
+
127
+
128
+ if object_action == "Update":
129
+ if not exists:
130
+ msg = (f" Element `{display_name}` does not exist! Updating result document with Create "
131
+ f"{object_action}\n")
132
+ logger.error(msg)
133
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
134
+ elif not valid:
135
+ msg = (" The input data is invalid and cannot be processed. \nPlease review")
136
+ logger.error(msg)
137
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
138
+ print(Markdown(msg))
139
+ return None
140
+ else:
141
+ print(Markdown(
142
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
143
+
144
+
145
+ body = set_update_body(obj, attributes)
146
+ body['properties'] = prop_body
147
+
148
+ egeria_client.update_external_reference(guid, body)
149
+ # if status:
150
+ # egeria_client.update_external_reference_status(guid, status)
151
+
152
+ logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
153
+ print(Markdown(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___"))
154
+ update_element_dictionary(qualified_name, {
155
+ 'guid': guid, 'display_name': display_name
156
+ })
157
+ return egeria_client.get_external_reference_by_guid(guid, element_type= object_type,
158
+ output_format='MD', report_spec = output_set)
159
+
160
+
161
+ elif object_action == "Create":
162
+ if valid is False and exists:
163
+ msg = (f"Project `{display_name}` already exists and result document updated changing "
164
+ f"`Create` to `Update` in processed output\n\n___")
165
+ logger.error(msg)
166
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
167
+ elif not valid:
168
+ msg = ("The input data is invalid and cannot be processed. \nPlease review")
169
+ logger.error(msg)
170
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
171
+ print(Markdown(msg))
172
+ return None
173
+
174
+ else:
175
+ body = set_create_body(object_type,attributes)
176
+
177
+ # if this is a root or folder (maybe more in the future), then make sure that the classification is set.
178
+ # body["initialClassifications"] = set_object_classifications(object_type, attributes, None)
179
+
180
+ body["properties"] = prop_body
181
+ slim_body = body_slimmer(body)
182
+ guid = egeria_client.create_external_reference(body = slim_body)
183
+ if guid:
184
+ update_element_dictionary(qualified_name, {
185
+ 'guid': guid, 'display_name': display_name
186
+ })
187
+ msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
188
+ logger.success(msg)
189
+ print(Markdown(msg))
190
+ return egeria_client.get_external_reference_by_guid(guid, element_type=object_type,
191
+ output_format='MD',
192
+ report_spec=output_set)
193
+ else:
194
+ msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
195
+ print(Markdown(msg))
196
+ logger.error(msg)
197
+ return None
198
+
199
+ except PyegeriaException as e:
200
+ logger.error(f"Pyegeria error performing {command}: {e}")
201
+ print_basic_exception(e)
202
+ return None
203
+ except Exception as e:
204
+ logger.error(f"Error performing {command}: {e}")
205
+ else:
206
+ return None
207
+
208
+
209
+
210
+ def process_link_to_external_reference_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
211
+ """ Link a referenceable to an external reference."""
212
+
213
+ command, object_type, object_action = extract_command_plus(txt)
214
+ print(Markdown(f"# {command}\n"))
215
+
216
+ parsed_output = parse_view_command(egeria_client, object_type, object_action,
217
+ txt, directive)
218
+
219
+ if not parsed_output:
220
+ logger.error(f"No output for `{object_action}`")
221
+ print(Markdown("## Parsing failed"))
222
+ return None
223
+
224
+ print(Markdown(parsed_output['display']))
225
+
226
+ logger.debug(json.dumps(parsed_output, indent=4))
227
+
228
+ attributes = parsed_output['attributes']
229
+
230
+ element_guid = attributes.get('Element Name', {}).get('guid', None)
231
+ external_reference_guid = attributes.get('External Reference', {}).get('guid', None)
232
+
233
+ valid = parsed_output['valid']
234
+ exists = element_guid is not None and external_reference_guid is not None
235
+ prop_body = set_rel_prop_body("ExternalReferenceLink", attributes)
236
+
237
+ if directive == "display":
238
+
239
+ return None
240
+ elif directive == "validate":
241
+ if valid:
242
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
243
+ else:
244
+ msg = f"Validation failed for object_action `{command}`\n"
245
+ logger.error(msg)
246
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
247
+ return valid
248
+
249
+ elif directive == "process":
250
+
251
+ try:
252
+ if object_action == "Detach":
253
+ if not exists:
254
+ msg = " Link does not exist! Updating result document with Link object_action\n"
255
+ logger.error(msg)
256
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
257
+ return out
258
+ elif not valid:
259
+ return None
260
+ else:
261
+ print(Markdown(
262
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
263
+ body = set_delete_request_body(object_type, attributes)
264
+
265
+ egeria_client.detach_external_reference(element_guid, external_reference_guid, body)
266
+
267
+ logger.success(f"===> Detached segment from `{element_guid}`to {external_reference_guid}\n")
268
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
269
+
270
+ return (out)
271
+
272
+
273
+ elif object_action == "Link":
274
+ if valid is False and exists:
275
+ msg = "--> Link already exists and result document updated changing `Link` to `Detach` in processed output\n"
276
+ logger.error(msg)
277
+
278
+ elif valid is False:
279
+ msg = f"==>{object_type} Link is not valid and can't be created"
280
+ logger.error(msg)
281
+ return
282
+
283
+ else:
284
+ body = set_rel_request_body_for_type("ExternalReferencesLink", attributes)
285
+ body['properties'] = prop_body
286
+
287
+ egeria_client.link_external_reference(element_guid,
288
+ external_reference_guid,
289
+ body=body_slimmer(body))
290
+ msg = f"==>Created {object_type} link \n"
291
+ logger.success(msg)
292
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
293
+ return out
294
+
295
+ except ValidationError as e:
296
+ print_validation_error(e)
297
+ logger.error(f"Validation Error performing {command}: {e}")
298
+ return None
299
+ except PyegeriaException as e:
300
+ print_basic_exception(e)
301
+ logger.error(f"PyegeriaException occurred: {e}")
302
+ return None
303
+
304
+ except Exception as e:
305
+ logger.error(f"Error performing {command}: {e}")
306
+ return None
307
+ else:
308
+ return None
309
+
310
+
311
+
312
+ def process_link_to_media_reference_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") \
313
+ -> Optional[str]:
314
+ # """ Link a referenceable to a related media reference."""
315
+ #
316
+ #
317
+
318
+ command, object_type, object_action = extract_command_plus(txt)
319
+ print(Markdown(f"# {command}\n"))
320
+
321
+ parsed_output = parse_view_command(egeria_client, object_type, object_action,
322
+ txt, directive)
323
+
324
+ if not parsed_output:
325
+ logger.error(f"No output for `{object_action}`")
326
+ print(Markdown("## Parsing failed"))
327
+ return None
328
+
329
+ print(Markdown(parsed_output['display']))
330
+
331
+ logger.debug(json.dumps(parsed_output, indent=4))
332
+
333
+ attributes = parsed_output['attributes']
334
+
335
+ element_guid = attributes.get('Element Name', {}).get('guid', None)
336
+ media_reference_guid = attributes.get('Media Reference', {}).get('guid', None)
337
+ media_id = attributes.get('Media Id', {}).get('value', None)
338
+ media_usage = attributes.get('Media Usage', {}).get('value', None)
339
+ media_usage_other_id = attributes.get('Media Usage Other Id', {}).get('value', None)
340
+
341
+ valid = parsed_output['valid']
342
+ exists = element_guid is not None and media_reference_guid is not None
343
+ prop_body = set_rel_prop_body("MediaReference", attributes)
344
+ prop_body["mediaId"] = media_id
345
+ prop_body["mediaUsageId"] = media_usage
346
+ prop_body["mediaUsageOtherId"] = media_usage_other_id
347
+
348
+
349
+ if directive == "display":
350
+
351
+ return None
352
+ elif directive == "validate":
353
+ if valid:
354
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
355
+ else:
356
+ msg = f"Validation failed for object_action `{command}`\n"
357
+ logger.error(msg)
358
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
359
+ return valid
360
+
361
+ elif directive == "process":
362
+
363
+ try:
364
+ if object_action == "Detach":
365
+ if not exists:
366
+ msg = " Link does not exist! Updating result document with Link 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_cited_document(element_guid, media_reference_guid, body)
378
+
379
+ logger.success(f"===> Detached segment from `{element_guid}`to {media_reference_guid}\n")
380
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
381
+
382
+ return (out)
383
+
384
+
385
+ elif object_action == "Link":
386
+ if valid is False and exists:
387
+ msg = "--> Link already exists and result document updated changing `Link` to `Detach` in processed output\n"
388
+ logger.error(msg)
389
+
390
+ elif valid is False:
391
+ msg = f"==>{object_type} Link is not valid and can't be created"
392
+ logger.error(msg)
393
+ return
394
+
395
+ else:
396
+ body = set_rel_request_body_for_type("CitedDocumentLink", attributes)
397
+ body['properties'] = prop_body
398
+
399
+ egeria_client.link_cited_document(element_guid,
400
+ media_reference_guid,
401
+ body=body_slimmer(body))
402
+ msg = f"==>Created {object_type} link \n"
403
+ logger.success(msg)
404
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
405
+ return out
406
+
407
+ except ValidationError as e:
408
+ print_validation_error(e)
409
+ logger.error(f"Validation Error performing {command}: {e}")
410
+ return None
411
+ except PyegeriaException as e:
412
+ print_basic_exception(e)
413
+ logger.error(f"PyegeriaException occurred: {e}")
414
+ return None
415
+
416
+ except Exception as e:
417
+ logger.error(f"Error performing {command}: {e}")
418
+ return None
419
+ else:
420
+ return None
421
+
422
+ def process_link_to_cited_document_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") \
423
+ -> Optional[str]:
424
+
425
+ # """ Link a referenceable to a cited document."""
426
+ #
427
+
428
+ command, object_type, object_action = extract_command_plus(txt)
429
+ print(Markdown(f"# {command}\n"))
430
+
431
+ parsed_output = parse_view_command(egeria_client, object_type, object_action,
432
+ txt, directive)
433
+
434
+ if not parsed_output:
435
+ logger.error(f"No output for `{object_action}`")
436
+ print(Markdown("## Parsing failed"))
437
+ return None
438
+
439
+ print(Markdown(parsed_output['display']))
440
+
441
+ logger.debug(json.dumps(parsed_output, indent=4))
442
+
443
+ attributes = parsed_output['attributes']
444
+
445
+ element_guid = attributes.get('Element Name', {}).get('guid', None)
446
+ cited_document_guid = attributes.get('Cited Document', {}).get('guid', None)
447
+ reference_id = attributes.get('Reference Id', {}).get('value', None)
448
+ pages = attributes.get('Pages', {}).get('value', None)
449
+
450
+ valid = parsed_output['valid']
451
+ exists = element_guid is not None and cited_document_guid is not None
452
+ prop_body = set_rel_prop_body("CitedDocumentLink", attributes)
453
+ prop_body["referenceId"] = reference_id
454
+ prop_body["pages"] = pages
455
+
456
+
457
+
458
+ if directive == "display":
459
+
460
+ return None
461
+ elif directive == "validate":
462
+ if valid:
463
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
464
+ else:
465
+ msg = f"Validation failed for object_action `{command}`\n"
466
+ logger.error(msg)
467
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
468
+ return valid
469
+
470
+ elif directive == "process":
471
+
472
+
473
+ try:
474
+ if object_action == "Detach":
475
+ if not exists:
476
+ msg = f" Link does not exist! Updating result document with Link object_action\n"
477
+ logger.error(msg)
478
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
479
+ return out
480
+ elif not valid:
481
+ return None
482
+ else:
483
+ print(Markdown(
484
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
485
+ body = set_delete_request_body(object_type, attributes)
486
+
487
+ egeria_client.detach_cited_document(element_guid, cited_document_guid,body)
488
+
489
+ logger.success(f"===> Detached segment from `{element_guid}`to {cited_document_guid}\n")
490
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
491
+
492
+ return (out)
493
+
494
+
495
+ elif object_action == "Link":
496
+ if valid is False and exists:
497
+ msg = "--> Link already exists and result document updated changing `Link` to `Detach` in processed output\n"
498
+ logger.error(msg)
499
+
500
+ elif valid is False:
501
+ msg = f"==>{object_type} Link is not valid and can't be created"
502
+ logger.error(msg)
503
+ return
504
+
505
+ else:
506
+ body = set_rel_request_body_for_type("CitedDocumentLink", attributes)
507
+ body['properties'] = prop_body
508
+
509
+ egeria_client.link_cited_document(element_guid,
510
+ cited_document_guid,
511
+ body=body_slimmer(body))
512
+ msg = f"==>Created {object_type} link \n"
513
+ logger.success(msg)
514
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
515
+ return out
516
+
517
+ except ValidationError as e:
518
+ print_validation_error(e)
519
+ logger.error(f"Validation Error performing {command}: {e}")
520
+ return None
521
+ except PyegeriaException as e:
522
+ print_basic_exception(e)
523
+ logger.error(f"PyegeriaException occurred: {e}")
524
+ return None
525
+
526
+ except Exception as e:
527
+ logger.error(f"Error performing {command}: {e}")
528
+ return None
529
+ else:
530
+ return None