pyegeria 5.4.3.4__py3-none-any.whl → 5.4.4.1__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.
Files changed (215) hide show
  1. commands/cat/dr_egeria_command_help.py +11 -17
  2. commands/cat/list_format_set.py +3 -1
  3. md_processing/__init__.py +9 -1
  4. md_processing/data/commands.json +6951 -541
  5. md_processing/data/generated_format_sets.json +4137 -0
  6. md_processing/data/generated_format_sets.py +51 -0
  7. md_processing/dr_egeria.py +14 -2
  8. md_processing/md_commands/ext_ref_commands.py +543 -0
  9. md_processing/md_commands/old_solution_architect_commands.py +1139 -0
  10. md_processing/md_commands/solution_architect_commands.py +26 -59
  11. md_processing/md_processing_utils/debug_log +186 -3
  12. md_processing/md_processing_utils/debug_log.2025-09-09_11-10-03_528597.zip +0 -0
  13. md_processing/md_processing_utils/dr-egeria-help-2025-09-09T11:10:03.md +3305 -0
  14. md_processing/md_processing_utils/dr-egeria-help-2025-09-10T14:49:49.md +3460 -0
  15. md_processing/md_processing_utils/dr-egeria-help-2025-09-10T14:57:46.md +472 -0
  16. md_processing/md_processing_utils/gen_format_sets.py +422 -0
  17. md_processing/md_processing_utils/generate_md_cmd_templates.py +4 -4
  18. md_processing/md_processing_utils/md_processing_constants.py +19 -1
  19. pyegeria/_output_formats.py +240 -86
  20. pyegeria/collection_manager.py +3 -3
  21. pyegeria/egeria_tech_client.py +3 -0
  22. pyegeria/external_references.py +1794 -0
  23. pyegeria/glossary_manager.py +2 -2
  24. pyegeria/solution_architect.py +290 -485
  25. {pyegeria-5.4.3.4.dist-info → pyegeria-5.4.4.1.dist-info}/METADATA +1 -1
  26. {pyegeria-5.4.3.4.dist-info → pyegeria-5.4.4.1.dist-info}/RECORD +29 -205
  27. commands/.DS_Store +0 -0
  28. commands/cat/.DS_Store +0 -0
  29. commands/cat/.env +0 -8
  30. commands/cat/debug_log.2025-08-29_07-07-27_848189.log.zip +0 -0
  31. commands/cat/debug_log.2025-08-30_21-15-48_528443.log.zip +0 -0
  32. commands/cat/debug_log.2025-09-01_07-02-58_818650.log.zip +0 -0
  33. commands/cat/debug_log.2025-09-02_07-44-39_567276.log.zip +0 -0
  34. commands/cat/debug_log.2025-09-03_07-45-21_986388.log.zip +0 -0
  35. commands/cat/debug_log.log +0 -7276
  36. commands/cat/logs/pyegeria.log +0 -90
  37. commands/cli/debug_log.log +0 -0
  38. commands/doc/.DS_Store +0 -0
  39. commands/ops/logs/pyegeria.log +0 -0
  40. md_processing/.DS_Store +0 -0
  41. md_processing/.idea/.gitignore +0 -8
  42. md_processing/.idea/inspectionProfiles/Project_Default.xml +0 -59
  43. md_processing/.idea/md_processing.iml +0 -15
  44. md_processing/.idea/modules.xml +0 -8
  45. md_processing/.idea/sonarlint/issuestore/index.pb +0 -0
  46. md_processing/.idea/sonarlint/securityhotspotstore/index.pb +0 -0
  47. md_processing/.idea/vcs.xml +0 -6
  48. md_processing/.idea/workspace.xml +0 -107
  49. md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +0 -8
  50. md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +0 -873
  51. md_processing/dr_egeria_inbox/arch_test.md +0 -57
  52. md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +0 -254
  53. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +0 -696
  54. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +0 -254
  55. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +0 -298
  56. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +0 -608
  57. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +0 -94
  58. md_processing/dr_egeria_inbox/archive/freddie_intro.md +0 -284
  59. md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +0 -275
  60. md_processing/dr_egeria_inbox/archive/test-term.md +0 -110
  61. md_processing/dr_egeria_inbox/cat_test.md +0 -100
  62. md_processing/dr_egeria_inbox/collections.md +0 -39
  63. md_processing/dr_egeria_inbox/data_designer_debug.log +0 -6
  64. md_processing/dr_egeria_inbox/data_designer_out.md +0 -60
  65. md_processing/dr_egeria_inbox/data_designer_search_test.md +0 -11
  66. md_processing/dr_egeria_inbox/data_field.md +0 -54
  67. md_processing/dr_egeria_inbox/data_spec.md +0 -77
  68. md_processing/dr_egeria_inbox/data_spec_test.md +0 -2014
  69. md_processing/dr_egeria_inbox/data_test.md +0 -179
  70. md_processing/dr_egeria_inbox/data_test2.md +0 -429
  71. md_processing/dr_egeria_inbox/data_test3.md +0 -462
  72. md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +0 -124
  73. md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +0 -168
  74. md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +0 -280
  75. md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +0 -318
  76. md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +0 -1073
  77. md_processing/dr_egeria_inbox/dr_egeria_isc1.md +0 -44
  78. md_processing/dr_egeria_inbox/generated_help_report.md +0 -9
  79. md_processing/dr_egeria_inbox/generated_help_terms.md +0 -842
  80. md_processing/dr_egeria_inbox/glossary_list.md +0 -5
  81. md_processing/dr_egeria_inbox/glossary_search_test.md +0 -40
  82. md_processing/dr_egeria_inbox/glossary_test1.md +0 -378
  83. md_processing/dr_egeria_inbox/gov_def.md +0 -718
  84. md_processing/dr_egeria_inbox/gov_def2.md +0 -447
  85. md_processing/dr_egeria_inbox/img.png +0 -0
  86. md_processing/dr_egeria_inbox/output_tests.md +0 -114
  87. md_processing/dr_egeria_inbox/product.md +0 -219
  88. md_processing/dr_egeria_inbox/rel.md +0 -8
  89. md_processing/dr_egeria_inbox/sb.md +0 -119
  90. md_processing/dr_egeria_inbox/solution-components.md +0 -136
  91. md_processing/dr_egeria_inbox/solution_blueprints.md +0 -118
  92. md_processing/dr_egeria_inbox/synonym_test.md +0 -42
  93. md_processing/dr_egeria_inbox/t2.md +0 -268
  94. md_processing/dr_egeria_outbox/.DS_Store +0 -0
  95. md_processing/dr_egeria_outbox/.obsidian/app.json +0 -1
  96. md_processing/dr_egeria_outbox/.obsidian/appearance.json +0 -1
  97. md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +0 -7
  98. md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +0 -33
  99. md_processing/dr_egeria_outbox/.obsidian/plugins/buttons/main.js +0 -5164
  100. md_processing/dr_egeria_outbox/.obsidian/plugins/buttons/manifest.json +0 -10
  101. md_processing/dr_egeria_outbox/.obsidian/plugins/buttons/styles.css +0 -624
  102. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +0 -10
  103. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +0 -4459
  104. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +0 -10
  105. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +0 -3
  106. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +0 -153
  107. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +0 -11
  108. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +0 -1
  109. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +0 -500
  110. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +0 -12
  111. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +0 -1
  112. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/data.json +0 -38
  113. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +0 -37
  114. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +0 -11
  115. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +0 -220
  116. md_processing/dr_egeria_outbox/.obsidian/types.json +0 -28
  117. md_processing/dr_egeria_outbox/.obsidian/workspace.json +0 -270
  118. md_processing/dr_egeria_outbox/Button Test.md +0 -11
  119. md_processing/dr_egeria_outbox/Scripts/.DS_Store +0 -0
  120. md_processing/dr_egeria_outbox/Scripts/sendRest.js +0 -24
  121. md_processing/dr_egeria_outbox/Templates/sendToApi.md.md +0 -17
  122. md_processing/dr_egeria_outbox/Untitled.canvas +0 -1
  123. md_processing/dr_egeria_outbox/monday/processed-2025-09-01 09:26-product.md +0 -210
  124. md_processing/dr_egeria_outbox/monday/processed-2025-09-01 14:03-product.md +0 -209
  125. md_processing/dr_egeria_outbox/monday/processed-2025-09-01 14:24-product.md +0 -263
  126. md_processing/dr_egeria_outbox/monday/processed-2025-09-01 16:03-data_spec_test.md +0 -2374
  127. md_processing/dr_egeria_outbox/monday/processed-2025-09-01 16:05-data_spec_test.md +0 -2374
  128. md_processing/dr_egeria_outbox/monday/processed-2025-09-02 08:28-data_spec_test.md +0 -2321
  129. md_processing/dr_egeria_outbox/monday/processed-2025-09-02 08:37-data_spec_test.md +0 -2304
  130. md_processing/dr_egeria_outbox/monday/processed-2025-09-02 08:56-data_spec_test.md +0 -2324
  131. md_processing/dr_egeria_outbox/monday/processed-2025-09-02 09:00-data_spec_test.md +0 -2324
  132. md_processing/dr_egeria_outbox/processed-2025-08-30 16:56-generated_help_terms.md +0 -795
  133. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +0 -719
  134. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +0 -41
  135. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +0 -33
  136. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +0 -192
  137. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +0 -486
  138. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +0 -486
  139. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +0 -486
  140. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +0 -486
  141. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +0 -486
  142. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +0 -486
  143. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +0 -486
  144. md_processing/family_docs/Data Designer/Create_Data_Class.md +0 -164
  145. md_processing/family_docs/Data Designer/Create_Data_Dictionary.md +0 -30
  146. md_processing/family_docs/Data Designer/Create_Data_Field.md +0 -162
  147. md_processing/family_docs/Data Designer/Create_Data_Specification.md +0 -36
  148. md_processing/family_docs/Data Designer/Create_Data_Structure.md +0 -38
  149. md_processing/family_docs/Data Designer/View_Data_Classes.md +0 -78
  150. md_processing/family_docs/Data Designer/View_Data_Dictionaries.md +0 -78
  151. md_processing/family_docs/Data Designer/View_Data_Fields.md +0 -78
  152. md_processing/family_docs/Data Designer/View_Data_Specifications.md +0 -78
  153. md_processing/family_docs/Data Designer/View_Data_Structures.md +0 -78
  154. md_processing/family_docs/Data Designer.md +0 -842
  155. md_processing/family_docs/Digital Product Manager/Add_Member->Collection.md +0 -42
  156. md_processing/family_docs/Digital Product Manager/Attach_Collection->Resource.md +0 -36
  157. md_processing/family_docs/Digital Product Manager/Create_Agreement.md +0 -96
  158. md_processing/family_docs/Digital Product Manager/Create_Data_Sharing_Agreement.md +0 -72
  159. md_processing/family_docs/Digital Product Manager/Create_DigitalSubscription.md +0 -102
  160. md_processing/family_docs/Digital Product Manager/Create_Digital_Product.md +0 -134
  161. md_processing/family_docs/Digital Product Manager/Link_Agreement_Items.md +0 -60
  162. md_processing/family_docs/Digital Product Manager/Link_Contracts.md +0 -26
  163. md_processing/family_docs/Digital Product Manager/Link_Digital_Product_-_Digital_Product.md +0 -30
  164. md_processing/family_docs/Digital Product Manager/Link_Subscribers.md +0 -48
  165. md_processing/family_docs/Digital Product Manager.md +0 -668
  166. md_processing/family_docs/Glossary/Attach_Category_Parent.md +0 -18
  167. md_processing/family_docs/Glossary/Attach_Term-Term_Relationship.md +0 -26
  168. md_processing/family_docs/Glossary/Create_Category.md +0 -38
  169. md_processing/family_docs/Glossary/Create_Glossary.md +0 -42
  170. md_processing/family_docs/Glossary/Create_Term.md +0 -70
  171. md_processing/family_docs/Glossary.md +0 -206
  172. md_processing/family_docs/Governance Officer/Create_Business_Imperative.md +0 -106
  173. md_processing/family_docs/Governance Officer/Create_Certification_Type.md +0 -112
  174. md_processing/family_docs/Governance Officer/Create_Governance_Approach.md +0 -114
  175. md_processing/family_docs/Governance Officer/Create_Governance_Obligation.md +0 -114
  176. md_processing/family_docs/Governance Officer/Create_Governance_Principle.md +0 -114
  177. md_processing/family_docs/Governance Officer/Create_Governance_Procedure.md +0 -128
  178. md_processing/family_docs/Governance Officer/Create_Governance_Process.md +0 -122
  179. md_processing/family_docs/Governance Officer/Create_Governance_Processing_Purpose.md +0 -106
  180. md_processing/family_docs/Governance Officer/Create_Governance_Responsibility.md +0 -122
  181. md_processing/family_docs/Governance Officer/Create_Governance_Rule.md +0 -122
  182. md_processing/family_docs/Governance Officer/Create_Governance_Strategy.md +0 -106
  183. md_processing/family_docs/Governance Officer/Create_License_Type.md +0 -112
  184. md_processing/family_docs/Governance Officer/Create_Naming_Standard_Rule.md +0 -122
  185. md_processing/family_docs/Governance Officer/Create_Regulation_Article.md +0 -106
  186. md_processing/family_docs/Governance Officer/Create_Regulation_Definition.md +0 -118
  187. md_processing/family_docs/Governance Officer/Create_Security_Access_Control.md +0 -114
  188. md_processing/family_docs/Governance Officer/Create_Security_Group.md +0 -120
  189. md_processing/family_docs/Governance Officer/Create_Service_Level_Objectives.md +0 -122
  190. md_processing/family_docs/Governance Officer/Create_Threat_Definition.md +0 -106
  191. md_processing/family_docs/Governance Officer/Link_Governance_Controls.md +0 -32
  192. md_processing/family_docs/Governance Officer/Link_Governance_Drivers.md +0 -32
  193. md_processing/family_docs/Governance Officer/Link_Governance_Policies.md +0 -32
  194. md_processing/family_docs/Governance Officer/View_Governance_Definitions.md +0 -82
  195. md_processing/family_docs/Governance Officer.md +0 -2412
  196. md_processing/family_docs/Solution Architect/Create_Information_Supply_Chain.md +0 -70
  197. md_processing/family_docs/Solution Architect/Create_Solution_Blueprint.md +0 -44
  198. md_processing/family_docs/Solution Architect/Create_Solution_Component.md +0 -96
  199. md_processing/family_docs/Solution Architect/Create_Solution_Role.md +0 -66
  200. md_processing/family_docs/Solution Architect/Link_Information_Supply_Chain_Peers.md +0 -32
  201. md_processing/family_docs/Solution Architect/Link_Solution_Component_Peers.md +0 -32
  202. md_processing/family_docs/Solution Architect/View_Information_Supply_Chains.md +0 -32
  203. md_processing/family_docs/Solution Architect/View_Solution_Blueprints.md +0 -32
  204. md_processing/family_docs/Solution Architect/View_Solution_Components.md +0 -32
  205. md_processing/family_docs/Solution Architect/View_Solution_Roles.md +0 -32
  206. md_processing/family_docs/Solution Architect.md +0 -490
  207. md_processing/md_commands/old_project_commands.py +0 -164
  208. md_processing/md_processing_utils/debug_log.log +0 -5580
  209. md_processing/md_processing_utils/generated_help_terms.md +0 -842
  210. md_processing/md_processing_utils/logs/pyegeria.log +0 -56
  211. pyegeria/.DS_Store +0 -0
  212. pyegeria/___external_references.py +0 -3255
  213. {pyegeria-5.4.3.4.dist-info → pyegeria-5.4.4.1.dist-info}/LICENSE +0 -0
  214. {pyegeria-5.4.3.4.dist-info → pyegeria-5.4.4.1.dist-info}/WHEEL +0 -0
  215. {pyegeria-5.4.3.4.dist-info → pyegeria-5.4.4.1.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,543 @@
1
+ """
2
+ This file contains Dr. Egeria commands for working with External References.
3
+ """
4
+
5
+ import json
6
+ import os
7
+ import re
8
+ from typing import List, Optional
9
+
10
+ from inflect import engine
11
+ from loguru import logger
12
+ from pydantic import ValidationError
13
+ from rich import print
14
+ from rich.console import Console
15
+ from rich.markdown import Markdown
16
+
17
+ from md_processing.md_processing_utils.common_md_proc_utils import (parse_upsert_command, parse_view_command,
18
+ sync_collection_memberships, )
19
+ from md_processing.md_processing_utils.common_md_utils import (update_element_dictionary, set_update_body, set_element_status_request_body, set_element_prop_body, set_delete_request_body, set_rel_request_body,
20
+ set_peer_gov_def_request_body,
21
+ set_rel_request_body, set_create_body, set_object_classifications, set_product_body, set_rel_request_body_for_type,
22
+ set_rel_prop_body,)
23
+
24
+ from md_processing.md_processing_utils.extraction_utils import (extract_command_plus, update_a_command)
25
+ from md_processing.md_processing_utils.md_processing_constants import (load_commands, ERROR)
26
+ from pyegeria import DEBUG_LEVEL, body_slimmer, to_pascal_case, PyegeriaException, print_basic_exception, \
27
+ print_exception_table, print_validation_error
28
+ from pyegeria.egeria_tech_client import EgeriaTech
29
+
30
+
31
+
32
+ from md_processing.md_processing_utils.common_md_utils import (debug_level, print_msg, set_debug_level,
33
+ get_element_dictionary, update_element_dictionary,
34
+ )
35
+ from md_processing.md_processing_utils.extraction_utils import (extract_command_plus, extract_command,
36
+ process_simple_attribute, process_element_identifiers,
37
+ update_a_command, extract_attribute,
38
+ get_element_by_name, process_name_list)
39
+ from md_processing.md_processing_utils.md_processing_constants import (GLOSSARY_NAME_LABELS, TERM_NAME_LABELS,
40
+ TERM_RELATIONSHPS, ALWAYS, ERROR, INFO,
41
+ WARNING, pre_command, EXISTS_REQUIRED,
42
+ OUTPUT_LABELS, SEARCH_LABELS, GUID_LABELS,
43
+ ELEMENT_OUTPUT_FORMATS, command_seperator)
44
+ from pyegeria import body_slimmer
45
+ from pyegeria._globals import (NO_GLOSSARIES_FOUND, NO_ELEMENTS_FOUND, NO_CATEGORIES_FOUND)
46
+ from pyegeria.egeria_tech_client import EgeriaTech
47
+
48
+ # EGERIA_WIDTH = int(os.environ.get("EGERIA_WIDTH", "170"))
49
+ # console = Console(width=EGERIA_WIDTH)
50
+
51
+
52
+
53
+ def process_external_reference_upsert_command(egeria_client: EgeriaTech, txt: str,
54
+ directive: str = "display") -> Optional[str]:
55
+ """
56
+ Processes a project create or update object_action by extracting key attributes such as
57
+ glossary name, language, description, and usage from the given text.
58
+
59
+ :param txt: A string representing the input cell to be processed for
60
+ extracting glossary-related attributes.
61
+ :param directive: an optional string indicating the directive to be used - display, validate or execute
62
+ :return: A string summarizing the outcome of the processing.
63
+ """
64
+
65
+ command, object_type, object_action = extract_command_plus(txt)
66
+ print(Markdown(f"# {command}\n"))
67
+
68
+ parsed_output = parse_upsert_command(egeria_client, object_type, object_action, txt, directive)
69
+ if not parsed_output:
70
+ logger.error(f"No output for `{object_action}`")
71
+ return None
72
+
73
+ valid = parsed_output['valid']
74
+ exists = parsed_output['exists']
75
+
76
+ qualified_name = parsed_output.get('qualified_name', None)
77
+ guid = parsed_output.get('guid', None)
78
+
79
+ print(Markdown(parsed_output['display']))
80
+
81
+ logger.debug(json.dumps(parsed_output, indent=4))
82
+
83
+ attributes = parsed_output['attributes']
84
+
85
+ display_name = attributes['Display Name'].get('value', None)
86
+ status = attributes.get('Status', {}).get('value', None)
87
+ #
88
+
89
+ if directive == "display":
90
+ return None
91
+ elif directive == "validate":
92
+ if valid:
93
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
94
+ else:
95
+ msg = f"Validation failed for object_action `{command}`\n"
96
+ return valid
97
+
98
+ elif directive == "process":
99
+ try:
100
+ obj = "External Reference"
101
+ EXTERNAL_REFERENCE_PROPS = ["ExternalReferenceProperties", "ExternalDataSourceProperties",
102
+ "ExternalModelSourceProperties",
103
+ "RelatedMediaProperties", "CitedDocumentProperties"]
104
+
105
+ EXTERNAL_REFERENCE_TYPES = ["ExternalReference", "ExternalDataSource", "ExternalModelSource",
106
+ "RelatedMedia", "CitedDocument"]
107
+
108
+
109
+ # Set the property body for a glossary collection
110
+ #
111
+ prop_body = set_element_prop_body(obj, qualified_name, attributes)
112
+ prop_body["referenceTitle"] = attributes.get('Reference Title', {}).get('value', None)
113
+ prop_body["referenceAbstract"] = attributes.get('Reference Abstract', {}).get('value', None)
114
+ prop_body["authors"] = attributes.get('Authors', {}).get('name_list', None)
115
+ prop_body["organization"] = attributes.get('Organization', {}).get('value', None)
116
+ prop_body["url"] = attributes.get('URL', {}).get('value', None)
117
+ prop_body["sources"] = attributes.get('Sources', {}).get('value', None)
118
+ prop_body["license"] = attributes.get('License', {}).get('value', None)
119
+ prop_body["copyright"] = attributes.get('Copyright', {}).get('value', None)
120
+ prop_body["attribution"] = attributes.get('Attribution', {}).get('value', None)
121
+
122
+ if object_type == "RelatedMedia":
123
+ prop_body["class"] = "RelatedProperties"
124
+ prop_body["mediaType"] = attributes.get('Media Type', {}).get('value', None)
125
+ prop_body["mediaTypeOtherId"] = attributes.get('Media Type Other ID', {}).get('value', None)
126
+ prop_body["defaultMediaUsage"]= attributes.get('Default Media Usage', {}).get('value', None)
127
+ prop_body["defaultMediaUsageOtherId"] = attributes.get('Default Media Usage Other ID', {}).get('value', None)
128
+ elif object_type == "CitedDocument":
129
+ prop_body["class"] = "CitedDocumentProperties"
130
+ prop_body["numberOfPages"] = attributes.get('Number of Pages', {}).get('value', None)
131
+ prop_body["pageRange"] = attributes.get('Page Range', {}).get('value', None)
132
+ prop_body["publicationSeries"] = attributes.get('Publication Series', {}).get('value', None)
133
+ prop_body["publicationSeriesVolume"] = attributes.get('Publication Series Volume', {}).get('value', None)
134
+ prop_body["publisher"] = attributes.get('Publisher', {}).get('value', None)
135
+ prop_body["edition"] = attributes.get('Edition', {}).get('value', None)
136
+ prop_body["firstPublicationDate"] = attributes.get('First Publication Date', {}).get('value', None)
137
+ prop_body["publicationDate"] = attributes.get('Publication Date', {}).get('value', None)
138
+ prop_body["publicationCity"] = attributes.get('Publication City', {}).get('value', None)
139
+ prop_body["publicationYear"] = attributes.get('Publication Year', {}).get('value', None)
140
+ prop_body["publicationNumbers"]= attributes.get('Publication Numbers', {}).get('value', None)
141
+
142
+
143
+
144
+ if object_action == "Update":
145
+ if not exists:
146
+ msg = (f" Element `{display_name}` does not exist! Updating result document with Create "
147
+ f"{object_action}\n")
148
+ logger.error(msg)
149
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
150
+ elif not valid:
151
+ msg = (" The input data is invalid and cannot be processed. \nPlease review")
152
+ logger.error(msg)
153
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
154
+ print(Markdown(msg))
155
+ return None
156
+ else:
157
+ print(Markdown(
158
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
159
+
160
+
161
+ body = set_update_body(obj, attributes)
162
+ body['properties'] = prop_body
163
+
164
+ egeria_client.update_project(guid, body)
165
+ if status:
166
+ egeria_client.update_external_reference_status(guid, status)
167
+
168
+ logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
169
+ update_element_dictionary(qualified_name, {
170
+ 'guid': guid, 'display_name': display_name
171
+ })
172
+ return egeria_client.get_external_reference_by_guid(guid, element_type= object_type,
173
+ output_format='MD', output_format_set = object_type)
174
+
175
+
176
+ elif object_action == "Create":
177
+ if valid is False and exists:
178
+ msg = (f"Project `{display_name}` already exists and result document updated changing "
179
+ f"`Create` to `Update` in processed output\n\n___")
180
+ logger.error(msg)
181
+ return update_a_command(txt, object_action, object_type, qualified_name, guid)
182
+ elif not valid:
183
+ msg = ("The input data is invalid and cannot be processed. \nPlease review")
184
+ logger.error(msg)
185
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
186
+ print(Markdown(msg))
187
+ return None
188
+
189
+ else:
190
+ body = set_create_body(object_type,attributes)
191
+
192
+ # if this is a root or folder (maybe more in the future), then make sure that the classification is set.
193
+ # body["initialClassifications"] = set_object_classifications(object_type, attributes, None)
194
+
195
+ body["properties"] = prop_body
196
+ slim_body = body_slimmer(body)
197
+ guid = egeria_client.create_external_reference(body = slim_body)
198
+ if guid:
199
+ update_element_dictionary(qualified_name, {
200
+ 'guid': guid, 'display_name': display_name
201
+ })
202
+ msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
203
+ logger.success(msg)
204
+ return egeria_client.get_external_reference_by_guid(guid, element_type=object_type,
205
+ output_format='MD',
206
+ output_format_set=object_type)
207
+ else:
208
+ msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
209
+ logger.error(msg)
210
+ return None
211
+
212
+ except PyegeriaException as e:
213
+ logger.error(f"Pyegeria error performing {command}: {e}")
214
+ print_basic_exception(e)
215
+ return None
216
+ except Exception as e:
217
+ logger.error(f"Error performing {command}: {e}")
218
+ else:
219
+ return None
220
+
221
+
222
+
223
+ def process_link_to_external_reference_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
224
+ """ Link a referenceable to an external reference."""
225
+
226
+ command, object_type, object_action = extract_command_plus(txt)
227
+ print(Markdown(f"# {command}\n"))
228
+
229
+ parsed_output = parse_view_command(egeria_client, object_type, object_action,
230
+ txt, directive)
231
+
232
+ if not parsed_output:
233
+ logger.error(f"No output for `{object_action}`")
234
+ print(Markdown("## Parsing failed"))
235
+ return None
236
+
237
+ print(Markdown(parsed_output['display']))
238
+
239
+ logger.debug(json.dumps(parsed_output, indent=4))
240
+
241
+ attributes = parsed_output['attributes']
242
+
243
+ element_guid = attributes.get('Element Name', {}).get('guid', None)
244
+ external_reference_guid = attributes.get('Media Reference', {}).get('guid', None)
245
+
246
+ valid = parsed_output['valid']
247
+ exists = element_guid is not None and external_reference_guid is not None
248
+ prop_body = set_rel_prop_body("MediaReference", attributes)
249
+
250
+ if directive == "display":
251
+
252
+ return None
253
+ elif directive == "validate":
254
+ if valid:
255
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
256
+ else:
257
+ msg = f"Validation failed for object_action `{command}`\n"
258
+ logger.error(msg)
259
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
260
+ return valid
261
+
262
+ elif directive == "process":
263
+
264
+ try:
265
+ if object_action == "Detach":
266
+ if not exists:
267
+ msg = " Link does not exist! Updating result document with Link object_action\n"
268
+ logger.error(msg)
269
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
270
+ return out
271
+ elif not valid:
272
+ return None
273
+ else:
274
+ print(Markdown(
275
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
276
+ body = set_delete_request_body(object_type, attributes)
277
+
278
+ egeria_client.detach_external_reference(element_guid, external_reference_guid, body)
279
+
280
+ logger.success(f"===> Detached segment from `{element_guid}`to {external_reference_guid}\n")
281
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
282
+
283
+ return (out)
284
+
285
+
286
+ elif object_action == "Link":
287
+ if valid is False and exists:
288
+ msg = "--> Link already exists and result document updated changing `Link` to `Detach` in processed output\n"
289
+ logger.error(msg)
290
+
291
+ elif valid is False:
292
+ msg = f"==>{object_type} Link is not valid and can't be created"
293
+ logger.error(msg)
294
+ return
295
+
296
+ else:
297
+ body = set_rel_request_body_for_type("CitedDocumentLink", attributes)
298
+ body['properties'] = prop_body
299
+
300
+ egeria_client.link_external_reference(element_guid,
301
+ external_reference_guid,
302
+ body=body_slimmer(body))
303
+ msg = f"==>Created {object_type} link \n"
304
+ logger.success(msg)
305
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
306
+ return out
307
+
308
+ except ValidationError as e:
309
+ print_validation_error(e)
310
+ logger.error(f"Validation Error performing {command}: {e}")
311
+ return None
312
+ except PyegeriaException as e:
313
+ print_basic_exception(e)
314
+ logger.error(f"PyegeriaException occurred: {e}")
315
+ return None
316
+
317
+ except Exception as e:
318
+ logger.error(f"Error performing {command}: {e}")
319
+ return None
320
+ else:
321
+ return None
322
+
323
+
324
+
325
+ def process_link_to_media_reference_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") \
326
+ -> Optional[str]:
327
+ # """ Link a referenceable to a related media reference."""
328
+ #
329
+ #
330
+
331
+ command, object_type, object_action = extract_command_plus(txt)
332
+ print(Markdown(f"# {command}\n"))
333
+
334
+ parsed_output = parse_view_command(egeria_client, object_type, object_action,
335
+ txt, directive)
336
+
337
+ if not parsed_output:
338
+ logger.error(f"No output for `{object_action}`")
339
+ print(Markdown("## Parsing failed"))
340
+ return None
341
+
342
+ print(Markdown(parsed_output['display']))
343
+
344
+ logger.debug(json.dumps(parsed_output, indent=4))
345
+
346
+ attributes = parsed_output['attributes']
347
+
348
+ element_guid = attributes.get('Element Name', {}).get('guid', None)
349
+ media_reference_guid = attributes.get('Media Reference', {}).get('guid', None)
350
+ media_id = attributes.get('Media Id', {}).get('value', None)
351
+ media_usage = attributes.get('Media Usage', {}).get('value', None)
352
+ media_usage_other_id = attributes.get('Media Usage Other Id', {}).get('value', None)
353
+
354
+ valid = parsed_output['valid']
355
+ exists = element_guid is not None and media_reference_guid is not None
356
+ prop_body = set_rel_prop_body("MediaReference", attributes)
357
+ prop_body["mediaId"] = media_id
358
+ prop_body["mediaUsageId"] = media_usage
359
+ prop_body["mediaUsageOtherId"] = media_usage_other_id
360
+
361
+
362
+ if directive == "display":
363
+
364
+ return None
365
+ elif directive == "validate":
366
+ if valid:
367
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
368
+ else:
369
+ msg = f"Validation failed for object_action `{command}`\n"
370
+ logger.error(msg)
371
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
372
+ return valid
373
+
374
+ elif directive == "process":
375
+
376
+ try:
377
+ if object_action == "Detach":
378
+ if not exists:
379
+ msg = " Link does not exist! Updating result document with Link object_action\n"
380
+ logger.error(msg)
381
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
382
+ return out
383
+ elif not valid:
384
+ return None
385
+ else:
386
+ print(Markdown(
387
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
388
+ body = set_delete_request_body(object_type, attributes)
389
+
390
+ egeria_client.detach_cited_document(element_guid, media_reference_guid, body)
391
+
392
+ logger.success(f"===> Detached segment from `{element_guid}`to {media_reference_guid}\n")
393
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
394
+
395
+ return (out)
396
+
397
+
398
+ elif object_action == "Link":
399
+ if valid is False and exists:
400
+ msg = "--> Link already exists and result document updated changing `Link` to `Detach` in processed output\n"
401
+ logger.error(msg)
402
+
403
+ elif valid is False:
404
+ msg = f"==>{object_type} Link is not valid and can't be created"
405
+ logger.error(msg)
406
+ return
407
+
408
+ else:
409
+ body = set_rel_request_body_for_type("CitedDocumentLink", attributes)
410
+ body['properties'] = prop_body
411
+
412
+ egeria_client.link_cited_document(element_guid,
413
+ media_reference_guid,
414
+ body=body_slimmer(body))
415
+ msg = f"==>Created {object_type} link \n"
416
+ logger.success(msg)
417
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
418
+ return out
419
+
420
+ except ValidationError as e:
421
+ print_validation_error(e)
422
+ logger.error(f"Validation Error performing {command}: {e}")
423
+ return None
424
+ except PyegeriaException as e:
425
+ print_basic_exception(e)
426
+ logger.error(f"PyegeriaException occurred: {e}")
427
+ return None
428
+
429
+ except Exception as e:
430
+ logger.error(f"Error performing {command}: {e}")
431
+ return None
432
+ else:
433
+ return None
434
+
435
+ def process_link_to_cited_document_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") \
436
+ -> Optional[str]:
437
+
438
+ # """ Link a referenceable to a cited document."""
439
+ #
440
+
441
+ command, object_type, object_action = extract_command_plus(txt)
442
+ print(Markdown(f"# {command}\n"))
443
+
444
+ parsed_output = parse_view_command(egeria_client, object_type, object_action,
445
+ txt, directive)
446
+
447
+ if not parsed_output:
448
+ logger.error(f"No output for `{object_action}`")
449
+ print(Markdown("## Parsing failed"))
450
+ return None
451
+
452
+ print(Markdown(parsed_output['display']))
453
+
454
+ logger.debug(json.dumps(parsed_output, indent=4))
455
+
456
+ attributes = parsed_output['attributes']
457
+
458
+ element_guid = attributes.get('Element Name', {}).get('guid', None)
459
+ cited_document_guid = attributes.get('Cited Document', {}).get('guid', None)
460
+ reference_id = attributes.get('Reference Id', {}).get('value', None)
461
+ pages = attributes.get('Pages', {}).get('value', None)
462
+
463
+ valid = parsed_output['valid']
464
+ exists = element_guid is not None and cited_document_guid is not None
465
+ prop_body = set_rel_prop_body("CitedDocumentLink", attributes)
466
+ prop_body["referenceId"] = reference_id
467
+ prop_body["pages"] = pages
468
+
469
+
470
+
471
+ if directive == "display":
472
+
473
+ return None
474
+ elif directive == "validate":
475
+ if valid:
476
+ print(Markdown(f"==> Validation of {command} completed successfully!\n"))
477
+ else:
478
+ msg = f"Validation failed for object_action `{command}`\n"
479
+ logger.error(msg)
480
+ print(Markdown(f"==> Validation of {command} failed!!\n"))
481
+ return valid
482
+
483
+ elif directive == "process":
484
+
485
+
486
+ try:
487
+ if object_action == "Detach":
488
+ if not exists:
489
+ msg = f" Link does not exist! Updating result document with Link object_action\n"
490
+ logger.error(msg)
491
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
492
+ return out
493
+ elif not valid:
494
+ return None
495
+ else:
496
+ print(Markdown(
497
+ f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
498
+ body = set_delete_request_body(object_type, attributes)
499
+
500
+ egeria_client.detach_cited_document(element_guid, cited_document_guid,body)
501
+
502
+ logger.success(f"===> Detached segment from `{element_guid}`to {cited_document_guid}\n")
503
+ out = parsed_output['display'].replace('Unlink', 'Link', 1)
504
+
505
+ return (out)
506
+
507
+
508
+ elif object_action == "Link":
509
+ if valid is False and exists:
510
+ msg = "--> Link already exists and result document updated changing `Link` to `Detach` in processed output\n"
511
+ logger.error(msg)
512
+
513
+ elif valid is False:
514
+ msg = f"==>{object_type} Link is not valid and can't be created"
515
+ logger.error(msg)
516
+ return
517
+
518
+ else:
519
+ body = set_rel_request_body_for_type("CitedDocumentLink", attributes)
520
+ body['properties'] = prop_body
521
+
522
+ egeria_client.link_cited_document(element_guid,
523
+ cited_document_guid,
524
+ body=body_slimmer(body))
525
+ msg = f"==>Created {object_type} link \n"
526
+ logger.success(msg)
527
+ out = parsed_output['display'].replace('Link', 'Detach', 1)
528
+ return out
529
+
530
+ except ValidationError as e:
531
+ print_validation_error(e)
532
+ logger.error(f"Validation Error performing {command}: {e}")
533
+ return None
534
+ except PyegeriaException as e:
535
+ print_basic_exception(e)
536
+ logger.error(f"PyegeriaException occurred: {e}")
537
+ return None
538
+
539
+ except Exception as e:
540
+ logger.error(f"Error performing {command}: {e}")
541
+ return None
542
+ else:
543
+ return None