pyegeria 5.4.8__py3-none-any.whl → 5.4.8.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. md_processing/__init__.py +2 -1
  2. md_processing/data/commands.json +59579 -52198
  3. md_processing/dr_egeria.py +7 -5
  4. md_processing/md_commands/solution_architect_commands.py +54 -10
  5. md_processing/md_processing_utils/common_md_proc_utils.py +8 -4
  6. md_processing/md_processing_utils/common_md_utils.py +41 -2
  7. pyegeria/_base_client.py +1 -17
  8. pyegeria/_client_new.py +1008 -323
  9. pyegeria/_client_new_backup.py +5359 -0
  10. pyegeria/_exceptions_new.py +6 -1
  11. pyegeria/base_report_formats.py +31 -2
  12. pyegeria/classification_manager.py +1430 -357
  13. pyegeria/collection_manager.py +52 -54
  14. pyegeria/config.py +1 -0
  15. pyegeria/data_designer.py +41 -41
  16. pyegeria/external_links.py +26 -26
  17. pyegeria/feedback_manager_omvs.py +13 -31
  18. pyegeria/glossary_manager.py +32 -35
  19. pyegeria/governance_officer.py +31 -31
  20. pyegeria/output_formatter.py +36 -11
  21. pyegeria/output_formatter_with_machine_keys.py +1127 -0
  22. pyegeria/project_manager.py +21 -21
  23. pyegeria/reference_data.py +2 -2
  24. pyegeria/solution_architect.py +112 -91
  25. {pyegeria-5.4.8.dist-info → pyegeria-5.4.8.3.dist-info}/METADATA +6 -5
  26. {pyegeria-5.4.8.dist-info → pyegeria-5.4.8.3.dist-info}/RECORD +30 -29
  27. pyegeria/md_processing_utils_orig.py +0 -1103
  28. {pyegeria-5.4.8.dist-info → pyegeria-5.4.8.3.dist-info}/WHEEL +0 -0
  29. {pyegeria-5.4.8.dist-info → pyegeria-5.4.8.3.dist-info}/entry_points.txt +0 -0
  30. {pyegeria-5.4.8.dist-info → pyegeria-5.4.8.3.dist-info}/licenses/LICENSE +0 -0
  31. {pyegeria-5.4.8.dist-info → pyegeria-5.4.8.3.dist-info}/top_level.txt +0 -0
@@ -15,7 +15,8 @@ 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, SearchStringRequestBody
18
+ NewRelationshipRequestBody, UpdateStatusRequestBody, SearchStringRequestBody, DeleteElementRequestBody, \
19
+ DeleteRelationshipRequestBody
19
20
  from pyegeria.output_formatter import make_preamble, make_md_attribute, generate_output, extract_mermaid_only, \
20
21
  extract_basic_dict, MD_SEPARATOR, populate_common_columns
21
22
  from pyegeria.base_report_formats import select_report_spec, get_report_spec_match
@@ -1218,7 +1219,7 @@ class SolutionArchitect(Client2):
1218
1219
 
1219
1220
  @dynamic_catch
1220
1221
  async def _async_unlink_peer_info_supply_chains(self, peer1_guid: str, peer2_guid: str,
1221
- body: dict | DeleteRequestBody = None) -> None:
1222
+ body: dict | DeleteRelationshipRequestBody = None) -> None:
1222
1223
  """ Detach two peers in an information supply chain from one another. The linked elements are of type
1223
1224
  'Referenceable' to allow significant data stores to be included in the definition of the information
1224
1225
  supply chain. Request body is optional. Async Version.
@@ -1229,7 +1230,7 @@ class SolutionArchitect(Client2):
1229
1230
  guid of the first information supply chain to link.
1230
1231
  peer2_guid: str
1231
1232
  guid of the second information supply chain to link.
1232
- body: dict | DeleteRequestBody, optional
1233
+ body: dict | DeleteRelationshipRequestBody, optional
1233
1234
  The body describing the link between the two segments.
1234
1235
 
1235
1236
  Returns
@@ -1250,7 +1251,7 @@ class SolutionArchitect(Client2):
1250
1251
 
1251
1252
  Body structure:
1252
1253
  {
1253
- "class": "DeleteRequestBody",
1254
+ "class": "DeleteRelationshipRequestBody",
1254
1255
  "externalSourceGUID": "add guid here",
1255
1256
  "externalSourceName": "add qualified name here",
1256
1257
  "effectiveTime": {{isotime}},
@@ -1263,7 +1264,7 @@ class SolutionArchitect(Client2):
1263
1264
  validate_guid(peer2_guid)
1264
1265
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
1265
1266
  f"information-supply-chains/{peer1_guid}/peer-links/{peer2_guid}/detach")
1266
- await self._async_delete_request(url, body)
1267
+ await self._async_delete_relationship_request(url, body)
1267
1268
  logger.info(
1268
1269
  f"Detached supply chains {peer1_guid} -> {peer2_guid}")
1269
1270
 
@@ -1464,12 +1465,12 @@ class SolutionArchitect(Client2):
1464
1465
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
1465
1466
  f"information-supply-chains/{chain_guid}/compositions/{nested_chain_guid}/detach")
1466
1467
 
1467
- await self._async_delete_request(url, body)
1468
+ await self._async_delete_relationship_request(url, body)
1468
1469
  logger.info(f"Removed composition of {nested_chain_guid} -> {chain_guid}")
1469
1470
 
1470
1471
  @dynamic_catch
1471
1472
  def decompose_info_supply_chains(self, chain_guid: str, nested_chain_guid: str,
1472
- body: dict | DeleteRequestBody = None) -> None:
1473
+ body: dict | DeleteRelationshipRequestBody = None) -> None:
1473
1474
  """ Detach two peers in an information supply chain from one another. Request body is optional.
1474
1475
 
1475
1476
  Parameters
@@ -1478,7 +1479,7 @@ class SolutionArchitect(Client2):
1478
1479
  guid of the first information supply chain to link.
1479
1480
  nested_chain_guid: str
1480
1481
  guid of the second information supply chain to link.
1481
- body: dict | DeleteRequestBody, optional
1482
+ body: dict | DeleteRelationshipRequestBody, optional
1482
1483
  The body describing the link between the two segments.
1483
1484
 
1484
1485
  Returns
@@ -1499,7 +1500,7 @@ class SolutionArchitect(Client2):
1499
1500
 
1500
1501
  Body structure:
1501
1502
  {
1502
- "class": "DeleteRequestBody",
1503
+ "class": "DeleteRelationshipRequestBody",
1503
1504
  "externalSourceGUID": "add guid here",
1504
1505
  "externalSourceName": "add qualified name here",
1505
1506
  "effectiveTime": {{isotime}},
@@ -1512,7 +1513,7 @@ class SolutionArchitect(Client2):
1512
1513
  nested_chain_guid, body))
1513
1514
 
1514
1515
  @dynamic_catch
1515
- async def _async_delete_info_supply_chain(self, guid: str, body: dict | DeleteRequestBody = None, cascade_delete: bool = False) -> None:
1516
+ async def _async_delete_info_supply_chain(self, guid: str, body: dict | DeleteElementRequestBody = None, cascade_delete: bool = False) -> None:
1516
1517
  """Delete an information supply chain. Async Version.
1517
1518
 
1518
1519
  Parameters
@@ -1542,7 +1543,7 @@ class SolutionArchitect(Client2):
1542
1543
 
1543
1544
  Body structure:
1544
1545
  {
1545
- "class": "DeleteRequestBody",
1546
+ "class": "DeleteElementRequestBody",
1546
1547
  "externalSourceGUID": "add guid here",
1547
1548
  "externalSourceName": "add qualified name here",
1548
1549
  "effectiveTime": {{isotime}},
@@ -1555,18 +1556,18 @@ class SolutionArchitect(Client2):
1555
1556
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
1556
1557
  f"information-supply-chains/{guid}/delete")
1557
1558
 
1558
- await self._async_delete_request(url, body, cascade_delete=cascade_delete)
1559
+ await self._async_delete_element_request(url, body, cascade_delete=cascade_delete)
1559
1560
  logger.info(f"Deleted Info Supply Chain {guid} with cascade {cascade_delete}")
1560
1561
 
1561
1562
  @dynamic_catch
1562
- def delete_info_supply_chain(self, guid: str, body: dict | DeleteRequestBody= None, cascade_delete: bool = False) -> None:
1563
+ def delete_info_supply_chain(self, guid: str, body: dict | DeleteElementRequestBody= None, cascade_delete: bool = False) -> None:
1563
1564
  """ Delete an information supply chain.
1564
1565
 
1565
1566
  Parameters
1566
1567
  ----------
1567
1568
  guid: str
1568
1569
  guid of the information supply chain to delete.
1569
- body: dict | DeleteRequestBody, optional
1570
+ body: dict | DeleteElementRequestBody, optional
1570
1571
  A dictionary containing parameters of the deletion.
1571
1572
  cascade_delete: bool, optional
1572
1573
  If true, the child objects will also be deleted.
@@ -1588,7 +1589,7 @@ class SolutionArchitect(Client2):
1588
1589
 
1589
1590
  Body structure:
1590
1591
  {
1591
- "class": "DeleteRequestBody",
1592
+ "class": "DeleteElementRequestBody",
1592
1593
  "externalSourceGUID": "add guid here",
1593
1594
  "externalSourceName": "add qualified name here",
1594
1595
  "effectiveTime": {{isotime}},
@@ -1809,7 +1810,7 @@ class SolutionArchitect(Client2):
1809
1810
  async def _async_get_info_supply_chain_by_name(self, search_filter: str, body: dict = None,
1810
1811
  add_implementation: bool = True, start_from: int = 0,
1811
1812
  page_size: int = max_paging_size,
1812
- output_format: str = "JSON") -> dict | str:
1813
+ output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
1813
1814
  """ Returns the list of information supply chains with a particular name. Async Version.
1814
1815
 
1815
1816
  Parameters
@@ -1874,12 +1875,12 @@ class SolutionArchitect(Client2):
1874
1875
  if element == NO_ELEMENTS_FOUND:
1875
1876
  return NO_ELEMENTS_FOUND
1876
1877
  if output_format != 'JSON': # return a simplified markdown representation
1877
- return self.generate_info_supply_chain_output(element, None, output_format)
1878
+ return self.generate_info_supply_chain_output(element, None, output_format, report_spec=report_spec)
1878
1879
  return response.json().get("elements", NO_ELEMENTS_FOUND)
1879
1880
 
1880
1881
  def get_info_supply_chain_by_name(self, search_filter: str, body: dict = None, add_implementation: bool = True,
1881
1882
  start_from: int = 0, page_size: int = max_paging_size,
1882
- output_format: str = "JSON") -> dict | str:
1883
+ output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
1883
1884
  """ Returns the list of information supply chains with a particular name. Async Version.
1884
1885
 
1885
1886
  Parameters
@@ -1936,11 +1937,11 @@ class SolutionArchitect(Client2):
1936
1937
  loop = asyncio.get_event_loop()
1937
1938
  response = loop.run_until_complete(
1938
1939
  self._async_get_info_supply_chain_by_name(search_filter, body, add_implementation, start_from, page_size,
1939
- output_format))
1940
+ output_format, report_spec))
1940
1941
  return response
1941
1942
 
1942
1943
  async def _async_get_info_supply_chain_by_guid(self, guid: str, body: dict = None, add_implementation: bool = True,
1943
- output_format: str = "JSON") -> dict | str:
1944
+ output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
1944
1945
  """Return the properties of a specific information supply chain. Async Version.
1945
1946
 
1946
1947
  Parameters
@@ -1997,11 +1998,11 @@ class SolutionArchitect(Client2):
1997
1998
  if element == NO_ELEMENTS_FOUND:
1998
1999
  return NO_ELEMENTS_FOUND
1999
2000
  if output_format != 'JSON': # return a simplified markdown representation
2000
- return self.generate_info_supply_chain_output(element, None, output_format)
2001
+ return self.generate_info_supply_chain_output(element, None, output_format, report_spec=report_spec)
2001
2002
  return element
2002
2003
 
2003
2004
  def get_info_supply_chain_by_guid(self, guid: str, body: dict = None, add_implementation: bool = True,
2004
- output_format: str = "JSON") -> dict | str:
2005
+ output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
2005
2006
  """ Return the properties of a specific information supply chain.
2006
2007
 
2007
2008
  Parameters
@@ -2047,7 +2048,7 @@ class SolutionArchitect(Client2):
2047
2048
  """
2048
2049
  loop = asyncio.get_event_loop()
2049
2050
  response = loop.run_until_complete(
2050
- self._async_get_info_supply_chain_by_guid(guid, body, add_implementation, output_format))
2051
+ self._async_get_info_supply_chain_by_guid(guid, body, add_implementation, output_format, report_spec))
2051
2052
  return response
2052
2053
 
2053
2054
  #
@@ -2562,7 +2563,7 @@ class SolutionArchitect(Client2):
2562
2563
 
2563
2564
 
2564
2565
  @dynamic_catch
2565
- async def _async_delete_solution_blueprint(self, guid: str, body: dict | DeleteRequestBody, cascade: bool = False) -> None:
2566
+ async def _async_delete_solution_blueprint(self, guid: str, body: dict | DeleteElementRequestBody, cascade: bool = False) -> None:
2566
2567
  """ Delete a solution blueprint. Async Version.
2567
2568
  Parameters
2568
2569
  ----------
@@ -2591,7 +2592,7 @@ class SolutionArchitect(Client2):
2591
2592
 
2592
2593
  Body structure:
2593
2594
  {
2594
- "class": "DeleteRequestBody",
2595
+ "class": "DeleteElementRequestBody",
2595
2596
  "externalSourceGUID": "add guid here",
2596
2597
  "externalSourceName": "add qualified name here",
2597
2598
  "effectiveTime": {{isotime}},
@@ -2603,11 +2604,11 @@ class SolutionArchitect(Client2):
2603
2604
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
2604
2605
  f"information-supply-chains/{guid}/delete")
2605
2606
 
2606
- await self._async_delete_request(url, body, cascade_delete=cascade)
2607
+ await self._async_delete_element_request(url, body, cascade_delete=cascade)
2607
2608
  logger.info(f"Deleted Info Supply Chain {guid} with cascade {cascade}")
2608
2609
 
2609
2610
  @dynamic_catch
2610
- def delete_solution_blueprint(self, guid: str, body: dict | DeleteRequestBody = None,
2611
+ def delete_solution_blueprint(self, guid: str, body: dict | DeleteElementRequestBody = None,
2611
2612
  cascade: bool = False) -> None:
2612
2613
  """ Delete an Solution Blueprint.
2613
2614
 
@@ -2615,7 +2616,7 @@ class SolutionArchitect(Client2):
2615
2616
  ----------
2616
2617
  guid: str
2617
2618
  guid of the information supply chain to delete.
2618
- body: dict | DeleteRequestBody, optional
2619
+ body: dict | DeleteElementRequestBody, optional
2619
2620
  A dictionary containing parameters of the deletion.
2620
2621
  cascade: bool, optional
2621
2622
  If true, the child objects will also be deleted.
@@ -2637,7 +2638,7 @@ class SolutionArchitect(Client2):
2637
2638
 
2638
2639
  Body structure:
2639
2640
  {
2640
- "class": "DeleteRequestBody",
2641
+ "class": "DeleteElementRequestBody",
2641
2642
  "externalSourceGUID": "add guid here",
2642
2643
  "externalSourceName": "add qualified name here",
2643
2644
  "effectiveTime": {{isotime}},
@@ -2755,7 +2756,7 @@ class SolutionArchitect(Client2):
2755
2756
 
2756
2757
  @dynamic_catch
2757
2758
  async def _async_detach_solution_component_from_blueprint(self, blueprint_guid: str, component_guid: str,
2758
- body: dict | DeleteRequestBody = None) -> None:
2759
+ body: dict | DeleteRelationshipRequestBody = None) -> None:
2759
2760
  """ Detach a solution component from a solution blueprint.
2760
2761
  Async Version.
2761
2762
 
@@ -2799,13 +2800,13 @@ class SolutionArchitect(Client2):
2799
2800
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
2800
2801
  f"solution-blueprints/{blueprint_guid}/solution-components/{component_guid}/detach")
2801
2802
 
2802
- await self._async_delete_request(url, body)
2803
+ await self._async_delete_relationship_request(url, body)
2803
2804
  logger.info(
2804
2805
  f"Detached component from blueprint {component_guid} -> {blueprint_guid}")
2805
2806
 
2806
2807
  @dynamic_catch
2807
2808
  def detach_solution_component_from_blueprint(self, blueprint_guid: str, component_guid: str,
2808
- body: dict | DeleteRequestBody = None) -> None:
2809
+ body: dict | DeleteRelationshipRequestBody = None) -> None:
2809
2810
  """ Detach a solution component from a solution blueprint.
2810
2811
 
2811
2812
  Parameters
@@ -2851,7 +2852,7 @@ class SolutionArchitect(Client2):
2851
2852
 
2852
2853
  @dynamic_catch
2853
2854
  async def _async_delete_solution_blueprint(self, blueprint_guid: str, cascade_delete: bool = False,
2854
- body: dict | DeleteRequestBody = None) -> None:
2855
+ body: dict | DeleteElementRequestBody = None) -> None:
2855
2856
  """Delete a solution blueprint. Async Version.
2856
2857
 
2857
2858
  Parameters
@@ -2895,11 +2896,11 @@ class SolutionArchitect(Client2):
2895
2896
 
2896
2897
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
2897
2898
  f"solution-blueprints/{blueprint_guid}/delete")
2898
- await self._async_delete_request(url, body, cascade_delete=cascade_delete)
2899
+ await self._async_delete_element_request(url, body, cascade_delete=cascade_delete)
2899
2900
  logger.info(f"Deleted Blueprint {blueprint_guid} with cascade {cascade_delete}")
2900
2901
 
2901
2902
  @dynamic_catch
2902
- def delete_solution_blueprint(self, blueprint_guid: str, cascade_delete: bool = False, body: dict | DeleteRequestBody = None) -> None:
2903
+ def delete_solution_blueprint(self, blueprint_guid: str, cascade_delete: bool = False, body: dict | DeleteElementRequestBody = None) -> None:
2903
2904
  """ Delete a solution blueprint.
2904
2905
  Parameters
2905
2906
  ----------
@@ -3887,7 +3888,7 @@ class SolutionArchitect(Client2):
3887
3888
  loop.run_until_complete(self._async_link_subcomponent(component_guid, sub_component_guid, body))
3888
3889
  @dynamic_catch
3889
3890
  async def _async_detach_sub_component(self, parent_component_guid: str, member_component_guid: str,
3890
- body: dict |DeleteRequestBody = None) -> None:
3891
+ body: dict |DeleteRelationshipRequestBody = None) -> None:
3891
3892
  """ Detach a solution component from a solution component.
3892
3893
  Async Version.
3893
3894
 
@@ -3918,7 +3919,7 @@ class SolutionArchitect(Client2):
3918
3919
 
3919
3920
  Body structure:
3920
3921
  {
3921
- "class": "DeleteRequestBody",
3922
+ "class": "DeleteRelationshipRequestBody",
3922
3923
  "externalSourceGUID": "add guid here",
3923
3924
  "externalSourceName": "add qualified name here",
3924
3925
  "effectiveTime": {{isotime}},
@@ -3931,12 +3932,12 @@ class SolutionArchitect(Client2):
3931
3932
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
3932
3933
  f"solution-components/{parent_component_guid}/subcomponents/{member_component_guid}/detach")
3933
3934
 
3934
- await self._async_delete_request(url, body)
3935
+ await self._async_delete_relationship_request(url, body)
3935
3936
  logger.info(
3936
3937
  f"Detached components {parent_component_guid} -> {member_component_guid}")
3937
3938
 
3938
3939
  @dynamic_catch
3939
- def detach_sub_component(self, parent_component_guid: str, member_component_guid: str, body: dict| DeleteRequestBody = None) -> None:
3940
+ def detach_sub_component(self, parent_component_guid: str, member_component_guid: str, body: dict| DeleteRelationshipRequestBody = None) -> None:
3940
3941
  """ Detach a solution component from a solution component.
3941
3942
  Async Version.
3942
3943
 
@@ -3946,7 +3947,7 @@ class SolutionArchitect(Client2):
3946
3947
  guid of the parent component to disconnect from.
3947
3948
  member_component_guid: str
3948
3949
  guid of the member (child) component to disconnect.
3949
- body: dict | DeleteRequestBody
3950
+ body: dict | DeleteRelationshipRequestBody
3950
3951
  The body describing the request.
3951
3952
 
3952
3953
  Returns
@@ -3967,7 +3968,7 @@ class SolutionArchitect(Client2):
3967
3968
 
3968
3969
  Body structure:
3969
3970
  {
3970
- "class": "DeleteRequestBody",
3971
+ "class": "DeleteRelationshipRequestBody",
3971
3972
  "externalSourceGUID": "add guid here",
3972
3973
  "externalSourceName": "add qualified name here",
3973
3974
  "effectiveTime": {{isotime}},
@@ -4081,7 +4082,7 @@ class SolutionArchitect(Client2):
4081
4082
 
4082
4083
  @dynamic_catch
4083
4084
  async def _async_detach_solution_linking_wire(self, component1_guid: str, component2_guid: str,
4084
- body: dict | DeleteRequestBody = None) -> None:
4085
+ body: dict | DeleteRelationshipRequestBody = None) -> None:
4085
4086
  """ Detach a solution component from a peer solution component.
4086
4087
  Async Version.
4087
4088
 
@@ -4091,7 +4092,7 @@ class SolutionArchitect(Client2):
4091
4092
  GUID of the first component to unlink.
4092
4093
  component2_guid: str
4093
4094
  GUID of the second component to unlink.
4094
- body: dict | DeleteRequestBody
4095
+ body: dict | DeleteRelationshipRequestBody
4095
4096
  The body describing the request.
4096
4097
 
4097
4098
  Returns
@@ -4112,7 +4113,7 @@ class SolutionArchitect(Client2):
4112
4113
 
4113
4114
  Body structure:
4114
4115
  {
4115
- "class" : "DeleteRequestBody",
4116
+ "class" : "DeleteRelationshipRequestBody",
4116
4117
  "externalSourceGUID": "add guid here",
4117
4118
  "externalSourceName": "add qualified name here",
4118
4119
  "effectiveTime" : "{{$isoTimestamp}}",
@@ -4125,12 +4126,12 @@ class SolutionArchitect(Client2):
4125
4126
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
4126
4127
  f"solution-components/{component1_guid}/wired-to/{component2_guid}/detach")
4127
4128
 
4128
- await self._async_delete_request(url, body)
4129
+ await self._async_delete_relationship_request(url, body)
4129
4130
  logger.info(
4130
4131
  f"Detached solution linking wire between {component1_guid} -> {component2_guid}")
4131
4132
 
4132
4133
  @dynamic_catch
4133
- def detach_solution_linking_wire(self, component1_guid: str, component2_guid: str, body: dict | DeleteRequestBody = None) -> None:
4134
+ def detach_solution_linking_wire(self, component1_guid: str, component2_guid: str, body: dict | DeleteRelationshipRequestBody = None) -> None:
4134
4135
  """ Detach a solution component from a peer solution component.
4135
4136
  Async Version.
4136
4137
 
@@ -4140,7 +4141,7 @@ class SolutionArchitect(Client2):
4140
4141
  GUID of the first component to unlink.
4141
4142
  component2_guid: str
4142
4143
  GUID of the second component to unlink.
4143
- body: dict | DeleteRequestBody
4144
+ body: dict | DeleteRelationshipRequestBody
4144
4145
  The body describing the request.
4145
4146
  The body describing the request.
4146
4147
 
@@ -4162,7 +4163,7 @@ class SolutionArchitect(Client2):
4162
4163
 
4163
4164
  Body structure:
4164
4165
  {
4165
- "class" : "DeleteRequestBody",
4166
+ "class" : "DeleteRelationshipRequestBody",
4166
4167
  "externalSourceGUID": "add guid here",
4167
4168
  "externalSourceName": "add qualified name here",
4168
4169
  "effectiveTime" : "{{$isoTimestamp}}",
@@ -4176,7 +4177,7 @@ class SolutionArchitect(Client2):
4176
4177
 
4177
4178
  @dynamic_catch
4178
4179
  async def _async_delete_solution_component(self, solution_component_guid: str, cascade_delete: bool = False,
4179
- body: dict | DeleteRequestBody= None) -> None:
4180
+ body: dict | DeleteElementRequestBody= None) -> None:
4180
4181
  """Delete a solution component. Async Version.
4181
4182
 
4182
4183
  Parameters
@@ -4185,7 +4186,7 @@ class SolutionArchitect(Client2):
4185
4186
  guid of the component to delete.
4186
4187
  cascade_delete: bool, optional, default: False
4187
4188
  Cascade the delete to dependent objects?
4188
- body: dict | DeleteRequestBody, optional
4189
+ body: dict | DeleteElementRequestBody, optional
4189
4190
  A dictionary containing parameters for the deletion.
4190
4191
 
4191
4192
  Returns
@@ -4206,7 +4207,7 @@ class SolutionArchitect(Client2):
4206
4207
 
4207
4208
  Body structure:
4208
4209
  {
4209
- "class": "DeleteRequestBody",
4210
+ "class": "DeleteElementRequestBody",
4210
4211
  "externalSourceGUID": "add guid here",
4211
4212
  "externalSourceName": "add qualified name here",
4212
4213
  "effectiveTime": {{isotime}},
@@ -4218,12 +4219,12 @@ class SolutionArchitect(Client2):
4218
4219
 
4219
4220
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
4220
4221
  f"solution-components/{solution_component_guid}/delete")
4221
- await self._async_delete_request(url, body, cascade_delete=cascade_delete)
4222
+ await self._async_delete_element_request(url, body, cascade_delete=cascade_delete)
4222
4223
  logger.info(f"Deleted Solution Component {solution_component_guid} with cascade {cascade_delete}")
4223
4224
 
4224
4225
  @dynamic_catch
4225
4226
  def delete_solution_component(self, solution_component_guid: str, cascade_delete: bool = False,
4226
- body: dict | DeleteRequestBody = None) -> None:
4227
+ body: dict | DeleteElementRequestBody = None) -> None:
4227
4228
  """Delete a solution component.
4228
4229
  Parameters
4229
4230
  ----------
@@ -4231,7 +4232,7 @@ class SolutionArchitect(Client2):
4231
4232
  guid of the component to delete.
4232
4233
  cascade_delete: bool, optional, default: False
4233
4234
  Cascade the delete to dependent objects?
4234
- body: dict | DeleteRequestBody, optional
4235
+ body: dict | DeleteElementRequestBody, optional
4235
4236
  A dictionary containing parameters for the deletion.
4236
4237
 
4237
4238
  Returns
@@ -4252,7 +4253,7 @@ class SolutionArchitect(Client2):
4252
4253
 
4253
4254
  Body structure:
4254
4255
  {
4255
- "class": "DeleteRequestBody",
4256
+ "class": "DeleteElementRequestBody",
4256
4257
  "externalSourceGUID": "add guid here",
4257
4258
  "externalSourceName": "add qualified name here",
4258
4259
  "effectiveTime": {{isotime}},
@@ -4343,7 +4344,7 @@ class SolutionArchitect(Client2):
4343
4344
  starts_with: bool = True, ends_with: bool = False,
4344
4345
  ignore_case: bool = False, start_from: int = 0,
4345
4346
  page_size: int = 0, output_format: str = 'JSON',
4346
- report_spec: str = None,
4347
+ report_spec: str | dict = None,
4347
4348
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
4348
4349
  """ Retrieve the solution component elements that contain the search string. The solutions components returned
4349
4350
  include information about consumers, actors, and other solution components that are associated with them.
@@ -4419,7 +4420,7 @@ class SolutionArchitect(Client2):
4419
4420
 
4420
4421
 
4421
4422
  async def _async_get_solution_components_by_name(self, search_filter: str, body: dict = None, start_from: int = 0,
4422
- page_size: int = 0, output_format: str = "JSON") -> dict | str:
4423
+ page_size: int = 0, output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
4423
4424
  """ Returns the list of solution components with a particular name. Async Version.
4424
4425
 
4425
4426
  Parameters
@@ -4481,11 +4482,12 @@ class SolutionArchitect(Client2):
4481
4482
  if element == NO_ELEMENTS_FOUND:
4482
4483
  return NO_ELEMENTS_FOUND
4483
4484
  if output_format != 'JSON': # return a simplified markdown representation
4484
- return self.generate_solution_components_output(element, search_filter, output_format)
4485
+ return self.generate_solution_components_output(element, search_filter, output_format, report_spec=report_spec)
4485
4486
  return response.json().get("elements", NO_ELEMENTS_FOUND)
4486
4487
 
4487
4488
  def get_solution_components_by_name(self, search_filter: str, body: dict = None, start_from: int = 0,
4488
- page_size: int = max_paging_size, output_format: str = "JSON") -> dict | str:
4489
+ page_size: int = max_paging_size, output_format: str = "JSON",
4490
+ report_spec: str | dict = None) -> dict | str:
4489
4491
  """ Returns the list of solution components with a particular name.
4490
4492
 
4491
4493
  Parameters
@@ -4536,10 +4538,13 @@ class SolutionArchitect(Client2):
4536
4538
  "filter": "Add name here"
4537
4539
  }
4538
4540
 
4541
+ Args:
4542
+ report_spec ():
4543
+
4539
4544
  """
4540
4545
  loop = asyncio.get_event_loop()
4541
4546
  response = loop.run_until_complete(
4542
- self._async_get_solution_components_by_name(search_filter, body, start_from, page_size, output_format))
4547
+ self._async_get_solution_components_by_name(search_filter, body, start_from, page_size, output_format, report_spec))
4543
4548
  return response
4544
4549
 
4545
4550
  async def _async_get_solution_component_by_guid(self, guid: str, body: dict = None,
@@ -4606,7 +4611,7 @@ class SolutionArchitect(Client2):
4606
4611
  # return self.generate_solution_components_output(element, None, output_format)
4607
4612
  # return response.json().get("element", NO_ELEMENTS_FOUND)
4608
4613
 
4609
- def get_solution_component_by_guid(self, guid: str, body: dict = None, output_format: str = "JSON") -> dict | str:
4614
+ def get_solution_component_by_guid(self, guid: str, body: dict = None, output_format: str = "JSON", report_spec: str | dict = "Solution-Component-DrE") -> dict | str:
4610
4615
  """ Return the properties of a specific solution component.
4611
4616
 
4612
4617
  Parameters
@@ -4649,7 +4654,7 @@ class SolutionArchitect(Client2):
4649
4654
 
4650
4655
  """
4651
4656
  loop = asyncio.get_event_loop()
4652
- response = loop.run_until_complete(self._async_get_solution_component_by_guid(guid, body, output_format))
4657
+ response = loop.run_until_complete(self._async_get_solution_component_by_guid(guid, body, output_format, report_spec))
4653
4658
  return response
4654
4659
 
4655
4660
 
@@ -4666,17 +4671,32 @@ class SolutionArchitect(Client2):
4666
4671
  blueprint_guids = []
4667
4672
  supply_chain_guids = []
4668
4673
  parent_component_guids = []
4674
+ keywords_list = {}
4669
4675
 
4670
- col_members = response.get('memberOfCollection', None)
4676
+ col_members = response.get('memberOfCollections', None)
4671
4677
  if col_members is not None:
4672
4678
  for member in col_members:
4673
- guid = member['relatedElement'].get('guid', None)
4674
- member_props = member['relatedElement'].get('properties', None)
4675
- if member_props is not None:
4676
- if member_props.get('typeName', None) == 'SolutionBlueprint':
4677
- blueprint_guids.append(guid)
4678
- elif member_props.get('class', None) == 'InformationSupplyChain':
4679
- supply_chain_guids.append(guid)
4679
+ guid = member['relatedElement']['elementHeader'].get('guid', None)
4680
+ type_name = member['relatedElement']['elementHeader']['type'].get('typeName',None)
4681
+ if type_name == 'SolutionBlueprint':
4682
+ blueprint_guids.append(guid)
4683
+ elif type_name == 'InformationSupplyChain':
4684
+ supply_chain_guids.append(guid)
4685
+ derived_from = response.get('derivedFrom', None)
4686
+ if derived_from is not None:
4687
+ for mem in derived_from:
4688
+ guid = mem['relatedElement']['elementHeader'].get('guid', None)
4689
+ type_name = mem['relatedElement']['elementHeader']['type'].get('typeName',None)
4690
+ if type_name == 'SolutionBlueprint':
4691
+ supply_chain_guids.append(guid)
4692
+
4693
+ keywords = response.get('searchKeywords', None)
4694
+ for mem in keywords:
4695
+ guid = mem['relatedElement']['elementHeader'].get('guid', None)
4696
+ keyword = mem['relatedElement']['properties'].get('displayName',None)
4697
+ if keyword is None:
4698
+ keyword = mem['relatedElement']['properties'].get('keyword',None)
4699
+ keywords_list[keyword] = guid
4680
4700
 
4681
4701
  sub_components = response.get('nestedSolutionComponents', None)
4682
4702
  if sub_components is not None:
@@ -4705,6 +4725,7 @@ class SolutionArchitect(Client2):
4705
4725
  "blueprint_guids": blueprint_guids,
4706
4726
  "supply_chain_guids": supply_chain_guids,
4707
4727
  "parent_component_guids": parent_component_guids,
4728
+ "keywords_list": keywords_list,
4708
4729
  }
4709
4730
 
4710
4731
 
@@ -5365,7 +5386,7 @@ class SolutionArchitect(Client2):
5365
5386
  loop.run_until_complete(self._async_link_component_to_actor(role_guid, component_guid, body))
5366
5387
 
5367
5388
  @dynamic_catch
5368
- async def _async_detach_component_actor(self, role_guid: str, component_guid: str, body: dict | DeleteRequestBody = None) -> None:
5389
+ async def _async_detach_component_actor(self, role_guid: str, component_guid: str, body: dict | DeleteRelationshipRequestBody = None) -> None:
5369
5390
  """ Detach a solution role from a solution component.
5370
5391
  Async Version.
5371
5392
 
@@ -5375,7 +5396,7 @@ class SolutionArchitect(Client2):
5375
5396
  guid of the role to disconnect from.
5376
5397
  component_guid: str
5377
5398
  guid of the component to disconnect.
5378
- body: dict | DeleteRequestBody, optional
5399
+ body: dict | DeleteRelationshipRequestBody, optional
5379
5400
  A dictionary containing the properties of the relationship to create.
5380
5401
 
5381
5402
  Returns
@@ -5396,7 +5417,7 @@ class SolutionArchitect(Client2):
5396
5417
 
5397
5418
  Body structure:
5398
5419
  {
5399
- "class": "DeleteRequestBody",
5420
+ "class": "DeleteRelationshipRequestBody",
5400
5421
  "externalSourceGUID": "add guid here",
5401
5422
  "externalSourceName": "add qualified name here",
5402
5423
  "effectiveTime": {{isotime}},
@@ -5409,12 +5430,12 @@ class SolutionArchitect(Client2):
5409
5430
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
5410
5431
  f"solution-components/{role_guid}/solution-component-actors/{component_guid}/detach")
5411
5432
 
5412
- await self._async_delete_request(url, body)
5433
+ await self._async_delete_relationship_request(url, body)
5413
5434
  logger.info(
5414
5435
  f"Detached role from component {role_guid} -> {component_guid}")
5415
5436
 
5416
5437
  @dynamic_catch
5417
- def detach_component_actore(self, role_guid: str, component_guid: str, body: dict |DeleteRequestBody = None) -> None:
5438
+ def detach_component_actore(self, role_guid: str, component_guid: str, body: dict |DeleteRelationshipRequestBody = None) -> None:
5418
5439
  """ Detach a solution role from a solution component.
5419
5440
 
5420
5441
  Parameters
@@ -5423,7 +5444,7 @@ class SolutionArchitect(Client2):
5423
5444
  guid of the role to disconnect from.
5424
5445
  component_guid: str
5425
5446
  guid of the component to disconnect.
5426
- body: dict | DeleteRequestBody, optional
5447
+ body: dict | DeleteRelationshipRequestBody, optional
5427
5448
  A dictionary containing the properties of the relationship to create.
5428
5449
 
5429
5450
  Returns
@@ -5444,7 +5465,7 @@ class SolutionArchitect(Client2):
5444
5465
 
5445
5466
  Body structure:
5446
5467
  {
5447
- "class": "DeleteRequestBody",
5468
+ "class": "DeleteRelationshipRequestBody",
5448
5469
  "externalSourceGUID": "add guid here",
5449
5470
  "externalSourceName": "add qualified name here",
5450
5471
  "effectiveTime": {{isotime}},
@@ -5456,14 +5477,14 @@ class SolutionArchitect(Client2):
5456
5477
  loop.run_until_complete(self._async_detach_component_actor(role_guid, component_guid, body))
5457
5478
 
5458
5479
  @dynamic_catch
5459
- async def _async_delete_solution_role(self, guid: str, body: dict | DeleteRequestBody= None, cascade_delete: bool = False,) -> None:
5480
+ async def _async_delete_solution_role(self, guid: str, body: dict | DeleteElementRequestBody= None, cascade_delete: bool = False,) -> None:
5460
5481
  """Delete a solution role. Async Version.
5461
5482
 
5462
5483
  Parameters
5463
5484
  ----------
5464
5485
  guid: str
5465
5486
  guid of the role to delete.
5466
- body: dict | DeleteRequestBody, optional
5487
+ body: dict | DeleteElementRequestBody, optional
5467
5488
  A dictionary containing parameters for the deletion.
5468
5489
  cascade_delete: bool, optional, default: False
5469
5490
  Cascade the delete to dependent objects?
@@ -5487,7 +5508,7 @@ class SolutionArchitect(Client2):
5487
5508
 
5488
5509
  Body structure:
5489
5510
  {
5490
- "class": "DeleteRequestBody",
5511
+ "class": "DeleteElementRequestBody",
5491
5512
  "externalSourceGUID": "add guid here",
5492
5513
  "externalSourceName": "add qualified name here",
5493
5514
  "effectiveTime": {{isotime}},
@@ -5499,18 +5520,18 @@ class SolutionArchitect(Client2):
5499
5520
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/solution-architect/"
5500
5521
  f"solution-roles/{guid}/delete")
5501
5522
 
5502
- await self._async_delete_request(url, body, cascade_delete=cascade_delete)
5523
+ await self._async_delete_element_request(url, body, cascade_delete=cascade_delete)
5503
5524
  logger.info(f"Delete solution rule {guid} with cascade {cascade_delete}")
5504
5525
 
5505
5526
  @dynamic_catch
5506
- def delete_solution_role(self, guid: str, body: dict | DeleteRequestBody = None,cascade_delete: bool = False) -> None:
5527
+ def delete_solution_role(self, guid: str, body: dict | DeleteElementRequestBody = None,cascade_delete: bool = False) -> None:
5507
5528
  """Delete a solution role. Async Version.
5508
5529
 
5509
5530
  Parameters
5510
5531
  ----------
5511
5532
  guid: str
5512
5533
  guid of the role to delete.
5513
- body: dict | DeleteRequestBody, optional
5534
+ body: dict | DeleteElementRequestBody, optional
5514
5535
  A dictionary containing parameters for the deletion.
5515
5536
  cascade_delete: bool, optional, default: False
5516
5537
  Cascade the delete to dependent objects?
@@ -5533,7 +5554,7 @@ class SolutionArchitect(Client2):
5533
5554
 
5534
5555
  Body structure:
5535
5556
  {
5536
- "class": "DeleteRequestBody",
5557
+ "class": "DeleteElementRequestBody",
5537
5558
  "externalSourceGUID": "add guid here",
5538
5559
  "externalSourceName": "add qualified name here",
5539
5560
  "effectiveTime": {{isotime}},
@@ -5707,7 +5728,7 @@ class SolutionArchitect(Client2):
5707
5728
 
5708
5729
  async def _async_get_solution_roles_by_name(self, search_filter: str, body: dict = None, start_from: int = 0,
5709
5730
  page_size: int = max_paging_size,
5710
- output_format: str = "JSON") -> dict | str:
5731
+ output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
5711
5732
  """ Returns the list of solution roles with a particular name. Async Version.
5712
5733
 
5713
5734
  Parameters
@@ -5771,11 +5792,11 @@ class SolutionArchitect(Client2):
5771
5792
  if element == NO_ELEMENTS_FOUND:
5772
5793
  return NO_ELEMENTS_FOUND
5773
5794
  if output_format != 'JSON': # return a simplified markdown representation
5774
- return self.generate_solution_roles_output(element, search_filter, output_format)
5795
+ return self.generate_solution_roles_output(element, search_filter, output_format, report_spec=report_spec)
5775
5796
  return response.json().get("elements", NO_ELEMENTS_FOUND)
5776
5797
 
5777
5798
  def get_solution_roles_by_name(self, search_filter: str, body: dict = None, start_from: int = 0,
5778
- page_size: int = max_paging_size, output_format: str = "JSON") -> dict | str:
5799
+ page_size: int = max_paging_size, output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
5779
5800
  """ Returns the list of solution roles with a particular name.
5780
5801
 
5781
5802
  Parameters
@@ -5829,12 +5850,12 @@ class SolutionArchitect(Client2):
5829
5850
  """
5830
5851
  loop = asyncio.get_event_loop()
5831
5852
  response = loop.run_until_complete(
5832
- self._async_get_solution_roles_by_name(search_filter, body, start_from, page_size, output_format))
5853
+ self._async_get_solution_roles_by_name(search_filter, body, start_from, page_size, output_format, report_spec))
5833
5854
  return response
5834
5855
 
5835
5856
 
5836
5857
  async def _async_get_solution_role_by_guid(self, guid: str, body: dict = None,
5837
- output_format: str = "JSON") -> dict | str:
5858
+ output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
5838
5859
  """ Return the properties of a specific solution role. Async Version.
5839
5860
 
5840
5861
  Parameters
@@ -5888,10 +5909,10 @@ class SolutionArchitect(Client2):
5888
5909
  if element == NO_ELEMENTS_FOUND:
5889
5910
  return NO_ELEMENTS_FOUND
5890
5911
  if output_format != 'JSON': # return a simplified markdown representation
5891
- return self.generate_solution_roles_output(element, None, output_format)
5912
+ return self.generate_solution_roles_output(element, None, output_format, report_spec=report_spec)
5892
5913
  return response.json().get("element", NO_ELEMENTS_FOUND)
5893
5914
 
5894
- def get_solution_role_by_guid(self, guid: str, body: dict = None, output_format: str = "JSON") -> dict | str:
5915
+ def get_solution_role_by_guid(self, guid: str, body: dict = None, output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
5895
5916
  """ Return the properties of a specific solution role.
5896
5917
 
5897
5918
  Parameters