pyegeria 5.4.0.20__py3-none-any.whl → 5.4.0.23__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 (121) hide show
  1. commands/cat/.DS_Store +0 -0
  2. commands/cat/.env +8 -0
  3. commands/cat/debug_log.log +0 -0
  4. commands/cat/list_collections.py +15 -6
  5. commands/cat/list_format_set.py +90 -85
  6. commands/cat/logs/pyegeria.log +136 -0
  7. commands/cli/debug_log.log +0 -0
  8. commands/ops/logs/pyegeria.log +0 -0
  9. md_processing/.DS_Store +0 -0
  10. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-30-37.md +163 -0
  11. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-35-58.md +474 -0
  12. md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +8 -0
  13. md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +873 -0
  14. md_processing/dr_egeria_inbox/arch_test.md +57 -0
  15. md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +254 -0
  16. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +696 -0
  17. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +254 -0
  18. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +298 -0
  19. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +608 -0
  20. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +94 -0
  21. md_processing/dr_egeria_inbox/archive/freddie_intro.md +284 -0
  22. md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +275 -0
  23. md_processing/dr_egeria_inbox/archive/test-term.md +110 -0
  24. md_processing/dr_egeria_inbox/cat_test.md +100 -0
  25. md_processing/dr_egeria_inbox/collections.md +39 -0
  26. md_processing/dr_egeria_inbox/data_designer_debug.log +6 -0
  27. md_processing/dr_egeria_inbox/data_designer_out.md +60 -0
  28. md_processing/dr_egeria_inbox/data_designer_search_test.md +11 -0
  29. md_processing/dr_egeria_inbox/data_field.md +54 -0
  30. md_processing/dr_egeria_inbox/data_spec.md +77 -0
  31. md_processing/dr_egeria_inbox/data_spec_test.md +2406 -0
  32. md_processing/dr_egeria_inbox/data_test.md +179 -0
  33. md_processing/dr_egeria_inbox/data_test2.md +429 -0
  34. md_processing/dr_egeria_inbox/data_test3.md +462 -0
  35. md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +124 -0
  36. md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +168 -0
  37. md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +280 -0
  38. md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +313 -0
  39. md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +1073 -0
  40. md_processing/dr_egeria_inbox/dr_egeria_isc1.md +44 -0
  41. md_processing/dr_egeria_inbox/generated_help_report.md +9 -0
  42. md_processing/dr_egeria_inbox/glossary_list.md +5 -0
  43. md_processing/dr_egeria_inbox/glossary_search_test.md +40 -0
  44. md_processing/dr_egeria_inbox/glossary_test1.md +324 -0
  45. md_processing/dr_egeria_inbox/gov_def.md +424 -0
  46. md_processing/dr_egeria_inbox/gov_def2.md +447 -0
  47. md_processing/dr_egeria_inbox/product.md +50 -0
  48. md_processing/dr_egeria_inbox/rel.md +8 -0
  49. md_processing/dr_egeria_inbox/sb.md +119 -0
  50. md_processing/dr_egeria_inbox/solution-components.md +136 -0
  51. md_processing/dr_egeria_inbox/solution_blueprints.md +118 -0
  52. md_processing/dr_egeria_inbox/synonym_test.md +42 -0
  53. md_processing/dr_egeria_inbox/t2.md +268 -0
  54. md_processing/dr_egeria_outbox/.obsidian/app.json +1 -0
  55. md_processing/dr_egeria_outbox/.obsidian/appearance.json +1 -0
  56. md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +6 -0
  57. md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +31 -0
  58. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +10 -0
  59. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +4459 -0
  60. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +10 -0
  61. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +3 -0
  62. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +153 -0
  63. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +11 -0
  64. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +1 -0
  65. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +500 -0
  66. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +12 -0
  67. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +1 -0
  68. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +37 -0
  69. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +11 -0
  70. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +220 -0
  71. md_processing/dr_egeria_outbox/.obsidian/types.json +28 -0
  72. md_processing/dr_egeria_outbox/.obsidian/workspace.json +220 -0
  73. md_processing/dr_egeria_outbox/Untitled.canvas +1 -0
  74. md_processing/dr_egeria_outbox/friday/processed-2025-07-18 15:00-product.md +62 -0
  75. md_processing/dr_egeria_outbox/friday/processed-2025-07-18 15:13-product.md +62 -0
  76. md_processing/dr_egeria_outbox/friday/processed-2025-07-20 13:23-product.md +47 -0
  77. md_processing/dr_egeria_outbox/friday/processed-2025-08-01 11:55-data_test3.md +503 -0
  78. md_processing/dr_egeria_outbox/monday/processed-2025-07-14 12:38-data_designer_out.md +663 -0
  79. md_processing/dr_egeria_outbox/monday/processed-2025-07-21 10:52-generated_help_report.md +2744 -0
  80. md_processing/dr_egeria_outbox/monday/processed-2025-07-21 18:38-collections.md +62 -0
  81. md_processing/dr_egeria_outbox/monday/processed-2025-08-01 11:34-gov_def.md +444 -0
  82. md_processing/dr_egeria_outbox/processed-2025-08-03 16:05-glossary_list.md +37 -0
  83. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 14:55-product.md +77 -0
  84. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:05-product.md +75 -0
  85. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:11-product.md +74 -0
  86. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 20:40-collections.md +49 -0
  87. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +719 -0
  88. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +41 -0
  89. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +33 -0
  90. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +192 -0
  91. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +486 -0
  92. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +486 -0
  93. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +486 -0
  94. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +486 -0
  95. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +486 -0
  96. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +486 -0
  97. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +486 -0
  98. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-16 19:15-gov_def2.md +527 -0
  99. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 12:08-gov_def2.md +527 -0
  100. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 14:27-gov_def2.md +485 -0
  101. md_processing/md_processing_utils/debug_log.log +0 -0
  102. md_processing/md_processing_utils/solution_architect_log.log +0 -0
  103. pyegeria/.DS_Store +0 -0
  104. pyegeria/__init__.py +2 -2
  105. pyegeria/_client_new.py +392 -98
  106. pyegeria/_exceptions_new.py +16 -13
  107. pyegeria/_output_format_models.py +22 -17
  108. pyegeria/_output_formats.py +107 -34
  109. pyegeria/collection_manager.py +703 -1429
  110. pyegeria/collection_manager_omvs.py +48 -19
  111. pyegeria/egeria_cat_client.py +1 -1
  112. pyegeria/egeria_client.py +6 -0
  113. pyegeria/egeria_tech_client.py +6 -1
  114. pyegeria/governance_officer.py +2515 -0
  115. pyegeria/models.py +23 -6
  116. pyegeria/output_formatter.py +298 -79
  117. {pyegeria-5.4.0.20.dist-info → pyegeria-5.4.0.23.dist-info}/METADATA +1 -1
  118. {pyegeria-5.4.0.20.dist-info → pyegeria-5.4.0.23.dist-info}/RECORD +121 -19
  119. {pyegeria-5.4.0.20.dist-info → pyegeria-5.4.0.23.dist-info}/LICENSE +0 -0
  120. {pyegeria-5.4.0.20.dist-info → pyegeria-5.4.0.23.dist-info}/WHEEL +0 -0
  121. {pyegeria-5.4.0.20.dist-info → pyegeria-5.4.0.23.dist-info}/entry_points.txt +0 -0
@@ -114,12 +114,15 @@ def print_bullet_list(items)->Text:
114
114
  def flatten_dict_to_string(d: dict) -> str:
115
115
  """Flatten a dictionary into a string and replace quotes with backticks."""
116
116
  try:
117
- flat_string = "\n\t".join(
118
- # Change replace(\"'\", '`') to replace("'", '`')
119
- f"\t* {key}=`{str(value).replace('\"', '`').replace("'", '`')}`"
120
- for key, value in d.items()
121
- )
122
- return flat_string
117
+ if d:
118
+ flat_string = "\n\t".join(
119
+ # Change replace(\"'\", '`') to replace("'", '`')
120
+ f"\t* {key}=`{str(value).replace('\"', '`').replace("'", '`')}`"
121
+ for key, value in d.items()
122
+ )
123
+ return flat_string
124
+ else:
125
+ return ""
123
126
  except Exception as e:
124
127
  # Corrected syntax for exception chaining
125
128
  raise Exception("Error flattening dictionary") from e
@@ -380,17 +383,17 @@ def print_basic_exception(e: PyegeriaException):
380
383
  if isinstance(e, PyegeriaException):
381
384
  table.add_row("HTTP Code", str(e.response_code))
382
385
  table.add_row("Egeria Code", str(related_code))
383
- table.add_row("Caller Method", e.context.get("caller method", "---"))
386
+ table.add_row("Caller Method", e.context.get("caller method", "---")) if e.context else ""
384
387
  table.add_row("Request URL", str(e.response_url))
385
388
  table.add_row("Egeria Message",
386
- format_dict_to_string(related_response.get('exceptionErrorMessage',"")))
389
+ format_dict_to_string(related_response.get('exceptionErrorMessage',"")) if isinstance(related_response,dict) else related_response)
387
390
  table.add_row("Egeria User Action",
388
- format_dict_to_string(related_response.get('exceptionUserAction',"")))
391
+ format_dict_to_string(related_response.get('exceptionUserAction',"")) if isinstance(related_response,dict) else related_response)
389
392
 
390
- exception_msg_id = related_response.get("exceptionErrorMessageId", None)
393
+ exception_msg_id = related_response.get("exceptionErrorMessageId", None) if isinstance(related_response,dict) else related_response
391
394
  table.add_row("Pyegeria Exception", exception_msg_id)
392
- table.add_row("Pyegeria Message",
393
- f"\n\t{e.error_details['message_template'].format(exception_msg_id)}\n")
395
+ table.add_row("Pyegeria Message", e.message)
396
+ console.print(table)
394
397
 
395
398
 
396
399
  console.print(table)
@@ -408,7 +411,7 @@ def print_validation_error(e: ValidationError):
408
411
 
409
412
  for error in e.errors():
410
413
  error_type = error["type"]
411
- attribute = " ".join(error["loc"])
414
+ attribute = " ".join(str(part) for part in error["loc"])
412
415
  message = error["msg"]
413
416
  table.add_row(error_type, attribute, message)
414
417
 
@@ -175,14 +175,16 @@ class FormatSet(BaseModel):
175
175
  aliases: Alternative names that can be used to reference this format set
176
176
  annotations: Additional metadata, like wiki links
177
177
  formats: A list of format configurations
178
- action: Optional actions associated with the format set
178
+ action: Optional action associated with the format set
179
+ get_additional_props: Optional action used to retrieve additional properties for a format set
179
180
  """
180
181
  heading: str
181
182
  description: str
182
183
  aliases: List[str] = Field(default_factory=list)
183
184
  annotations: Dict[str, List[str]] = Field(default_factory=dict)
184
185
  formats: List[Union[Format, Dict[str, Any]]]
185
- action: Optional[List[Union[ActionParameter, Dict[str, Any]]]] = None
186
+ action: Optional[Union[ActionParameter, Dict[str, Any]]] = None
187
+ get_additional_props: Optional[Union[ActionParameter, Dict[str, Any]]] = None
186
188
 
187
189
  @validator('formats', pre=True)
188
190
  def validate_formats(cls, v):
@@ -195,18 +197,20 @@ class FormatSet(BaseModel):
195
197
  result.append(item)
196
198
  return result
197
199
 
198
- @validator('action', pre=True)
199
- def validate_action(cls, v):
200
- """Convert dictionary actions to ActionParameter objects."""
200
+ @validator('action', 'get_additional_props', pre=True)
201
+ def validate_action_like(cls, v):
202
+ """Convert dictionary action-like fields to ActionParameter objects. Accepts legacy list shape."""
201
203
  if v is None:
202
204
  return None
203
- result = []
204
- for item in v:
205
- if isinstance(item, dict):
206
- result.append(ActionParameter(**item))
207
- else:
208
- result.append(item)
209
- return result
205
+ # Backward compatibility: if a list is provided, use the first element
206
+ if isinstance(v, list):
207
+ if not v:
208
+ return None
209
+ logger.warning("FormatSet.action/get_additional_props provided as a list; coercing first element to dict. This shape is deprecated.")
210
+ v = v[0]
211
+ if isinstance(v, dict):
212
+ return ActionParameter(**v)
213
+ return v
210
214
 
211
215
  def dict(self, *args, **kwargs):
212
216
  """Override dict method to convert nested objects back to dictionaries."""
@@ -215,11 +219,12 @@ class FormatSet(BaseModel):
215
219
  format if isinstance(format, dict) else format.dict()
216
220
  for format in self.formats
217
221
  ]
218
- if self.action:
219
- result['action'] = [
220
- action if isinstance(action, dict) else action.dict()
221
- for action in self.action
222
- ]
222
+ if self.action is not None:
223
+ result['action'] = self.action if isinstance(self.action, dict) else self.action.dict()
224
+ if self.get_additional_props is not None:
225
+ result['get_additional_props'] = (
226
+ self.get_additional_props if isinstance(self.get_additional_props, dict) else self.get_additional_props.dict()
227
+ )
223
228
  return result
224
229
 
225
230
  def get(self, key, default=None):
@@ -70,9 +70,11 @@ from pathlib import Path
70
70
  from typing import Dict, List, Optional, Union, Any
71
71
  from loguru import logger
72
72
 
73
- from pyegeria._output_format_models import Column, Format, ActionParameter, FormatSet, FormatSetDict, save_format_sets_to_json, load_format_sets_from_json
73
+ from pyegeria._output_format_models import (Column, Format, ActionParameter, FormatSet, FormatSetDict,
74
+ save_format_sets_to_json, load_format_sets_from_json)
74
75
  from pyegeria.load_config import get_app_config
75
76
 
77
+
76
78
  # Get the configured value for the user format sets directory
77
79
  app_config = get_app_config()
78
80
  USER_FORMAT_SETS_DIR = os.path.expanduser(app_config.Environment.pyegeria_user_format_sets_dir)
@@ -90,6 +92,7 @@ COMMON_COLUMNS = [
90
92
 
91
93
  COMMON_METADATA_COLUMNS = [
92
94
  Column(name='GUID', key='guid', format=True),
95
+ Column(name='Type Name', key='type_name'),
93
96
  Column(name='Metadata Collection ID', key='metadata_collection_id', format=True),
94
97
  Column(name='Metadata Collection Name', key='metadata_collection_name', format=True),
95
98
  ]
@@ -120,6 +123,8 @@ COMMON_FORMATS_ALL = Format(
120
123
 
121
124
 
122
125
  COLLECTIONS_COLUMNS = COMMON_COLUMNS + [
126
+ Column(name='Type Name', key='type_name'),
127
+ Column(name='Classifications', key='classifications'),
123
128
  Column(name="Created By", key='created_by'),
124
129
  Column(name="Create Time", key='create_time'),
125
130
  Column(name="Updated By", key='updated_by'),
@@ -127,23 +132,36 @@ COLLECTIONS_COLUMNS = COMMON_COLUMNS + [
127
132
  ]
128
133
 
129
134
  COLLECTIONS_MEMBERS_COLUMNS = COLLECTIONS_COLUMNS + [
130
- Column(name="Members", key='members'),
135
+ Column(name="Containing Members", key='collection_members'),
136
+ Column(name="Member Of", key='member_of_collections')
131
137
  ]
132
138
 
133
139
  COLLECTION_DICT = Format(
134
140
  types=["DICT"],
135
- columns=COLLECTIONS_COLUMNS,
141
+ columns=COLLECTIONS_MEMBERS_COLUMNS + [
142
+ Column(name="GUID", key='GUID'),
143
+ ],
144
+ )
145
+
146
+ COLLECTION_REPORT = Format(
147
+ types=["REPORT"],
148
+ columns=COLLECTIONS_MEMBERS_COLUMNS + [
149
+ Column(name="GUID", key='GUID'),
150
+ Column(name="Mermaid", key='mermaid'),
151
+ ],
136
152
  )
137
153
 
138
154
  COLLECTION_TABLE = Format(
139
155
  types=["TABLE"],
140
- columns=COMMON_COLUMNS,
156
+ columns=COLLECTIONS_MEMBERS_COLUMNS,
141
157
  )
142
158
 
143
159
  GOVERNANCE_DEFINITIONS_COLUMNS = COMMON_COLUMNS + [
144
- Column(name="Document Identifier", key='document_identifier'),
145
- Column(name="Title", key='title'),
160
+ Column(name="Summary", key='summary'),
161
+ Column(name="Usage", key='usage'),
162
+ Column(name="Importance", key='importance'),
146
163
  Column(name="Scope", key='scope'),
164
+ Column(name="Type", key='type_name'),
147
165
  ]
148
166
 
149
167
  COMMON_ANNOTATIONS = {
@@ -152,6 +170,29 @@ COMMON_ANNOTATIONS = {
152
170
 
153
171
  # Modularized output_format_sets
154
172
  output_format_sets = FormatSetDict({
173
+ "Default": FormatSet(
174
+ heading="Default Base Attributes",
175
+ description="Was a valid combination of output_format_set and output_format provided?",
176
+ annotations={}, # No specific annotations
177
+ formats=[
178
+ Format(
179
+ types=["ALL"],
180
+ columns=COMMON_COLUMNS + COMMON_METADATA_COLUMNS + [
181
+ Column(name='Version Identifier', key='version_identifier'),
182
+ Column(name="Classifications", key='classifications'),
183
+ Column(name="Additional Properties", key='additional_properties'),
184
+ Column(name="Created By", key='created_by'),
185
+ Column(name="Create Time", key='create_time'),
186
+ Column(name="Updated By", key='updated_by'),
187
+ Column(name="Update Time", key='update_time'),
188
+ Column(name="Effective From", key='effective_from'),
189
+ Column(name="Effective To", key='effective_to'),
190
+ Column(name="Version", key='version'),
191
+ Column(name="Open Metadata Type Name", key='type_name'),
192
+ ],
193
+ )
194
+ ],
195
+ ),
155
196
  "Referenceable": FormatSet(
156
197
  heading="Common Attributes",
157
198
  description="Attributes that apply to all Referenceables.",
@@ -205,12 +246,12 @@ output_format_sets = FormatSetDict({
205
246
  aliases=["Collection", "RootCollection", "Folder", "ReferenceList", "HomeCollection",
206
247
  "ResultSet", "RecentAccess", "WorkItemList", "Namespace"],
207
248
  annotations=COMMON_ANNOTATIONS,
208
- formats=[COLLECTION_DICT, COLLECTION_TABLE, COMMON_FORMATS_ALL], # Reusing common formats
209
- action=[ActionParameter(
249
+ formats=[COLLECTION_DICT, COLLECTION_TABLE, COLLECTION_REPORT, COMMON_FORMATS_ALL], # Reusing common formats
250
+ action=ActionParameter(
210
251
  function="CollectionManager.find_collections",
211
252
  user_params=["search_string"],
212
253
  spec_params={},
213
- )]
254
+ )
214
255
  ),
215
256
 
216
257
  "CollectionMembers": FormatSet(
@@ -219,11 +260,11 @@ output_format_sets = FormatSetDict({
219
260
  aliases=["CollectionMember", "Member", "Members"],
220
261
  annotations= {"wikilinks": ["[[CollectionMembers]]"]},
221
262
  formats = [COLLECTION_DICT, COLLECTION_TABLE],
222
- action=[ActionParameter(
263
+ action=ActionParameter(
223
264
  function="CollectionManager.get_collection_members",
224
265
  user_params=["collection_guid"],
225
266
  spec_params={"output_format": "DICT"},
226
- )]
267
+ )
227
268
  ),
228
269
  "DigitalProducts": FormatSet(
229
270
  heading="Digital Product Information",
@@ -232,7 +273,7 @@ output_format_sets = FormatSetDict({
232
273
  annotations={},
233
274
  formats=[
234
275
  Format(
235
- types=["REPORT"],
276
+ types=["REPORT", "DICT", "TABLE"],
236
277
  columns=COMMON_COLUMNS + [
237
278
  Column(name="Status", key='status'),
238
279
  Column(name='Product Name', key='product_name'),
@@ -242,35 +283,65 @@ output_format_sets = FormatSetDict({
242
283
  Column(name='Next Version', key='next_version'),
243
284
  Column(name='Withdraw Date', key='withdraw_date'),
244
285
  Column(name='Members', key='members', format=True),
286
+ Column(name='Uses Products', key='uses_digital_products'),
287
+ Column(name='Used by Products', key='used_by_digital_products'),
245
288
  ],
246
289
  )
247
290
  ],
248
- action=[ActionParameter(
291
+ action=ActionParameter(
249
292
  function="CollectionManager.find_collections",
250
293
  user_params=["search_string"],
251
- spec_params={"classification_name": "DigitalProducts"},
252
- )]
294
+ spec_params={},
295
+ ),
296
+ get_additional_props=ActionParameter(
297
+ function="CollectionManager._extract_digital_product_properties",
298
+ user_params = [],
299
+ spec_params={},
300
+ )
253
301
  ),
254
302
 
255
303
  "Agreements": FormatSet(
256
304
  heading="General Agreement Information",
257
305
  description="Attributes generic to all Agreements.",
258
- aliases=["DataSharingAgreement"],
306
+ aliases=["DataSharingAgreement", "Agreement"],
259
307
  annotations={"wikilinks": ["[[Agreements]]", "[[Egeria]]"]},
260
- formats=[COMMON_FORMATS_ALL] # Reusing common formats and columns
308
+ formats=[
309
+ Format(
310
+ types=["REPORT", "DICT", "TABLE"],
311
+ columns=COMMON_COLUMNS + COMMON_HEADER_COLUMNS + [
312
+ Column(name='Identifier', key='identifier'),
313
+ Column(name='Support Level', key='support_level'),
314
+ Column(name='service Levels', key='service_levels'),
315
+ Column(name='Agreement Items', key='agreement_items', format=True),
316
+ Column(name='Members', key='members', format=True),
317
+ ]
318
+ )
319
+ ],
320
+ action=ActionParameter(
321
+ function="CollectionManager.find_collections",
322
+ user_params=["search_string"],
323
+ spec_params={"metadata_element_types": ["Agreement"]},
324
+ # spec_params={},
325
+ ),
326
+ get_additional_props=ActionParameter(
327
+ function="CollectionManager._extract_agreement_properties",
328
+ user_params=[],
329
+ spec_params={},
330
+ ),
261
331
  ),
262
332
 
333
+
263
334
  "DataDictionary": FormatSet(
264
335
  heading="Data Dictionary Information",
265
336
  description="Attributes useful to Data Dictionary.",
266
337
  aliases=["Data Dict", "Data Dictionary"],
267
338
  annotations={"wikilinks": ["[[Data Dictionary]]"]},
268
339
  formats=[COMMON_FORMATS_ALL], # Reusing common formats and columns
269
- action=[ActionParameter(
340
+ action=ActionParameter(
270
341
  function="CollectionManager.find_collections",
271
342
  user_params=["search_string"],
272
- spec_params={"classification_name": "DataDictionary"},
273
- )]
343
+ spec_params={"initial_classifications": "DataDictionary"},
344
+ )
274
345
  ),
275
346
 
276
347
  "Data Specification": FormatSet(
@@ -285,11 +356,11 @@ output_format_sets = FormatSetDict({
285
356
  Column(name="Mermaid", key='mermaid'),
286
357
  ]),
287
358
  Format(types=["ALL"], columns=COMMON_COLUMNS)], # Reusing common formats and columns
288
- action=[ActionParameter(
359
+ action=ActionParameter(
289
360
  function="CollectionManager.find_collections",
290
361
  user_params=["search_string"],
291
- spec_params={"classification_name": "DataSpec"},
292
- )]
362
+ spec_params={"initial_classifications": "DataSpec"},
363
+ )
293
364
  ),
294
365
 
295
366
  "DataStruct": FormatSet(
@@ -298,11 +369,11 @@ output_format_sets = FormatSetDict({
298
369
  aliases=["Data Structure", "DataStructures", "Data Structures", "Data Struct", "DataStructure"],
299
370
  annotations={"wikilinks": ["[[Data Structure]]"]},
300
371
  formats=[Format(types=["ALL"], columns=COMMON_COLUMNS)], # Reusing common formats and columns
301
- action=[ActionParameter(
372
+ action=ActionParameter(
302
373
  function="DataDesigner.find_data_structures",
303
374
  user_params=["search_string"],
304
375
  spec_params={},
305
- )]
376
+ )
306
377
  ),
307
378
 
308
379
  "DataField": FormatSet(
@@ -311,11 +382,11 @@ output_format_sets = FormatSetDict({
311
382
  aliases=["Data Field", "Data Fields", "DataFields"],
312
383
  annotations={"wikilinks": ["[[Data Field]]"]},
313
384
  formats=[Format(types=["ALL"], columns=COMMON_COLUMNS)], # Reusing common formats and columns
314
- action=[ActionParameter(
385
+ action=ActionParameter(
315
386
  function="DataDesigner.find_data_fields",
316
387
  user_params=["search_string"],
317
388
  spec_params={},
318
- )]
389
+ )
319
390
  ),
320
391
 
321
392
  "Mandy-DataStruct": FormatSet(
@@ -329,11 +400,11 @@ output_format_sets = FormatSetDict({
329
400
  Format(types=["REPORT","MERMAID", "HTML"], columns=[Column(name='Display Name', key='display_name'),
330
401
  Column(name='Mermaid', key='mermaid'),]),
331
402
  ],
332
- action=[ActionParameter(
403
+ action=ActionParameter(
333
404
  function="DataDesigner.find_data_structures",
334
405
  user_params=["search_string"],
335
406
  spec_params={"output_format":"DICT"},
336
- )]
407
+ )
337
408
  ),
338
409
 
339
410
  "Governance Definitions": FormatSet(
@@ -342,11 +413,11 @@ output_format_sets = FormatSetDict({
342
413
  aliases=["GovernanceDefinitions"],
343
414
  annotations={"wikilinks": ["[[Governance]]"]},
344
415
  formats=[Format(types=["ALL"], columns=GOVERNANCE_DEFINITIONS_COLUMNS)],
345
- action=[ActionParameter(
416
+ action=ActionParameter(
346
417
  function="GovernanceOfficer.find_governance_definitions",
347
- user_params=["search_filter"],
348
- spec_params={"output_format":"DICT"},
349
- )]
418
+ user_params=["search_string"],
419
+ spec_params={},
420
+ )
350
421
  ),
351
422
  })
352
423
 
@@ -390,7 +461,9 @@ def select_output_format_set(kind: str, output_type: str) -> dict | None:
390
461
  output_struct["annotations"] = element.annotations
391
462
  if element.action:
392
463
  # Convert ActionParameter to dictionary for backward compatibility
393
- output_struct["action"] = [action.dict() for action in element.action]
464
+ output_struct["action"] = element.action.dict()
465
+ if element.get_additional_props:
466
+ output_struct["get_additional_props"] = element.get_additional_props.dict()
394
467
 
395
468
  # If this was just a validation that the format set could be found then the output type is ANY - so just return.
396
469
  if output_type == "ANY":