pyegeria 5.4.3.4__py3-none-any.whl → 5.4.4__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 (208) hide show
  1. commands/cat/debug_log.2025-09-04_08-21-58_788009.log.zip +0 -0
  2. commands/cat/debug_log.2025-09-05_09-37-53_062579.log.zip +0 -0
  3. commands/cat/list_format_set.py +3 -1
  4. md_processing/__init__.py +9 -1
  5. md_processing/data/commands.json +7181 -1400
  6. md_processing/data/generated_format_sets.json +4137 -0
  7. md_processing/data/generated_format_sets.py +51 -0
  8. md_processing/dr_egeria.py +14 -2
  9. md_processing/md_commands/ext_ref_commands.py +543 -0
  10. md_processing/md_commands/old_solution_architect_commands.py +1139 -0
  11. md_processing/md_commands/solution_architect_commands.py +26 -59
  12. md_processing/md_processing_utils/debug_log +1 -3
  13. md_processing/md_processing_utils/dr-egeria-help-2025-09-09T11:10:03.md +3305 -0
  14. md_processing/md_processing_utils/gen_format_sets.py +422 -0
  15. md_processing/md_processing_utils/md_processing_constants.py +19 -1
  16. pyegeria/_output_formats.py +239 -85
  17. pyegeria/collection_manager.py +3 -3
  18. pyegeria/egeria_tech_client.py +3 -0
  19. pyegeria/external_references.py +1794 -0
  20. pyegeria/solution_architect.py +290 -485
  21. {pyegeria-5.4.3.4.dist-info → pyegeria-5.4.4.dist-info}/METADATA +1 -1
  22. {pyegeria-5.4.3.4.dist-info → pyegeria-5.4.4.dist-info}/RECORD +25 -199
  23. commands/.DS_Store +0 -0
  24. commands/cat/.DS_Store +0 -0
  25. commands/cat/.env +0 -8
  26. commands/cat/debug_log.2025-08-29_07-07-27_848189.log.zip +0 -0
  27. commands/cat/debug_log.2025-08-30_21-15-48_528443.log.zip +0 -0
  28. commands/cat/debug_log.log +0 -7276
  29. commands/cat/logs/pyegeria.log +0 -90
  30. commands/cli/debug_log.log +0 -0
  31. commands/doc/.DS_Store +0 -0
  32. commands/ops/logs/pyegeria.log +0 -0
  33. md_processing/.DS_Store +0 -0
  34. md_processing/.idea/.gitignore +0 -8
  35. md_processing/.idea/inspectionProfiles/Project_Default.xml +0 -59
  36. md_processing/.idea/md_processing.iml +0 -15
  37. md_processing/.idea/modules.xml +0 -8
  38. md_processing/.idea/sonarlint/issuestore/index.pb +0 -0
  39. md_processing/.idea/sonarlint/securityhotspotstore/index.pb +0 -0
  40. md_processing/.idea/vcs.xml +0 -6
  41. md_processing/.idea/workspace.xml +0 -107
  42. md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +0 -8
  43. md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +0 -873
  44. md_processing/dr_egeria_inbox/arch_test.md +0 -57
  45. md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +0 -254
  46. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +0 -696
  47. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +0 -254
  48. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +0 -298
  49. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +0 -608
  50. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +0 -94
  51. md_processing/dr_egeria_inbox/archive/freddie_intro.md +0 -284
  52. md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +0 -275
  53. md_processing/dr_egeria_inbox/archive/test-term.md +0 -110
  54. md_processing/dr_egeria_inbox/cat_test.md +0 -100
  55. md_processing/dr_egeria_inbox/collections.md +0 -39
  56. md_processing/dr_egeria_inbox/data_designer_debug.log +0 -6
  57. md_processing/dr_egeria_inbox/data_designer_out.md +0 -60
  58. md_processing/dr_egeria_inbox/data_designer_search_test.md +0 -11
  59. md_processing/dr_egeria_inbox/data_field.md +0 -54
  60. md_processing/dr_egeria_inbox/data_spec.md +0 -77
  61. md_processing/dr_egeria_inbox/data_spec_test.md +0 -2014
  62. md_processing/dr_egeria_inbox/data_test.md +0 -179
  63. md_processing/dr_egeria_inbox/data_test2.md +0 -429
  64. md_processing/dr_egeria_inbox/data_test3.md +0 -462
  65. md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +0 -124
  66. md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +0 -168
  67. md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +0 -280
  68. md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +0 -318
  69. md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +0 -1073
  70. md_processing/dr_egeria_inbox/dr_egeria_isc1.md +0 -44
  71. md_processing/dr_egeria_inbox/generated_help_report.md +0 -9
  72. md_processing/dr_egeria_inbox/generated_help_terms.md +0 -842
  73. md_processing/dr_egeria_inbox/glossary_list.md +0 -5
  74. md_processing/dr_egeria_inbox/glossary_search_test.md +0 -40
  75. md_processing/dr_egeria_inbox/glossary_test1.md +0 -378
  76. md_processing/dr_egeria_inbox/gov_def.md +0 -718
  77. md_processing/dr_egeria_inbox/gov_def2.md +0 -447
  78. md_processing/dr_egeria_inbox/img.png +0 -0
  79. md_processing/dr_egeria_inbox/output_tests.md +0 -114
  80. md_processing/dr_egeria_inbox/product.md +0 -219
  81. md_processing/dr_egeria_inbox/rel.md +0 -8
  82. md_processing/dr_egeria_inbox/sb.md +0 -119
  83. md_processing/dr_egeria_inbox/solution-components.md +0 -136
  84. md_processing/dr_egeria_inbox/solution_blueprints.md +0 -118
  85. md_processing/dr_egeria_inbox/synonym_test.md +0 -42
  86. md_processing/dr_egeria_inbox/t2.md +0 -268
  87. md_processing/dr_egeria_outbox/.DS_Store +0 -0
  88. md_processing/dr_egeria_outbox/.obsidian/app.json +0 -1
  89. md_processing/dr_egeria_outbox/.obsidian/appearance.json +0 -1
  90. md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +0 -7
  91. md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +0 -33
  92. md_processing/dr_egeria_outbox/.obsidian/plugins/buttons/main.js +0 -5164
  93. md_processing/dr_egeria_outbox/.obsidian/plugins/buttons/manifest.json +0 -10
  94. md_processing/dr_egeria_outbox/.obsidian/plugins/buttons/styles.css +0 -624
  95. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +0 -10
  96. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +0 -4459
  97. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +0 -10
  98. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +0 -3
  99. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +0 -153
  100. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +0 -11
  101. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +0 -1
  102. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +0 -500
  103. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +0 -12
  104. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +0 -1
  105. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/data.json +0 -38
  106. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +0 -37
  107. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +0 -11
  108. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +0 -220
  109. md_processing/dr_egeria_outbox/.obsidian/types.json +0 -28
  110. md_processing/dr_egeria_outbox/.obsidian/workspace.json +0 -270
  111. md_processing/dr_egeria_outbox/Button Test.md +0 -11
  112. md_processing/dr_egeria_outbox/Scripts/.DS_Store +0 -0
  113. md_processing/dr_egeria_outbox/Scripts/sendRest.js +0 -24
  114. md_processing/dr_egeria_outbox/Templates/sendToApi.md.md +0 -17
  115. md_processing/dr_egeria_outbox/Untitled.canvas +0 -1
  116. md_processing/dr_egeria_outbox/monday/processed-2025-09-01 09:26-product.md +0 -210
  117. md_processing/dr_egeria_outbox/monday/processed-2025-09-01 14:03-product.md +0 -209
  118. md_processing/dr_egeria_outbox/monday/processed-2025-09-01 14:24-product.md +0 -263
  119. md_processing/dr_egeria_outbox/monday/processed-2025-09-01 16:03-data_spec_test.md +0 -2374
  120. md_processing/dr_egeria_outbox/monday/processed-2025-09-01 16:05-data_spec_test.md +0 -2374
  121. md_processing/dr_egeria_outbox/monday/processed-2025-09-02 08:28-data_spec_test.md +0 -2321
  122. md_processing/dr_egeria_outbox/monday/processed-2025-09-02 08:37-data_spec_test.md +0 -2304
  123. md_processing/dr_egeria_outbox/monday/processed-2025-09-02 08:56-data_spec_test.md +0 -2324
  124. md_processing/dr_egeria_outbox/monday/processed-2025-09-02 09:00-data_spec_test.md +0 -2324
  125. md_processing/dr_egeria_outbox/processed-2025-08-30 16:56-generated_help_terms.md +0 -795
  126. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +0 -719
  127. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +0 -41
  128. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +0 -33
  129. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +0 -192
  130. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +0 -486
  131. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +0 -486
  132. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +0 -486
  133. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +0 -486
  134. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +0 -486
  135. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +0 -486
  136. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +0 -486
  137. md_processing/family_docs/Data Designer/Create_Data_Class.md +0 -164
  138. md_processing/family_docs/Data Designer/Create_Data_Dictionary.md +0 -30
  139. md_processing/family_docs/Data Designer/Create_Data_Field.md +0 -162
  140. md_processing/family_docs/Data Designer/Create_Data_Specification.md +0 -36
  141. md_processing/family_docs/Data Designer/Create_Data_Structure.md +0 -38
  142. md_processing/family_docs/Data Designer/View_Data_Classes.md +0 -78
  143. md_processing/family_docs/Data Designer/View_Data_Dictionaries.md +0 -78
  144. md_processing/family_docs/Data Designer/View_Data_Fields.md +0 -78
  145. md_processing/family_docs/Data Designer/View_Data_Specifications.md +0 -78
  146. md_processing/family_docs/Data Designer/View_Data_Structures.md +0 -78
  147. md_processing/family_docs/Data Designer.md +0 -842
  148. md_processing/family_docs/Digital Product Manager/Add_Member->Collection.md +0 -42
  149. md_processing/family_docs/Digital Product Manager/Attach_Collection->Resource.md +0 -36
  150. md_processing/family_docs/Digital Product Manager/Create_Agreement.md +0 -96
  151. md_processing/family_docs/Digital Product Manager/Create_Data_Sharing_Agreement.md +0 -72
  152. md_processing/family_docs/Digital Product Manager/Create_DigitalSubscription.md +0 -102
  153. md_processing/family_docs/Digital Product Manager/Create_Digital_Product.md +0 -134
  154. md_processing/family_docs/Digital Product Manager/Link_Agreement_Items.md +0 -60
  155. md_processing/family_docs/Digital Product Manager/Link_Contracts.md +0 -26
  156. md_processing/family_docs/Digital Product Manager/Link_Digital_Product_-_Digital_Product.md +0 -30
  157. md_processing/family_docs/Digital Product Manager/Link_Subscribers.md +0 -48
  158. md_processing/family_docs/Digital Product Manager.md +0 -668
  159. md_processing/family_docs/Glossary/Attach_Category_Parent.md +0 -18
  160. md_processing/family_docs/Glossary/Attach_Term-Term_Relationship.md +0 -26
  161. md_processing/family_docs/Glossary/Create_Category.md +0 -38
  162. md_processing/family_docs/Glossary/Create_Glossary.md +0 -42
  163. md_processing/family_docs/Glossary/Create_Term.md +0 -70
  164. md_processing/family_docs/Glossary.md +0 -206
  165. md_processing/family_docs/Governance Officer/Create_Business_Imperative.md +0 -106
  166. md_processing/family_docs/Governance Officer/Create_Certification_Type.md +0 -112
  167. md_processing/family_docs/Governance Officer/Create_Governance_Approach.md +0 -114
  168. md_processing/family_docs/Governance Officer/Create_Governance_Obligation.md +0 -114
  169. md_processing/family_docs/Governance Officer/Create_Governance_Principle.md +0 -114
  170. md_processing/family_docs/Governance Officer/Create_Governance_Procedure.md +0 -128
  171. md_processing/family_docs/Governance Officer/Create_Governance_Process.md +0 -122
  172. md_processing/family_docs/Governance Officer/Create_Governance_Processing_Purpose.md +0 -106
  173. md_processing/family_docs/Governance Officer/Create_Governance_Responsibility.md +0 -122
  174. md_processing/family_docs/Governance Officer/Create_Governance_Rule.md +0 -122
  175. md_processing/family_docs/Governance Officer/Create_Governance_Strategy.md +0 -106
  176. md_processing/family_docs/Governance Officer/Create_License_Type.md +0 -112
  177. md_processing/family_docs/Governance Officer/Create_Naming_Standard_Rule.md +0 -122
  178. md_processing/family_docs/Governance Officer/Create_Regulation_Article.md +0 -106
  179. md_processing/family_docs/Governance Officer/Create_Regulation_Definition.md +0 -118
  180. md_processing/family_docs/Governance Officer/Create_Security_Access_Control.md +0 -114
  181. md_processing/family_docs/Governance Officer/Create_Security_Group.md +0 -120
  182. md_processing/family_docs/Governance Officer/Create_Service_Level_Objectives.md +0 -122
  183. md_processing/family_docs/Governance Officer/Create_Threat_Definition.md +0 -106
  184. md_processing/family_docs/Governance Officer/Link_Governance_Controls.md +0 -32
  185. md_processing/family_docs/Governance Officer/Link_Governance_Drivers.md +0 -32
  186. md_processing/family_docs/Governance Officer/Link_Governance_Policies.md +0 -32
  187. md_processing/family_docs/Governance Officer/View_Governance_Definitions.md +0 -82
  188. md_processing/family_docs/Governance Officer.md +0 -2412
  189. md_processing/family_docs/Solution Architect/Create_Information_Supply_Chain.md +0 -70
  190. md_processing/family_docs/Solution Architect/Create_Solution_Blueprint.md +0 -44
  191. md_processing/family_docs/Solution Architect/Create_Solution_Component.md +0 -96
  192. md_processing/family_docs/Solution Architect/Create_Solution_Role.md +0 -66
  193. md_processing/family_docs/Solution Architect/Link_Information_Supply_Chain_Peers.md +0 -32
  194. md_processing/family_docs/Solution Architect/Link_Solution_Component_Peers.md +0 -32
  195. md_processing/family_docs/Solution Architect/View_Information_Supply_Chains.md +0 -32
  196. md_processing/family_docs/Solution Architect/View_Solution_Blueprints.md +0 -32
  197. md_processing/family_docs/Solution Architect/View_Solution_Components.md +0 -32
  198. md_processing/family_docs/Solution Architect/View_Solution_Roles.md +0 -32
  199. md_processing/family_docs/Solution Architect.md +0 -490
  200. md_processing/md_commands/old_project_commands.py +0 -164
  201. md_processing/md_processing_utils/debug_log.log +0 -5580
  202. md_processing/md_processing_utils/generated_help_terms.md +0 -842
  203. md_processing/md_processing_utils/logs/pyegeria.log +0 -56
  204. pyegeria/.DS_Store +0 -0
  205. pyegeria/___external_references.py +0 -3255
  206. {pyegeria-5.4.3.4.dist-info → pyegeria-5.4.4.dist-info}/LICENSE +0 -0
  207. {pyegeria-5.4.3.4.dist-info → pyegeria-5.4.4.dist-info}/WHEEL +0 -0
  208. {pyegeria-5.4.3.4.dist-info → pyegeria-5.4.4.dist-info}/entry_points.txt +0 -0
@@ -15,9 +15,10 @@ from httpx import Response
15
15
  from loguru import logger
16
16
 
17
17
  from pyegeria.models import NewElementRequestBody, TemplateRequestBody, UpdateElementRequestBody, \
18
- NewRelationshipRequestBody, DeleteRequestBody, UpdateStatusRequestBody
18
+ NewRelationshipRequestBody, DeleteRequestBody, UpdateStatusRequestBody, SearchStringRequestBody
19
19
  from pyegeria.output_formatter import make_preamble, make_md_attribute, generate_output, extract_mermaid_only, \
20
- extract_basic_dict, MD_SEPARATOR
20
+ extract_basic_dict, MD_SEPARATOR, populate_common_columns
21
+ from pyegeria._output_formats import select_output_format_set, get_output_format_type_match
21
22
  from pyegeria import validate_guid
22
23
  from pyegeria.governance_officer import GovernanceOfficer
23
24
  from pyegeria._client_new import Client2, max_paging_size
@@ -224,7 +225,7 @@ class SolutionArchitect(Client2):
224
225
  else:
225
226
  return []
226
227
 
227
- def _extract_info_supply_chain_properties(self, element: dict) -> dict:
228
+ def _extract_info_supply_chain_properties(self, element: dict, columns_struct: dict) -> dict:
228
229
  """
229
230
  Extract properties from an information supply chain element.
230
231
 
@@ -234,63 +235,18 @@ class SolutionArchitect(Client2):
234
235
  Returns:
235
236
  Dictionary with extracted properties
236
237
  """
237
- guid = element['elementHeader'].get("guid", None)
238
- properties = element['properties']
239
- qualified_name = properties.get("qualifiedName", None)
240
- display_name = properties.get("displayName", None)
241
- description = properties.get("description", None)
242
- scope = properties.get("scope", None)
243
- purposes = properties.get("purposes", [])
244
- purpose_md = ""
245
- if purposes:
246
- for purpose in purposes:
247
- purpose_md += f"{purpose},\n"
248
- extended_properties = properties.get("extendedProperties", {})
249
- additional_properties = properties.get("additionalProperties", {})
250
- mer = element.get('mermaidGraph', None)
251
-
252
-
253
- parents = element.get("parents", [])
254
- parents_list = []
255
- if parents:
256
- for sub in parents:
257
- sub_rel_label = sub.get('relationshipProperties',{}).get("label", None)
258
- sub_qn = sub['relatedElement']['properties']['qualifiedName']
259
- sub_lab = f"--> <{sub_rel_label}> -->" if sub_rel_label else ""
260
- sub_info = f"{sub_lab} {sub_qn}"
261
- parents_list.append(sub_info)
262
-
263
- peer_supply_chains = element.get("links", {})
264
- peer_supply_chains_list = []
265
- if peer_supply_chains:
266
- for peer in peer_supply_chains:
267
- peer_supply_chain_qnames = peer['relatedElement']['properties'].get("qualifiedName", "")
268
- peer_supply_chain_label = peer['relationshipProperties'].get('label', None)
269
- peer_lab = f"==> <{peer_supply_chain_label}> ==>" if peer_supply_chain_label else ""
270
- peer_supply_chains_list.append(f"{peer_lab} {peer_supply_chain_qnames}")
271
-
272
- implemented_by = element.get("implementedByList", {})
273
- implemented_by_qnames = []
274
- if implemented_by:
275
- for peer in peer_supply_chains:
276
- implemented_by_qnames.append(peer['relatedElement']['properties'].get("qualifiedName", ""))
277
-
278
- return {
279
- 'GUID': guid,
280
- 'qualified_name': qualified_name,
281
- 'display_name': display_name,
282
- 'description': description,
283
- 'scope': scope,
284
- 'purposes': purpose_md,
285
- 'extended_properties': extended_properties,
286
- 'additional_properties': additional_properties,
287
- 'parents_list': parents_list,
288
- 'links': peer_supply_chains_list,
289
- 'implemented_by': implemented_by_qnames,
290
- 'mermaid': mer
291
- }
292
-
293
- def _extract_solution_blueprint_properties(self, element: dict) -> dict:
238
+ # Follow common extractor pattern using populate_common_columns
239
+ return populate_common_columns(
240
+ element,
241
+ columns_struct,
242
+ include_header=True,
243
+ include_relationships=True,
244
+ include_subject_area=True,
245
+ mermaid_source_key='mermaidGraph',
246
+ mermaid_dest_key='mermaid'
247
+ )
248
+
249
+ def _extract_solution_blueprint_properties(self, element: dict, columns_struct: dict) -> dict:
294
250
  """
295
251
  Extract properties from a solution blueprint element.
296
252
 
@@ -300,34 +256,17 @@ class SolutionArchitect(Client2):
300
256
  Returns:
301
257
  Dictionary with extracted properties
302
258
  """
303
- guid = element['elementHeader'].get("guid", None)
304
- element_properties = element['properties']
305
- display_name = element_properties.get("displayName", None)
306
- description = element_properties.get("description", None)
307
- version = element_properties.get("version", None)
308
- qualified_name = element_properties.get("qualifiedName", None)
309
-
310
- solution_components = element.get('solutionComponents', None)
311
- solution_components_md = ""
312
- if solution_components:
313
- for solution_component in solution_components:
314
- sol_comp_prop = solution_component['solutionComponent']['properties']
315
- sol_comp_name = sol_comp_prop.get("displayName", None)
316
- sol_comp_desc = sol_comp_prop.get("description", None)
317
- solution_components_md += '{' + f" {sol_comp_name}:\t {sol_comp_desc}" + " },\n"
318
- mer = f"```mermaid\n\n{element.get('mermaidGraph', None)}\n\n```"
319
-
320
- return {
321
- 'GUID': guid,
322
- 'qualified_name': qualified_name,
323
- 'display_name': display_name,
324
- 'description': description,
325
- 'version': version,
326
- 'solution_components': solution_components_md,
327
- 'mermaid': mer
328
- }
329
-
330
- def _extract_solution_roles_properties(self, element: dict) -> dict:
259
+ return populate_common_columns(
260
+ element,
261
+ columns_struct,
262
+ include_header=True,
263
+ include_relationships=True,
264
+ include_subject_area=True,
265
+ mermaid_source_key='mermaidGraph',
266
+ mermaid_dest_key='mermaid'
267
+ )
268
+
269
+ def _extract_solution_roles_properties(self, element: dict, columns_struct: dict) -> dict:
331
270
  """
332
271
  Extract properties from a solution role element.
333
272
 
@@ -337,35 +276,15 @@ class SolutionArchitect(Client2):
337
276
  Returns:
338
277
  Dictionary with extracted properties
339
278
  """
340
- guid = element['elementHeader'].get("guid", None)
341
- element_properties = element['properties']
342
- display_name = element_properties.get("title", None)
343
- role_id = element_properties.get("roleId", None)
344
- scope = element_properties.get("scope", None)
345
- description = element_properties.get("description", None)
346
- domain_identifier = element_properties.get("domainIdentifier", None)
347
- qualified_name = element_properties.get("qualifiedName", None)
348
-
349
- solution_components = element.get('solutionComponents', None)
350
- solution_components_md = ""
351
- if solution_components:
352
- for solution_component in solution_components:
353
- sol_comp_prop = solution_component.get('relationshipProperties', None)
354
- if sol_comp_prop:
355
- sol_comp_name = sol_comp_prop.get("role", None)
356
- sol_comp_desc = sol_comp_prop.get("description", None)
357
- solution_components_md += "{" + f" {sol_comp_name}:\t {sol_comp_desc}" + " },\n"
358
-
359
- return {
360
- 'GUID': guid,
361
- 'qualified_name': qualified_name,
362
- 'display_name': display_name,
363
- 'description': description,
364
- 'role_id': role_id,
365
- 'scope': scope,
366
- 'domain_identifier': domain_identifier,
367
- 'solution_components': solution_components_md
368
- }
279
+ return populate_common_columns(
280
+ element,
281
+ columns_struct,
282
+ include_header=True,
283
+ include_relationships=True,
284
+ include_subject_area=True,
285
+ mermaid_source_key='mermaidGraph',
286
+ mermaid_dest_key='mermaid'
287
+ )
369
288
 
370
289
 
371
290
 
@@ -552,7 +471,7 @@ class SolutionArchitect(Client2):
552
471
  else:
553
472
  return []
554
473
 
555
- def _extract_solution_components_properties(self, element: Union[Dict,List[Dict]]) -> dict:
474
+ def _extract_solution_components_properties(self, element: Union[Dict,List[Dict]], columns_struct: dict) -> dict:
556
475
  """
557
476
  Extract properties from a solution component element.
558
477
 
@@ -563,125 +482,51 @@ class SolutionArchitect(Client2):
563
482
  Dictionary with extracted properties
564
483
  """
565
484
 
566
- guid = element['elementHeader'].get("guid", None)
567
- properties = element.get('glossaryCategoryProperties', element.get('properties', {}))
568
- display_name = properties.get("displayName", None)
569
- description = properties.get("description", None)
570
- component_type = properties.get("solutionComponentType", properties.get("componentType", None))
571
- version = properties.get("version", None)
572
- qualified_name = properties.get("qualifiedName", None)
573
-
574
- # Extract extended properties
575
- extended_props = properties.get("extendedProperties", None)
576
- extended_props_md = ""
577
- if extended_props:
578
- for key in extended_props.keys():
579
- extended_props_md += "{" + f" {key}: {extended_props[key]}" + " }, "
580
-
581
- # Extract additional properties
582
- additional_props = properties.get("additionalProperties", None)
583
- additional_props_md = ""
584
- if additional_props:
585
- for key in additional_props.keys():
586
- additional_props_md += "{" + f" {key}: {additional_props[key]}" + " }, "
587
-
588
- rel_elements = self._get_component_rel_elements_dict(element)
589
-
590
- # actors
591
- actors_md = ", ".join(rel_elements.get("actor.qnames", []) )
592
-
593
- # Extract blueprints & supply chains
594
- blueprints_md = ", ".join(rel_elements.get("blueprint_qnames",[]))
595
- owning_supply_chains_md = ", ".join(rel_elements.get("owning_info_supply_chain_qnames",[]))
596
-
597
- # Extract parent components
598
- parent_comp_md = ", ".join(rel_elements.get("parent_qnames",[]))
599
-
600
- # Extract sub-components
601
- sub_comp_md = ", ".join(rel_elements.get("sub_component_qnames",[]))
602
-
603
- # wired from and to
604
- wired_from_md = ", ".join(rel_elements.get("wired_from_qnames",[]))
605
- wired_to_md = ", ".join(rel_elements.get("wired_to_qnames",[]))
606
-
607
-
608
- comp_graph = element.get('mermaidGraph', None)
609
-
610
- return {
611
- 'GUID': guid,
612
- 'qualified_name': qualified_name,
613
- 'display_name': display_name,
614
- 'description': description,
615
- 'component_type': component_type,
616
- 'version': version,
617
- 'blueprints': blueprints_md,
618
- 'owning_supply_chains': owning_supply_chains_md,
619
- 'actors': actors_md,
620
- 'parent_components': parent_comp_md,
621
- 'sub_components': sub_comp_md,
622
- 'wired_from_components': wired_from_md,
623
- 'wired_to_components': wired_to_md,
624
- 'additional_properties': additional_props_md,
625
- 'extended_properties': extended_props_md,
626
- 'mermaid_graph': comp_graph
627
- }
485
+ return populate_common_columns(
486
+ element,
487
+ columns_struct,
488
+ include_header=True,
489
+ include_relationships=True,
490
+ include_subject_area=True,
491
+ mermaid_source_key='mermaidGraph',
492
+ mermaid_dest_key='mermaid'
493
+ )
628
494
 
629
495
  #
630
496
  # Markdown output support
631
497
  #
632
- def generate_info_supply_chain_output(self, elements: list | dict, search_string: str,
633
- output_format: str = 'MD') -> str | list:
634
- """
635
- Generate output for information supply chains in the specified format.
636
-
637
- Args:
638
- elements: Dictionary or list of dictionaries containing information supply chain elements
639
- search_string: The search string used to find the elements
640
- output_format: The desired output format (MD, FORM, REPORT, LIST, DICT, MERMAID, HTML)
641
-
642
- Returns:
643
- Formatted output as string or list of dictionaries
498
+ def generate_info_supply_chain_output(self, elements: list | dict, search_string: str, element_type_name: str | None,
499
+ output_format: str = 'MD', output_format_set: dict | str = None) -> str | list:
500
+ """Render Information Supply Chains using the shared output pipeline.
644
501
  """
645
- # Handle MERMAID and DICT formats
646
502
  if output_format == "MERMAID":
647
503
  return extract_mermaid_only(elements)
648
- elif output_format == "DICT":
649
- # return extract_basic_dict(elements)
650
- return self._extract_supply_chain_list(elements)
651
- elif output_format == "HTML":
652
- return generate_output(
653
- elements=elements,
654
- search_string=search_string,
655
- entity_type="Information Supply Chain",
656
- output_format="HTML",
657
- extract_properties_func=self._extract_info_supply_chain_properties
658
- )
659
- # For other formats (MD, FORM, REPORT, LIST), use generate_output
660
- elif output_format in ["MD", "FORM", "REPORT", "LIST"]:
661
- # Define columns for LIST format
662
- columns = [
663
- {'name': 'Name', 'key': 'display_name'},
664
- {'name': 'Qualified Name', 'key': 'qualified_name'},
665
- {'name': 'Scope', 'key': 'scope'},
666
- {'name': 'Description', 'key': 'description', 'format': True},
667
- {'name': 'Purposes', 'key': 'purposes', 'format': True},
668
- {'name': 'Peer Links', 'key': 'links', 'format': True},
669
- ]
670
-
671
- return generate_output(
672
- elements=elements,
673
- search_string=search_string,
674
- entity_type="Information Supply Chain",
675
- output_format=output_format,
676
- extract_properties_func=self._extract_info_supply_chain_properties,
677
- columns=columns if output_format == 'LIST' else None
678
- )
679
-
680
- # Default case
681
- return None
682
-
683
- def generate_solution_blueprint_output(self, elements: list | dict, search_string: str,
684
- output_format: str = 'MD') -> str | list:
504
+
505
+ entity_type = "Information Supply Chain"
506
+ if output_format_set:
507
+ if isinstance(output_format_set, str):
508
+ output_formats = select_output_format_set(output_format_set, output_format)
509
+ elif isinstance(output_format_set, dict):
510
+ output_formats = get_output_format_type_match(output_format_set, output_format)
511
+ else:
512
+ output_formats = None
513
+ else:
514
+ output_formats = select_output_format_set("Information Supply Chains", output_format)
515
+ if output_formats is None:
516
+ output_formats = select_output_format_set("Default", output_format)
517
+
518
+ return generate_output(
519
+ elements=elements,
520
+ search_string=search_string,
521
+ entity_type=entity_type,
522
+ output_format=output_format,
523
+ extract_properties_func=self._extract_info_supply_chain_properties,
524
+ get_additional_props_func=None,
525
+ columns_struct=output_formats,
526
+ )
527
+
528
+ def generate_solution_blueprint_output(self, elements: list | dict, search_string: str, element_type_name: str | None,
529
+ output_format: str = 'MD', output_format_set: dict | str = None) -> str | list:
685
530
  """
686
531
  Generate output for solution blueprints in the specified format.
687
532
 
@@ -693,43 +538,34 @@ class SolutionArchitect(Client2):
693
538
  Returns:
694
539
  Formatted output as string or list of dictionaries
695
540
  """
696
- # Handle MERMAID and DICT formats
697
541
  if output_format == "MERMAID":
698
542
  return extract_mermaid_only(elements)
699
- elif output_format == "DICT":
700
- return extract_basic_dict(elements)
701
- elif output_format == "HTML":
702
- return generate_output(
703
- elements=elements,
704
- search_string=search_string,
705
- entity_type="Solution Blueprint",
706
- output_format="HTML",
707
- extract_properties_func=self._extract_solution_blueprint_properties
708
- )
709
-
710
- # For other formats (MD, FORM, REPORT, LIST), use generate_output
711
- elif output_format in ["MD", "FORM", "REPORT", "LIST"]:
712
- # Define columns for LIST format
713
- columns = [
714
- {'name': 'Blueprint Name', 'key': 'display_name'},
715
- {'name': 'Qualified Name', 'key': 'qualified_name'},
716
- {'name': 'Version', 'key': 'version'},
717
- {'name': 'Description', 'key': 'description', 'format': True}
718
- ]
719
-
720
- return generate_output(
721
- elements=elements,
722
- search_string=search_string,
723
- entity_type="Solution Blueprint",
724
- output_format=output_format,
725
- extract_properties_func=self._extract_solution_blueprint_properties,
726
- columns=columns if output_format == 'LIST' else None
727
- )
728
-
729
- # Default case
730
- return None
731
-
732
- def generate_solution_roles_output(self, elements: list | dict, search_string: str, output_format: str = 'MD') -> str | list:
543
+
544
+ entity_type = "Solution Blueprint"
545
+ if output_format_set:
546
+ if isinstance(output_format_set, str):
547
+ output_formats = select_output_format_set(output_format_set, output_format)
548
+ elif isinstance(output_format_set, dict):
549
+ output_formats = get_output_format_type_match(output_format_set, output_format)
550
+ else:
551
+ output_formats = None
552
+ else:
553
+ output_formats = select_output_format_set("Solution Blueprints", output_format)
554
+ if output_formats is None:
555
+ output_formats = select_output_format_set("Default", output_format)
556
+
557
+ return generate_output(
558
+ elements=elements,
559
+ search_string=search_string,
560
+ entity_type=entity_type,
561
+ output_format=output_format,
562
+ extract_properties_func=self._extract_solution_blueprint_properties,
563
+ get_additional_props_func=None,
564
+ columns_struct=output_formats,
565
+ )
566
+
567
+ def generate_solution_roles_output(self, elements: list | dict, search_string: str, element_type_name: str | None,
568
+ output_format: str = 'MD', output_format_set: dict | str = None) -> str | list:
733
569
  """
734
570
  Generate output for solution roles in the specified format.
735
571
 
@@ -741,45 +577,34 @@ class SolutionArchitect(Client2):
741
577
  Returns:
742
578
  Formatted output as string or list of dictionaries
743
579
  """
744
- # Handle MERMAID and DICT formats
745
580
  if output_format == "MERMAID":
746
581
  return extract_mermaid_only(elements)
747
- elif output_format == "DICT":
748
- return extract_basic_dict(elements)
749
- elif output_format == "HTML":
750
- return generate_output(
751
- elements=elements,
752
- search_string=search_string,
753
- entity_type="Solution Role",
754
- output_format="HTML",
755
- extract_properties_func=self._extract_solution_roles_properties
756
- )
757
-
758
- # For other formats (MD, FORM, REPORT, LIST), use generate_output
759
- elif output_format in ["MD", "FORM", "REPORT", "LIST"]:
760
- # Define columns for LIST format
761
- columns = [
762
- {'name': 'Role Name', 'key': 'display_name'},
763
- {'name': 'Role ID', 'key': 'role_id'},
764
- {'name': 'Scope', 'key': 'scope'},
765
- {'name': 'Domain', 'key': 'domain_identifier'},
766
- {'name': 'Description', 'key': 'description', 'format': True}
767
- ]
768
-
769
- return generate_output(
770
- elements=elements,
771
- search_string=search_string,
772
- entity_type="Solution Role",
773
- output_format=output_format,
774
- extract_properties_func=self._extract_solution_roles_properties,
775
- columns=columns if output_format == 'LIST' else None
776
- )
777
-
778
- # Default case
779
- return None
780
-
781
- def generate_solution_components_output(self, elements: list | dict, search_string: str,
782
- output_format: str = 'MD') -> str | list:
582
+
583
+ entity_type = "Solution Role"
584
+ if output_format_set:
585
+ if isinstance(output_format_set, str):
586
+ output_formats = select_output_format_set(output_format_set, output_format)
587
+ elif isinstance(output_format_set, dict):
588
+ output_formats = get_output_format_type_match(output_format_set, output_format)
589
+ else:
590
+ output_formats = None
591
+ else:
592
+ output_formats = select_output_format_set("Solution Roles", output_format)
593
+ if output_formats is None:
594
+ output_formats = select_output_format_set("Default", output_format)
595
+
596
+ return generate_output(
597
+ elements=elements,
598
+ search_string=search_string,
599
+ entity_type=entity_type,
600
+ output_format=output_format,
601
+ extract_properties_func=self._extract_solution_roles_properties,
602
+ get_additional_props_func=None,
603
+ columns_struct=output_formats,
604
+ )
605
+
606
+ def generate_solution_components_output(self, elements: list | dict, search_string: str, element_type_name: str | None,
607
+ output_format: str = 'MD', output_format_set: dict | str = None) -> str | list:
783
608
  """
784
609
  Generate output for solution components in the specified format.
785
610
 
@@ -796,43 +621,31 @@ class SolutionArchitect(Client2):
796
621
  Returns:
797
622
  Formatted output as string or list of dictionaries
798
623
  """
799
- # Handle MERMAID and DICT formats
800
624
  if output_format == "MERMAID":
801
625
  return extract_mermaid_only(elements)
802
- elif output_format == "DICT":
803
- return self._extract_component_list(elements)
804
- # return extract_basic_dict(elements)
805
- # add more to the body
806
- elif output_format == "HTML":
807
- return generate_output(
808
- elements=elements,
809
- search_string=search_string,
810
- entity_type="Solution Component",
811
- output_format="HTML",
812
- extract_properties_func=self._extract_solution_components_properties
813
- )
814
- # For other formats (MD, FORM, REPORT, LIST), use generate_output
815
- elif output_format in ["MD", "FORM", "REPORT", "LIST"]:
816
- # Define columns for LIST format
817
- columns = [
818
- {'name': 'Component Name', 'key': 'display_name'},
819
- {'name': 'Component Type', 'key': 'component_type'},
820
- {'name': 'Version', 'key': 'version'},
821
- {'name': 'Qualified Name', 'key': 'qualified_name'},
822
- {'name': 'Description', 'key': 'description', 'format': True}
823
- ]
824
-
825
- return generate_output(
826
- elements=elements,
827
- search_string=search_string,
828
- entity_type="Solution Component",
829
- output_format=output_format,
830
- extract_properties_func=self._extract_solution_components_properties,
831
- columns=columns if output_format == 'LIST' else None
832
- )
833
-
834
- # Default case
835
- return None
626
+
627
+ entity_type = "Solution Component"
628
+ if output_format_set:
629
+ if isinstance(output_format_set, str):
630
+ output_formats = select_output_format_set(output_format_set, output_format)
631
+ elif isinstance(output_format_set, dict):
632
+ output_formats = get_output_format_type_match(output_format_set, output_format)
633
+ else:
634
+ output_formats = None
635
+ else:
636
+ output_formats = select_output_format_set("Solution Components", output_format)
637
+ if output_formats is None:
638
+ output_formats = select_output_format_set("Default", output_format)
639
+
640
+ return generate_output(
641
+ elements=elements,
642
+ search_string=search_string,
643
+ entity_type=entity_type,
644
+ output_format=output_format,
645
+ extract_properties_func=self._extract_solution_components_properties,
646
+ get_additional_props_func=None,
647
+ columns_struct=output_formats,
648
+ )
836
649
 
837
650
  @dynamic_catch
838
651
  async def _async_create_info_supply_chain(self, body: dict | NewElementRequestBody) -> str:
@@ -1751,8 +1564,13 @@ class SolutionArchitect(Client2):
1751
1564
  loop = asyncio.get_event_loop()
1752
1565
  loop.run_until_complete(self._async_delete_info_supply_chain(guid, body, cascade_delete))
1753
1566
 
1754
- def find_all_information_supply_chains(self, body: dict = None, start_from: int = 0, page_size: int = max_paging_size,
1755
- output_format: str = "JSON") -> (list[dict] | str):
1567
+ def find_all_information_supply_chains(self, search_string: str = "*", classification_names: list[str] = None,
1568
+ metadata_element_types: list[str] = None,
1569
+ starts_with: bool = True, ends_with: bool = False,
1570
+ ignore_case: bool = False, start_from: int = 0,
1571
+ page_size: int = 0, output_format: str = 'JSON',
1572
+ output_format_set: str = None,
1573
+ body: dict| SearchStringRequestBody = None) -> (list[dict] | str):
1756
1574
  """ Retrieve a list of all information supply chains
1757
1575
  Parameters
1758
1576
  ----------
@@ -1799,14 +1617,15 @@ class SolutionArchitect(Client2):
1799
1617
  }
1800
1618
  """
1801
1619
 
1802
- return self.find_information_supply_chains("*", body = body, start_from=start_from, page_size=page_size,
1803
- output_format=output_format)
1620
+ return self.find_information_supply_chains("*", classification_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, output_format_set, body)
1804
1621
 
1805
- async def _async_find_information_supply_chains(self, search_filter: str = "*", add_implementation: bool = True,
1622
+ async def _async_find_information_supply_chains(self, search_string: str = "*", classification_names: list[str] = None,
1623
+ metadata_element_types: list[str] = None,
1806
1624
  starts_with: bool = True, ends_with: bool = False,
1807
1625
  ignore_case: bool = False, start_from: int = 0,
1808
- page_size: int = max_paging_size, body: dict = None,
1809
- output_format: str = 'JSON') -> list[dict] | str:
1626
+ page_size: int = 0, output_format: str = 'JSON',
1627
+ output_format_set: str = None,
1628
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
1810
1629
  """Retrieve the list of information supply chain metadata elements that contain the search string.
1811
1630
  https://egeria-project.org/concepts/information-supply-chain
1812
1631
  Async version.
@@ -1862,39 +1681,26 @@ class SolutionArchitect(Client2):
1862
1681
  }
1863
1682
 
1864
1683
  """
1865
- starts_with_s = str(starts_with).lower()
1866
- ends_with_s = str(ends_with).lower()
1867
- ignore_case_s = str(ignore_case).lower()
1868
1684
 
1869
- possible_query_params = query_string(
1870
- [("addImplementation", add_implementation), ("startFrom", start_from), ("pageSize", page_size),
1871
- ("startsWith", starts_with_s), ("endsWith", ends_with_s), ("ignoreCase", ignore_case_s), ])
1872
-
1873
- if search_filter is None or search_filter == "*":
1874
- search_filter = None
1875
-
1876
- if body is None:
1877
- body = {
1878
- "filter": search_filter,
1879
- }
1880
- else:
1881
- body["filter"] = search_filter
1882
-
1883
- url = (f"{self.solution_architect_command_root}/information-supply-chains/by-search-string"
1884
- f"{possible_query_params}")
1885
-
1886
- response: Response = await self._async_make_request("POST", url, body_slimmer(body))
1887
- element = response.json().get("elements", NO_ELEMENTS_FOUND)
1888
- if element == NO_ELEMENTS_FOUND:
1889
- return NO_ELEMENTS_FOUND
1890
- if output_format != 'JSON': # return a simplified markdown representation
1891
- return self.generate_info_supply_chain_output(element, search_filter, output_format)
1892
- return response.json().get("elements", NO_ELEMENTS_FOUND)
1893
-
1894
- def find_information_supply_chains(self, filter: str = "*", add_implementation: bool = True,
1895
- starts_with: bool = True, ends_with: bool = False, ignore_case: bool = False,
1896
- start_from: int = 0, page_size: int = max_paging_size, body: dict = None,
1897
- output_format: str = 'JSON', ) -> list[dict] | str:
1685
+ url = f"{self.solution_architect_command_root}/information-supply-chains/by-search-string"
1686
+ return await self._async_find_request(url, _type="GovernanceDefinition",
1687
+ _gen_output=self.generate_info_supply_chain_output,
1688
+ search_string=search_string, classification_names=classification_names,
1689
+ metadata_element_types=metadata_element_types,
1690
+ starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case,
1691
+ start_from=start_from, page_size=page_size,
1692
+ output_format=output_format, output_format_set=output_format_set,
1693
+ body=body)
1694
+
1695
+
1696
+
1697
+ def find_information_supply_chains(self, search_string: str = "*", classification_names: list[str] = None,
1698
+ metadata_element_types: list[str] = None,
1699
+ starts_with: bool = True, ends_with: bool = False,
1700
+ ignore_case: bool = False, start_from: int = 0,
1701
+ page_size: int = 0, output_format: str = 'JSON',
1702
+ output_format_set: str = None,
1703
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
1898
1704
  """Retrieve the list of information supply chain metadata elements that contain the search string.
1899
1705
  https://egeria-project.org/concepts/information-supply-chain
1900
1706
 
@@ -1943,7 +1749,7 @@ class SolutionArchitect(Client2):
1943
1749
  -----
1944
1750
 
1945
1751
  {
1946
- "class" : "FilterRequestBody",
1752
+ "class" : "SearchStringRequestBody",
1947
1753
  "asOfTime" : "{{$isoTimestamp}}",
1948
1754
  "effectiveTime" : "{{$isoTimestamp}}",
1949
1755
  "forLineage" : false,
@@ -1957,8 +1763,10 @@ class SolutionArchitect(Client2):
1957
1763
 
1958
1764
  loop = asyncio.get_event_loop()
1959
1765
  response = loop.run_until_complete(
1960
- self._async_find_information_supply_chains(filter, add_implementation, starts_with, ends_with, ignore_case,
1961
- start_from, page_size, body, output_format))
1766
+ self._async_find_information_supply_chains(search_string, classification_names, metadata_element_types,
1767
+ starts_with, ends_with, ignore_case,
1768
+ start_from, page_size, output_format,
1769
+ output_format_set, body))
1962
1770
  return response
1963
1771
 
1964
1772
  async def _async_get_info_supply_chain_by_name(self, search_filter: str, body: dict = None,
@@ -3187,10 +2995,13 @@ class SolutionArchitect(Client2):
3187
2995
 
3188
2996
 
3189
2997
 
3190
- async def _async_find_solution_blueprints(self, search_filter: str = "*", starts_with: bool = True,
3191
- ends_with: bool = False, ignore_case: bool = False, start_from: int = 0,
3192
- page_size: int = max_paging_size, body: dict = None,
3193
- output_format: str = "JSON") -> list[dict] | str:
2998
+ async def _async_find_solution_blueprints(self, search_string: str = "*", classification_names: list[str] = None,
2999
+ metadata_element_types: list[str] = None,
3000
+ starts_with: bool = True, ends_with: bool = False,
3001
+ ignore_case: bool = False, start_from: int = 0,
3002
+ page_size: int = 0, output_format: str = 'JSON',
3003
+ output_format_set: str = None,
3004
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
3194
3005
  """Retrieve the solution blueprint elements that contain the search string.
3195
3006
  https://egeria-project.org/concepts/solution-blueprint
3196
3007
  Async version.
@@ -3243,37 +3054,28 @@ class SolutionArchitect(Client2):
3243
3054
  }
3244
3055
 
3245
3056
  """
3246
- starts_with_s = str(starts_with).lower()
3247
- ends_with_s = str(ends_with).lower()
3248
- ignore_case_s = str(ignore_case).lower()
3249
3057
 
3250
- possible_query_params = query_string(
3251
- [("startFrom", start_from), ("pageSize", page_size),
3252
- ("startsWith", starts_with_s), ("endsWith", ends_with_s), ("ignoreCase", ignore_case_s), ])
3253
3058
 
3254
- if search_filter is None or search_filter == "*":
3255
- search_filter = None
3256
3059
 
3257
- if body is None:
3258
- body = {
3259
- "filter": search_filter,
3260
- }
3261
- else:
3262
- body["filter"] = search_filter
3263
3060
 
3264
- url = (f"{self.solution_architect_command_root}/solution-blueprints/by-search-string"
3265
- f"{possible_query_params}")
3266
- response: Response = await self._async_make_request("POST", url, body_slimmer(body))
3267
- element = response.json().get("elements", NO_ELEMENTS_FOUND)
3268
- if element == NO_ELEMENTS_FOUND:
3269
- return NO_ELEMENTS_FOUND
3270
- if output_format != 'JSON': # return a simplified markdown representation
3271
- return self.generate_solution_blueprint_output(element, search_filter, output_format)
3272
- return response.json().get("elements", NO_ELEMENTS_FOUND)
3061
+ url = f"{self.solution_architect_command_root}/solution-blueprints/by-search-string"
3062
+ return await self._async_find_request(url, _type="GovernanceDefinition",
3063
+ _gen_output=self.generate_info_supply_chain_output,
3064
+ search_string=search_string, classification_names=classification_names,
3065
+ metadata_element_types=metadata_element_types,
3066
+ starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case,
3067
+ start_from=start_from, page_size=page_size,
3068
+ output_format=output_format, output_format_set=output_format_set,
3069
+ body=body)
3273
3070
 
3274
- def find_solution_blueprints(self, filter: str = "*", starts_with: bool = True, ends_with: bool = False,
3275
- ignore_case: bool = False, start_from: int = 0, page_size: int = max_paging_size,
3276
- body: dict = None, output_format: str = 'JSON') -> list[dict] | str:
3071
+
3072
+ def find_solution_blueprints(self, search_string: str = "*", classification_names: list[str] = None,
3073
+ metadata_element_types: list[str] = None,
3074
+ starts_with: bool = True, ends_with: bool = False,
3075
+ ignore_case: bool = False, start_from: int = 0,
3076
+ page_size: int = 0, output_format: str = 'JSON',
3077
+ output_format_set: str = None,
3078
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
3277
3079
  """Retrieve the list of solution blueprint elements that contain the search string.
3278
3080
  https://egeria-project.org/concepts/solution-blueprint
3279
3081
 
@@ -3333,17 +3135,24 @@ class SolutionArchitect(Client2):
3333
3135
 
3334
3136
  loop = asyncio.get_event_loop()
3335
3137
  response = loop.run_until_complete(
3336
- self._async_find_solution_blueprints(filter, starts_with, ends_with, ignore_case, start_from, page_size,
3337
- body, output_format))
3138
+ self._async_find_solution_blueprints(search_string, classification_names, metadata_element_types,
3139
+ starts_with, ends_with, ignore_case, start_from,
3140
+ page_size, output_format, output_format_set, body))
3338
3141
  return response
3339
3142
 
3340
- def find_all_solution_blueprints(self, start_from: int = 0, page_size: int = max_paging_size,
3341
- output_format: str = "JSON") -> list[dict] | str:
3143
+ def find_all_solution_blueprints(self, classification_names: list[str] = None,
3144
+ metadata_element_types: list[str] = None,
3145
+ starts_with: bool = True, ends_with: bool = False,
3146
+ ignore_case: bool = False, start_from: int = 0,
3147
+ page_size: int = 0, output_format: str = 'JSON',
3148
+ output_format_set: str = None,
3149
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
3342
3150
  """Retrieve a list of all solution blueprint elements
3343
3151
  https://egeria-project.org/concepts/solution-blueprint
3344
3152
  """
3345
- return self.find_solution_blueprints("*", start_from=start_from, page_size=page_size,
3346
- output_format=output_format)
3153
+ return self.find_solution_blueprints("*", classification_names, metadata_element_types,
3154
+ starts_with, ends_with, ignore_case, start_from,
3155
+ page_size, output_format, output_format_set, body)
3347
3156
 
3348
3157
 
3349
3158
  async def _async_get_solution_blueprint_by_guid(self, guid: str, body: dict = None,
@@ -4496,10 +4305,13 @@ class SolutionArchitect(Client2):
4496
4305
  loop = asyncio.get_event_loop()
4497
4306
  loop.run_until_complete(self._async_delete_solution_component(solution_component_guid, cascade_delete, body))
4498
4307
 
4499
- async def _async_find_solution_components(self, search_filter: str = "*", starts_with: bool = True,
4500
- ends_with: bool = False, ignore_case: bool = False, start_from: int = 0,
4501
- page_size: int = 0, body: dict = None,
4502
- output_format: str = "JSON") -> list[dict] | str:
4308
+ async def _async_find_solution_components(self, search_string: str = "*", classification_names: list[str] = None,
4309
+ metadata_element_types: list[str] = None,
4310
+ starts_with: bool = True, ends_with: bool = False,
4311
+ ignore_case: bool = False, start_from: int = 0,
4312
+ page_size: int = 0, output_format: str = 'JSON',
4313
+ output_format_set: str = None,
4314
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
4503
4315
  """ Retrieve the solution component elements that contain the search string. The solutions components returned
4504
4316
  include information about consumers, actors, and other solution components that are associated with them.
4505
4317
  https://egeria-project.org/concepts/solution-components
@@ -4555,35 +4367,26 @@ class SolutionArchitect(Client2):
4555
4367
  }
4556
4368
  """
4557
4369
 
4558
- starts_with_s = str(starts_with).lower()
4559
- ends_with_s = str(ends_with).lower()
4560
- ignore_case_s = str(ignore_case).lower()
4561
-
4562
- possible_query_params = query_string(
4563
- [ ("startFrom", start_from), ("pageSize", page_size),
4564
- ("startsWith", starts_with_s), ("endsWith", ends_with_s), ("ignoreCase", ignore_case_s), ])
4565
4370
 
4566
- if search_filter is None or search_filter == "*":
4567
- search_filter = None
4568
4371
 
4569
- if body is None:
4570
- body = {
4571
- "filter": search_filter,
4572
- }
4372
+ url = f"{self.solution_architect_command_root}/solution-components/by-search-string"
4573
4373
 
4574
- url = (f"{self.solution_architect_command_root}/solution-components/by-search-string"
4575
- f"{possible_query_params}")
4576
- response: Response = await self._async_make_request("POST", url, body_slimmer(body))
4577
- element = response.json().get("elements", NO_ELEMENTS_FOUND)
4578
- if element == NO_ELEMENTS_FOUND:
4579
- return NO_ELEMENTS_FOUND
4580
- if output_format != 'JSON': # return a simplified markdown representation
4581
- return self.generate_solution_components_output(element, filter, output_format)
4582
- return response.json().get("elements", NO_ELEMENTS_FOUND)
4374
+ return await self._async_find_request(url, _type="GovernanceDefinition",
4375
+ _gen_output=self.generate_info_supply_chain_output,
4376
+ search_string=search_string, classification_names=classification_names,
4377
+ metadata_element_types=metadata_element_types,
4378
+ starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case,
4379
+ start_from=start_from, page_size=page_size,
4380
+ output_format=output_format, output_format_set=output_format_set,
4381
+ body=body)
4583
4382
 
4584
- def find_solution_components(self, search_filter: str = "*", starts_with: bool = True, ends_with: bool = False,
4585
- ignore_case: bool = False, start_from: int = 0, page_size: int = 0,
4586
- body: dict = None, output_format: str = "JSON") -> list[dict] | str:
4383
+ def find_solution_components(self, search_string: str = "*", classification_names: list[str] = None,
4384
+ metadata_element_types: list[str] = None,
4385
+ starts_with: bool = True, ends_with: bool = False,
4386
+ ignore_case: bool = False, start_from: int = 0,
4387
+ page_size: int = 0, output_format: str = 'JSON',
4388
+ output_format_set: str = None,
4389
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
4587
4390
  """ Retrieve the solution component elements that contain the search string. The solutions components returned
4588
4391
  include information about consumers, actors, and other solution components that are associated with them.
4589
4392
  https://egeria-project.org/concepts/solution-components
@@ -4641,17 +4444,20 @@ class SolutionArchitect(Client2):
4641
4444
 
4642
4445
  loop = asyncio.get_event_loop()
4643
4446
  response = loop.run_until_complete(
4644
- self._async_find_solution_components(search_filter, starts_with, ends_with, ignore_case, start_from,
4645
- page_size, body, output_format))
4447
+ self._async_find_solution_components(search_string, classification_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, output_format_set, body))
4646
4448
  return response
4647
4449
 
4648
- def find_all_solution_components(self, body: dict = None, start_from: int = 0, page_size: int = max_paging_size,
4649
- output_format: str = "JSON") -> list[dict] | str:
4450
+ def find_all_solution_components(self, classification_names: list[str] = None,
4451
+ metadata_element_types: list[str] = None,
4452
+ starts_with: bool = True, ends_with: bool = False,
4453
+ ignore_case: bool = False, start_from: int = 0,
4454
+ page_size: int = 0, output_format: str = 'JSON',
4455
+ output_format_set: str = None,
4456
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
4650
4457
  """Retrieve a list of all solution component elements
4651
4458
  https://egeria-project.org/concepts/solution-components
4652
4459
  """
4653
- return self.find_solution_components("*", body = body, start_from=start_from, page_size=page_size,
4654
- output_format=output_format)
4460
+ return self.find_solution_components("*", classification_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, output_format_set, body)
4655
4461
 
4656
4462
  async def _async_get_solution_components_by_name(self, search_filter: str, body: dict = None, start_from: int = 0,
4657
4463
  page_size: int = 0, output_format: str = "JSON") -> dict | str:
@@ -5765,10 +5571,13 @@ class SolutionArchitect(Client2):
5765
5571
  loop = asyncio.get_event_loop()
5766
5572
  loop.run_until_complete(self._async_delete_solution_role(guid, cascade_delete, body))
5767
5573
 
5768
- async def _async_find_solution_roles(self, search_filter: str = "*", body: dict = None, starts_with: bool = True,
5769
- ends_with: bool = False, ignore_case: bool = False, start_from: int = 0,
5770
- page_size: int = 0,
5771
- output_format: str = "JSON", ) -> list[dict] | str:
5574
+ async def _async_find_solution_roles(self, search_string: str = "*", classification_names: list[str] = None,
5575
+ metadata_element_types: list[str] = None,
5576
+ starts_with: bool = True, ends_with: bool = False,
5577
+ ignore_case: bool = False, start_from: int = 0,
5578
+ page_size: int = 0, output_format: str = 'JSON',
5579
+ output_format_set: str = None,
5580
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
5772
5581
  """Retrieve the solution role elements that contain the search string.
5773
5582
  https://egeria-project.org/concepts/actor
5774
5583
  Async version.
@@ -5824,34 +5633,26 @@ class SolutionArchitect(Client2):
5824
5633
  "filter": "Add name here"
5825
5634
  }
5826
5635
  """
5827
- starts_with_s = str(starts_with).lower()
5828
- ends_with_s = str(ends_with).lower()
5829
- ignore_case_s = str(ignore_case).lower()
5830
5636
 
5831
- possible_query_params = query_string(
5832
- [ ("startFrom", start_from), ("pageSize", page_size),
5833
- ("startsWith", starts_with_s), ("endsWith", ends_with_s), ("ignoreCase", ignore_case_s), ])
5834
- if search_filter is None or search_filter == "*":
5835
- search_filter = None
5836
-
5837
- if body is None:
5838
- body = {
5839
- "filter": search_filter,
5840
- }
5841
-
5842
- url = (f"{self.solution_architect_command_root}/solution-roles/by-search-string"
5843
- f"{possible_query_params}")
5844
- response: Response = await self._async_make_request("POST", url, body_slimmer(body))
5845
- element = response.json().get("elements", NO_ELEMENTS_FOUND)
5846
- if element == NO_ELEMENTS_FOUND:
5847
- return NO_ELEMENTS_FOUND
5848
- if output_format != 'JSON': # return a simplified markdown representation
5849
- return self.generate_solution_roles_output(element, filter, output_format)
5850
- return response.json().get("elements", NO_ELEMENTS_FOUND)
5851
5637
 
5852
- def find_solution_roles(self, search_filter: str = "*", body: dict = None, starts_with: bool = True, ends_with: bool = False,
5853
- ignore_case: bool = False, start_from: int = 0, page_size: int = max_paging_size,
5854
- output_format: str = "JSON", ) -> list[dict] | str:
5638
+ url = f"{self.solution_architect_command_root}/solution-roles/by-search-string"
5639
+
5640
+ return await self._async_find_request(url, _type="GovernanceDefinition",
5641
+ _gen_output=self.generate_info_supply_chain_output,
5642
+ search_string=search_string, classification_names=classification_names,
5643
+ metadata_element_types=metadata_element_types,
5644
+ starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case,
5645
+ start_from=start_from, page_size=page_size,
5646
+ output_format=output_format, output_format_set=output_format_set,
5647
+ body=body)
5648
+
5649
+ def find_solution_roles(self, search_string: str = "*", classification_names: list[str] = None,
5650
+ metadata_element_types: list[str] = None,
5651
+ starts_with: bool = True, ends_with: bool = False,
5652
+ ignore_case: bool = False, start_from: int = 0,
5653
+ page_size: int = 0, output_format: str = 'JSON',
5654
+ output_format_set: str = None,
5655
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
5855
5656
  """Retrieve the list of solution role elements that contain the search string.
5856
5657
  https://egeria-project.org/concepts/actor
5857
5658
 
@@ -5915,16 +5716,20 @@ class SolutionArchitect(Client2):
5915
5716
 
5916
5717
  loop = asyncio.get_event_loop()
5917
5718
  response = loop.run_until_complete(
5918
- self._async_find_solution_roles(search_filter, body, starts_with, ends_with, ignore_case, start_from, page_size,
5919
- output_format=output_format, ))
5719
+ self._async_find_solution_roles(search_string, classification_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, output_format_set, body))
5920
5720
  return response
5921
5721
 
5922
- def find_all_solution_roles(self, body: dict = None, start_from: int = 0, page_size: int = max_paging_size,
5923
- output_format: str = "JSON") -> list[dict] | str:
5722
+ def find_all_solution_roles(self, classification_names: list[str] = None,
5723
+ metadata_element_types: list[str] = None,
5724
+ starts_with: bool = True, ends_with: bool = False,
5725
+ ignore_case: bool = False, start_from: int = 0,
5726
+ page_size: int = 0, output_format: str = 'JSON',
5727
+ output_format_set: str = None,
5728
+ body: dict| SearchStringRequestBody = None) -> list[dict] | str:
5924
5729
  """Retrieve a list of all solution blueprint elements
5925
5730
  https://egeria-project.org/concepts/actor
5926
5731
  """
5927
- return self.find_solution_roles("*", body, start_from=start_from, page_size=page_size, output_format=output_format)
5732
+ return self.find_solution_roles("*", classification_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, output_format_set, body)
5928
5733
 
5929
5734
 
5930
5735
  async def _async_get_solution_roles_by_name(self, search_filter: str, body: dict = None, start_from: int = 0,