pyegeria 5.4.0.22__py3-none-any.whl → 5.4.0.24__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 (130) hide show
  1. commands/cat/.DS_Store +0 -0
  2. commands/cat/.env +8 -0
  3. commands/cat/debug_log +2046 -465
  4. commands/cat/debug_log.2025-08-15_09-14-07_444802.zip +0 -0
  5. commands/cat/debug_log.2025-08-16_10-21-59_388912.zip +0 -0
  6. commands/cat/debug_log.log +0 -0
  7. commands/cat/dr_egeria_md.py +16 -3
  8. commands/cat/list_collections.py +15 -6
  9. commands/cat/list_format_set.py +90 -85
  10. commands/cli/debug_log.log +0 -0
  11. commands/ops/logs/pyegeria.log +0 -0
  12. md_processing/.DS_Store +0 -0
  13. md_processing/__init__.py +5 -3
  14. md_processing/data/commands.json +8310 -903
  15. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-30-37.md +163 -0
  16. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-35-58.md +474 -0
  17. md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +8 -0
  18. md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +873 -0
  19. md_processing/dr_egeria_inbox/arch_test.md +57 -0
  20. md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +254 -0
  21. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +696 -0
  22. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +254 -0
  23. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +298 -0
  24. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +608 -0
  25. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +94 -0
  26. md_processing/dr_egeria_inbox/archive/freddie_intro.md +284 -0
  27. md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +275 -0
  28. md_processing/dr_egeria_inbox/archive/test-term.md +110 -0
  29. md_processing/dr_egeria_inbox/cat_test.md +100 -0
  30. md_processing/dr_egeria_inbox/collections.md +39 -0
  31. md_processing/dr_egeria_inbox/data_designer_debug.log +6 -0
  32. md_processing/dr_egeria_inbox/data_designer_out.md +60 -0
  33. md_processing/dr_egeria_inbox/data_designer_search_test.md +11 -0
  34. md_processing/dr_egeria_inbox/data_field.md +54 -0
  35. md_processing/dr_egeria_inbox/data_spec.md +77 -0
  36. md_processing/dr_egeria_inbox/data_spec_test.md +2406 -0
  37. md_processing/dr_egeria_inbox/data_test.md +179 -0
  38. md_processing/dr_egeria_inbox/data_test2.md +429 -0
  39. md_processing/dr_egeria_inbox/data_test3.md +462 -0
  40. md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +124 -0
  41. md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +168 -0
  42. md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +280 -0
  43. md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +313 -0
  44. md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +1073 -0
  45. md_processing/dr_egeria_inbox/dr_egeria_isc1.md +44 -0
  46. md_processing/dr_egeria_inbox/generated_help_report.md +9 -0
  47. md_processing/dr_egeria_inbox/glossary_list.md +5 -0
  48. md_processing/dr_egeria_inbox/glossary_search_test.md +40 -0
  49. md_processing/dr_egeria_inbox/glossary_test1.md +324 -0
  50. md_processing/dr_egeria_inbox/gov_def.md +482 -0
  51. md_processing/dr_egeria_inbox/gov_def2.md +447 -0
  52. md_processing/dr_egeria_inbox/img.png +0 -0
  53. md_processing/dr_egeria_inbox/product.md +162 -0
  54. md_processing/dr_egeria_inbox/rel.md +8 -0
  55. md_processing/dr_egeria_inbox/sb.md +119 -0
  56. md_processing/dr_egeria_inbox/solution-components.md +136 -0
  57. md_processing/dr_egeria_inbox/solution_blueprints.md +118 -0
  58. md_processing/dr_egeria_inbox/synonym_test.md +42 -0
  59. md_processing/dr_egeria_inbox/t2.md +268 -0
  60. md_processing/dr_egeria_outbox/.obsidian/app.json +1 -0
  61. md_processing/dr_egeria_outbox/.obsidian/appearance.json +1 -0
  62. md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +6 -0
  63. md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +31 -0
  64. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +10 -0
  65. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +4459 -0
  66. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +10 -0
  67. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +3 -0
  68. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +153 -0
  69. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +11 -0
  70. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +1 -0
  71. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +500 -0
  72. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +12 -0
  73. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +1 -0
  74. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +37 -0
  75. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +11 -0
  76. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +220 -0
  77. md_processing/dr_egeria_outbox/.obsidian/types.json +28 -0
  78. md_processing/dr_egeria_outbox/.obsidian/workspace.json +220 -0
  79. md_processing/dr_egeria_outbox/Untitled.canvas +1 -0
  80. md_processing/dr_egeria_outbox/monday/processed-2025-07-14 12:38-data_designer_out.md +663 -0
  81. md_processing/dr_egeria_outbox/monday/processed-2025-07-21 10:52-generated_help_report.md +2744 -0
  82. md_processing/dr_egeria_outbox/monday/processed-2025-07-21 18:38-collections.md +62 -0
  83. md_processing/dr_egeria_outbox/monday/processed-2025-08-01 11:34-gov_def.md +444 -0
  84. md_processing/dr_egeria_outbox/monday/processed-2025-08-17 21:04-product.md +97 -0
  85. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 14:55-product.md +77 -0
  86. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:05-product.md +75 -0
  87. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:11-product.md +74 -0
  88. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 20:40-collections.md +49 -0
  89. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +719 -0
  90. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +41 -0
  91. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +33 -0
  92. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +192 -0
  93. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +486 -0
  94. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +486 -0
  95. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +486 -0
  96. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +486 -0
  97. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +486 -0
  98. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +486 -0
  99. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +486 -0
  100. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-16 19:15-gov_def2.md +527 -0
  101. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 12:08-gov_def2.md +527 -0
  102. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 14:27-gov_def2.md +485 -0
  103. md_processing/md_commands/governance_officer_commands.py +291 -150
  104. md_processing/md_commands/product_manager_commands.py +309 -401
  105. md_processing/md_processing_utils/common_md_proc_utils.py +110 -7
  106. md_processing/md_processing_utils/common_md_utils.py +112 -26
  107. md_processing/md_processing_utils/debug_log.log +0 -0
  108. md_processing/md_processing_utils/md_processing_constants.py +8 -5
  109. md_processing/md_processing_utils/solution_architect_log.log +0 -0
  110. pyegeria/.DS_Store +0 -0
  111. pyegeria/__init__.py +3 -3
  112. pyegeria/_client_new.py +48 -51
  113. pyegeria/_exceptions_new.py +6 -0
  114. pyegeria/_output_format_models.py +22 -17
  115. pyegeria/_output_formats.py +122 -34
  116. pyegeria/collection_manager.py +154 -50
  117. pyegeria/collection_manager_omvs.py +47 -18
  118. pyegeria/egeria_cat_client.py +1 -1
  119. pyegeria/egeria_client.py +6 -0
  120. pyegeria/egeria_tech_client.py +6 -1
  121. pyegeria/governance_officer.py +2513 -0
  122. pyegeria/load_config.py +1 -1
  123. pyegeria/models.py +48 -5
  124. pyegeria/output_formatter.py +298 -79
  125. pyegeria/utils.py +1 -1
  126. {pyegeria-5.4.0.22.dist-info → pyegeria-5.4.0.24.dist-info}/METADATA +1 -1
  127. {pyegeria-5.4.0.22.dist-info → pyegeria-5.4.0.24.dist-info}/RECORD +130 -30
  128. {pyegeria-5.4.0.22.dist-info → pyegeria-5.4.0.24.dist-info}/LICENSE +0 -0
  129. {pyegeria-5.4.0.22.dist-info → pyegeria-5.4.0.24.dist-info}/WHEEL +0 -0
  130. {pyegeria-5.4.0.22.dist-info → pyegeria-5.4.0.24.dist-info}/entry_points.txt +0 -0
@@ -13,11 +13,12 @@ from rich.markdown import Markdown
13
13
 
14
14
  from md_processing.md_processing_utils.common_md_proc_utils import (parse_upsert_command, parse_view_command)
15
15
  from md_processing.md_processing_utils.common_md_utils import update_element_dictionary, setup_log, set_update_body, \
16
- set_element_status_request_body, set_prop_body, set_metadata_source_request_body, set_peer_gov_def_request_body, \
17
- set_rel_request_body, set_create_body, set_collection_classifications, set_collection_property_body
16
+ set_element_status_request_body, set_prop_body, set_delete_request_body, set_rel_request_body, set_peer_gov_def_request_body, \
17
+ set_rel_request_body, set_create_body, set_collection_classifications, set_product_body
18
+
18
19
  from md_processing.md_processing_utils.extraction_utils import (extract_command_plus, update_a_command)
19
20
  from md_processing.md_processing_utils.md_processing_constants import (load_commands, ERROR)
20
- from pyegeria import DEBUG_LEVEL, body_slimmer, to_pascal_case
21
+ from pyegeria import DEBUG_LEVEL, body_slimmer, to_pascal_case, PyegeriaException
21
22
  from pyegeria.egeria_tech_client import EgeriaTech
22
23
 
23
24
  GERIA_METADATA_STORE = os.environ.get("EGERIA_METADATA_STORE", "active-metadata-store")
@@ -56,7 +57,7 @@ def add_member_to_collections(egeria_client: EgeriaTech, collection_list: list,
56
57
  Add member to data dictionaries and data specifications.
57
58
  """
58
59
  body = {
59
- "class": "RelationshipRequestBody", "properties": {
60
+ "class": "NewRelationshipRequestBody", "properties": {
60
61
  "class": "CollectionMembershipProperties", "membershipRationale": "User Specified",
61
62
  "notes": "Added by Dr.Egeria"
62
63
  }
@@ -144,267 +145,267 @@ def update_data_collection_memberships(egeria_client: EgeriaTech, entity_type: s
144
145
  # @logger.catch
145
146
 
146
147
 
147
- @logger.catch
148
- def add_field_to_data_structures(egeria_client: EgeriaTech, display_name: str, struct_list: list, guid) -> None:
149
- """
150
- Add data field to data structures.
151
- """
152
-
153
- try:
154
- for structure_guid in struct_list:
155
- egeria_client.link_member_data_field(structure_guid, guid, None)
156
- msg = f"Added `{display_name}` to structure `{structure_guid}`"
157
- logger.info(msg)
158
- return
159
-
160
- except Exception as e:
161
- console.print_exception()
162
-
163
-
164
- @logger.catch
165
- def remove_field_from_data_structures(egeria_client: EgeriaTech, display_name: str, struct_list: list,
166
- guid: str) -> None:
167
- """Remove a data field from a list of data structures."""
168
- try:
169
- for structure_guid in struct_list:
170
- egeria_client.detach_member_data_field(structure_guid, guid, None)
171
- msg = f"Removed `{display_name}` from structure `{structure_guid}`"
172
- logger.info(msg)
173
- return
174
-
175
- except Exception as e:
176
- console.print_exception()
177
-
178
-
179
- @logger.catch
180
- def sync_data_field_rel_elements(egeria_client: EgeriaTech, structure_list: list, parent_field_list: list, terms: list,
181
- data_class_guid: str, guid: str, display_name: str,
182
- replace_all_props: bool = True) -> None:
183
- """Sync a field's related elements.
184
-
185
- TODO: Need to add data class support when ready and may need to revisit bodies.
186
-
187
- """
188
- if terms:
189
- terms = [terms]
190
-
191
- if replace_all_props:
192
- rel_el_list = egeria_client.get_data_field_rel_elements(guid)
193
- # should I throw an exception if empty?
194
- if rel_el_list is None:
195
- logger.warning("Unexpected -> the list was None - assigning empty list")
196
- rel_el_list = {}
197
-
198
- as_is_data_structs = set(rel_el_list.get("data_structure_guids", []))
199
- as_is_parent_fields = set(rel_el_list.get("parent_guids", []))
200
- as_is_assigned_meanings = set(rel_el_list.get("assigned_meanings_guids", []))
201
- as_is_data_classes = set(rel_el_list.get("data_class_guids", []))
202
-
203
- to_be_data_structs = set(structure_list) if structure_list is not None else set()
204
- to_be_parent_fields = set(parent_field_list) if parent_field_list is not None else set()
205
- to_be_assigned_meanings = set(terms) if terms is not None else set()
206
- to_be_data_classes = set([data_class_guid]) if data_class_guid is not None else set()
207
-
208
- logger.trace(f"as_is_data_structs: {list(as_is_data_structs)} to_be_data_struct: {list(to_be_data_structs)}")
209
- logger.trace(
210
- f"as_is_parent_fields: {list(as_is_parent_fields)} to_be_parent_fields: {list(to_be_parent_fields)}")
211
- logger.trace(f"as_is_assigned_meanings: {list(as_is_assigned_meanings)} to_be_assigned_meanings: "
212
- f"{list(to_be_assigned_meanings)}")
213
- logger.trace(f"as_is_data_classes: {list(as_is_data_classes)} to_be_assigned_data_classes: "
214
- f"{list(to_be_data_classes)}")
215
-
216
- data_struct_to_remove = as_is_data_structs - to_be_data_structs
217
- logger.trace(f"data_struct_to_remove: {list(data_struct_to_remove)}")
218
- if len(data_struct_to_remove) > 0:
219
- for ds in data_struct_to_remove:
220
- egeria_client.detach_member_data_field(ds, guid, None)
221
- msg = f"Removed `{display_name}` from structure `{ds}`"
222
- logger.trace(msg)
223
- data_struct_to_add = to_be_data_structs - as_is_data_structs
224
- logger.trace(f"data_struct_to_add: {list(data_struct_to_add)}")
225
- if len(data_struct_to_add) > 0:
226
- for ds in data_struct_to_add:
227
- egeria_client.link_member_data_field(ds, guid, None)
228
- msg = f"Added `{display_name}` to structure `{ds}`"
229
- logger.trace(msg)
230
-
231
- parent_field_to_remove = to_be_parent_fields - as_is_parent_fields
232
- logger.trace(f"parent_field_to_remove: {list(parent_field_to_remove)}")
233
- if len(parent_field_to_remove) > 0:
234
- for field in parent_field_to_remove:
235
- egeria_client.detach_nested_data_field(field, guid, None)
236
- msg = f"Removed `{display_name}` from field `{field}`"
237
- logger.trace(msg)
238
- parent_field_to_add = to_be_parent_fields - as_is_parent_fields
239
- logger.trace(f"parent_field_to_add: {list(parent_field_to_add)}")
240
- if len(parent_field_to_add) > 0:
241
- for field in parent_field_to_add:
242
- egeria_client.link_nested_data_field(field, guid, None)
243
- msg = f"Added `{display_name}` to field `{field}`"
244
- logger.trace(msg)
245
-
246
- terms_to_remove = as_is_assigned_meanings - to_be_assigned_meanings
247
- logger.trace(f"terms_to_remove: {list(terms_to_remove)}")
248
- if terms:
249
- for term in terms_to_remove:
250
- egeria_client.detach_semantic_definition(guid, term, None)
251
- msg = f"Removed `{term}` from `{display_name}`"
252
- logger.trace(msg)
253
- terms_to_add = to_be_assigned_meanings - as_is_assigned_meanings
254
- logger.trace(f"terms_to_add: {list(terms_to_add)}")
255
- if len(terms_to_add) > 0:
256
- for term in terms_to_add:
257
- egeria_client.link_semantic_definition(guid, term, None)
258
- msg = f"Added `{term}` to`{display_name}`"
259
- logger.trace(msg)
260
-
261
- classes_to_remove = as_is_data_classes - to_be_data_classes
262
- logger.trace(f"classes_to_remove: {list(classes_to_remove)}")
263
- if len(terms_to_remove) > 0:
264
- for dc in classes_to_remove:
265
- body = {
266
- "class": "MetadataSourceRequestBody", "forLineage": False, "forDuplicateProcessing": False
267
- }
268
- egeria_client.detach_data_class_definition(guid, dc, body)
269
- msg = f"Removed `{dc}` from `{display_name}`"
270
- logger.trace(msg)
271
- classes_to_add = to_be_data_classes - as_is_data_classes
272
- logger.trace(f"classes_to_add: {list(classes_to_add)}")
273
- if len(terms_to_add) > 0:
274
- for dc in classes_to_add:
275
- body = {
276
- "class": "RelationshipRequestBody", "forLineage": False, "forDuplicateProcessing": False
277
- }
278
- egeria_client.link_data_class_definition(guid, dc, body)
279
- msg = f"Added `{dc}` to`{display_name}`"
280
- logger.trace(msg)
281
-
282
-
283
- else: # merge - add field to related elements
284
- if structure_list:
285
- add_field_to_data_structures(egeria_client, display_name, structure_list, guid)
286
- msg = f"Added `{display_name}` to `{structure_list}`"
287
- logger.trace(msg)
288
-
289
- if parent_field_list:
290
- for field in parent_field_list:
291
- egeria_client.link_nested_data_field(field, guid, None)
292
- msg = f"Added `{display_name}` to `{field}`"
293
- logger.trace(msg)
294
- if terms:
295
- for term in terms:
296
- egeria_client.link_semantic_definition(guid, term, None)
297
- msg = f"Added `{term}` to `{display_name}`"
298
- logger.trace(msg)
299
-
300
- if data_class_guid:
301
- egeria_client.link_data_class_definition(guid, data_class_guid)
302
- msg = f"Added `{data_class_guid}` to `{display_name}`"
303
- logger.trace(msg)
304
-
305
-
306
- @logger.catch
307
- def sync_data_class_rel_elements(egeria_client: EgeriaTech, containing_data_class_guids: list, terms: list,
308
- specializes_data_classes: list, guid: str, display_name: str,
309
- replace_all_props: bool = True) -> None:
310
- """Sync a data class' related elements.
148
+ # @logger.catch
149
+ # def add_field_to_data_structures(egeria_client: EgeriaTech, display_name: str, struct_list: list, guid) -> None:
150
+ # """
151
+ # Add data field to data structures.
152
+ # """
153
+ #
154
+ # try:
155
+ # for structure_guid in struct_list:
156
+ # egeria_client.link_member_data_field(structure_guid, guid, None)
157
+ # msg = f"Added `{display_name}` to structure `{structure_guid}`"
158
+ # logger.info(msg)
159
+ # return
160
+ #
161
+ # except Exception as e:
162
+ # console.print_exception()
163
+ #
164
+ #
165
+ # @logger.catch
166
+ # def remove_field_from_data_structures(egeria_client: EgeriaTech, display_name: str, struct_list: list,
167
+ # guid: str) -> None:
168
+ # """Remove a data field from a list of data structures."""
169
+ # try:
170
+ # for structure_guid in struct_list:
171
+ # egeria_client.detach_member_data_field(structure_guid, guid, None)
172
+ # msg = f"Removed `{display_name}` from structure `{structure_guid}`"
173
+ # logger.info(msg)
174
+ # return
175
+ #
176
+ # except Exception as e:
177
+ # console.print_exception()
178
+ #
311
179
 
312
- """
313
- if terms:
314
- terms = [terms]
180
+ # @logger.catch
181
+ # def sync_data_field_rel_elements(egeria_client: EgeriaTech, structure_list: list, parent_field_list: list, terms: list,
182
+ # data_class_guid: str, guid: str, display_name: str,
183
+ # replace_all_props: bool = True) -> None:
184
+ # """Sync a field's related elements.
185
+ #
186
+ # TODO: Need to add data class support when ready and may need to revisit bodies.
187
+ #
188
+ # """
189
+ # if terms:
190
+ # terms = [terms]
191
+ #
192
+ # if replace_all_props:
193
+ # rel_el_list = egeria_client.get_data_field_rel_elements(guid)
194
+ # # should I throw an exception if empty?
195
+ # if rel_el_list is None:
196
+ # logger.warning("Unexpected -> the list was None - assigning empty list")
197
+ # rel_el_list = {}
198
+ #
199
+ # as_is_data_structs = set(rel_el_list.get("data_structure_guids", []))
200
+ # as_is_parent_fields = set(rel_el_list.get("parent_guids", []))
201
+ # as_is_assigned_meanings = set(rel_el_list.get("assigned_meanings_guids", []))
202
+ # as_is_data_classes = set(rel_el_list.get("data_class_guids", []))
203
+ #
204
+ # to_be_data_structs = set(structure_list) if structure_list is not None else set()
205
+ # to_be_parent_fields = set(parent_field_list) if parent_field_list is not None else set()
206
+ # to_be_assigned_meanings = set(terms) if terms is not None else set()
207
+ # to_be_data_classes = set([data_class_guid]) if data_class_guid is not None else set()
208
+ #
209
+ # logger.trace(f"as_is_data_structs: {list(as_is_data_structs)} to_be_data_struct: {list(to_be_data_structs)}")
210
+ # logger.trace(
211
+ # f"as_is_parent_fields: {list(as_is_parent_fields)} to_be_parent_fields: {list(to_be_parent_fields)}")
212
+ # logger.trace(f"as_is_assigned_meanings: {list(as_is_assigned_meanings)} to_be_assigned_meanings: "
213
+ # f"{list(to_be_assigned_meanings)}")
214
+ # logger.trace(f"as_is_data_classes: {list(as_is_data_classes)} to_be_assigned_data_classes: "
215
+ # f"{list(to_be_data_classes)}")
216
+ #
217
+ # data_struct_to_remove = as_is_data_structs - to_be_data_structs
218
+ # logger.trace(f"data_struct_to_remove: {list(data_struct_to_remove)}")
219
+ # if len(data_struct_to_remove) > 0:
220
+ # for ds in data_struct_to_remove:
221
+ # egeria_client.detach_member_data_field(ds, guid, None)
222
+ # msg = f"Removed `{display_name}` from structure `{ds}`"
223
+ # logger.trace(msg)
224
+ # data_struct_to_add = to_be_data_structs - as_is_data_structs
225
+ # logger.trace(f"data_struct_to_add: {list(data_struct_to_add)}")
226
+ # if len(data_struct_to_add) > 0:
227
+ # for ds in data_struct_to_add:
228
+ # egeria_client.link_member_data_field(ds, guid, None)
229
+ # msg = f"Added `{display_name}` to structure `{ds}`"
230
+ # logger.trace(msg)
231
+ #
232
+ # parent_field_to_remove = to_be_parent_fields - as_is_parent_fields
233
+ # logger.trace(f"parent_field_to_remove: {list(parent_field_to_remove)}")
234
+ # if len(parent_field_to_remove) > 0:
235
+ # for field in parent_field_to_remove:
236
+ # egeria_client.detach_nested_data_field(field, guid, None)
237
+ # msg = f"Removed `{display_name}` from field `{field}`"
238
+ # logger.trace(msg)
239
+ # parent_field_to_add = to_be_parent_fields - as_is_parent_fields
240
+ # logger.trace(f"parent_field_to_add: {list(parent_field_to_add)}")
241
+ # if len(parent_field_to_add) > 0:
242
+ # for field in parent_field_to_add:
243
+ # egeria_client.link_nested_data_field(field, guid, None)
244
+ # msg = f"Added `{display_name}` to field `{field}`"
245
+ # logger.trace(msg)
246
+ #
247
+ # terms_to_remove = as_is_assigned_meanings - to_be_assigned_meanings
248
+ # logger.trace(f"terms_to_remove: {list(terms_to_remove)}")
249
+ # if terms:
250
+ # for term in terms_to_remove:
251
+ # egeria_client.detach_semantic_definition(guid, term, None)
252
+ # msg = f"Removed `{term}` from `{display_name}`"
253
+ # logger.trace(msg)
254
+ # terms_to_add = to_be_assigned_meanings - as_is_assigned_meanings
255
+ # logger.trace(f"terms_to_add: {list(terms_to_add)}")
256
+ # if len(terms_to_add) > 0:
257
+ # for term in terms_to_add:
258
+ # egeria_client.link_semantic_definition(guid, term, None)
259
+ # msg = f"Added `{term}` to`{display_name}`"
260
+ # logger.trace(msg)
261
+ #
262
+ # classes_to_remove = as_is_data_classes - to_be_data_classes
263
+ # logger.trace(f"classes_to_remove: {list(classes_to_remove)}")
264
+ # if len(terms_to_remove) > 0:
265
+ # for dc in classes_to_remove:
266
+ # body = {
267
+ # "class": "MetadataSourceRequestBody", "forLineage": False, "forDuplicateProcessing": False
268
+ # }
269
+ # egeria_client.detach_data_class_definition(guid, dc, body)
270
+ # msg = f"Removed `{dc}` from `{display_name}`"
271
+ # logger.trace(msg)
272
+ # classes_to_add = to_be_data_classes - as_is_data_classes
273
+ # logger.trace(f"classes_to_add: {list(classes_to_add)}")
274
+ # if len(terms_to_add) > 0:
275
+ # for dc in classes_to_add:
276
+ # body = {
277
+ # "class": "RelationshipRequestBody", "forLineage": False, "forDuplicateProcessing": False
278
+ # }
279
+ # egeria_client.link_data_class_definition(guid, dc, body)
280
+ # msg = f"Added `{dc}` to`{display_name}`"
281
+ # logger.trace(msg)
282
+ #
283
+ #
284
+ # else: # merge - add field to related elements
285
+ # if structure_list:
286
+ # add_field_to_data_structures(egeria_client, display_name, structure_list, guid)
287
+ # msg = f"Added `{display_name}` to `{structure_list}`"
288
+ # logger.trace(msg)
289
+ #
290
+ # if parent_field_list:
291
+ # for field in parent_field_list:
292
+ # egeria_client.link_nested_data_field(field, guid, None)
293
+ # msg = f"Added `{display_name}` to `{field}`"
294
+ # logger.trace(msg)
295
+ # if terms:
296
+ # for term in terms:
297
+ # egeria_client.link_semantic_definition(guid, term, None)
298
+ # msg = f"Added `{term}` to `{display_name}`"
299
+ # logger.trace(msg)
300
+ #
301
+ # if data_class_guid:
302
+ # egeria_client.link_data_class_definition(guid, data_class_guid)
303
+ # msg = f"Added `{data_class_guid}` to `{display_name}`"
304
+ # logger.trace(msg)
315
305
 
316
- if replace_all_props:
317
- rel_el_list = egeria_client.get_data_class_rel_elements(guid)
318
- if rel_el_list is None:
319
- logger.warning("Unexpected -> the list was None - assigning empty list")
320
- rel_el_list = {}
321
- if terms:
322
- terms = [terms]
323
-
324
- as_is_nested_classes = set(rel_el_list.get("nested_data_class_guids", []))
325
- as_is_assigned_meanings = set(rel_el_list.get("assigned_meanings_guids", []))
326
- as_is_specialized_classes = set(rel_el_list.get("specialized_data_class_guids", []))
327
-
328
- to_be_nested_classes = set(containing_data_class_guids) if containing_data_class_guids is not None else set()
329
- to_be_assigned_meanings = set(terms) if terms is not None else set()
330
- to_be_specialized_classes = set([specializes_data_classes]) if specializes_data_classes is not None else set()
331
-
332
- logger.trace(
333
- f"as_is_nested_classes: {list(as_is_nested_classes)} to_be_nested_classes: {list(to_be_nested_classes)}")
334
- logger.trace(f"as_is_assigned_meanings: {list(as_is_assigned_meanings)} to_be_assigned_meanings: "
335
- f"{list(to_be_assigned_meanings)}")
336
- logger.trace(f"as_is_specialized_classes: {list(as_is_specialized_classes)} to_be_specizialized_data_classes: "
337
- f"{list(to_be_specialized_classes)}")
338
-
339
- nested_classes_to_remove = to_be_nested_classes - as_is_nested_classes
340
- logger.trace(f"nested_classes_to_remove: {list(nested_classes_to_remove)}")
341
- if len(nested_classes_to_remove) > 0:
342
- for field in nested_classes_to_remove:
343
- egeria_client.detach_nested_data_class(field, guid, None)
344
- msg = f"Removed `{display_name}` from field `{field}`"
345
- logger.trace(msg)
346
- nested_classes_to_add = to_be_nested_classes - as_is_nested_classes
347
- logger.trace(f"nested_classes_to_add: {list(nested_classes_to_add)}")
348
- if len(nested_classes_to_add) > 0:
349
- for field in nested_classes_to_add:
350
- egeria_client.link_nested_data_class(field, guid, None)
351
- msg = f"Added `{display_name}` to field `{field}`"
352
- logger.trace(msg)
353
-
354
- terms_to_remove = as_is_assigned_meanings - to_be_assigned_meanings
355
- logger.trace(f"terms_to_remove: {list(terms_to_remove)}")
356
- if len(terms_to_remove) > 0:
357
- for term in terms_to_remove:
358
- egeria_client.detach_semantic_definition(guid, term, None)
359
- msg = f"Removed `{term}` from `{display_name}`"
360
- logger.trace(msg)
361
- terms_to_add = to_be_assigned_meanings - as_is_assigned_meanings
362
- logger.trace(f"terms_to_add: {list(terms_to_add)}")
363
- if len(terms_to_add) > 0:
364
- for term in terms_to_add:
365
- egeria_client.link_semantic_definition(guid, term, None)
366
- msg = f"Added `{term}` to`{display_name}`"
367
- logger.trace(msg)
368
-
369
- specialized_classes_to_remove = as_is_specialized_classes - to_be_specialized_classes
370
- logger.trace(f"classes_to_remove: {list(specialized_classes_to_remove)}")
371
- if len(terms_to_remove) > 0:
372
- for dc in specialized_classes_to_remove:
373
- body = {
374
- "class": "MetadataSourceRequestBody", "forLineage": False, "forDuplicateProcessing": False
375
- }
376
- egeria_client.detach_specialist_data_class(guid, dc, body)
377
- msg = f"Removed `{dc}` from `{display_name}`"
378
- logger.trace(msg)
379
- specialized_classes_to_add = to_be_specialized_classes - as_is_specialized_classes
380
- logger.trace(f"classes_to_add: {list(specialized_classes_to_add)}")
381
- if len(specialized_classes_to_add) > 0:
382
- for dc in specialized_classes_to_add:
383
- body = {
384
- "class": "RelationshipRequestBody", "forLineage": False, "forDuplicateProcessing": False
385
- }
386
- egeria_client.link_specialist_data_class(guid, dc, body)
387
- msg = f"Added `{dc}` to`{display_name}`"
388
- logger.trace(msg)
389
-
390
-
391
- else: # merge - add field to related elements
392
- if containing_data_class_guids:
393
- for field in containing_data_class_guids:
394
- egeria_client.link_nested_data_class(field, guid, None)
395
- msg = f"Added `{display_name}` to `{field}`"
396
- logger.trace(msg)
397
-
398
- if terms:
399
- for term in terms:
400
- egeria_client.link_semantic_definition(guid, term, None)
401
- msg = f"Added `{term}` to `{display_name}`"
402
- logger.trace(msg)
403
- if specializes_data_classes:
404
- for el in specializes_data_classes:
405
- egeria_client.link_specialist_data_class(guid, el)
406
- msg = f"Linked `{el}` to `{display_name}`"
407
- logger.trace(msg)
306
+ #
307
+ # @logger.catch
308
+ # def sync_data_class_rel_elements(egeria_client: EgeriaTech, containing_data_class_guids: list, terms: list,
309
+ # specializes_data_classes: list, guid: str, display_name: str,
310
+ # replace_all_props: bool = True) -> None:
311
+ # """Sync a data class' related elements.
312
+ #
313
+ # """
314
+ # if terms:
315
+ # terms = [terms]
316
+ #
317
+ # if replace_all_props:
318
+ # rel_el_list = egeria_client.get_data_class_rel_elements(guid)
319
+ # if rel_el_list is None:
320
+ # logger.warning("Unexpected -> the list was None - assigning empty list")
321
+ # rel_el_list = {}
322
+ # if terms:
323
+ # terms = [terms]
324
+ #
325
+ # as_is_nested_classes = set(rel_el_list.get("nested_data_class_guids", []))
326
+ # as_is_assigned_meanings = set(rel_el_list.get("assigned_meanings_guids", []))
327
+ # as_is_specialized_classes = set(rel_el_list.get("specialized_data_class_guids", []))
328
+ #
329
+ # to_be_nested_classes = set(containing_data_class_guids) if containing_data_class_guids is not None else set()
330
+ # to_be_assigned_meanings = set(terms) if terms is not None else set()
331
+ # to_be_specialized_classes = set([specializes_data_classes]) if specializes_data_classes is not None else set()
332
+ #
333
+ # logger.trace(
334
+ # f"as_is_nested_classes: {list(as_is_nested_classes)} to_be_nested_classes: {list(to_be_nested_classes)}")
335
+ # logger.trace(f"as_is_assigned_meanings: {list(as_is_assigned_meanings)} to_be_assigned_meanings: "
336
+ # f"{list(to_be_assigned_meanings)}")
337
+ # logger.trace(f"as_is_specialized_classes: {list(as_is_specialized_classes)} to_be_specizialized_data_classes: "
338
+ # f"{list(to_be_specialized_classes)}")
339
+ #
340
+ # nested_classes_to_remove = to_be_nested_classes - as_is_nested_classes
341
+ # logger.trace(f"nested_classes_to_remove: {list(nested_classes_to_remove)}")
342
+ # if len(nested_classes_to_remove) > 0:
343
+ # for field in nested_classes_to_remove:
344
+ # egeria_client.detach_nested_data_class(field, guid, None)
345
+ # msg = f"Removed `{display_name}` from field `{field}`"
346
+ # logger.trace(msg)
347
+ # nested_classes_to_add = to_be_nested_classes - as_is_nested_classes
348
+ # logger.trace(f"nested_classes_to_add: {list(nested_classes_to_add)}")
349
+ # if len(nested_classes_to_add) > 0:
350
+ # for field in nested_classes_to_add:
351
+ # egeria_client.link_nested_data_class(field, guid, None)
352
+ # msg = f"Added `{display_name}` to field `{field}`"
353
+ # logger.trace(msg)
354
+ #
355
+ # terms_to_remove = as_is_assigned_meanings - to_be_assigned_meanings
356
+ # logger.trace(f"terms_to_remove: {list(terms_to_remove)}")
357
+ # if len(terms_to_remove) > 0:
358
+ # for term in terms_to_remove:
359
+ # egeria_client.detach_semantic_definition(guid, term, None)
360
+ # msg = f"Removed `{term}` from `{display_name}`"
361
+ # logger.trace(msg)
362
+ # terms_to_add = to_be_assigned_meanings - as_is_assigned_meanings
363
+ # logger.trace(f"terms_to_add: {list(terms_to_add)}")
364
+ # if len(terms_to_add) > 0:
365
+ # for term in terms_to_add:
366
+ # egeria_client.link_semantic_definition(guid, term, None)
367
+ # msg = f"Added `{term}` to`{display_name}`"
368
+ # logger.trace(msg)
369
+ #
370
+ # specialized_classes_to_remove = as_is_specialized_classes - to_be_specialized_classes
371
+ # logger.trace(f"classes_to_remove: {list(specialized_classes_to_remove)}")
372
+ # if len(terms_to_remove) > 0:
373
+ # for dc in specialized_classes_to_remove:
374
+ # body = {
375
+ # "class": "MetadataSourceRequestBody", "forLineage": False, "forDuplicateProcessing": False
376
+ # }
377
+ # egeria_client.detach_specialist_data_class(guid, dc, body)
378
+ # msg = f"Removed `{dc}` from `{display_name}`"
379
+ # logger.trace(msg)
380
+ # specialized_classes_to_add = to_be_specialized_classes - as_is_specialized_classes
381
+ # logger.trace(f"classes_to_add: {list(specialized_classes_to_add)}")
382
+ # if len(specialized_classes_to_add) > 0:
383
+ # for dc in specialized_classes_to_add:
384
+ # body = {
385
+ # "class": "RelationshipRequestBody", "forLineage": False, "forDuplicateProcessing": False
386
+ # }
387
+ # egeria_client.link_specialist_data_class(guid, dc, body)
388
+ # msg = f"Added `{dc}` to`{display_name}`"
389
+ # logger.trace(msg)
390
+ #
391
+ #
392
+ # else: # merge - add field to related elements
393
+ # if containing_data_class_guids:
394
+ # for field in containing_data_class_guids:
395
+ # egeria_client.link_nested_data_class(field, guid, None)
396
+ # msg = f"Added `{display_name}` to `{field}`"
397
+ # logger.trace(msg)
398
+ #
399
+ # if terms:
400
+ # for term in terms:
401
+ # egeria_client.link_semantic_definition(guid, term, None)
402
+ # msg = f"Added `{term}` to `{display_name}`"
403
+ # logger.trace(msg)
404
+ # if specializes_data_classes:
405
+ # for el in specializes_data_classes:
406
+ # egeria_client.link_specialist_data_class(guid, el)
407
+ # msg = f"Linked `{el}` to `{display_name}`"
408
+ # logger.trace(msg)
408
409
  #
409
410
  # Product Manager Commands
410
411
  #
@@ -442,37 +443,37 @@ def process_collection_upsert_command(egeria_client: EgeriaTech, txt: str, direc
442
443
  attributes = parsed_output['attributes']
443
444
 
444
445
  display_name = attributes['Display Name'].get('value', None)
445
- description = attributes.get('Description',{}).get('value', None)
446
- user_defined_status = attributes.get('User Defined Status',{}).get('value', None)
447
-
448
- collection_classification = attributes.get('Collection Classification', {}).get('value', None)
446
+ # description = attributes.get('Description',{}).get('value', None)
447
+ # user_defined_status = attributes.get('User Defined Status',{}).get('value', None)
448
+ #
449
+ # collection_classification = attributes.get('Collection Classification', {}).get('value', None)
449
450
 
450
- current_version = attributes.get('Version Identifier',{}).get('value', None)
451
+ # current_version = attributes.get('Version Identifier',{}).get('value', None)
451
452
 
452
453
  # status = attributes.get('Status',{}).get('value', "ACTIVE")
453
454
 
454
- anchor_guid = attributes.get('Anchor ID', {}).get('guid', None)
455
- parent_guid = attributes.get('Parent ID', {}).get('guid', None)
456
- parent_relationship_type_name = attributes.get('Parent Relationship Type Name', {}).get('value', None)
457
- parent_relationship_type_name = attributes.get('Parent Relationship Type Name', {}).get('value',"CollectionMembership")
458
- parent_at_end1 = attributes.get('Parent at End1', {}).get('value', True)
459
- anchor_scope_guid = attributes.get('Anchor Scope GUID', {}).get('value', None)
460
- is_own_anchor = attributes.get('Is Own Anchor', {}).get('value', True)
461
- if parent_guid is None:
462
- is_own_anchor = True
463
-
464
-
465
- additional_prop = attributes.get('Additional Properties', {}).get('value', None)
466
- additional_properties = json.loads(additional_prop) if additional_prop is not None else None
467
- extended_prop = attributes.get('Extended Properties', {}).get('value', None)
468
- extended_properties = json.loads(extended_prop) if extended_prop is not None else None
469
- external_source_guid = attributes.get('External Source Name', {}).get('guid', None)
470
- external_source_name = attributes.get('External Source Name', {}).get('value', None)
471
- effective_time = attributes.get('Effective Time', {}).get('value', None)
472
- for_lineage = attributes.get('For Lineage', {}).get('value', None)
473
- for_duplicate_processing = attributes.get('For Duplicate Processing', {}).get('value', None)
474
-
475
- replace_all_props = not attributes.get('Merge Update', {}).get('value', True)
455
+ # anchor_guid = attributes.get('Anchor ID', {}).get('guid', None)
456
+ # parent_guid = attributes.get('Parent ID', {}).get('guid', None)
457
+ # parent_relationship_type_name = attributes.get('Parent Relationship Type Name', {}).get('value', None)
458
+ # parent_relationship_type_name = attributes.get('Parent Relationship Type Name', {}).get('value',"CollectionMembership")
459
+ # parent_at_end1 = attributes.get('Parent at End1', {}).get('value', True)
460
+ # anchor_scope_guid = attributes.get('Anchor Scope GUID', {}).get('value', None)
461
+ # is_own_anchor = attributes.get('Is Own Anchor', {}).get('value', True)
462
+ # if parent_guid is None:
463
+ # is_own_anchor = True
464
+
465
+
466
+ # additional_prop = attributes.get('Additional Properties', {}).get('value', None)
467
+ # additional_properties = json.loads(additional_prop) if additional_prop is not None else None
468
+ # extended_prop = attributes.get('Extended Properties', {}).get('value', None)
469
+ # extended_properties = json.loads(extended_prop) if extended_prop is not None else None
470
+ # external_source_guid = attributes.get('External Source Name', {}).get('guid', None)
471
+ # external_source_name = attributes.get('External Source Name', {}).get('value', None)
472
+ # effective_time = attributes.get('Effective Time', {}).get('value', None)
473
+ # for_lineage = attributes.get('For Lineage', {}).get('value', None)
474
+ # for_duplicate_processing = attributes.get('For Duplicate Processing', {}).get('value', None)
475
+
476
+ # replace_all_props = not attributes.get('Merge Update', {}).get('value', True)
476
477
 
477
478
  if directive == "display":
478
479
 
@@ -497,10 +498,10 @@ def process_collection_upsert_command(egeria_client: EgeriaTech, txt: str, direc
497
498
  else:
498
499
  print(Markdown(
499
500
  f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
500
- prop_body = set_collection_property_body(object_type,qualified_name,attributes)
501
+ prop_body = set_prop_body(object_type,qualified_name,attributes)
501
502
 
502
503
  body = set_update_body(object_type, attributes)
503
- body['properties'] = set_collection_property_body(object_type,qualified_name,attributes)
504
+ body['properties'] = set_prop_body(object_type,qualified_name,attributes)
504
505
 
505
506
  egeria_client.update_collection_w_body(guid, body)
506
507
  # egeria_client.update_collection_status(guid, status)
@@ -522,8 +523,10 @@ def process_collection_upsert_command(egeria_client: EgeriaTech, txt: str, direc
522
523
 
523
524
  else:
524
525
  body = set_create_body(object_type,attributes)
525
- body["initialClassifications"] = set_collection_classifications(object_type, attributes)
526
- body["properties"] = set_collection_property_body(object_type, qualified_name,attributes)
526
+
527
+ # if this is a root or folder (maybe more in the future), then make sure that the classification is set.
528
+ body["initialClassifications"] = set_collections_classifications(object_type, attributes)
529
+ body["properties"] = set_prop_body(object_type, qualified_name,attributes)
527
530
 
528
531
 
529
532
  guid = egeria_client.create_collection_w_body(body)
@@ -540,9 +543,11 @@ def process_collection_upsert_command(egeria_client: EgeriaTech, txt: str, direc
540
543
  logger.error(msg)
541
544
  return None
542
545
 
546
+ except PyegeriaException as e:
547
+ logger.error(f"Pyegeria error performing {command}: {e}")
548
+ return None
543
549
  except Exception as e:
544
550
  logger.error(f"Error performing {command}: {e}")
545
- return None
546
551
  else:
547
552
  return None
548
553
 
@@ -576,51 +581,8 @@ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
576
581
  attributes = parsed_output['attributes']
577
582
 
578
583
  display_name = attributes['Display Name'].get('value', None)
579
- description = attributes.get('Description',{}).get('value', None)
580
- user_defined_status = attributes.get('User Defined Status',{}).get('value', None)
581
- product_identifier = attributes.get('Product Identifier',{}).get('value', None)
582
- product_name = attributes.get('Product Name',{}).get('value', None)
583
- product_type = attributes.get('Product Type',{}).get('value', None)
584
-
585
-
586
-
587
- product_description = attributes.get('Product Description',{}).get('value', None)
588
- maturity = attributes.get('Maturity',{}).get('value', None)
589
- service_life = attributes.get('Service Life',{}).get('value', None)
590
- introduction_date = attributes.get('Introduction Date',{}).get('value', None)
591
- next_version_date = attributes.get('Next Version Date',{}).get('value', None)
592
- withdrawal_date = attributes.get('Withdrawal Date',{}).get('value', None)
593
-
594
- collection_type = attributes.get('Collection Type', {}).get('value', None)
595
- current_version = attributes.get('Version Identifier',{}).get('value', None)
596
584
  product_manager = attributes.get('Product Manager',{}).get('value', None)
597
585
 
598
-
599
- product_status = attributes.get('Status',{}).get('value', "ACTIVE")
600
-
601
- anchor_guid = attributes.get('Anchor ID', {}).get('guid', None)
602
- parent_guid = attributes.get('Parent ID', {}).get('guid', None)
603
- parent_relationship_type_name = attributes.get('Parent Relationship Type Name', {}).get('value', None)
604
- parent_relationship_type_name = attributes.get('Parent Relationship Type Name', {}).get('value',"CollectionMembership")
605
- parent_at_end1 = attributes.get('Parent at End1', {}).get('value', True)
606
- anchor_scope_guid = attributes.get('Anchor Scope GUID', {}).get('value', None)
607
- is_own_anchor = attributes.get('Is Own Anchor', {}).get('value', True)
608
- if parent_guid is None:
609
- is_own_anchor = True
610
-
611
-
612
- additional_prop = attributes.get('Additional Properties', {}).get('value', None)
613
- additional_properties = json.loads(additional_prop) if additional_prop is not None else None
614
- extended_prop = attributes.get('Extended Properties', {}).get('value', None)
615
- extended_properties = json.loads(extended_prop) if extended_prop is not None else None
616
- external_source_guid = attributes.get('External Source Name', {}).get('guid', None)
617
- external_source_name = attributes.get('External Source Name', {}).get('value', None)
618
- effective_time = attributes.get('Effective Time', {}).get('value', None)
619
- for_lineage = attributes.get('For Lineage', {}).get('value', None)
620
- for_duplicate_processing = attributes.get('For Duplicate Processing', {}).get('value', None)
621
-
622
- replace_all_props = not attributes.get('Merge Update', {}).get('value', True)
623
-
624
586
  if directive == "display":
625
587
 
626
588
  return None
@@ -644,34 +606,8 @@ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
644
606
  else:
645
607
  print(Markdown(
646
608
  f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
647
- prop_body = set_prop_body(object_type,qualified_name,attributes)
648
-
649
- body ={
650
- "class": "UpdateElementRequestBody",
651
- "properties": {
652
- "class": "DigitalProductProperties",
653
- "qualifiedName": qualified_name,
654
- "userDefinedStatus": user_defined_status,
655
- "name": display_name,
656
- "description": description,
657
- "identifier": product_identifier,
658
- "productName": product_name,
659
- "productType": product_type,
660
- "maturity": maturity,
661
- "serviceLife": service_life,
662
- "introductionDate": introduction_date,
663
- "nextVersionDate": next_version_date,
664
- "withdrawDate": withdrawal_date,
665
- "currentVersion": current_version,
666
- "additionalProperties": additional_properties,
667
- "extendedProperties": extended_properties,
668
- },
669
- "externalSourceGUID": external_source_guid,
670
- "externalSourceName": external_source_name,
671
- "effectiveTime": effective_time,
672
- "forLineage": for_lineage,
673
- "forDuplicateProcessing": for_duplicate_processing
674
- }
609
+ prop_body = set_product_body(object_type,qualified_name,attributes)
610
+ # Todo: Update product manager later?
675
611
 
676
612
  egeria_client.update_digital_product(guid, body)
677
613
  egeria_client.update_digital_product_status(guid, product_status)
@@ -692,49 +628,21 @@ def process_digital_product_upsert_command(egeria_client: EgeriaTech, txt: str,
692
628
  return update_a_command(txt, object_action, object_type, qualified_name, guid)
693
629
 
694
630
  else:
695
- body = {
696
- "class": "NewDigitalProductRequestBody",
697
- "isOwnAnchor": is_own_anchor,
698
- "parentGUID": parent_guid,
699
- "parentRelationshipTypeName": parent_relationship_type_name,
700
- "parentAtEnd1": parent_at_end1,
701
- "properties": {
702
- "class": "DigitalProductProperties",
703
- "qualifiedName": qualified_name,
704
- "userDefinedStatus": user_defined_status,
705
- "name": display_name,
706
- "description" : description,
707
- "identifier": product_identifier,
708
- "productName": product_name,
709
- "productType": product_type,
710
- "maturity": maturity,
711
- "serviceLife": service_life,
712
- "introductionDate": introduction_date,
713
- "nextVersionDate": next_version_date,
714
- "withdrawDate": withdrawal_date,
715
- "currentVersion": current_version,
716
-
717
- "additionalProperties": additional_properties,
718
- "extendedProperties": extended_properties,
719
- },
720
- "initialStatus": product_status,
721
- "externalSourceGUID": external_source_guid,
722
- "externalSourceName": external_source_name,
723
- "effectiveTime" : effective_time,
724
- "forLineage": for_lineage,
725
- "forDuplicateProcessing": for_duplicate_processing
726
- }
727
-
728
-
631
+ body = set_create_body(object_type, attributes)
632
+ body["initialClassifications"] = set_collection_classifications(object_type, attributes)
633
+ prop_body = set_product_body(object_type, qualified_name, attributes)
634
+ body["properties"] = prop_body
729
635
 
730
636
  guid = egeria_client.create_digital_product(body)
731
637
  if guid:
732
638
  update_element_dictionary(qualified_name, {
733
639
  'guid': guid, 'display_name': display_name
734
640
  })
641
+ # Todo: Add product manager link later? Agreements?
642
+
735
643
  msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
736
644
  logger.success(msg)
737
- return egeria_client.get_collection_by_guid(guid, collection_type='Digital Product',
645
+ return egeria_client.get_collection_by_guid(guid, element_type='Digital Product',
738
646
  output_format='MD')
739
647
  else:
740
648
  msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"