pyegeria 5.4.8.8__py3-none-any.whl → 5.4.8.9__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.

Potentially problematic release.


This version of pyegeria might be problematic. Click here for more details.

md_processing/__init__.py CHANGED
@@ -32,7 +32,7 @@ from md_processing.md_commands.data_designer_commands import (process_data_field
32
32
  process_data_dict_upsert_command,
33
33
  process_data_structure_upsert_command)
34
34
 
35
- from md_processing.md_commands.feedback_commands import (process_add_comment_command, process_upsert_note_log_command,
35
+ from md_processing.md_commands.feedback_commands import (process_add_comment_command, process_journal_entry_command,
36
36
  process_upsert_note_command, process_attach_note_log_command,
37
37
  process_upsert_informal_tag_command, process_tag_element_command)
38
38
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "Command Specifications": {
3
- "exported": "Oct 29, 2025 at 10:57:59 AM",
3
+ "exported": "Oct 30, 2025 at 11:35:20 AM",
4
4
  "Create Comment": {
5
5
  "display_name": "Comment",
6
6
  "qn_prefix": "Comment",
@@ -54,7 +54,7 @@
54
54
  "default_value": "",
55
55
  "valid_values": "",
56
56
  "existing_element": "",
57
- "description": "The element the comment is attached to.",
57
+ "description": "The element the comment is attached to. To reply to a previous comment, you would use the ID of the previous comment as the associated element.",
58
58
  "qualified_name_pattern": "",
59
59
  "generated": false,
60
60
  "style": "Reference Name",
@@ -69,30 +69,6 @@
69
69
  "Journal Entry": ""
70
70
  }
71
71
  },
72
- {
73
- "Parent Comment": {
74
- "variable_name": "parent_comment",
75
- "inUpdate": true,
76
- "attr_labels": "Element",
77
- "examples": "",
78
- "default_value": "",
79
- "valid_values": "",
80
- "existing_element": "",
81
- "description": "The comment being replied to. If provided, the Associated Element will be ignored (this becomes the associated element).",
82
- "qualified_name_pattern": "",
83
- "generated": false,
84
- "style": "ID",
85
- "user_specified": true,
86
- "unique": false,
87
- "input_required": false,
88
- "isParent": false,
89
- "isAnchor": false,
90
- "min_cardinality": 1,
91
- "max_cardinality": 1,
92
- "level": "Basic",
93
- "Journal Entry": ""
94
- }
95
- },
96
72
  {
97
73
  "Comment Text": {
98
74
  "variable_name": "comment_text",
@@ -455,10 +431,10 @@
455
431
  }
456
432
  ]
457
433
  },
458
- "Create NoteLog": {
434
+ "Create Journal Entry": {
459
435
  "display_name": "NoteLog",
460
436
  "qn_prefix": "NoteLog",
461
- "alternate_names": "",
437
+ "alternate_names": "Note Log; Journal",
462
438
  "family": "Feedback Manager",
463
439
  "description": "Allows a sequence of notes to be attached to an associated element.",
464
440
  "verb": "Create",
@@ -476,21 +452,21 @@
476
452
  "Journal Entry": "",
477
453
  "Attributes": [
478
454
  {
479
- "Display Name": {
455
+ "Journal Name": {
480
456
  "variable_name": "display_name",
481
457
  "inUpdate": true,
482
- "attr_labels": "Name",
458
+ "attr_labels": "Name; Title",
483
459
  "examples": "",
484
460
  "default_value": "",
485
461
  "valid_values": "",
486
462
  "existing_element": "",
487
- "description": "Name of the NoteLog.",
463
+ "description": "Name of the NoteLog or Journal.",
488
464
  "qualified_name_pattern": "",
489
465
  "generated": false,
490
- "style": "Simple",
466
+ "style": "ID",
491
467
  "user_specified": true,
492
468
  "unique": false,
493
- "input_required": false,
469
+ "input_required": true,
494
470
  "isParent": false,
495
471
  "isAnchor": false,
496
472
  "min_cardinality": 0,
@@ -524,8 +500,8 @@
524
500
  }
525
501
  },
526
502
  {
527
- "Description": {
528
- "variable_name": "description",
503
+ "Journal Description": {
504
+ "variable_name": "journal_description",
529
505
  "inUpdate": true,
530
506
  "attr_labels": "",
531
507
  "examples": "",
@@ -547,6 +523,30 @@
547
523
  "Journal Entry": ""
548
524
  }
549
525
  },
526
+ {
527
+ "Note Entry": {
528
+ "variable_name": "note_entry",
529
+ "inUpdate": true,
530
+ "attr_labels": "Note; Journal Entry",
531
+ "examples": "",
532
+ "default_value": "",
533
+ "valid_values": "",
534
+ "existing_element": "",
535
+ "description": "The text of the journal entry.",
536
+ "qualified_name_pattern": "",
537
+ "generated": false,
538
+ "style": "Simple",
539
+ "user_specified": true,
540
+ "unique": false,
541
+ "input_required": true,
542
+ "isParent": false,
543
+ "isAnchor": false,
544
+ "min_cardinality": 1,
545
+ "max_cardinality": 1,
546
+ "level": "Basic",
547
+ "Journal Entry": ""
548
+ }
549
+ },
550
550
  {
551
551
  "URL": {
552
552
  "variable_name": "url",
@@ -885,7 +885,7 @@
885
885
  "Display Name": {
886
886
  "variable_name": "display_name",
887
887
  "inUpdate": true,
888
- "attr_labels": "Name",
888
+ "attr_labels": "Name; Title",
889
889
  "examples": "",
890
890
  "default_value": "",
891
891
  "valid_values": "",
@@ -909,7 +909,7 @@
909
909
  "NoteLog": {
910
910
  "variable_name": "note_log",
911
911
  "inUpdate": true,
912
- "attr_labels": "",
912
+ "attr_labels": "Journal",
913
913
  "examples": "",
914
914
  "default_value": "",
915
915
  "valid_values": "",
@@ -933,12 +933,12 @@
933
933
  "Description": {
934
934
  "variable_name": "description",
935
935
  "inUpdate": true,
936
- "attr_labels": "",
936
+ "attr_labels": "Text",
937
937
  "examples": "",
938
938
  "default_value": "",
939
939
  "valid_values": "",
940
940
  "existing_element": "",
941
- "description": "Description of the NoteLog.",
941
+ "description": "The text of the note..",
942
942
  "qualified_name_pattern": "",
943
943
  "generated": false,
944
944
  "style": "Simple",
@@ -45,7 +45,7 @@ from md_processing.md_commands.data_designer_commands import (process_data_spec_
45
45
  process_data_structure_upsert_command,
46
46
  process_data_class_upsert_command)
47
47
 
48
- from md_processing.md_commands.feedback_commands import (process_add_comment_command, process_upsert_note_log_command,
48
+ from md_processing.md_commands.feedback_commands import (process_add_comment_command, process_journal_entry_command,
49
49
  process_upsert_note_command, process_attach_note_log_command,
50
50
  process_upsert_informal_tag_command, process_tag_element_command)
51
51
 
@@ -124,8 +124,8 @@ def process_md_file(input_file: str, output_folder:str, directive: str, server:
124
124
 
125
125
  elif potential_command in ["Create Comment", "Update Comment"]:
126
126
  result = process_add_comment_command(client, current_block, directive)
127
- elif potential_command in ["Create NoteLog", "Update NoteLog"]:
128
- result = process_upsert_note_log_command(client, current_block, directive)
127
+ elif potential_command in ["Create Journal Entry"]:
128
+ result = process_journal_entry_command(client, current_block, directive)
129
129
  elif potential_command in ["Create Note", "Update Note"]:
130
130
  result = process_upsert_note_command(client, current_block, directive)
131
131
  elif potential_command in ["Link NoteLog", "Detach NoteLog"]:
@@ -64,7 +64,8 @@ def process_add_comment_command(egeria_client: EgeriaTech, txt: str, directive:
64
64
 
65
65
  attributes = parsed_output['attributes']
66
66
 
67
-
67
+ valid = parsed_output['valid']
68
+ exists = parsed_output['exists']
68
69
 
69
70
  qualified_name = parsed_output.get('qualified_name', None)
70
71
  guid = parsed_output.get('guid', None)
@@ -79,19 +80,18 @@ def process_add_comment_command(egeria_client: EgeriaTech, txt: str, directive:
79
80
  associated_element = attributes.get('Associated Element', {}).get('value', None)
80
81
  associated_element_guid = attributes.get('Associated Element', {}).get('guid', None)
81
82
  description = attributes.get('Comment Text', {}).get('value', None)
82
- comment_type = attributes.get('Comment Type', {}).get('value', None)
83
- parent_comment = attributes.get('Parent Comment', {}).get('value', None)
84
- parent_comment_guid = attributes.get('Parent Comment', {}).get('guid', None)
85
-
86
- if associated_element_guid is None and parent_comment_guid is None:
87
- valid = False
88
- msg = f"Validation failed for {command} - One of `Associated Element` or `Parent Comment` must be specified\n"
89
- logger.error(msg)
90
- print(msg)
91
- else:
92
- if description:
93
- valid = True
94
- exists = True
83
+ comment_type = attributes.get('Comment Type', {}).get('value', None).strip()
84
+
85
+
86
+ # if associated_element_guid is None and parent_comment_guid is None:
87
+ # valid = False
88
+ # msg = f"Validation failed for {command} - One of `Associated Element` or `Parent Comment` must be specified\n"
89
+ # logger.error(msg)
90
+ # print(msg)
91
+ # else:
92
+ # if description:
93
+ # valid = True
94
+ # exists = True
95
95
  #
96
96
 
97
97
  if directive == "display":
@@ -109,13 +109,14 @@ def process_add_comment_command(egeria_client: EgeriaTech, txt: str, directive:
109
109
  obj = "Comment"
110
110
  if comment_type not in COMMENT_TYPES:
111
111
  raise ValueError(f"Invalid comment type: {comment_type}")
112
- target_guid = parent_comment_guid if parent_comment_guid else associated_element_guid
112
+ # target_guid = parent_comment_guid if parent_comment_guid else associated_element_guid
113
113
  if qualified_name is None:
114
- qualified_name = egeria_client.make_feedback_qn("Comment",target_guid,display_name)
114
+ qualified_name = egeria_client.make_feedback_qn("Comment",associated_element_guid,display_name)
115
115
  # Set the property body for a glossary collection
116
116
  #
117
117
  prop_body = {
118
118
  "class": "CommentProperties",
119
+ "displayName": display_name,
119
120
  "qualifiedName": qualified_name,
120
121
  "description": description,
121
122
  "commentType": comment_type
@@ -165,20 +166,21 @@ def process_add_comment_command(egeria_client: EgeriaTech, txt: str, directive:
165
166
  return None
166
167
 
167
168
  else:
169
+
168
170
  body = set_create_body(object_type,attributes)
169
171
  body['class'] = "NewAttachmentRequestBody"
170
172
  body["properties"] = prop_body
171
173
  slim_body = body_slimmer(body)
172
- if parent_comment_guid:
173
- guid = egeria_client.add_comment_reply(element_guid = parent_comment_guid, body = slim_body)
174
- else:
175
- guid = egeria_client.add_comment_to_element(element_guid = associated_element_guid, body =slim_body)
174
+ # if parent_comment_guid:
175
+ # guid = egeria_client.add_comment_reply(element_guid = parent_comment_guid, body = slim_body)
176
+ # else:
177
+ guid = egeria_client.add_comment_to_element(element_guid = associated_element_guid, body =slim_body)
176
178
 
177
179
  if guid:
178
180
  update_element_dictionary(qualified_name, {
179
181
  'guid': guid, 'display_name': display_name
180
182
  })
181
- msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
183
+ msg = f"## ==> Created Element `{display_name}` with GUID {guid}\n\n___"
182
184
  logger.success(msg)
183
185
  print(Markdown(msg))
184
186
  return egeria_client.get_comment_by_guid(guid, output_format='MD', report_spec = "Comments-DrE")
@@ -196,10 +198,11 @@ def process_add_comment_command(egeria_client: EgeriaTech, txt: str, directive:
196
198
  else:
197
199
  return None
198
200
 
199
- def process_upsert_note_log_command(egeria_client: EgeriaTech, txt: str, directive: str = "display") -> Optional[str]:
201
+ def process_journal_entry_command(egeria_client: EgeriaTech, txt: str,
202
+ directive: str = "display") -> Optional[str]:
200
203
  """
201
- Processes a noteLog create or update object_action by extracting key attributes from the given text and applying
202
- this using the pyegeria function.
204
+ Creates or updates a journal entry. If the journal (NoteLog) doesn't exist, then it will be created. Each journal
205
+ entry is a note in a NoteLog.
203
206
 
204
207
  :param txt: A string representing the input cell to be processed for
205
208
  extracting glossary-related attributes.
@@ -227,10 +230,24 @@ def process_upsert_note_log_command(egeria_client: EgeriaTech, txt: str, directi
227
230
 
228
231
  attributes = parsed_output['attributes']
229
232
 
230
- display_name = attributes['Display Name'].get('value', None)
231
- description = attributes['Description'].get('value', None)
233
+ journal_name = attributes['Journal Name'].get('value', None)
234
+ journal_qn = attributes['Journal Name'].get('qualified_name', None)
235
+ journal_exists = attributes['Journal Name'].get('Exists', False)
236
+ note_entry = attributes['Note Entry'].get('value', None)
237
+ journal_description = attributes['Journal Description'].get('value', None)
238
+
232
239
  associated_element = attributes.get('Associated Element', {}).get('value', None)
233
- associated_element_guid = attributes.get('Associated Element', {}).get('guid', None)
240
+ associated_element_qn = attributes.get('Associated Element', {}).get('qualified_name', None)
241
+
242
+ if journal_exists is False:
243
+ qualified_name = None
244
+ journal_qn = None
245
+
246
+
247
+ if journal_name and note_entry:
248
+ valid = True
249
+ else:
250
+ valid = False
234
251
  #
235
252
 
236
253
  if directive == "display":
@@ -244,71 +261,29 @@ def process_upsert_note_log_command(egeria_client: EgeriaTech, txt: str, directi
244
261
 
245
262
  elif directive == "process":
246
263
  try:
247
- obj = "NoteLog"
248
-
249
- # Set the property body for a glossary collection
250
- #
251
- prop_body = set_element_prop_body(obj, qualified_name, attributes)
252
264
 
253
- if object_action == "Update":
254
- if not exists:
255
- msg = (f" Element `{display_name}` does not exist! Updating result document with Create "
256
- f"{object_action}\n")
257
- logger.error(msg)
258
- return update_a_command(txt, object_action, object_type, qualified_name, guid)
259
- elif not valid:
260
- msg = (" The input data is invalid and cannot be processed. \nPlease review")
265
+ if object_action == "Create":
266
+ if valid is False:
267
+ msg = "Journal name or Journal entry are missing."
261
268
  logger.error(msg)
269
+ print(msg)
262
270
  print(Markdown(f"==> Validation of {command} failed!!\n"))
263
- print(Markdown(msg))
264
- return None
265
- else:
266
- print(Markdown(
267
- f"==> Validation of {command} completed successfully! Proceeding to apply the changes.\n"))
268
-
269
-
270
- body = set_update_body(obj, attributes)
271
- body['properties'] = prop_body
272
-
273
- egeria_client.update_note_log(associated_element_guid, body)
274
-
275
- logger.success(f"Updated {object_type} `{display_name}` with GUID {guid}\n\n___")
276
- update_element_dictionary(qualified_name, {
277
- 'guid': guid, 'display_name': display_name
278
- })
279
- return egeria_client.get_note_logs_by_name(filter = qualified_name, element_type="NoteLog",
280
- output_format='MD', report_spec = "NoteLog-DrE")
281
-
282
-
283
- elif object_action == "Create":
284
- if valid is False and exists:
285
- msg = (f"NoteLog `{display_name}` already exists and result document updated changing "
286
- f"`Create` to `Update` in processed output\n\n___")
287
- logger.error(msg)
288
- return update_a_command(txt, object_action, object_type, qualified_name, guid)
289
- elif not valid:
290
- msg = ("The input data is invalid and cannot be processed. \nPlease review")
291
- logger.error(msg)
292
- print(Markdown(f"==> Validation of {command} failed!!\n"))
293
- print(Markdown(msg))
294
271
  return None
295
272
 
296
273
  else:
297
- body = set_create_body(object_type,attributes)
298
274
 
299
- body["properties"] = prop_body
300
- slim_body = body_slimmer(body)
301
- guid = egeria_client.create_note_log(associated_element_guid, slim_body)
302
- if guid:
303
- update_element_dictionary(qualified_name, {
304
- 'guid': guid, 'display_name': display_name
305
- })
306
- msg = f"Created Element `{display_name}` with GUID {guid}\n\n___"
275
+ note_guid = egeria_client.add_journal_entry(note_log_qn = journal_qn,
276
+ element_qn = associated_element_qn,
277
+ note_log_display_name = journal_name,
278
+ note_entry = note_entry )
279
+ if note_guid:
280
+ msg = f"Created entry in `{journal_name}` with GUID {note_guid}\n\n___"
307
281
  logger.success(msg)
308
- return egeria_client.get_note_logs_by_name(filter = qualified_name, element_type="NoteLog",
309
- output_format='MD', report_spec = "NoteLog-DrE")
282
+ print(Markdown(msg))
283
+ return egeria_client.get_note_by_guid(note_guid,
284
+ output_format='MD', report_spec = "Journal-Entry-DrE")
310
285
  else:
311
- msg = f"Failed to create element `{display_name}` with GUID {guid}\n\n___"
286
+ msg = f"Failed to create entry for `{journal_name}`\n\n___"
312
287
  logger.error(msg)
313
288
  return None
314
289
 
@@ -572,8 +572,8 @@ def add_note_in_dr_e(client: Client2, qualified_name: str, display_name: str, jo
572
572
  note_log_qn = f"{qualified_name}-NoteLog"
573
573
  note_log_display_name = f"{display_name}-NoteLog"
574
574
  note_display_name = f"{qualified_name}-Journal-Entry-{datetime.now().strftime('%Y-%m-%d %H:%M')}"
575
- journal_entry_guid = client.add_journal_entry(note_log_qn, qualified_name, note_log_display_name, note_display_name,
576
- journal_entry)
575
+ journal_entry_guid = client.add_journal_entry(note_log_qn, qualified_name, note_log_display_name,
576
+ note_display_name, journal_entry)
577
577
  logger.info(f"Added journal entry `{journal_entry_guid}` to `{qualified_name}`")
578
578
  return journal_entry_guid
579
579
  else:
@@ -142,17 +142,21 @@ def extract_attribute(text: str, labels: List[str]) -> Optional[str]:
142
142
  Returns:
143
143
  The cleaned value of the attribute, or None if not found.
144
144
  """
145
+
146
+
145
147
  for label in labels:
146
- # Construct pattern for the current label
147
- pattern = rf"## {re.escape(label)}\n(.*?)(?=^##|\Z)" # Captures content until the next '##' or end of text
148
+ # Construct pattern for the current label - stops at next ##, ___ separator, or end of text
149
+ pattern = rf"## {re.escape(label)}\n(.*?)(?=^##|^_{3,}|\Z)"
148
150
  match = re.search(pattern, text, re.DOTALL | re.MULTILINE)
149
151
  if match:
150
152
  # Extract matched text
151
153
  extracted_text = match.group(1)
152
154
 
153
- # Remove lines starting with '>'
154
- filtered_lines = [line for line in extracted_text.splitlines() if not line.lstrip().startswith(">")]
155
-
155
+ # Remove lines starting with '>' and lines that are only underscores/whitespace
156
+ filtered_lines = [
157
+ line for line in extracted_text.splitlines()
158
+ if not line.lstrip().startswith(">") and not re.match(r'^\s*_+\s*$', line)
159
+ ]
156
160
  # Join the lines back, preserving single newlines
157
161
  cleaned_text = "\n".join(filtered_lines).strip()
158
162
 
@@ -6,10 +6,12 @@ import json
6
6
  import os
7
7
 
8
8
  import inflect
9
+ from loguru import logger
9
10
  from rich.markdown import Markdown
10
11
 
11
12
  from md_processing.md_processing_utils.message_constants import ERROR
12
13
  from pyegeria._globals import DEBUG_LEVEL
14
+ from pyegeria.logging_configuration import config_logging
13
15
 
14
16
  inflect_engine = inflect.engine()
15
17
 
@@ -167,7 +169,7 @@ COLLECTION_CREATE = ["Create Collection", "Update Collection", "Create Digital P
167
169
  "Update Digital Product Catalog",
168
170
  "Create Root Collection", "Update Root Collection", "Create Folder", "Update Folder",
169
171
  ]
170
- FEEDBACK_COMMANDS = ["Create Comment", "Update Comment", "Create NoteLog", "Update NoteLog", "Create Note", "Update Note",
172
+ FEEDBACK_COMMANDS = ["Create Comment", "Update Comment", "Create Journal Entry",
171
173
  "Create Informal Tag", "Update Informal Tag", "Tag Element"]
172
174
 
173
175
  command_list = ["Provenance", "Create Glossary", "Update Glossary", "Create Term", "Update Term", "List Terms",
@@ -263,9 +265,10 @@ command_seperator = Markdown("\n---\n")
263
265
  EXISTS_REQUIRED = "Exists Required"
264
266
  COMMAND_DEFINITIONS = {}
265
267
 
268
+ config_logging()
269
+ logger.enable("pyegeria")
266
270
  debug_level = DEBUG_LEVEL
267
271
 
268
-
269
272
  # def load_commands(filename: str) -> None:
270
273
  # global COMMAND_DEFINITIONS
271
274
  #
@@ -288,7 +291,8 @@ def load_commands(filename: str) -> None:
288
291
  # Validate JSON before attempting to load
289
292
  try:
290
293
  COMMAND_DEFINITIONS = json.loads(config_str)
291
- print(f"Successfully loaded {filename}")
294
+ msg = f"Successfully loaded {filename}"
295
+ logger.info(msg)
292
296
  except json.JSONDecodeError as json_err:
293
297
  # Provide detailed error information
294
298
  error_line = json_err.lineno
pyegeria/_client_new.py CHANGED
@@ -21,7 +21,7 @@ from pydantic import TypeAdapter
21
21
 
22
22
  from pyegeria._base_client import BaseClient
23
23
  from pyegeria._exceptions_new import (
24
- PyegeriaConnectionException, PyegeriaInvalidParameterException, PyegeriaException
24
+ PyegeriaConnectionException, PyegeriaInvalidParameterException, PyegeriaException, PyegeriaErrorCode
25
25
  )
26
26
  from pyegeria._globals import max_paging_size, NO_ELEMENTS_FOUND, default_time_out, COMMENT_TYPES
27
27
  from pyegeria.base_report_formats import get_report_spec_match
@@ -1317,7 +1317,6 @@ class Client2(BaseClient):
1317
1317
 
1318
1318
  def remove_comment_from_element(
1319
1319
  self,
1320
- element_guid: str,
1321
1320
  comment_guid: str,
1322
1321
  body: dict | DeleteElementRequestBody = None,
1323
1322
  cascade_delete: bool = False,
@@ -1330,8 +1329,6 @@ class Client2(BaseClient):
1330
1329
 
1331
1330
  Parameters
1332
1331
  ----------
1333
- element_guid: str
1334
- - unique id for the element
1335
1332
  comment_guid: str
1336
1333
  - unique id for the comment object
1337
1334
  body: dict | DeleteElementRequestBody, optional
@@ -1349,7 +1346,7 @@ class Client2(BaseClient):
1349
1346
  """
1350
1347
  loop = asyncio.get_event_loop()
1351
1348
  loop.run_until_complete(
1352
- self._async_remove_note_log(element_guid, body, cascade_delete=cascade_delete)
1349
+ self._async_remove_comment_from_element(comment_guid, body, cascade_delete=cascade_delete)
1353
1350
  )
1354
1351
 
1355
1352
  async def _async_get_comment_by_guid(
@@ -1794,6 +1791,7 @@ class Client2(BaseClient):
1794
1791
  "class": "NewAttachmentRequestBody",
1795
1792
  "properties": {
1796
1793
  "class": "NoteLogProperties",
1794
+ "typeName": "NoteLog",
1797
1795
  "displayName": display_name,
1798
1796
  "qualifiedName": self.make_feedback_qn("NoteLog", element_guid, display_name),
1799
1797
  "description": description,
@@ -1804,6 +1802,7 @@ class Client2(BaseClient):
1804
1802
  "class": "NewAElementRequestBody",
1805
1803
  "properties": {
1806
1804
  "class": "NoteLogProperties",
1805
+ "typeName": "NoteLog",
1807
1806
  "displayName": display_name,
1808
1807
  "qualifiedName": self.make_feedback_qn("NoteLog", element_guid, display_name),
1809
1808
  "description": description,
@@ -1817,7 +1816,7 @@ class Client2(BaseClient):
1817
1816
  if element_guid:
1818
1817
  url = f"{self.command_root}feedback-manager/elements/{element_guid}/note-logs"
1819
1818
  else:
1820
- url = f"{self.command_root}feedback-manager/elements/note-logs"
1819
+ url = f"{self.command_root}feedback-manager/note-logs"
1821
1820
  response = await self._async_make_request("POST", url, body_slimmer(body))
1822
1821
  return response.json()
1823
1822
 
@@ -2296,7 +2295,7 @@ class Client2(BaseClient):
2296
2295
  """
2297
2296
 
2298
2297
  url = f"{self.command_root}feedback-manager/note-logs/by-name"
2299
- response = await self._async_get_name_request(url, _type=element_type,
2298
+ response = await self._async_get_name_request(url, _type=element_type, filter=filter,
2300
2299
  _gen_output=self._generate_feedback_output, start_from=start_from,
2301
2300
  page_size=page_size, output_format=output_format,
2302
2301
  report_spec=report_spec,
@@ -2438,7 +2437,7 @@ class Client2(BaseClient):
2438
2437
 
2439
2438
  @dynamic_catch
2440
2439
  async def _async_create_note(self, note_log_guid: str, display_name: str = None, description: str = None,
2441
- body: dict | NewElementRequestBody = None) -> str:
2440
+ associated_element: str = None, body: dict | NewElementRequestBody = None) -> str:
2442
2441
  """
2443
2442
  Creates a new note for a note log and returns the unique identifier for it. Async version.
2444
2443
 
@@ -2450,6 +2449,8 @@ class Client2(BaseClient):
2450
2449
  - optional display name for the note
2451
2450
  description
2452
2451
  - optional description for the note
2452
+ associated_element: str, default is None
2453
+ - guid of the element to associate with the note - if provided, the note will be anchored to this element.
2453
2454
  body
2454
2455
  - optional body for the note
2455
2456
 
@@ -2501,10 +2502,11 @@ class Client2(BaseClient):
2501
2502
  }
2502
2503
 
2503
2504
  """
2505
+
2504
2506
  if body is None and display_name:
2505
2507
  body = {
2506
2508
  "class": "NewElementRequestBody",
2507
- "anchorGUID": note_log_guid,
2509
+ "anchorGUID": associated_element if associated_element else note_log_guid,
2508
2510
  "isOwnAnchor": False,
2509
2511
  "parentGUID": note_log_guid,
2510
2512
  "parentRelationshipTypeName": "AttachedNoteLogEntry",
@@ -2602,8 +2604,10 @@ class Client2(BaseClient):
2602
2604
  return response
2603
2605
 
2604
2606
  @dynamic_catch
2605
- async def _async_add_journal_entry(self, note_log_qn: str = None, element_qn: str = None, note_log_display_name: str = None, journal_entry_display_name: str = None, journal_entry_description: str = None,
2606
- body: dict | NewElementRequestBody = None ) -> str:
2607
+ async def _async_add_journal_entry(self, note_log_qn: str = None, element_qn: str = None,
2608
+ note_log_display_name: str = None, journal_entry_display_name: str = None,
2609
+ note_entry: str = None,
2610
+ body: dict | NewElementRequestBody = None) -> str:
2607
2611
  """
2608
2612
  Creates a new journal entry for a note log and returns the unique identifier for it. The note_log will be
2609
2613
  created if it does not exist. Async version.
@@ -2619,7 +2623,7 @@ class Client2(BaseClient):
2619
2623
  - optional note log display name
2620
2624
  journal_entry_display_name: str = None
2621
2625
  - optional journal entry display name
2622
- journal_entry_description: str = None
2626
+ note_entry: str = None
2623
2627
  - the journal entry text
2624
2628
 
2625
2629
  body
@@ -2683,24 +2687,29 @@ class Client2(BaseClient):
2683
2687
  if note_log_guid is None or note_log_guid == NO_ELEMENTS_FOUND:
2684
2688
  if element_qn is None:
2685
2689
  if note_log_display_name is None:
2686
- note_log_display_name = f"NoName-{datetime.now().strftime('%Y-%m-%d %H:%M')}"
2690
+ note_log_display_name = f"NoteLog-{datetime.now().strftime('%Y-%m-%d %H:%M')}"
2687
2691
 
2688
2692
  else:
2689
2693
  element_guid = await self._async_get_guid_for_name(element_qn, ["qualifiedName"])
2694
+ if element_guid is None or element_guid == NO_ELEMENTS_FOUND:
2695
+ context = { "reason" : "The specified associated element was not found"}
2696
+ raise PyegeriaException(error_code = PyegeriaErrorCode.VALIDATION_ERROR, context = context)
2690
2697
 
2691
2698
  note_log = await self._async_create_note_log(element_guid = element_guid, display_name = note_log_display_name)
2692
2699
  note_log_guid = note_log["guid"]
2693
2700
 
2694
2701
  # Create the Journal Entry (Note)
2702
+ if journal_entry_display_name is None:
2703
+ journal_entry_display_name = f"Note-{datetime.now().strftime('%Y-%m-%d %H:%M')}"
2695
2704
  journal_entry_guid = await self._async_create_note(note_log_guid, journal_entry_display_name,
2696
- journal_entry_description, body)
2705
+ note_entry, body)
2697
2706
 
2698
2707
  return journal_entry_guid
2699
2708
 
2700
2709
  @dynamic_catch
2701
2710
  def add_journal_entry(self, note_log_qn: str = None, element_qn: str = None,
2702
2711
  note_log_display_name: str = None, journal_entry_display_name: str = None,
2703
- journal_entry_description: str = None,
2712
+ note_entry: str = None,
2704
2713
  body: dict | NewElementRequestBody = None) -> str:
2705
2714
  """
2706
2715
  Creates a new journal entry for a note log and returns the unique identifier for it. The note_log will be
@@ -2717,7 +2726,7 @@ class Client2(BaseClient):
2717
2726
  - optional note log display name
2718
2727
  journal_entry_display_name: str = None
2719
2728
  - optional journal entry display name
2720
- journal_entry_description: str = None
2729
+ note_entry: str = None
2721
2730
  - the journal entry text
2722
2731
 
2723
2732
  body
@@ -2773,7 +2782,7 @@ class Client2(BaseClient):
2773
2782
  """
2774
2783
  loop = asyncio.get_event_loop()
2775
2784
  response = loop.run_until_complete(
2776
- self._async_add_journal_entry(note_log_qn, element_qn, note_log_display_name, journal_entry_display_name, journal_entry_description, body)
2785
+ self._async_add_journal_entry(note_log_qn, element_qn, note_log_display_name, journal_entry_display_name, note_entry, body)
2777
2786
  )
2778
2787
  return response
2779
2788
 
@@ -3563,9 +3572,9 @@ class Client2(BaseClient):
3563
3572
 
3564
3573
  url = f"{self.command_root}feedback-manager/tags/by-name"
3565
3574
 
3566
- response = await self._async_get_name_request(url, "InformalTag", self._generate_feedback_output,
3567
- tag_name, [], start_from,
3568
- page_size, output_format, report_spec)
3575
+ response = await self._async_get_name_request(url, self._generate_feedback_output, tag_name,
3576
+ None,start_from, page_size, output_format, report_spec
3577
+ )
3569
3578
  return response
3570
3579
 
3571
3580
  @dynamic_catch
@@ -4714,6 +4723,11 @@ class Client2(BaseClient):
4714
4723
  extra = self._extract_element_properties_for_keyword(element, columns_struct)
4715
4724
  col_data = overlay_additional_values(col_data, extra)
4716
4725
 
4726
+ note_logs = element.get("presentInNoteLogs", [])
4727
+ if note_logs != []:
4728
+ extra = self._extract_element_properties_for_notes( element, columns_struct)
4729
+ col_data = overlay_additional_values(col_data, extra)
4730
+
4717
4731
  return col_data
4718
4732
 
4719
4733
  @dynamic_catch
@@ -5667,3 +5681,46 @@ class Client2(BaseClient):
5667
5681
  get_additional_props_func=None,
5668
5682
  columns_struct=output_formats,
5669
5683
  )
5684
+
5685
+ def _extract_element_properties_for_keyword(self, element: dict, columns_struct: dict) -> dict:
5686
+ keyword_elements = None
5687
+ keyword_elements = element["keywordElements"]
5688
+ out_body = {}
5689
+ keyword = element["properties"].get('keyword', '')
5690
+ for el in keyword_elements:
5691
+ element = el.get("relatedElement", {})
5692
+ element_guid = element['elementHeader']['guid']
5693
+ element_type = element['elementHeader']['type']['typeName']
5694
+ element_display_name = element['properties'].get('displayName',"")
5695
+ element_description = element['properties'].get('description',"")
5696
+ element_category = element['properties'].get('category',"")
5697
+ out_body = {
5698
+ "element_display_name": element_display_name,
5699
+ "element_description": element_description,
5700
+ "element_category": element_category,
5701
+ "element_type": element_type,
5702
+ "element_guid": element_guid,
5703
+ "keyword": keyword
5704
+ }
5705
+ return out_body
5706
+
5707
+ def _extract_element_properties_for_notes(self, element: dict, columns_struct: dict):
5708
+ note_log_qualified_name = None
5709
+ note_log_guid = None
5710
+ note_log_display_name = None
5711
+ note_log_description = None
5712
+
5713
+ note_log_el = element.get("presentInNoteLogs",{})[0].get("relatedElement",None)
5714
+ if note_log_el:
5715
+ note_log_guid = note_log_el['elementHeader']['guid']
5716
+ note_log_display_name = note_log_el['properties'].get('displayName',"")
5717
+ note_log_qualified_name = note_log_el['properties']['qualifiedName']
5718
+ note_log_description = note_log_el['properties'].get('description',"")
5719
+
5720
+ return {
5721
+ "note_log_name": note_log_display_name,
5722
+ "note_log_description": note_log_description,
5723
+ "note_log_qualified_name": note_log_qualified_name,
5724
+ "note_log_guid": note_log_guid,
5725
+ }
5726
+
@@ -391,17 +391,25 @@ def print_basic_exception(e: PyegeriaException):
391
391
  table.add_column("Item", justify="left", width=80)
392
392
 
393
393
  if isinstance(e, PyegeriaException):
394
- table.add_row("HTTP Code", str(e.response_code))
395
- table.add_row("HTTP Reason", str(http_reason))
396
- table.add_row("Egeria Code", str(related_code))
397
- table.add_row("Caller Method", e.context.get("caller method", "---")) if e.context else ""
398
- table.add_row("Request URL", str(e.response_url))
399
- table.add_row("Egeria Message",
400
- format_dict_to_string(related_response.get('exceptionErrorMessage',"")) if isinstance(related_response,dict) else related_response)
401
- table.add_row("Egeria User Action",
402
- format_dict_to_string(related_response.get('exceptionUserAction',"")) if isinstance(related_response,dict) else related_response)
403
-
404
- exception_msg_id = related_response.get("exceptionErrorMessageId", None) if isinstance(related_response,dict) else related_response
394
+ if e.context:
395
+ table.add_row("Context", e.context.get('reason',""), style = "bold yellow")
396
+ if e.response:
397
+ table.add_row("HTTP Code", str(e.response_code))
398
+ table.add_row("HTTP Reason", str(http_reason))
399
+ table.add_row("Egeria Code", str(related_code))
400
+ table.add_row("Caller Method", e.context.get("caller method", "---")) if e.context else ""
401
+ table.add_row("Request URL", str(e.response_url))
402
+ if related_response:
403
+ if isinstance(related_response, dict):
404
+ table.add_row("Egeria Message",
405
+ format_dict_to_string(related_response.get('exceptionErrorMessage',"")))
406
+ elif isinstance(related_response, str):
407
+ table.add_row(related_response,)
408
+
409
+ table.add_row("Egeria User Action",
410
+ format_dict_to_string(related_response.get('exceptionUserAction',"")) if isinstance(related_response,dict) else related_response)
411
+
412
+ exception_msg_id = related_response.get("exceptionErrorMessageId", None) if isinstance(related_response,dict) else related_response
405
413
  table.add_row("Pyegeria Exception", exception_msg_id)
406
414
  table.add_row("Pyegeria Message", e.message)
407
415
  console.print(table)
pyegeria/_globals.py CHANGED
@@ -49,96 +49,105 @@ NO_COLLECTION_FOUND = "No collection found"
49
49
  NO_GUID_RETURNED = "No guid returned"
50
50
  NO_MEMBERS_FOUND = "No members found"
51
51
 
52
+ MERMAID_GRAPHS = ["anchorMermaidGraph", "informationSupplyChainMermaidGraph","fieldLevelLineageGraph",
53
+ "actionMermaidGraph", "localLineageGraph", "edgeMermaidGraph", "iscImplementationMermaidGraph",
54
+ "specificationMermaidGraph", "solutionBlueprintMermaidGraph","mermaidGraph",
55
+ "solutionSubcomponentMermaidGraph"]
56
+ MERMAID_GRAPH_TITLES = ["Anchor Mermaid Graph", "Information Supply Chain Mermaid Graph","Field Level Lineage Graph",
57
+ "Action Mermaid Graph", "Local Lineage Graph", "Edge Mermaid Graph", "ISC Implementation Mermaid Graph",
58
+ "Specification Mermaid Graph", "Solution Blueprint Mermaid Graph","Mermaid Graph",
59
+ "Solution Subcomponent Mermaid Graph"]
60
+
52
61
  #
53
- TEMPLATE_GUIDS['File System Directory'] = 'c353fd5d-9523-4a5e-a5e2-723ae490fe54'
54
- INTEGRATION_GUIDS['GeneralFilesMonitor'] = '1b98cdac-dd0a-4621-93db-99ef5a1098bc'
55
- INTEGRATION_GUIDS['OpenLineageFilePublisher'] = '6271b678-7d22-4cdf-87b1-45b366beaf4e'
56
- INTEGRATION_GUIDS['ContentPacksMonitor'] = '6bb2181e-7724-4515-ba3c-877cded55980'
57
- INTEGRATION_GUIDS['HarvestActivity'] = '856501d9-ec29-4e67-9cd7-120f53710ffa'
58
- INTEGRATION_GUIDS['SampleDataFilesMonitor'] = 'cd6479e1-2fe7-4426-b358-8a0cf70be117'
59
- TEMPLATE_GUIDS['CSV Data File'] = '13770f93-13c8-42be-9bb8-e0b1b1e52b1f'
60
- TEMPLATE_GUIDS['Keystore File'] = 'fbcfcc0c-1652-421f-b49b-c3e1c108768f'
61
- TEMPLATE_GUIDS['Unity Catalog Registered Model Version'] = '1364bfe7-8295-4e99-9243-8840aeac4cf1'
62
- TEMPLATE_GUIDS['Unity Catalog Server'] = 'dcca9788-b30f-4007-b1ac-ec634aff6879'
63
- INTEGRATION_GUIDS['UnityCatalogInsideCatalog'] = '74dde22f-2249-4ea3-af2b-b39e73f79b81'
64
- INTEGRATION_GUIDS['UnityCatalogServer'] = '06d068d9-9e08-4e67-8c59-073bbf1013af'
65
- TEMPLATE_GUIDS['Databricks Unity Catalog Server'] = '3f7f62f6-4abc-424e-9f92-523306e7d5d5'
66
- INTEGRATION_GUIDS['JDBC'] = '70dcd0b7-9f06-48ad-ad44-ae4d7a7762aa'
67
- TEMPLATE_GUIDS['Data File'] = '66d8dda9-00cf-4e59-938c-4b0583596b1e'
68
- TEMPLATE_GUIDS['Unity Catalog Catalog'] = '5ee006aa-a6d6-411b-9b8d-5f720c079cae'
69
- TEMPLATE_GUIDS['View Server'] = 'fd61ca01-390d-4aa2-a55d-426826aa4e1b'
70
- TEMPLATE_GUIDS['Archive File'] = '7578e504-d00f-406d-a194-3fc0a351cdf9'
71
- TEMPLATE_GUIDS['Executable File'] = '3d99a163-7a13-4576-a212-784010a8302a'
72
- INTEGRATION_GUIDS['OpenLineageAPIPublisher'] = '2156bc98-973a-4859-908d-4ccc96f53cc5'
73
- TEMPLATE_GUIDS['PostgreSQL Relational Database'] = '3d398b3f-7ae6-4713-952a-409f3dea8520'
74
- INTEGRATION_GUIDS['PostgreSQLDatabase'] = 'ef301220-7dfe-4c6c-bb9d-8f92d9f63823'
75
- TEMPLATE_GUIDS['Unity Catalog Table'] = '6cc1e5f5-4c1e-4290-a80e-e06643ffb13d'
76
- TEMPLATE_GUIDS['JSON Data File'] = 'c4836635-7e9e-446a-83b5-15e206b1aff3'
77
- TEMPLATE_GUIDS['File System'] = '522f228c-097c-4f90-9efc-26c1f2696f87'
78
- TEMPLATE_GUIDS['Source Code File'] = '9c7013ef-f29b-4b01-a8ea-5ea14f64c67a'
79
- TEMPLATE_GUIDS['Program File'] = '32d27e9c-1fdf-455a-ad2a-42b4d7d99108'
80
- TEMPLATE_GUIDS['Apple MacBook Pro'] = '32a9fd56-85c9-47fe-a211-9da3871bf4da'
81
- TEMPLATE_GUIDS['Build Instruction File'] = 'fbb2fa2e-8bcb-402e-9be7-5c6db9f2c504'
82
- TEMPLATE_GUIDS['Spreadsheet Data File'] = 'e4fabff5-2ba9-4050-9076-6ed917970b4c'
83
- TEMPLATE_GUIDS['UNIX File System'] = '27117270-8667-41d0-a99a-9118f9b60199'
84
- TEMPLATE_GUIDS['Video Data File'] = '93b2b722-ec0f-4da4-960a-b8d4922f8bf5'
85
- TEMPLATE_GUIDS['JDBC Endpoint'] = '3d79ce50-1887-4627-ad71-ba4649aba2bc'
86
- TEMPLATE_GUIDS['Unity Catalog Function'] = 'a490ba65-6104-4213-9be9-524e16fed8aa'
87
- TEMPLATE_GUIDS['Unity Catalog Registered Model'] = '0d762ec5-c1f5-4364-aa64-e7e00d27f837'
88
- TEMPLATE_GUIDS['PostgreSQL Relational Database Schema'] = '82a5417c-d882-4271-8444-4c6a996a8bfc'
89
- INTEGRATION_GUIDS['HarvestSurveys'] = 'fae162c3-2bfd-467f-9c47-2e3b63a655de'
90
- INTEGRATION_GUIDS['HarvestActivity'] = '856501d9-ec29-4e67-9cd7-120f53710ffa'
91
- INTEGRATION_GUIDS['HarvestOpenMetadata'] = 'f8bf326b-d613-4ece-a12e-a1423bc272d7'
92
- TEMPLATE_GUIDS['PostgreSQL Server'] = '542134e6-b9ce-4dce-8aef-22e8daf34fdb'
93
- INTEGRATION_GUIDS['PostgreSQLServer'] = '36f69fd0-54ba-4f59-8a44-11ccf2687a34'
94
- TEMPLATE_GUIDS['Audio Data File'] = '39b4b670-7f15-4744-a5ba-62e8edafbcee'
95
- TEMPLATE_GUIDS['Document File'] = 'eb6f728d-fa54-4350-9807-1199cbf96851'
96
- TEMPLATE_GUIDS['Engine Host'] = '1764a891-4234-45f1-8cc3-536af40c790d'
97
- TEMPLATE_GUIDS['Integration Daemon'] = '6b3516f0-dd13-4786-9601-07215f995197'
98
- TEMPLATE_GUIDS['XML Data File'] = 'ea67ae71-c674-473e-b38b-689879d2a7d9'
99
- TEMPLATE_GUIDS['Avro Data File'] = '9f5be428-058e-41dd-b506-3a222283b579'
100
- TEMPLATE_GUIDS['REST API Endpoint'] = '9ea4bff4-d193-492f-bcad-6e68c07c6f9e'
101
- TEMPLATE_GUIDS['Unity Catalog Schema'] = '5bf92b0f-3970-41ea-b0a3-aacfbf6fd92e'
102
- TEMPLATE_GUIDS['Unity Catalog Volume'] = '92d2d2dc-0798-41f0-9512-b10548d312b7'
103
- TEMPLATE_GUIDS['Parquet Data File'] = '7f6cd744-79c3-4d25-a056-eeb1a91574c3'
104
- TEMPLATE_GUIDS['File'] = 'ae3067c7-cc72-4a18-88e1-746803c2c86f'
105
- TEMPLATE_GUIDS['3D Image Data File'] = '0059ea2b-6292-4cac-aa6f-a80a605f1114'
106
- TEMPLATE_GUIDS['YAML File'] = '2221855b-2b64-4b45-a2ee-c40adc5e2a64'
107
- TEMPLATE_GUIDS['Apache Kafka Topic'] = 'ea8f81c9-c59c-47de-9525-7cc59d1251e5'
108
- INTEGRATION_GUIDS['OpenLineageKafkaListener'] = '980b989c-de78-4e6a-a58d-51049d7381bf'
109
- TEMPLATE_GUIDS['Script File'] = 'dbd5e6bb-1ff8-46f4-a007-fb0485f68c92'
110
- TEMPLATE_GUIDS['Apache Atlas Server'] = 'fe6dce45-a978-4417-ab55-17f05b8bcea7'
111
- INTEGRATION_GUIDS['ApacheAtlasServer'] = '5721627a-2dd4-4f95-a274-6cfb128edb97'
112
- TEMPLATE_GUIDS['Raster Data File'] = '47211156-f03f-4881-8526-015e695a3dac'
113
- TEMPLATE_GUIDS['Metadata Access Server'] = 'bd8de890-fa79-4c24-aab8-20b41b5893dd'
114
- TEMPLATE_GUIDS['Data Folder'] = '372a0379-7060-4c9d-8d84-bc709b31794c'
115
- INTEGRATION_GUIDS['MaintainDataFolderLastUpdateDate'] = 'fd26f07c-ae44-4bc5-b457-37b43112224f'
116
- INTEGRATION_GUIDS['OpenLineageFilePublisher'] = '6271b678-7d22-4cdf-87b1-45b366beaf4e'
117
- TEMPLATE_GUIDS['Properties File'] = '3b281111-a0ef-4fc4-99e7-9a0ef84a7636'
118
- TEMPLATE_GUIDS['Vector Data File'] = 'db1bec7f-55a9-40d3-91c0-a57b76d422e2'
119
- TEMPLATE_GUIDS['OMAG Server Platform'] = '9b06c4dc-ddc8-47ae-b56b-28775d3a96f0'
120
- INTEGRATION_GUIDS['OpenAPI'] = 'b89d9a5a-2ea6-49bc-a4fc-e7df9f3ca93e'
121
- INTEGRATION_GUIDS['OMAGServerPlatform'] = 'dee84e6e-7a96-4975-86c1-152fb3ab759b'
122
- TEMPLATE_GUIDS['Apache Kafka Server'] = '5e1ff810-5418-43f7-b7c4-e6e062f9aff7'
123
- INTEGRATION_GUIDS['KafkaTopic'] = 'fa1f711c-0b34-4b57-8e6e-16162b132b0c'
124
- INTEGRATION_GUIDS['OpenLineageAPIPublisher'] = '2156bc98-973a-4859-908d-4ccc96f53cc5'
125
- INTEGRATION_GUIDS['JDBCDatabaseCataloguer'] = '70dcd0b7-9f06-48ad-ad44-ae4d7a7762aa'
126
- INTEGRATION_GUIDS['ApacheKafkaCataloguer'] = 'fa1f711c-0b34-4b57-8e6e-16162b132b0c'
127
- INTEGRATION_GUIDS['FilesCataloguer'] = '1b98cdac-dd0a-4621-93db-99ef5a1098bc'
128
- INTEGRATION_GUIDS['UnityCatalogServerSynchronizer'] = '06d068d9-9e08-4e67-8c59-073bbf1013af'
129
- INTEGRATION_GUIDS['SampleDataCataloguer'] = 'cd6479e1-2fe7-4426-b358-8a0cf70be117'
130
- INTEGRATION_GUIDS['OpenLineageGovernanceActionPublisher'] = '206f8faf-04da-4b6f-8280-eeee3943afeb'
131
- INTEGRATION_GUIDS['OMAGServerPlatformCataloguer'] = 'dee84e6e-7a96-4975-86c1-152fb3ab759b'
132
- INTEGRATION_GUIDS['HarvestActivity'] = '856501d9-ec29-4e67-9cd7-120f53710ffa'
133
- INTEGRATION_GUIDS['MaintainLastUpdateDate'] = 'fd26f07c-ae44-4bc5-b457-37b43112224f'
134
- INTEGRATION_GUIDS['UnityCatalogInsideCatalogSynchronizer'] = '74dde22f-2249-4ea3-af2b-b39e73f79b81'
135
- INTEGRATION_GUIDS['OpenLineageKafkaListener'] = '980b989c-de78-4e6a-a58d-51049d7381bf'
136
- INTEGRATION_GUIDS['HarvestOpenMetadata'] = 'f8bf326b-d613-4ece-a12e-a1423bc272d7'
137
- INTEGRATION_GUIDS['OpenAPICataloguer'] = 'b89d9a5a-2ea6-49bc-a4fc-e7df9f3ca93e'
138
- INTEGRATION_GUIDS['OpenLineageFilePublisher'] = '6271b678-7d22-4cdf-87b1-45b366beaf4e'
139
- INTEGRATION_GUIDS['PostgreSQLServerCataloguer'] = '36f69fd0-54ba-4f59-8a44-11ccf2687a34'
140
- INTEGRATION_GUIDS['PostgreSQLDatabaseCataloguer'] = 'ef301220-7dfe-4c6c-bb9d-8f92d9f63823'
141
- INTEGRATION_GUIDS['ContentPacksCataloguer'] = '6bb2181e-7724-4515-ba3c-877cded55980'
142
- INTEGRATION_GUIDS['OpenLineageCataloguer'] = '3347ac71-8dd2-403a-bc16-75a71be64bd7'
143
- INTEGRATION_GUIDS['ApacheAtlasExchange'] = '5721627a-2dd4-4f95-a274-6cfb128edb97'
144
- INTEGRATION_GUIDS['HarvestSurveys'] = 'fae162c3-2bfd-467f-9c47-2e3b63a655de'
62
+ # TEMPLATE_GUIDS['File System Directory'] = 'c353fd5d-9523-4a5e-a5e2-723ae490fe54'
63
+ # INTEGRATION_GUIDS['GeneralFilesMonitor'] = '1b98cdac-dd0a-4621-93db-99ef5a1098bc'
64
+ # INTEGRATION_GUIDS['OpenLineageFilePublisher'] = '6271b678-7d22-4cdf-87b1-45b366beaf4e'
65
+ # INTEGRATION_GUIDS['ContentPacksMonitor'] = '6bb2181e-7724-4515-ba3c-877cded55980'
66
+ # INTEGRATION_GUIDS['HarvestActivity'] = '856501d9-ec29-4e67-9cd7-120f53710ffa'
67
+ # INTEGRATION_GUIDS['SampleDataFilesMonitor'] = 'cd6479e1-2fe7-4426-b358-8a0cf70be117'
68
+ # TEMPLATE_GUIDS['CSV Data File'] = '13770f93-13c8-42be-9bb8-e0b1b1e52b1f'
69
+ # TEMPLATE_GUIDS['Keystore File'] = 'fbcfcc0c-1652-421f-b49b-c3e1c108768f'
70
+ # TEMPLATE_GUIDS['Unity Catalog Registered Model Version'] = '1364bfe7-8295-4e99-9243-8840aeac4cf1'
71
+ # TEMPLATE_GUIDS['Unity Catalog Server'] = 'dcca9788-b30f-4007-b1ac-ec634aff6879'
72
+ # INTEGRATION_GUIDS['UnityCatalogInsideCatalog'] = '74dde22f-2249-4ea3-af2b-b39e73f79b81'
73
+ # INTEGRATION_GUIDS['UnityCatalogServer'] = '06d068d9-9e08-4e67-8c59-073bbf1013af'
74
+ # TEMPLATE_GUIDS['Databricks Unity Catalog Server'] = '3f7f62f6-4abc-424e-9f92-523306e7d5d5'
75
+ # INTEGRATION_GUIDS['JDBC'] = '70dcd0b7-9f06-48ad-ad44-ae4d7a7762aa'
76
+ # TEMPLATE_GUIDS['Data File'] = '66d8dda9-00cf-4e59-938c-4b0583596b1e'
77
+ # TEMPLATE_GUIDS['Unity Catalog Catalog'] = '5ee006aa-a6d6-411b-9b8d-5f720c079cae'
78
+ # TEMPLATE_GUIDS['View Server'] = 'fd61ca01-390d-4aa2-a55d-426826aa4e1b'
79
+ # TEMPLATE_GUIDS['Archive File'] = '7578e504-d00f-406d-a194-3fc0a351cdf9'
80
+ # TEMPLATE_GUIDS['Executable File'] = '3d99a163-7a13-4576-a212-784010a8302a'
81
+ # INTEGRATION_GUIDS['OpenLineageAPIPublisher'] = '2156bc98-973a-4859-908d-4ccc96f53cc5'
82
+ # TEMPLATE_GUIDS['PostgreSQL Relational Database'] = '3d398b3f-7ae6-4713-952a-409f3dea8520'
83
+ # INTEGRATION_GUIDS['PostgreSQLDatabase'] = 'ef301220-7dfe-4c6c-bb9d-8f92d9f63823'
84
+ # TEMPLATE_GUIDS['Unity Catalog Table'] = '6cc1e5f5-4c1e-4290-a80e-e06643ffb13d'
85
+ # TEMPLATE_GUIDS['JSON Data File'] = 'c4836635-7e9e-446a-83b5-15e206b1aff3'
86
+ # TEMPLATE_GUIDS['File System'] = '522f228c-097c-4f90-9efc-26c1f2696f87'
87
+ # TEMPLATE_GUIDS['Source Code File'] = '9c7013ef-f29b-4b01-a8ea-5ea14f64c67a'
88
+ # TEMPLATE_GUIDS['Program File'] = '32d27e9c-1fdf-455a-ad2a-42b4d7d99108'
89
+ # TEMPLATE_GUIDS['Apple MacBook Pro'] = '32a9fd56-85c9-47fe-a211-9da3871bf4da'
90
+ # TEMPLATE_GUIDS['Build Instruction File'] = 'fbb2fa2e-8bcb-402e-9be7-5c6db9f2c504'
91
+ # TEMPLATE_GUIDS['Spreadsheet Data File'] = 'e4fabff5-2ba9-4050-9076-6ed917970b4c'
92
+ # TEMPLATE_GUIDS['UNIX File System'] = '27117270-8667-41d0-a99a-9118f9b60199'
93
+ # TEMPLATE_GUIDS['Video Data File'] = '93b2b722-ec0f-4da4-960a-b8d4922f8bf5'
94
+ # TEMPLATE_GUIDS['JDBC Endpoint'] = '3d79ce50-1887-4627-ad71-ba4649aba2bc'
95
+ # TEMPLATE_GUIDS['Unity Catalog Function'] = 'a490ba65-6104-4213-9be9-524e16fed8aa'
96
+ # TEMPLATE_GUIDS['Unity Catalog Registered Model'] = '0d762ec5-c1f5-4364-aa64-e7e00d27f837'
97
+ # TEMPLATE_GUIDS['PostgreSQL Relational Database Schema'] = '82a5417c-d882-4271-8444-4c6a996a8bfc'
98
+ # INTEGRATION_GUIDS['HarvestSurveys'] = 'fae162c3-2bfd-467f-9c47-2e3b63a655de'
99
+ # INTEGRATION_GUIDS['HarvestActivity'] = '856501d9-ec29-4e67-9cd7-120f53710ffa'
100
+ # INTEGRATION_GUIDS['HarvestOpenMetadata'] = 'f8bf326b-d613-4ece-a12e-a1423bc272d7'
101
+ # TEMPLATE_GUIDS['PostgreSQL Server'] = '542134e6-b9ce-4dce-8aef-22e8daf34fdb'
102
+ # INTEGRATION_GUIDS['PostgreSQLServer'] = '36f69fd0-54ba-4f59-8a44-11ccf2687a34'
103
+ # TEMPLATE_GUIDS['Audio Data File'] = '39b4b670-7f15-4744-a5ba-62e8edafbcee'
104
+ # TEMPLATE_GUIDS['Document File'] = 'eb6f728d-fa54-4350-9807-1199cbf96851'
105
+ # TEMPLATE_GUIDS['Engine Host'] = '1764a891-4234-45f1-8cc3-536af40c790d'
106
+ # TEMPLATE_GUIDS['Integration Daemon'] = '6b3516f0-dd13-4786-9601-07215f995197'
107
+ # TEMPLATE_GUIDS['XML Data File'] = 'ea67ae71-c674-473e-b38b-689879d2a7d9'
108
+ # TEMPLATE_GUIDS['Avro Data File'] = '9f5be428-058e-41dd-b506-3a222283b579'
109
+ # TEMPLATE_GUIDS['REST API Endpoint'] = '9ea4bff4-d193-492f-bcad-6e68c07c6f9e'
110
+ # TEMPLATE_GUIDS['Unity Catalog Schema'] = '5bf92b0f-3970-41ea-b0a3-aacfbf6fd92e'
111
+ # TEMPLATE_GUIDS['Unity Catalog Volume'] = '92d2d2dc-0798-41f0-9512-b10548d312b7'
112
+ # TEMPLATE_GUIDS['Parquet Data File'] = '7f6cd744-79c3-4d25-a056-eeb1a91574c3'
113
+ # TEMPLATE_GUIDS['File'] = 'ae3067c7-cc72-4a18-88e1-746803c2c86f'
114
+ # TEMPLATE_GUIDS['3D Image Data File'] = '0059ea2b-6292-4cac-aa6f-a80a605f1114'
115
+ # TEMPLATE_GUIDS['YAML File'] = '2221855b-2b64-4b45-a2ee-c40adc5e2a64'
116
+ # TEMPLATE_GUIDS['Apache Kafka Topic'] = 'ea8f81c9-c59c-47de-9525-7cc59d1251e5'
117
+ # INTEGRATION_GUIDS['OpenLineageKafkaListener'] = '980b989c-de78-4e6a-a58d-51049d7381bf'
118
+ # TEMPLATE_GUIDS['Script File'] = 'dbd5e6bb-1ff8-46f4-a007-fb0485f68c92'
119
+ # TEMPLATE_GUIDS['Apache Atlas Server'] = 'fe6dce45-a978-4417-ab55-17f05b8bcea7'
120
+ # INTEGRATION_GUIDS['ApacheAtlasServer'] = '5721627a-2dd4-4f95-a274-6cfb128edb97'
121
+ # TEMPLATE_GUIDS['Raster Data File'] = '47211156-f03f-4881-8526-015e695a3dac'
122
+ # TEMPLATE_GUIDS['Metadata Access Server'] = 'bd8de890-fa79-4c24-aab8-20b41b5893dd'
123
+ # TEMPLATE_GUIDS['Data Folder'] = '372a0379-7060-4c9d-8d84-bc709b31794c'
124
+ # INTEGRATION_GUIDS['MaintainDataFolderLastUpdateDate'] = 'fd26f07c-ae44-4bc5-b457-37b43112224f'
125
+ # INTEGRATION_GUIDS['OpenLineageFilePublisher'] = '6271b678-7d22-4cdf-87b1-45b366beaf4e'
126
+ # TEMPLATE_GUIDS['Properties File'] = '3b281111-a0ef-4fc4-99e7-9a0ef84a7636'
127
+ # TEMPLATE_GUIDS['Vector Data File'] = 'db1bec7f-55a9-40d3-91c0-a57b76d422e2'
128
+ # TEMPLATE_GUIDS['OMAG Server Platform'] = '9b06c4dc-ddc8-47ae-b56b-28775d3a96f0'
129
+ # INTEGRATION_GUIDS['OpenAPI'] = 'b89d9a5a-2ea6-49bc-a4fc-e7df9f3ca93e'
130
+ # INTEGRATION_GUIDS['OMAGServerPlatform'] = 'dee84e6e-7a96-4975-86c1-152fb3ab759b'
131
+ # TEMPLATE_GUIDS['Apache Kafka Server'] = '5e1ff810-5418-43f7-b7c4-e6e062f9aff7'
132
+ # INTEGRATION_GUIDS['KafkaTopic'] = 'fa1f711c-0b34-4b57-8e6e-16162b132b0c'
133
+ # INTEGRATION_GUIDS['OpenLineageAPIPublisher'] = '2156bc98-973a-4859-908d-4ccc96f53cc5'
134
+ # INTEGRATION_GUIDS['JDBCDatabaseCataloguer'] = '70dcd0b7-9f06-48ad-ad44-ae4d7a7762aa'
135
+ # INTEGRATION_GUIDS['ApacheKafkaCataloguer'] = 'fa1f711c-0b34-4b57-8e6e-16162b132b0c'
136
+ # INTEGRATION_GUIDS['FilesCataloguer'] = '1b98cdac-dd0a-4621-93db-99ef5a1098bc'
137
+ # INTEGRATION_GUIDS['UnityCatalogServerSynchronizer'] = '06d068d9-9e08-4e67-8c59-073bbf1013af'
138
+ # INTEGRATION_GUIDS['SampleDataCataloguer'] = 'cd6479e1-2fe7-4426-b358-8a0cf70be117'
139
+ # INTEGRATION_GUIDS['OpenLineageGovernanceActionPublisher'] = '206f8faf-04da-4b6f-8280-eeee3943afeb'
140
+ # INTEGRATION_GUIDS['OMAGServerPlatformCataloguer'] = 'dee84e6e-7a96-4975-86c1-152fb3ab759b'
141
+ # INTEGRATION_GUIDS['HarvestActivity'] = '856501d9-ec29-4e67-9cd7-120f53710ffa'
142
+ # INTEGRATION_GUIDS['MaintainLastUpdateDate'] = 'fd26f07c-ae44-4bc5-b457-37b43112224f'
143
+ # INTEGRATION_GUIDS['UnityCatalogInsideCatalogSynchronizer'] = '74dde22f-2249-4ea3-af2b-b39e73f79b81'
144
+ # INTEGRATION_GUIDS['OpenLineageKafkaListener'] = '980b989c-de78-4e6a-a58d-51049d7381bf'
145
+ # INTEGRATION_GUIDS['HarvestOpenMetadata'] = 'f8bf326b-d613-4ece-a12e-a1423bc272d7'
146
+ # INTEGRATION_GUIDS['OpenAPICataloguer'] = 'b89d9a5a-2ea6-49bc-a4fc-e7df9f3ca93e'
147
+ # INTEGRATION_GUIDS['OpenLineageFilePublisher'] = '6271b678-7d22-4cdf-87b1-45b366beaf4e'
148
+ # INTEGRATION_GUIDS['PostgreSQLServerCataloguer'] = '36f69fd0-54ba-4f59-8a44-11ccf2687a34'
149
+ # INTEGRATION_GUIDS['PostgreSQLDatabaseCataloguer'] = 'ef301220-7dfe-4c6c-bb9d-8f92d9f63823'
150
+ # INTEGRATION_GUIDS['ContentPacksCataloguer'] = '6bb2181e-7724-4515-ba3c-877cded55980'
151
+ # INTEGRATION_GUIDS['OpenLineageCataloguer'] = '3347ac71-8dd2-403a-bc16-75a71be64bd7'
152
+ # INTEGRATION_GUIDS['ApacheAtlasExchange'] = '5721627a-2dd4-4f95-a274-6cfb128edb97'
153
+ # INTEGRATION_GUIDS['HarvestSurveys'] = 'fae162c3-2bfd-467f-9c47-2e3b63a655de'
@@ -466,7 +466,7 @@ class AssetCatalog(Client):
466
466
  f"as-graph?startFrom={start_from}&pageSize={page_size}"
467
467
  )
468
468
 
469
- response = await self._async_make_request("GET", url)
469
+ response = await self._async_make_request("POST", url)
470
470
  return response.json().get("assetGraph", NO_ASSETS_FOUND)
471
471
 
472
472
  def get_asset_graph(
@@ -836,7 +836,7 @@ class AssetCatalog(Client):
836
836
 
837
837
  return response.json().get("types", "NO_ASSETS_FOUND")
838
838
 
839
- def get_asset_catalog_types(self) -> str | dict:
839
+ def get_asset_types(self) -> str | dict:
840
840
  """Return all the elements that are anchored to an asset plus relationships between these elements and to
841
841
  other elements.
842
842
  Parameters
@@ -299,6 +299,35 @@ base_report_specs = FormatSetDict({
299
299
  )
300
300
  ],
301
301
  ),
302
+ "Common-Mermaid": FormatSet(
303
+ target_type="Referenceable",
304
+ heading="Common Attributes with Mermaid",
305
+ description="Attributes that apply to all Referenceables.",
306
+ annotations={}, # No specific annotations
307
+ formats=[
308
+ Format(
309
+ types=["DICT", "REPORT"],
310
+ attributes=[
311
+ Column(name='Display Name', key='display_name'),
312
+ Column(name="Qualified Name", key='qualified_name'),
313
+ Column(name="Description", key='description'),
314
+ Column(name="GUID", key='guid'),
315
+ Column(name="Mermaid Graph", key='mermaid_graph'),
316
+ Column(name="Anchor Mermaid Graph", key='anchorMermaidGraph'),
317
+ Column(name="Information Supply Chain Mermaid Graph", key='informationSupplyChainMermaidGraph'),
318
+ Column(name="Field Level Lineage Graph", key ='fieldLevelLineageGraph'),
319
+ Column(name= "Action Mermaid Graph", key = 'actionMermaidGraph'),
320
+ Column(name="Local Lineage Graph", key="localLineageGraph"),
321
+ Column(name="Edge Mermaid",key="edgeMermaidGraph"),
322
+ Column(name="ISC Implementation Graph", key='iscImplementationGraph'),
323
+ Column(name="Specification Mermaid Graph", key='specificationMermaidGraph'),
324
+ Column(name="Solution Blueprint Mermaid Graph", key='solutionBlueprintMermaidGraph'),
325
+ Column(name="Solution Subcomponent Mermaid Graph", key='solutionSubcomponentMermaidGraph'),
326
+
327
+ ],
328
+ )
329
+ ],
330
+ ),
302
331
  "Search-Keywords": FormatSet(
303
332
  heading="Search Keyword Report",
304
333
  description="A report of elements with search keywords matching the specified string",
@@ -348,22 +377,30 @@ base_report_specs = FormatSetDict({
348
377
  )
349
378
  ],
350
379
  ),
351
- "Comments-DrE": FormatSet(
352
- target_type="Comments",
353
- heading="Comments",
354
- description="Details of a comment.",
380
+
381
+ "Journal-Entry-DrE": FormatSet(
382
+ target_type="Notification",
383
+ heading="Journal Entry",
384
+ description="Details of a journal entry.",
355
385
  annotations={}, # No specific annotations
356
386
  formats=[
357
387
  Format(
358
388
  types=["ALL"],
359
389
  attributes=[
360
- Column(name='Display Name', key='display_name'),
361
- Column(name="Qualified Name", key='qualified_name'),
362
- Column(name="GUID", key='guid'),
363
- Column(name="Comment", key='description')
390
+ Column(name='Journal Name', key='note_log_name'),
391
+ Column(name='Journal Qualified Name', key='note_log_qualified_name'),
392
+ Column(name="Journal Entry Qualified Name", key='qualified_name'),
393
+ Column(name="Journal Entry GUID", key='guid'),
394
+ Column(name="Journal Entry", key='description')
364
395
  ],
365
396
  )
366
397
  ],
398
+ action=ActionParameter(
399
+ function="Client2.find_notes",
400
+ optional_params=OPTIONAL_PARAMS,
401
+ required_params=["search_string"],
402
+ spec_params={},
403
+ )
367
404
  ),
368
405
 
369
406
  "ExternalReference": FormatSet(
@@ -1,6 +1,8 @@
1
1
  from datetime import datetime
2
2
  import re
3
3
  from typing import Any, Callable, Dict, List, Optional, Tuple, Union
4
+
5
+ from pyegeria._globals import MERMAID_GRAPH_TITLES, MERMAID_GRAPHS
4
6
  from pyegeria.utils import (camel_to_title_case)
5
7
  from markdown_it import MarkdownIt
6
8
  from rich.console import Console
@@ -204,7 +206,7 @@ def make_md_attribute(attribute_name: str, attribute_value: str, output_type: st
204
206
 
205
207
  output = f"## {attribute_title}\n{attribute_value}\n\n"
206
208
  elif output_type in ["REPORT", "MERMAID"]:
207
- if attribute_title in ['Mermaid Graph', 'Mermaid', 'Solution Blueprint Mermaid Graph']:
209
+ if attribute_title in MERMAID_GRAPH_TITLES + ['Mermaid Graph', 'Mermaid']:
208
210
  output = f"## {attribute_title}\n\n```mermaid\n{attribute_value}\n```\n"
209
211
  elif attribute_value:
210
212
  output = f"## {attribute_title}\n{attribute_value}\n\n"
@@ -872,9 +874,11 @@ def populate_common_columns(
872
874
  try:
873
875
  mermaid_val = element.get(mermaid_source_key, '') or ''
874
876
  for column in columns_list:
877
+ column_key = column.get('key')
875
878
  if column.get('key') == mermaid_dest_key and column.get('value') in (None, ""):
876
879
  column['value'] = mermaid_val
877
- break
880
+ if (column_key in MERMAID_GRAPHS and mermaid_dest_key not in MERMAID_GRAPHS):
881
+ column['value'] = element.get(column_key, '')
878
882
  except Exception as e:
879
883
  logger.debug(f"populate_common_columns: mermaid handling error: {e}")
880
884
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyegeria
3
- Version: 5.4.8.8
3
+ Version: 5.4.8.9
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
@@ -122,16 +122,16 @@ examples/Jupyter Notebooks/common/orig_globals.py,sha256=VtwTB336p9WyNJaFEtE9keo
122
122
  examples/format_sets/all_format_sets.json,sha256=rPesOiP-Vgooe78Y_epuQjyk_KrabTV6icHwXF73p3s,19991
123
123
  examples/format_sets/custom_format_sets.json,sha256=X3NG9Qe8L0KlfrUfjd2ju15I2IayV1mFEQxC4rdW2Fg,5614
124
124
  examples/format_sets/subset_format_sets.json,sha256=cRgpGuuQht9KkJR6nLxQ8GaEAZtc-ZmbCgU8syHcNkc,4009
125
- md_processing/__init__.py,sha256=2SrcrDsGaetFZgPLjNnDJ7q3t_19FsY-cFLOz5h1A4Q,7758
126
- md_processing/dr_egeria.py,sha256=tir3svioN0y0O5lbK2LhrRQZ6ZcszJo9jme-czE9788,22174
125
+ md_processing/__init__.py,sha256=VAbmF5j27fvjQhwqv6aYrGKDb32r494vFUUhdhHOX5U,7756
126
+ md_processing/dr_egeria.py,sha256=MZZqzvyimb_6csJvzz4RpqsUG1JId7mufmrw3EVF-Wk,22158
127
127
  md_processing/data/commands-working.json,sha256=uCo_azcuuYqGm7QffJeCGj7PyZuZRGdu7kKf4XWmMoA,1162560
128
- md_processing/data/commands.json,sha256=1kd-soUijSsNCig9SbENdgCf5Zm1oLADJ1z_QR3AcYQ,1035975
128
+ md_processing/data/commands.json,sha256=KIRqNzSSZBwNKE4bIZFm0oUGOfLyMxMT0OprzuNC_MU,1036061
129
129
  md_processing/data/generated_format_sets.json,sha256=80Z9yt8ll4x-gODzOQyGIweKoqfSsVIin9esaKUeKsA,98631
130
130
  md_processing/data/generated_format_sets.py,sha256=2BfRzb5G5n8Cz6VwirQXlBq1fHBISIh4x7jquXg6QEw,36402
131
131
  md_processing/md_commands/__init__.py,sha256=ssEojzFlSYtY2bHqqOoKo8PFaANZ_kq_gIbtlXnuc2s,93
132
132
  md_processing/md_commands/data_designer_commands.py,sha256=ab0uZo4NutKKpwbMnZhZvkyny2jf6lZjx4pJXdOPQ70,65456
133
133
  md_processing/md_commands/ext_ref_commands.py,sha256=jYTD_FsMK0M6pefnkluEpWEcS_VShllMvNFYsZTE3NQ,23558
134
- md_processing/md_commands/feedback_commands.py,sha256=CgCkFWlJRMXycfK5srElBzN8aqU6mVMv61-fFOgiEz4,32919
134
+ md_processing/md_commands/feedback_commands.py,sha256=tj0fTHuFr6YksFSUztu0WrAYvFb3yAGanTv_n12s44w,31228
135
135
  md_processing/md_commands/glossary_commands.py,sha256=F8BPFL5GlCQ3oSs8svSL5PipzmWBiXpCqUAdKUZhGkY,33373
136
136
  md_processing/md_commands/governance_officer_commands.py,sha256=drq7H-f9J8j1x9Gw2FKi9M92RsF22oX7cu_9JJdzWJ4,26467
137
137
  md_processing/md_commands/product_manager_commands.py,sha256=RPfApQQ4z0dLTBF9jUN1AaxnYAk_Vn6axlzvSiOgMk8,57742
@@ -140,30 +140,30 @@ md_processing/md_commands/solution_architect_commands.py,sha256=Oqtz6nIKA-ZoznZC
140
140
  md_processing/md_commands/view_commands.py,sha256=AQsjR6whW_mV-_I_Ihq2xCv3dbEXip6EQEpzB0-UiA0,12042
141
141
  md_processing/md_processing_utils/__init__.py,sha256=LxAmxlcji26ziKV4gGar01d95gL9vgToRIeJW8N-Ifs,80
142
142
  md_processing/md_processing_utils/common_md_proc_utils.py,sha256=SzzSuXQ6FhUwasKG-u3mXIqD-OW-H_3oiZb_WkWnJnM,59104
143
- md_processing/md_processing_utils/common_md_utils.py,sha256=nX6lBP3UxCftU0PX9jMdXDwcC03htHWOTIOfmgB21QM,28468
143
+ md_processing/md_processing_utils/common_md_utils.py,sha256=ScVWr8DzLIPbAoC8Atbb63uZ8Prp4MuVv0rRyHMIDQg,28461
144
144
  md_processing/md_processing_utils/determine_width.py,sha256=nzinSuSF9SeuVOfKXsg-l1cqLkNYKZnF6HYfJpft44A,4236
145
- md_processing/md_processing_utils/extraction_utils.py,sha256=Hx3OPjMLfChBPwJxHeRNeQaSrZbopoj87iE7poPV4ns,22358
145
+ md_processing/md_processing_utils/extraction_utils.py,sha256=dbHP2HdMv6HqxUIu0x3xhaMrbKDKJEXdPTUxwsoMXv0,22492
146
146
  md_processing/md_processing_utils/gen_format_sets.py,sha256=JoOUT56IEj3jT1StMdMemX0cGZ9bpoX-RvbBcDfYOHU,16434
147
147
  md_processing/md_processing_utils/generate_dr_help.py,sha256=NKSC2Tf7QzkYkGJD3u_o_Xn9nN9ZvrQU_jPt-R7X3Js,7422
148
148
  md_processing/md_processing_utils/generate_md_cmd_templates.py,sha256=mFenxe9Jq8QivgmI0ZFtO_iu6P6RH_EiNa__CGyDw_0,5809
149
149
  md_processing/md_processing_utils/generate_md_templates.py,sha256=DMnMQ7_LbmQCS8aG-ppHGTu25obOSn4ZzSg7V21k9jo,3547
150
- md_processing/md_processing_utils/md_processing_constants.py,sha256=19v2zggks8SijjvUXah9rxR7zuqiHkznU14cWUBcFGs,25827
150
+ md_processing/md_processing_utils/md_processing_constants.py,sha256=nN-mXvAY_HuSzd_GnE2IrvBITr2Sg4JYB6sbAWY1Z9I,25939
151
151
  md_processing/md_processing_utils/message_constants.py,sha256=UBf18obM83umM6zplR7ychre4xLRbBnTzidHDZ2gNvM,548
152
152
  pyegeria/__init__.py,sha256=_Q93impwC_PIz1PQRy-6ka6r28VuiN3ASdDmLHf4m_s,4466
153
153
  pyegeria/_base_client.py,sha256=w2Cid4GZOTwc4dutipk2vy2cs2qj-faMF21eClitFEI,21525
154
154
  pyegeria/_client.py,sha256=hJHn5pD8sbelP_M9dK-M5Z2CYqpRXzXfg1UCgAdQ6dQ,33416
155
- pyegeria/_client_new.py,sha256=h6seD2_1WSiLSbo-R2LtGyR4x7klKDf-j2Oqql0fqcc,200517
155
+ pyegeria/_client_new.py,sha256=Zrt4hbwkandXANDUbkdynKoJUsQ54ytbWy-U69TLGhU,203415
156
156
  pyegeria/_client_new_backup.py,sha256=Kznc1iHG_y1T4D2UlccbgHpczmcQkPSrTut4Wxqq2Rg,187354
157
157
  pyegeria/_deprecated_gov_engine.py,sha256=dWNcwVsE5__dF2u4QiIyQrssozzzOjBbLld8MdpmVCQ,17264
158
158
  pyegeria/_exceptions.py,sha256=1SrnV194V4_YJNnNAU0myTHQ3dhLn4GF2B2gZcj1u90,18153
159
- pyegeria/_exceptions_new.py,sha256=DthS0OQ6PPOrmQ8-LJA0xhIy_A4i_RZrppFEvL-nn74,19875
160
- pyegeria/_globals.py,sha256=fE0txOo3lkNmVLLAqzvUUxzLtg6LxWt_GjGyImBhrIQ,8538
159
+ pyegeria/_exceptions_new.py,sha256=-NectpeE5Xq3nS_pRq8yvJs_4J4SR7d8uB_918vBxUw,20195
160
+ pyegeria/_globals.py,sha256=xFuto9O4mQO2Az25nJWpueGjhayaTJqQo5CiLDQOpok,9488
161
161
  pyegeria/_output_format_models.py,sha256=LB5ryEMF0xBFE38ZP9rAKFRof_4_mNBOPHhRJY0ur2M,15448
162
162
  pyegeria/_output_formats.py,sha256=u8_7zOI5VCWT-hJM5Bc7eCHQZI4kEfOhjzufINivEtg,384
163
163
  pyegeria/_validators.py,sha256=pNxND0dN2qvyuGE52N74l1Ezfrh2p9Hao2ziR_t1ENI,7425
164
- pyegeria/asset_catalog_omvs.py,sha256=sBXPgkRe_ZFOunZ-xoZe4qndILf9L0dPRHpQb_95bHw,29030
164
+ pyegeria/asset_catalog_omvs.py,sha256=yNpdloqwTPbtJwmOGr9yONFKO6SWxlUb5JZ7LB1GArw,29023
165
165
  pyegeria/automated_curation.py,sha256=DaEg_qB2TfgveKm4Y0aEKppoWwyUeY96VqjumVDCYN4,143103
166
- pyegeria/base_report_formats.py,sha256=qJumPuAMPolVnNoCVpWqyNNSIPIog--QdyQCHCXnDJQ,194914
166
+ pyegeria/base_report_formats.py,sha256=98lTsaaNVCrh3XUXR_p91Lr_363xw1PNe12mmysbMJs,196932
167
167
  pyegeria/classification_manager.py,sha256=HO5UcSb65FjeKWx8COD4kNYKd3zUfeGG05TiHV2CYis,282275
168
168
  pyegeria/classification_manager_omvs.py,sha256=CFFEZv9hBPv0UXIwyu5JyGBg_edGlRn5w6MUkPVC4pY,183952
169
169
  pyegeria/collection_manager.py,sha256=bfFQQiqOo2cVf5IqkQxFwZJn-SLhBngCGzJdS7KzncY,239812
@@ -192,7 +192,7 @@ pyegeria/mermaid_utilities.py,sha256=G0zPyy_xRBs-3jA6Ws0q6KyvB7N5--IzWSHNjt3htnE
192
192
  pyegeria/metadata_explorer_omvs.py,sha256=xHnZTQKbd6XwOhYia-RiIisrvZcqHi0SL1l6OCf04Gk,86911
193
193
  pyegeria/models.py,sha256=Ar7Yg26vODjsITT1kxJz26G8m2-W5S9AC0OtczYIT0A,20580
194
194
  pyegeria/my_profile_omvs.py,sha256=d0oJYCJG7pS9BINPuGciVa00ac0jwPHNANXDCLginEc,34720
195
- pyegeria/output_formatter.py,sha256=Sr40ztQ9E7wHHXsVWCniJvHTIFuJYH1fqLDZ2oSCovQ,45872
195
+ pyegeria/output_formatter.py,sha256=yfuxgeNMnVCcgUhDlTHReoe7ZV2Gnq6GaX41592zHmM,46100
196
196
  pyegeria/output_formatter_with_machine_keys.py,sha256=1Bx_SRreOlrkryZEdDX40xpRYvmTIXr3KlqzGdQ1hRo,47315
197
197
  pyegeria/platform_services.py,sha256=cvBoFbKJdtBL546LDbhjik6MZl0sm9VE67_HBnlfCWs,41737
198
198
  pyegeria/project_manager.py,sha256=0duceDInq3bAOe1BeNns1WaJJ81zRkNEEaHUEUyXwRg,66338
@@ -205,9 +205,9 @@ pyegeria/template_manager_omvs.py,sha256=chBljs1vy5wr9DRAtbvIt4Cob_7HxGfxLkCNlDT
205
205
  pyegeria/utils.py,sha256=xOTxk9PH8ZGZmgIwz_a6rczTVLADLEjucr10ZJTUnY4,9272
206
206
  pyegeria/valid_metadata_omvs.py,sha256=Xq9DqBQvBFFJzaFIRKcVZ2k4gJvSh9yeXs_j-O3vn1w,65050
207
207
  pyegeria/x_action_author_omvs.py,sha256=XyRsUgN-xnWR-cJayzo5RtY4Xv1uBDML4pwaKHrwC1w,6430
208
- pyegeria-5.4.8.8.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
209
- pyegeria-5.4.8.8.dist-info/METADATA,sha256=8WqvNOSaCuirDp9vrVmziijPJjq1RdKz12jDeh1fkQE,7295
210
- pyegeria-5.4.8.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
211
- pyegeria-5.4.8.8.dist-info/entry_points.txt,sha256=erl7EsY2vrll8DL_wr28FlvoWk7TQ2liioGYej0C2X4,6585
212
- pyegeria-5.4.8.8.dist-info/top_level.txt,sha256=79GSLIQLdnCT1ApFEbFYr2flWPPANEUlnvMZXWn4fng,41
213
- pyegeria-5.4.8.8.dist-info/RECORD,,
208
+ pyegeria-5.4.8.9.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
209
+ pyegeria-5.4.8.9.dist-info/METADATA,sha256=ASOumgTBkkYUIE4YuJARR0MqKhpcL5pWAb7V_Reet7Q,7295
210
+ pyegeria-5.4.8.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
211
+ pyegeria-5.4.8.9.dist-info/entry_points.txt,sha256=erl7EsY2vrll8DL_wr28FlvoWk7TQ2liioGYej0C2X4,6585
212
+ pyegeria-5.4.8.9.dist-info/top_level.txt,sha256=79GSLIQLdnCT1ApFEbFYr2flWPPANEUlnvMZXWn4fng,41
213
+ pyegeria-5.4.8.9.dist-info/RECORD,,