pyegeria 5.4.7.8__py3-none-any.whl → 5.4.8__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 (49) hide show
  1. commands/cat/dr_egeria_command_help.py +1 -1
  2. commands/cat/list_collections.py +2 -2
  3. commands/cat/run_report.py +12 -12
  4. commands/ops/list_archives.py +1 -3
  5. md_processing/data/generated_format_sets.json +43 -43
  6. md_processing/md_commands/data_designer_commands.py +10 -10
  7. md_processing/md_commands/ext_ref_commands.py +2 -2
  8. md_processing/md_commands/glossary_commands.py +3 -3
  9. md_processing/md_commands/governance_officer_commands.py +2 -2
  10. md_processing/md_commands/product_manager_commands.py +8 -8
  11. md_processing/md_commands/project_commands.py +2 -2
  12. md_processing/md_commands/solution_architect_commands.py +3 -3
  13. md_processing/md_commands/view_commands.py +7 -7
  14. md_processing/md_processing_utils/common_md_proc_utils.py +8 -8
  15. md_processing/md_processing_utils/gen_format_sets.py +12 -12
  16. md_processing/md_processing_utils/generate_dr_help.py +1 -1
  17. pyegeria/__init__.py +3 -3
  18. pyegeria/_base_client.py +564 -0
  19. pyegeria/_client_new.py +3378 -722
  20. pyegeria/_output_format_models.py +41 -16
  21. pyegeria/_output_formats.py +9 -2642
  22. pyegeria/automated_curation.py +90 -81
  23. pyegeria/base_report_formats.py +2835 -0
  24. pyegeria/classification_manager.py +184 -199
  25. pyegeria/classification_manager_omvs.py +45 -69
  26. pyegeria/collection_manager.py +87 -75
  27. pyegeria/data_designer.py +110 -110
  28. pyegeria/egeria_cat_client.py +23 -67
  29. pyegeria/egeria_client.py +2 -2
  30. pyegeria/egeria_tech_client.py +2 -2
  31. pyegeria/{external_references.py → external_links.py} +33 -34
  32. pyegeria/feedback_manager.py +191 -3931
  33. pyegeria/feedback_manager_omvs.py +104 -306
  34. pyegeria/format_set_executor.py +16 -16
  35. pyegeria/glossary_manager.py +30 -30
  36. pyegeria/governance_officer.py +22 -22
  37. pyegeria/mcp_adapter.py +6 -6
  38. pyegeria/output_formatter.py +59 -43
  39. pyegeria/platform_services.py +2 -1
  40. pyegeria/project_manager.py +45 -45
  41. pyegeria/reference_data.py +28 -28
  42. pyegeria/solution_architect.py +73 -73
  43. {pyegeria-5.4.7.8.dist-info → pyegeria-5.4.8.dist-info}/METADATA +33 -3
  44. {pyegeria-5.4.7.8.dist-info → pyegeria-5.4.8.dist-info}/RECORD +48 -47
  45. pyegeria/egeria_my_client.py +0 -91
  46. {pyegeria-5.4.7.8.dist-info → pyegeria-5.4.8.dist-info}/WHEEL +0 -0
  47. {pyegeria-5.4.7.8.dist-info → pyegeria-5.4.8.dist-info}/entry_points.txt +0 -0
  48. {pyegeria-5.4.7.8.dist-info → pyegeria-5.4.8.dist-info}/licenses/LICENSE +0 -0
  49. {pyegeria-5.4.7.8.dist-info → pyegeria-5.4.8.dist-info}/top_level.txt +0 -0
@@ -18,7 +18,7 @@ from pyegeria.models import NewElementRequestBody, TemplateRequestBody, UpdateEl
18
18
  NewRelationshipRequestBody, DeleteRequestBody, UpdateStatusRequestBody, SearchStringRequestBody
19
19
  from pyegeria.output_formatter import make_preamble, make_md_attribute, generate_output, extract_mermaid_only, \
20
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
+ from pyegeria.base_report_formats import select_report_spec, get_report_spec_match
22
22
  from pyegeria._validators import validate_guid
23
23
  from pyegeria.governance_officer import GovernanceOfficer
24
24
  from pyegeria._client_new import Client2, max_paging_size
@@ -502,7 +502,7 @@ class SolutionArchitect(Client2):
502
502
  # We only set a column's value if it is currently empty (None or "").
503
503
  try:
504
504
  formats = col_data.get('formats') if isinstance(col_data, dict) else None
505
- columns = formats.get('columns') if isinstance(formats, dict) else None
505
+ columns = formats.get('attributes') if isinstance(formats, dict) else None
506
506
  if isinstance(columns, list) and isinstance(rel_dict, dict):
507
507
  for col in columns:
508
508
  if not isinstance(col, dict):
@@ -531,24 +531,24 @@ class SolutionArchitect(Client2):
531
531
  # Markdown output support
532
532
  #
533
533
  def generate_info_supply_chain_output(self, elements: list | dict, search_string: str, element_type_name: str | None,
534
- output_format: str = 'MD', output_format_set: dict | str = None) -> str | list:
534
+ output_format: str = 'MD', report_spec: dict | str = None) -> str | list:
535
535
  """Render Information Supply Chains using the shared output pipeline.
536
536
  """
537
537
  if output_format == "MERMAID":
538
538
  return extract_mermaid_only(elements)
539
539
 
540
540
  entity_type = "Information Supply Chain"
541
- if output_format_set:
542
- if isinstance(output_format_set, str):
543
- output_formats = select_output_format_set(output_format_set, output_format)
544
- elif isinstance(output_format_set, dict):
545
- output_formats = get_output_format_type_match(output_format_set, output_format)
541
+ if report_spec:
542
+ if isinstance(report_spec, str):
543
+ output_formats = select_report_spec(report_spec, output_format)
544
+ elif isinstance(report_spec, dict):
545
+ output_formats = get_report_spec_match(report_spec, output_format)
546
546
  else:
547
547
  output_formats = None
548
548
  else:
549
- output_formats = select_output_format_set("Information Supply Chains", output_format)
549
+ output_formats = select_report_spec("Information Supply Chains", output_format)
550
550
  if output_formats is None:
551
- output_formats = select_output_format_set("Default", output_format)
551
+ output_formats = select_report_spec("Default", output_format)
552
552
 
553
553
  return generate_output(
554
554
  elements=elements,
@@ -561,7 +561,7 @@ class SolutionArchitect(Client2):
561
561
  )
562
562
 
563
563
  def generate_solution_blueprint_output(self, elements: list | dict, search_string: str, element_type_name: str | None,
564
- output_format: str = 'MD', output_format_set: dict | str = None) -> str | list:
564
+ output_format: str = 'MD', report_spec: dict | str = None) -> str | list:
565
565
  """
566
566
  Generate output for solution blueprints in the specified format.
567
567
 
@@ -577,17 +577,17 @@ class SolutionArchitect(Client2):
577
577
  return extract_mermaid_only(elements)
578
578
 
579
579
  entity_type = "Solution Blueprint"
580
- if output_format_set:
581
- if isinstance(output_format_set, str):
582
- output_formats = select_output_format_set(output_format_set, output_format)
583
- elif isinstance(output_format_set, dict):
584
- output_formats = get_output_format_type_match(output_format_set, output_format)
580
+ if report_spec:
581
+ if isinstance(report_spec, str):
582
+ output_formats = select_report_spec(report_spec, output_format)
583
+ elif isinstance(report_spec, dict):
584
+ output_formats = get_report_spec_match(report_spec, output_format)
585
585
  else:
586
586
  output_formats = None
587
587
  else:
588
- output_formats = select_output_format_set("Solution Blueprints", output_format)
588
+ output_formats = select_report_spec("Solution Blueprints", output_format)
589
589
  if output_formats is None:
590
- output_formats = select_output_format_set("Default", output_format)
590
+ output_formats = select_report_spec("Default", output_format)
591
591
 
592
592
  return generate_output(
593
593
  elements=elements,
@@ -600,7 +600,7 @@ class SolutionArchitect(Client2):
600
600
  )
601
601
 
602
602
  def generate_solution_roles_output(self, elements: list | dict, search_string: str, element_type_name: str | None,
603
- output_format: str = 'MD', output_format_set: dict | str = None) -> str | list:
603
+ output_format: str = 'MD', report_spec: dict | str = None) -> str | list:
604
604
  """
605
605
  Generate output for solution roles in the specified format.
606
606
 
@@ -616,17 +616,17 @@ class SolutionArchitect(Client2):
616
616
  return extract_mermaid_only(elements)
617
617
 
618
618
  entity_type = "Solution Role"
619
- if output_format_set:
620
- if isinstance(output_format_set, str):
621
- output_formats = select_output_format_set(output_format_set, output_format)
622
- elif isinstance(output_format_set, dict):
623
- output_formats = get_output_format_type_match(output_format_set, output_format)
619
+ if report_spec:
620
+ if isinstance(report_spec, str):
621
+ output_formats = select_report_spec(report_spec, output_format)
622
+ elif isinstance(report_spec, dict):
623
+ output_formats = get_report_spec_match(report_spec, output_format)
624
624
  else:
625
625
  output_formats = None
626
626
  else:
627
- output_formats = select_output_format_set("Solution Roles", output_format)
627
+ output_formats = select_report_spec("Solution Roles", output_format)
628
628
  if output_formats is None:
629
- output_formats = select_output_format_set("Default", output_format)
629
+ output_formats = select_report_spec("Default", output_format)
630
630
 
631
631
  return generate_output(
632
632
  elements=elements,
@@ -639,7 +639,7 @@ class SolutionArchitect(Client2):
639
639
  )
640
640
 
641
641
  def generate_solution_components_output(self, elements: list | dict, search_string: str, element_type_name: str | None,
642
- output_format: str = 'MD', output_format_set: dict | str = None) -> str | list:
642
+ output_format: str = 'MD', report_spec: dict | str = None) -> str | list:
643
643
  """
644
644
  Generate output for solution components in the specified format.
645
645
 
@@ -660,17 +660,17 @@ class SolutionArchitect(Client2):
660
660
  return extract_mermaid_only(elements)
661
661
 
662
662
  entity_type = "Solution Component"
663
- if output_format_set:
664
- if isinstance(output_format_set, str):
665
- output_formats = select_output_format_set(output_format_set, output_format)
666
- elif isinstance(output_format_set, dict):
667
- output_formats = get_output_format_type_match(output_format_set, output_format)
663
+ if report_spec:
664
+ if isinstance(report_spec, str):
665
+ output_formats = select_report_spec(report_spec, output_format)
666
+ elif isinstance(report_spec, dict):
667
+ output_formats = get_report_spec_match(report_spec, output_format)
668
668
  else:
669
669
  output_formats = None
670
670
  else:
671
- output_formats = select_output_format_set("Solution Components", output_format)
671
+ output_formats = select_report_spec("Solution Components", output_format)
672
672
  if output_formats is None:
673
- output_formats = select_output_format_set("Default", output_format)
673
+ output_formats = select_report_spec("Default", output_format)
674
674
 
675
675
  return generate_output(
676
676
  elements=elements,
@@ -1604,7 +1604,7 @@ class SolutionArchitect(Client2):
1604
1604
  starts_with: bool = True, ends_with: bool = False,
1605
1605
  ignore_case: bool = False, start_from: int = 0,
1606
1606
  page_size: int = 0, output_format: str = 'JSON',
1607
- output_format_set: str = None,
1607
+ report_spec: str = None,
1608
1608
  body: dict| SearchStringRequestBody = None) -> (list[dict] | str):
1609
1609
  """ Retrieve a list of all information supply chains
1610
1610
  Parameters
@@ -1652,7 +1652,7 @@ class SolutionArchitect(Client2):
1652
1652
  }
1653
1653
  """
1654
1654
 
1655
- 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)
1655
+ return self.find_information_supply_chains("*", classification_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, body)
1656
1656
 
1657
1657
  async def _async_find_information_supply_chains(self, search_string: str = "*", add_implementation: bool = True,
1658
1658
  classification_names: list[str] = None,
@@ -1660,7 +1660,7 @@ class SolutionArchitect(Client2):
1660
1660
  starts_with: bool = True, ends_with: bool = False,
1661
1661
  ignore_case: bool = False, start_from: int = 0,
1662
1662
  page_size: int = 0, output_format: str = 'JSON',
1663
- output_format_set: str = None,
1663
+ report_spec: str = None,
1664
1664
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
1665
1665
  """Retrieve the list of information supply chain metadata elements that contain the search string.
1666
1666
  https://egeria-project.org/concepts/information-supply-chain
@@ -1725,7 +1725,7 @@ class SolutionArchitect(Client2):
1725
1725
  metadata_element_types=metadata_element_types,
1726
1726
  starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case,
1727
1727
  start_from=start_from, page_size=page_size,
1728
- output_format=output_format, output_format_set=output_format_set,
1728
+ output_format=output_format, report_spec=report_spec,
1729
1729
  body=body)
1730
1730
 
1731
1731
 
@@ -1736,7 +1736,7 @@ class SolutionArchitect(Client2):
1736
1736
  starts_with: bool = True, ends_with: bool = False,
1737
1737
  ignore_case: bool = False, start_from: int = 0,
1738
1738
  page_size: int = 0, output_format: str = 'JSON',
1739
- output_format_set: str = None,
1739
+ report_spec: str = None,
1740
1740
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
1741
1741
  """Retrieve the list of information supply chain metadata elements that contain the search string.
1742
1742
  https://egeria-project.org/concepts/information-supply-chain
@@ -1803,7 +1803,7 @@ class SolutionArchitect(Client2):
1803
1803
  self._async_find_information_supply_chains(search_string, add_implementation,classification_names, metadata_element_types,
1804
1804
  starts_with, ends_with, ignore_case,
1805
1805
  start_from, page_size, output_format,
1806
- output_format_set, body))
1806
+ report_spec, body))
1807
1807
  return response
1808
1808
 
1809
1809
  async def _async_get_info_supply_chain_by_name(self, search_filter: str, body: dict = None,
@@ -2947,7 +2947,7 @@ class SolutionArchitect(Client2):
2947
2947
  starts_with: bool = True, ends_with: bool = False,
2948
2948
  ignore_case: bool = False, start_from: int = 0,
2949
2949
  page_size: int = 0, output_format: str = 'JSON',
2950
- output_format_set: str = "Solution-Blueprint",
2950
+ report_spec: str = "Solution-Blueprint",
2951
2951
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
2952
2952
  """Retrieve the solution blueprint elements that contain the search string.
2953
2953
  https://egeria-project.org/concepts/solution-blueprint
@@ -3012,7 +3012,7 @@ class SolutionArchitect(Client2):
3012
3012
  metadata_element_types=metadata_element_types,
3013
3013
  starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case,
3014
3014
  start_from=start_from, page_size=page_size,
3015
- output_format=output_format, output_format_set=output_format_set,
3015
+ output_format=output_format, report_spec=report_spec,
3016
3016
  body=body)
3017
3017
 
3018
3018
 
@@ -3021,7 +3021,7 @@ class SolutionArchitect(Client2):
3021
3021
  starts_with: bool = True, ends_with: bool = False,
3022
3022
  ignore_case: bool = False, start_from: int = 0,
3023
3023
  page_size: int = 0, output_format: str = 'JSON',
3024
- output_format_set: str = None,
3024
+ report_spec: str = None,
3025
3025
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
3026
3026
  """Retrieve the list of solution blueprint elements that contain the search string.
3027
3027
  https://egeria-project.org/concepts/solution-blueprint
@@ -3084,7 +3084,7 @@ class SolutionArchitect(Client2):
3084
3084
  response = loop.run_until_complete(
3085
3085
  self._async_find_solution_blueprints(search_string, classification_names, metadata_element_types,
3086
3086
  starts_with, ends_with, ignore_case, start_from,
3087
- page_size, output_format, output_format_set, body))
3087
+ page_size, output_format, report_spec, body))
3088
3088
  return response
3089
3089
 
3090
3090
  def find_all_solution_blueprints(self, classification_names: list[str] = None,
@@ -3092,19 +3092,19 @@ class SolutionArchitect(Client2):
3092
3092
  starts_with: bool = True, ends_with: bool = False,
3093
3093
  ignore_case: bool = False, start_from: int = 0,
3094
3094
  page_size: int = 0, output_format: str = 'JSON',
3095
- output_format_set: str = None,
3095
+ report_spec: str = None,
3096
3096
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
3097
3097
  """Retrieve a list of all solution blueprint elements
3098
3098
  https://egeria-project.org/concepts/solution-blueprint
3099
3099
  """
3100
3100
  return self.find_solution_blueprints("*", classification_names, metadata_element_types,
3101
3101
  starts_with, ends_with, ignore_case, start_from,
3102
- page_size, output_format, output_format_set, body)
3102
+ page_size, output_format, report_spec, body)
3103
3103
 
3104
3104
 
3105
3105
  async def _async_get_solution_blueprint_by_guid(self, guid: str, body: dict = None,
3106
3106
  output_format: str = "JSON",
3107
- output_format_set: str| Dict = "Solution-Blueprint") -> dict | str:
3107
+ report_spec: str| Dict = "Solution-Blueprint") -> dict | str:
3108
3108
  """Return the properties of a specific solution blueprint. Async Version.
3109
3109
 
3110
3110
  Parameters
@@ -3120,7 +3120,7 @@ class SolutionArchitect(Client2):
3120
3120
  FORM - output markdown with a preamble for a form
3121
3121
  REPORT - output markdown with a preamble for a report
3122
3122
  MERMAID - output mermaid markdown
3123
- output_format_set: str|Dict, optional
3123
+ report_spec: str|Dict, optional
3124
3124
  Structure of content to return.
3125
3125
 
3126
3126
  Returns
@@ -3161,11 +3161,11 @@ class SolutionArchitect(Client2):
3161
3161
  return NO_ELEMENTS_FOUND
3162
3162
  if output_format != 'JSON': # return a simplified markdown representation
3163
3163
  return self.generate_solution_blueprint_output(element, guid, "SolutionBlueprint",
3164
- output_format, output_format_set=output_format_set)
3164
+ output_format, report_spec=report_spec)
3165
3165
  return response.json().get("element", NO_ELEMENTS_FOUND)
3166
3166
 
3167
3167
  def get_solution_blueprint_by_guid(self, guid: str, body: dict = None, output_format: str = "JSON",
3168
- output_format_set: str| Dict = "Solution-Blueprint") -> dict | str:
3168
+ report_spec: str| Dict = "Solution-Blueprint") -> dict | str:
3169
3169
  """ Return the properties of a specific solution blueprint.
3170
3170
 
3171
3171
  Parameters
@@ -3181,7 +3181,7 @@ class SolutionArchitect(Client2):
3181
3181
  FORM - output markdown with a preamble for a form
3182
3182
  REPORT - output markdown with a preamble for a report
3183
3183
  MERMAID - output mermaid markdown
3184
- output_format_set: str|Dict, optional
3184
+ report_spec: str|Dict, optional
3185
3185
  Structure of content to return.
3186
3186
 
3187
3187
  Returns
@@ -3211,12 +3211,12 @@ class SolutionArchitect(Client2):
3211
3211
  """
3212
3212
  loop = asyncio.get_event_loop()
3213
3213
  response = loop.run_until_complete(self._async_get_solution_blueprint_by_guid(guid, body,
3214
- output_format, output_format_set))
3214
+ output_format, report_spec))
3215
3215
  return response
3216
3216
 
3217
3217
  async def _async_get_solution_blueprints_by_name(self, search_filter: str, body: dict = None, start_from: int = 0,
3218
3218
  page_size: int = max_paging_size,
3219
- output_format: str = "JSON", output_format_set: str| Dict = "Solution-Blueprint") -> dict | str:
3219
+ output_format: str = "JSON", report_spec: str| Dict = "Solution-Blueprint") -> dict | str:
3220
3220
  """ Returns the list of solution blueprints with a particular name. Async Version.
3221
3221
 
3222
3222
  Parameters
@@ -3232,7 +3232,7 @@ class SolutionArchitect(Client2):
3232
3232
  FORM - output markdown with a preamble for a form
3233
3233
  REPORT - output markdown with a preamble for a report
3234
3234
  MERMAID - output mermaid markdown
3235
- output_format_set: str|Dict, optional
3235
+ report_spec: str|Dict, optional
3236
3236
  Structure of content to return.
3237
3237
 
3238
3238
  Returns
@@ -3280,12 +3280,12 @@ class SolutionArchitect(Client2):
3280
3280
  if element == NO_ELEMENTS_FOUND:
3281
3281
  return NO_ELEMENTS_FOUND
3282
3282
  if output_format != 'JSON': # return a simplified markdown representation
3283
- return self.generate_solution_blueprint_output(element, search_filter, output_format, output_format_set=output_format_set)
3283
+ return self.generate_solution_blueprint_output(element, search_filter, output_format, report_spec=report_spec)
3284
3284
  return response.json().get("elements", NO_ELEMENTS_FOUND)
3285
3285
 
3286
3286
  def get_solution_blueprints_by_name(self, search_filter: str, body: dict = None, start_from: int = 0,
3287
3287
  page_size: int = max_paging_size, output_format: str = "JSON",
3288
- output_format_set: str| Dict = "Solution-Blueprint") -> dict | str:
3288
+ report_spec: str| Dict = "Solution-Blueprint") -> dict | str:
3289
3289
  """ Returns the list of solution blueprints with a particular name.
3290
3290
 
3291
3291
  Parameters
@@ -3306,7 +3306,7 @@ class SolutionArchitect(Client2):
3306
3306
  FORM - output markdown with a preamble for a form
3307
3307
  REPORT - output markdown with a preamble for a report
3308
3308
  MERMAID - output mermaid markdown
3309
- output_format_set: str|Dict, optional
3309
+ report_spec: str|Dict, optional
3310
3310
  Structure of content to return.
3311
3311
 
3312
3312
  Returns
@@ -3341,7 +3341,7 @@ class SolutionArchitect(Client2):
3341
3341
  """
3342
3342
  loop = asyncio.get_event_loop()
3343
3343
  response = loop.run_until_complete(
3344
- self._async_get_solution_blueprints_by_name(search_filter, body, start_from, page_size, output_format, output_format_set))
3344
+ self._async_get_solution_blueprints_by_name(search_filter, body, start_from, page_size, output_format, report_spec))
3345
3345
  return response
3346
3346
 
3347
3347
 
@@ -4268,7 +4268,7 @@ class SolutionArchitect(Client2):
4268
4268
  starts_with: bool = True, ends_with: bool = False,
4269
4269
  ignore_case: bool = False, start_from: int = 0,
4270
4270
  page_size: int = 0, output_format: str = 'JSON',
4271
- output_format_set: str = None,
4271
+ report_spec: str = None,
4272
4272
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
4273
4273
  """ Retrieve the solution component elements that contain the search string. The solutions components returned
4274
4274
  include information about consumers, actors, and other solution components that are associated with them.
@@ -4335,7 +4335,7 @@ class SolutionArchitect(Client2):
4335
4335
  metadata_element_types=metadata_element_types,
4336
4336
  starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case,
4337
4337
  start_from=start_from, page_size=page_size,
4338
- output_format=output_format, output_format_set=output_format_set,
4338
+ output_format=output_format, report_spec=report_spec,
4339
4339
  body=body)
4340
4340
 
4341
4341
  def find_solution_components(self, search_string: str = "*", classification_names: list[str] = None,
@@ -4343,7 +4343,7 @@ class SolutionArchitect(Client2):
4343
4343
  starts_with: bool = True, ends_with: bool = False,
4344
4344
  ignore_case: bool = False, start_from: int = 0,
4345
4345
  page_size: int = 0, output_format: str = 'JSON',
4346
- output_format_set: str = None,
4346
+ report_spec: str = None,
4347
4347
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
4348
4348
  """ Retrieve the solution component elements that contain the search string. The solutions components returned
4349
4349
  include information about consumers, actors, and other solution components that are associated with them.
@@ -4402,7 +4402,7 @@ class SolutionArchitect(Client2):
4402
4402
 
4403
4403
  loop = asyncio.get_event_loop()
4404
4404
  response = loop.run_until_complete(
4405
- 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))
4405
+ self._async_find_solution_components(search_string, classification_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, body))
4406
4406
  return response
4407
4407
 
4408
4408
  def find_all_solution_components(self, classification_names: list[str] = None,
@@ -4410,12 +4410,12 @@ class SolutionArchitect(Client2):
4410
4410
  starts_with: bool = True, ends_with: bool = False,
4411
4411
  ignore_case: bool = False, start_from: int = 0,
4412
4412
  page_size: int = 0, output_format: str = 'JSON',
4413
- output_format_set: str = None,
4413
+ report_spec: str = None,
4414
4414
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
4415
4415
  """Retrieve a list of all solution component elements
4416
4416
  https://egeria-project.org/concepts/solution-components
4417
4417
  """
4418
- 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)
4418
+ return self.find_solution_components("*", classification_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, body)
4419
4419
 
4420
4420
 
4421
4421
  async def _async_get_solution_components_by_name(self, search_filter: str, body: dict = None, start_from: int = 0,
@@ -4543,7 +4543,7 @@ class SolutionArchitect(Client2):
4543
4543
  return response
4544
4544
 
4545
4545
  async def _async_get_solution_component_by_guid(self, guid: str, body: dict = None,
4546
- output_format: str = "JSON", output_format_set: str = "Solution-Component-DrE") -> dict | str:
4546
+ output_format: str = "JSON", report_spec: str = "Solution-Component-DrE") -> dict | str:
4547
4547
  """ Return the properties of a specific solution component. Async Version.
4548
4548
 
4549
4549
  Parameters
@@ -4559,7 +4559,7 @@ class SolutionArchitect(Client2):
4559
4559
  FORM - output markdown with a preamble for a form
4560
4560
  REPORT - output markdown with a preamble for a report
4561
4561
  MERMAID - output mermaid markdown
4562
- output_format_set: str, default = "Solution-Component-DrE"
4562
+ report_spec: str, default = "Solution-Component-DrE"
4563
4563
  Structure of output to produce:
4564
4564
 
4565
4565
  Returns
@@ -4592,7 +4592,7 @@ class SolutionArchitect(Client2):
4592
4592
  f"solution-components/{guid}/retrieve")
4593
4593
  response = await self._async_get_guid_request(url, 'SolutionComponent',
4594
4594
  self.generate_solution_components_output,
4595
- output_format, output_format_set, body)
4595
+ output_format, report_spec, body)
4596
4596
  return response
4597
4597
 
4598
4598
  # if body is None:
@@ -5549,7 +5549,7 @@ class SolutionArchitect(Client2):
5549
5549
  starts_with: bool = True, ends_with: bool = False,
5550
5550
  ignore_case: bool = False, start_from: int = 0,
5551
5551
  page_size: int = 0, output_format: str = 'JSON',
5552
- output_format_set: str = None,
5552
+ report_spec: str = None,
5553
5553
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
5554
5554
  """Retrieve the solution role elements that contain the search string.
5555
5555
  https://egeria-project.org/concepts/actor
@@ -5616,7 +5616,7 @@ class SolutionArchitect(Client2):
5616
5616
  metadata_element_types=metadata_element_types,
5617
5617
  starts_with=starts_with, ends_with=ends_with, ignore_case=ignore_case,
5618
5618
  start_from=start_from, page_size=page_size,
5619
- output_format=output_format, output_format_set=output_format_set,
5619
+ output_format=output_format, report_spec=report_spec,
5620
5620
  body=body)
5621
5621
 
5622
5622
  def find_solution_roles(self, search_string: str = "*", classification_names: list[str] = None,
@@ -5624,7 +5624,7 @@ class SolutionArchitect(Client2):
5624
5624
  starts_with: bool = True, ends_with: bool = False,
5625
5625
  ignore_case: bool = False, start_from: int = 0,
5626
5626
  page_size: int = 0, output_format: str = 'JSON',
5627
- output_format_set: str = None,
5627
+ report_spec: str = None,
5628
5628
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
5629
5629
  """Retrieve the list of solution role elements that contain the search string.
5630
5630
  https://egeria-project.org/concepts/actor
@@ -5689,7 +5689,7 @@ class SolutionArchitect(Client2):
5689
5689
 
5690
5690
  loop = asyncio.get_event_loop()
5691
5691
  response = loop.run_until_complete(
5692
- 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))
5692
+ self._async_find_solution_roles(search_string, classification_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, body))
5693
5693
  return response
5694
5694
 
5695
5695
  def find_all_solution_roles(self, classification_names: list[str] = None,
@@ -5697,12 +5697,12 @@ class SolutionArchitect(Client2):
5697
5697
  starts_with: bool = True, ends_with: bool = False,
5698
5698
  ignore_case: bool = False, start_from: int = 0,
5699
5699
  page_size: int = 0, output_format: str = 'JSON',
5700
- output_format_set: str = None,
5700
+ report_spec: str = None,
5701
5701
  body: dict| SearchStringRequestBody = None) -> list[dict] | str:
5702
5702
  """Retrieve a list of all solution blueprint elements
5703
5703
  https://egeria-project.org/concepts/actor
5704
5704
  """
5705
- 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)
5705
+ return self.find_solution_roles("*", classification_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, report_spec, body)
5706
5706
 
5707
5707
 
5708
5708
  async def _async_get_solution_roles_by_name(self, search_filter: str, body: dict = None, start_from: int = 0,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyegeria
3
- Version: 5.4.7.8
3
+ Version: 5.4.8
4
4
  Summary: A python client for Egeria
5
5
  Author-email: Dan Wolfson <dan.wolfson@pdr-associates.com>
6
6
  License-Expression: Apache-2.0
@@ -19,7 +19,7 @@ Requires-Dist: jupyter
19
19
  Requires-Dist: click
20
20
  Requires-Dist: trogon
21
21
  Requires-Dist: mermaid-py
22
- Requires-Dist: psycopg2-binary
22
+ Requires-Dist: psycopg2-binary>=2.9.11
23
23
  Requires-Dist: jupyter-notebook-parser
24
24
  Requires-Dist: loguru
25
25
  Requires-Dist: inflect
@@ -30,6 +30,9 @@ Requires-Dist: wcwidth
30
30
  Requires-Dist: altair
31
31
  Requires-Dist: modelcontextprotocol
32
32
  Requires-Dist: mcp>=1.15.0
33
+ Requires-Dist: markers>=0.3.0
34
+ Provides-Extra: test
35
+ Requires-Dist: pytest; extra == "test"
33
36
  Dynamic: license-file
34
37
 
35
38
  <!-- SPDX-License-Identifier: CC-BY-4.0 -->
@@ -57,6 +60,9 @@ to visualize and use Egeria. The commands also serve as useful examples.
57
60
 
58
61
  An examples folder holds some useful examples showing different facets of using pyegeria.
59
62
 
63
+ For detailed guidance on report formats (selection, dynamic loading, runtime registration, and migration from columns→attributes), see:
64
+ - examples/doc_samples/report_formats.md
65
+
60
66
  WARNING: files that start with "X" are in-progress placeholders that are not meant to be used..they will mature and
61
67
  evolve.
62
68
 
@@ -142,10 +148,34 @@ print(cfg.Logging.enable_logging)
142
148
  python scripts/validate_env.py --env config/env
143
149
  python scripts/validate_env.py # auto-detects ./config/env or ./.env
144
150
 
145
- - Run tests (requires Poetry):
151
+ ### Testing
152
+
153
+ By default, running pytest executes unit tests that use monkeypatching/fakes and do not contact a live Egeria.
154
+
155
+ - Run unit tests (recommended default):
146
156
  poetry install
147
157
  poetry run pytest -v
148
158
 
159
+ You can also run tests live against a local Egeria instance. Enable live mode with either a CLI flag or an environment variable. In live mode, tests marked as `unit` are skipped and live tests run using a real Client2 connection.
160
+
161
+ - Enable live mode via CLI:
162
+ poetry run pytest -q --live-egeria
163
+
164
+ - Or enable via environment variable:
165
+ PYEG_LIVE_EGERIA=1 poetry run pytest -q
166
+
167
+ Default live connection parameters (can be overridden via env):
168
+ - server_name = "qs-view-server" (override with PYEG_SERVER_NAME)
169
+ - platform_url = "https://localhost:9443" (override with PYEG_PLATFORM_URL)
170
+ - user_id = "peterprofile" (override with PYEG_USER_ID)
171
+ - user_pwd = "secret" (override with PYEG_USER_PWD)
172
+
173
+ Notes:
174
+ - SSL verification is controlled by pyegeria._globals.enable_ssl_check, which defaults to False in this repo to support localhost/self-signed certs.
175
+ - See tests/conftest.py for the live test fixtures and switches.
176
+
177
+ ### Troubleshooting
178
+
149
179
  ### Troubleshooting
150
180
 
151
181
  - If your env doesn’t seem to apply, confirm which config.json is used (the loader checks PYEGERIA_CONFIG_DIRECTORY first, then PYEGERIA_ROOT_PATH, then ./config.json).