pyegeria 5.4.4__py3-none-any.whl → 5.4.4.2__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 (27) hide show
  1. commands/cat/debug_log.2025-09-10_13-48-37_153090.log.zip +0 -0
  2. commands/cat/dr_egeria_command_help.py +11 -17
  3. md_processing/data/commands.json +763 -134
  4. md_processing/dr-egeria-outbox/Business-Imperative-DrE-2025-09-11-21-21-15.md +33 -0
  5. md_processing/md_commands/governance_officer_commands.py +5 -2
  6. md_processing/md_processing_utils/common_md_proc_utils.py +159 -127
  7. md_processing/md_processing_utils/common_md_utils.py +7 -4
  8. md_processing/md_processing_utils/debug_log +186 -1
  9. md_processing/md_processing_utils/debug_log.2025-09-09_11-10-03_528597.zip +0 -0
  10. md_processing/md_processing_utils/dr-egeria-help-2025-09-10T14:49:49.md +3460 -0
  11. md_processing/md_processing_utils/dr-egeria-help-2025-09-10T14:57:46.md +472 -0
  12. md_processing/md_processing_utils/extraction_utils.py +75 -36
  13. md_processing/md_processing_utils/generate_md_cmd_templates.py +4 -4
  14. pyegeria/_output_formats.py +1 -1
  15. pyegeria/glossary_manager.py +2 -2
  16. pyegeria/governance_officer.py +1 -4
  17. pyegeria/utils.py +110 -0
  18. {pyegeria-5.4.4.dist-info → pyegeria-5.4.4.2.dist-info}/METADATA +1 -1
  19. {pyegeria-5.4.4.dist-info → pyegeria-5.4.4.2.dist-info}/RECORD +22 -22
  20. commands/cat/debug_log.2025-09-01_07-02-58_818650.log.zip +0 -0
  21. commands/cat/debug_log.2025-09-02_07-44-39_567276.log.zip +0 -0
  22. commands/cat/debug_log.2025-09-03_07-45-21_986388.log.zip +0 -0
  23. commands/cat/debug_log.2025-09-04_08-21-58_788009.log.zip +0 -0
  24. commands/cat/debug_log.2025-09-05_09-37-53_062579.log.zip +0 -0
  25. {pyegeria-5.4.4.dist-info → pyegeria-5.4.4.2.dist-info}/LICENSE +0 -0
  26. {pyegeria-5.4.4.dist-info → pyegeria-5.4.4.2.dist-info}/WHEEL +0 -0
  27. {pyegeria-5.4.4.dist-info → pyegeria-5.4.4.2.dist-info}/entry_points.txt +0 -0
@@ -2,6 +2,7 @@
2
2
  This file contains functions for extracting data from text for Egeria Markdown processing
3
3
  """
4
4
  import re
5
+ import json
5
6
  from typing import Any
6
7
 
7
8
  from md_processing.md_processing_utils.common_md_utils import (print_msg, find_key_with_value, get_element_dictionary,
@@ -74,56 +75,94 @@ def extract_command(block: str) -> str | None:
74
75
  return None
75
76
 
76
77
 
77
- def extract_attribute(text: str, labels: set) -> str | None:
78
+ # def extract_attribute(text: str, labels: set) -> str | None:
79
+ # """
80
+ # Extracts the attribute value from a string.
81
+ #
82
+ # Args:
83
+ # text: The input string.
84
+ # labels: List of equivalent labels to search for
85
+ #
86
+ # Returns:
87
+ # The value of the attribute, or None if not found.
88
+ #
89
+ # Note:
90
+ # Lines beginning with '>' are ignored.
91
+ # """
92
+ # # Iterate over the list of labels
93
+ # for label in labels:
94
+ # # Construct pattern for the current label
95
+ # # text = re.sub(r'\s+', ' ', text).strip() # just added
96
+ # # text = re.sub(r'\n\n+', '\n\n', text).strip()
97
+ #
98
+ # # Replace multiple spaces or tabs with a single space
99
+ # normalized = re.sub(r'\s+', ' ', text)
100
+ # # Collapse multiple blank lines into a single one
101
+ # normalized = re.sub(r'\n\s*\n', '\n', normalized).strip()
102
+ #
103
+ # # label = label.strip()
104
+ # # pattern = rf"##\s*{re.escape(label)}\s*\n(?:\s*\n)*?(.*?)(?:#|___|$)"
105
+ # # Normalize the label
106
+ # normalized_label = re.sub(r'\s+', ' ', label.strip())
107
+ #
108
+ # # Construct the regex pattern
109
+ # pattern = rf"##\s*{re.escape(normalized_label)}\s*\n(?:\s*\n)*?(.*?)(?:#|___|$)"
110
+ # # pattern = rf"##\s+{re.escape(label)}\n(.*?)(?:#|___|$)" # modified from --- to enable embedded tables
111
+ # match = re.search(pattern, text, re.DOTALL)
112
+ # if match:
113
+ # # Extract matched text
114
+ # matched_text = match.group(1)
115
+ #
116
+ # # Filter out lines beginning with '>'
117
+ # filtered_lines = [line for line in matched_text.split('\n') if not line.strip().startswith('>')]
118
+ # filtered_text = '\n'.join(filtered_lines)
119
+ #
120
+ # # Replace consecutive \n with a single \n
121
+ # extracted_text = re.sub(r'\n+', '\n', filtered_text)
122
+ # if not extracted_text.isspace() and extracted_text:
123
+ # return extracted_text.strip() # Return the cleaned text - I removed the title casing
124
+ #
125
+ # return None
126
+
127
+
128
+ from typing import Optional, List
129
+
130
+ def extract_attribute(text: str, labels: List[str]) -> Optional[str]:
78
131
  """
79
- Extracts the attribute value from a string.
132
+ def extract_attribute(text: str, labels: List[str]) -> Optional[str]:
80
133
 
81
- Args:
82
- text: The input string.
83
- labels: List of equivalent labels to search for
134
+ Extracts the attribute value from a string while:
135
+ - Preserving single newlines within the matched text.
136
+ - Removing lines starting with '>'.
84
137
 
85
- Returns:
86
- The value of the attribute, or None if not found.
138
+ Args:
139
+ text: The input string containing labeled sections.
140
+ labels: List of equivalent labels to search for.
87
141
 
88
- Note:
89
- Lines beginning with '>' are ignored.
90
- """
91
- # Iterate over the list of labels
142
+ Returns:
143
+ The cleaned value of the attribute, or None if not found.
144
+ """
92
145
  for label in labels:
93
146
  # Construct pattern for the current label
94
- # text = re.sub(r'\s+', ' ', text).strip() # just added
95
- # text = re.sub(r'\n\n+', '\n\n', text).strip()
96
-
97
- # Replace multiple spaces or tabs with a single space
98
- normalized = re.sub(r'\s+', ' ', text)
99
- # Collapse multiple blank lines into a single one
100
- normalized = re.sub(r'\n\s*\n', '\n', normalized).strip()
101
-
102
- # label = label.strip()
103
- # pattern = rf"##\s*{re.escape(label)}\s*\n(?:\s*\n)*?(.*?)(?:#|___|$)"
104
- # Normalize the label
105
- normalized_label = re.sub(r'\s+', ' ', label.strip())
106
-
107
- # Construct the regex pattern
108
- pattern = rf"##\s*{re.escape(normalized_label)}\s*\n(?:\s*\n)*?(.*?)(?:#|___|$)"
109
- # pattern = rf"##\s+{re.escape(label)}\n(.*?)(?:#|___|$)" # modified from --- to enable embedded tables
110
- match = re.search(pattern, text, re.DOTALL)
147
+ pattern = rf"## {re.escape(label)}\n(.*?)(?=^##|\Z)" # Captures content until the next '##' or end of text
148
+ match = re.search(pattern, text, re.DOTALL | re.MULTILINE)
111
149
  if match:
112
150
  # Extract matched text
113
- matched_text = match.group(1)
151
+ extracted_text = match.group(1)
114
152
 
115
- # Filter out lines beginning with '>'
116
- filtered_lines = [line for line in matched_text.split('\n') if not line.strip().startswith('>')]
117
- filtered_text = '\n'.join(filtered_lines)
153
+ # Remove lines starting with '>'
154
+ filtered_lines = [line for line in extracted_text.splitlines() if not line.lstrip().startswith(">")]
118
155
 
119
- # Replace consecutive \n with a single \n
120
- extracted_text = re.sub(r'\n+', '\n', filtered_text)
121
- if not extracted_text.isspace() and extracted_text:
122
- return extracted_text.strip() # Return the cleaned text - I removed the title casing
156
+ # Join the lines back, preserving single newlines
157
+ cleaned_text = "\n".join(filtered_lines).strip()
123
158
 
159
+ if cleaned_text:
160
+ return cleaned_text # Return the cleaned and formatted text
124
161
  return None
125
162
 
126
163
 
164
+
165
+
127
166
  def process_simple_attribute(txt: str, labels: set, if_missing: str = INFO) -> str | None:
128
167
  """Process a simple attribute based on the provided labels and if_missing value.
129
168
  Extract the attribute value from the text and return it if it exists.
@@ -88,8 +88,8 @@ def main():
88
88
  command_output = io.StringIO()
89
89
 
90
90
  # Write command header
91
- command_output.write(f"# **{command}**\n>\t{command_description}\n")
92
- print(f"\n## {command_verb} **{command}**\n>\t{command_description}")
91
+ command_output.write(f"# {command}\n>\t{command_description}\n")
92
+ print(f"\n## {command_verb} {command}\n>\t{command_description}")
93
93
 
94
94
  # Process command attributes
95
95
  attributes = values['Attributes']
@@ -99,8 +99,8 @@ def main():
99
99
  continue
100
100
  user_specified = value.get('user_specified', 'true') in ["true", "True"]
101
101
 
102
- command_output.write(f"\n## **{key}**\n")
103
- print(f"\n### **{key}**")
102
+ command_output.write(f"\n## {key}\n")
103
+ print(f"\n### {key}")
104
104
 
105
105
  command_output.write(f">\t**Input Required**: {value.get('input_required', 'false')}\n\n")
106
106
  print(f">\tInput Required: {value.get('input_required', 'false')}")
@@ -443,7 +443,7 @@ base_output_format_sets = FormatSetDict({
443
443
  formats=[
444
444
  Format(
445
445
 
446
- types=["DICT", "FORM", "LIST", "TABLE"],
446
+ types=["DICT", "FORM", "REPORT","LIST", "TABLE"],
447
447
  columns= [
448
448
  Column(name='Term Name', key='display_name'),
449
449
  Column(name='Description', key='description'),
@@ -2828,11 +2828,11 @@ class GlossaryManager(CollectionManager):
2828
2828
  response = loop.run_until_complete(self._async_get_term_by_guid(term_guid, element_type, body, output_format, output_format_set))
2829
2829
  return response
2830
2830
 
2831
- async def _async_find_glossary_terms(self, search_string: str, starts_with: bool = False,
2831
+ async def _async_find_glossary_terms(self, search_string: str, starts_with: bool = True,
2832
2832
  ends_with: bool = False, ignore_case: bool = False, type_name: str = "GlossaryTerm",
2833
2833
  classification_names: list[str] = None, start_from: int = 0,
2834
2834
  page_size: int = 0, output_format: str = 'JSON',
2835
- output_format_set: str | dict = None, body: dict = None) -> list | str:
2835
+ output_format_set: str | dict = "Glossary-Term-DrE", body: dict = None) -> list | str:
2836
2836
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/terms/"
2837
2837
  f"by-search-string")
2838
2838
  response = await self._async_find_request(url, _type= type_name,
@@ -787,9 +787,6 @@ class GovernanceOfficer(Client2):
787
787
  f"{guid}/update")
788
788
  await self._async_update_element_body_request(url, GOV_DEF_PROPERTIES_LIST, body)
789
789
 
790
- @dynamic_catch
791
- async def _async_update_governance_definition(self, guid: str, body: dict | UpdateElementRequestBody) -> None:
792
- """ Update a governance definition. Async Version."""
793
790
 
794
791
  def update_governance_definition(self, guid: str, body: dict | UpdateStatusRequestBody) -> None:
795
792
  """ Update the properties of a governance definition.
@@ -899,7 +896,7 @@ class GovernanceOfficer(Client2):
899
896
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/{self.url_marker}/governance-defnitions/"
900
897
  f"{guid}/update-status")
901
898
 
902
- await self._async_update_status_request(url, status, body)
899
+ # await self._async_update_status_request(url, status, body)
903
900
 
904
901
  def update_governance_definition_status(self, guid: str, status: str = None,
905
902
  body: dict | UpdateStatusRequestBody = None) -> None:
pyegeria/utils.py CHANGED
@@ -246,6 +246,116 @@ def flatten_dict_to_string(d: dict) -> str:
246
246
  # The decorator logic, which applies @logger.catch dynamically
247
247
 
248
248
 
249
+ import json
250
+ import re
251
+
252
+
253
+ # def parse_to_dict(input_str: str):
254
+ # """
255
+ # Check if a string is valid JSON or a name:value list without braces and convert to a dictionary.
256
+ #
257
+ # Args:
258
+ # input_str: The input string to parse.
259
+ #
260
+ # Returns:
261
+ # dict: A dictionary converted from the input string.
262
+ # None: If the input is neither valid JSON nor a valid name:value list.
263
+ # """
264
+ #
265
+ # if input_str is None:
266
+ # return None
267
+ #
268
+ # # Check if the input string is valid JSON
269
+ # try:
270
+ # result = json.loads(input_str)
271
+ # if isinstance(result, dict): # Ensure it's a dictionary
272
+ # return result
273
+ # except json.JSONDecodeError:
274
+ # pass
275
+ #
276
+ # # Check if input string looks like a name:value list
277
+ # # Supports both comma and newline as separators
278
+ # pattern = r'^(\s*("[^"]+"|\'[^\']+\'|[a-zA-Z0-9_-]+)\s*:\s*("[^"]+"|\'[^\']+\'|[a-zA-Z0-9 _-]*)\s*)' \
279
+ # r'(\s*[,|\n]\s*("[^"]+"|\'[^\']+\'|[a-zA-Z0-9_-]+)\s*:\s*("[^"]+"|\'[^\']+\'|[a-zA-Z0-9 _-]*)\s*)*$'
280
+ # if re.match(pattern, input_str.strip()):
281
+ # try:
282
+ # # Split by ',' or '\n' and process key-value pairs
283
+ # pairs = [pair.split(":", 1) for pair in re.split(r'[,|\n]+', input_str.strip())]
284
+ # return {key.strip().strip('\'"'): value.strip().strip('\'"') for key, value in pairs}
285
+ # except Exception:
286
+ # return None
287
+ #
288
+ # # If neither pattern matches, return None
289
+ # return None
290
+
291
+
292
+ def parse_to_dict(input_str: str) -> dict | None:
293
+ """
294
+ Parse input strings into a dictionary, handling both JSON and key-value pairs.
295
+ Recovers from malformed JSON (e.g., where commas are missing between key-value pairs)
296
+ and supports multiline values.
297
+
298
+ Args:
299
+ input_str (str): The input string to parse.
300
+
301
+ Returns:
302
+ dict: A parsed dictionary if validation is successful, or None if the string cannot be parsed.
303
+ """
304
+ if not input_str:
305
+ return None
306
+
307
+ # Attempt to parse valid JSON
308
+ try:
309
+ result = json.loads(input_str)
310
+ if isinstance(result, dict):
311
+ return result
312
+ except json.JSONDecodeError:
313
+ pass
314
+
315
+ # Fix malformed JSON or attempt alternate parsing for "key: value" patterns
316
+ try:
317
+ # Step 1: Inject missing commas where they are omitted between key-value pairs
318
+ fixed_input = re.sub(
319
+ r'("\s*:[^,}\n]+)\s*("(?![:,}\n]))', # Find missing commas (key-value-value sequences)
320
+ r'\1,\2', # Add a comma between the values
321
+ input_str
322
+ )
323
+
324
+ # Attempt to parse the fixed string as JSON
325
+ try:
326
+ result = json.loads(fixed_input)
327
+ if isinstance(result, dict):
328
+ return result
329
+ except json.JSONDecodeError:
330
+ pass
331
+
332
+ # Step 2: Handle key-value format fallback (supports multiline strings)
333
+ # Matches `key: value` pairs, including multiline quoted values
334
+ key_value_pattern = re.compile(r'''
335
+ (?:"([^"]+)"|'([^']+)'|([a-zA-Z0-9_-]+)) # Key: quoted "key", 'key', or unquoted key
336
+ \s*:\s* # Key-value separator
337
+ (?:"((?:\\.|[^"\\])*?)"|'((?:\\.|[^'\\])*?)'|([^\n,]+)) # Value: quoted or unquoted
338
+ ''', re.VERBOSE | re.DOTALL)
339
+
340
+ matches = key_value_pattern.findall(input_str)
341
+
342
+ # Build dictionary from matches
343
+ result_dict = {}
344
+ for match in matches:
345
+ key = next((group for group in match[:3] if group), "").strip()
346
+ value = next((group for group in match[3:] if group), "").strip()
347
+ result_dict[key] = value
348
+
349
+ if result_dict:
350
+ return result_dict
351
+ except Exception as e:
352
+ # Log or handle parsing exception if needed
353
+ pass
354
+
355
+ # If all parsing attempts fail, return None
356
+ return None
357
+
358
+
249
359
  def dynamic_catch(func: T) -> T:
250
360
  if app_settings.get("enable_logger_catchh", False):
251
361
  return logger.catch(func) # Apply the logger.catch decorator
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyegeria
3
- Version: 5.4.4
3
+ Version: 5.4.4.2
4
4
  Summary: A python client for Egeria
5
5
  License: Apache 2.0
6
6
  Keywords: egeria,metadata,governance
@@ -3,12 +3,8 @@ commands/__init__.py,sha256=-_1ApX0GIzkVNl1NajyGMIz7fHbwZfN5DVnBQAOiScA,1174
3
3
  commands/cat/Dr-Egeria_md-orig.py,sha256=ZX20BvRo0fIFisvy5Z-VJDLVyKbQoud89-CUV2S66tU,7336
4
4
  commands/cat/README.md,sha256=-aaAnIT2fcfU63vajgB-RzQk4l4yFdhkyVfSaTPiqRY,967
5
5
  commands/cat/__init__.py,sha256=l4CImkjEiTQKS7QR-RQwzHIgRpfP032Mn_NZEuIILwg,98
6
- commands/cat/debug_log.2025-09-01_07-02-58_818650.log.zip,sha256=oHriwvdtAjCF1lZUBteGc_nRqxbeWZZMdztdtXwFku4,60996
7
- commands/cat/debug_log.2025-09-02_07-44-39_567276.log.zip,sha256=3lJErYJjfrd8GNSVLeql3khPKO2ACnqQAqD7z2smx-U,21285
8
- commands/cat/debug_log.2025-09-03_07-45-21_986388.log.zip,sha256=aXrkTdBn_pFsGrwiIKTij96NyQhqn0uRRE_EsyA_atw,215221
9
- commands/cat/debug_log.2025-09-04_08-21-58_788009.log.zip,sha256=o8y66Asnj2waUhGfBHK4DP_4md9yQzWLAPqLOKRqFo4,27616
10
- commands/cat/debug_log.2025-09-05_09-37-53_062579.log.zip,sha256=ACgO0jq3PyP4CpDBSxzdjVcy8lBvMX-M3Xwnfjg-CMo,3131
11
- commands/cat/dr_egeria_command_help.py,sha256=z4EmOKNW_-5XS6eHFqIrq_9y4iyIiV3x_8B7nZjkncw,15677
6
+ commands/cat/debug_log.2025-09-10_13-48-37_153090.log.zip,sha256=Wx_eCPrVj_km3sNYZu6fe4KlMUTkiuGJ3SSWmD4mOyU,13471
7
+ commands/cat/dr_egeria_command_help.py,sha256=_HOJd1IplnYhoQm1cwsROS9SxVKILLUf9YNlGMvvdF4,15359
12
8
  commands/cat/dr_egeria_jupyter.py,sha256=rfLVV_84Q8Pqcq1flmijKvZ7sEZFy7JAcAP_NAbb46Y,5656
13
9
  commands/cat/dr_egeria_md.py,sha256=zz-XtRW0sfBOG8kA51OFR5uKQ7JULGoOgXeJBXQBqTM,4889
14
10
  commands/cat/exp_list_glossaries.py,sha256=dC6Bnfm3YSMTKPP146qeslIFRiZnGu5b7iDYE07p4iU,5817
@@ -4293,31 +4289,35 @@ md_processing/.obsidian/plugins/obsidian-sample-plugin/versions.json,sha256=BUEx
4293
4289
  md_processing/.obsidian/workspace.json,sha256=NLVJEOtsowljw7Ka035ReHLPu4iitk2ZsuSDN6zUAFY,4282
4294
4290
  md_processing/__init__.py,sha256=cEB6Fq334zRFybe2gLQgmfvMW_6s489JRD-j9Apoowg,7325
4295
4291
  md_processing/data/commands-working.json,sha256=uCo_azcuuYqGm7QffJeCGj7PyZuZRGdu7kKf4XWmMoA,1162560
4296
- md_processing/data/commands.json,sha256=lezFy4RADLboQyW6e3s4nLzHkxsGR5orKSGtrEinrok,1690730
4292
+ md_processing/data/commands.json,sha256=RIHRggidx9qPwBDVmXagoY0AkVcG-sL0yobl7aiGmHI,1712477
4297
4293
  md_processing/data/generated_format_sets.json,sha256=TXvGK_Gm5ieq9i6u9M1j4CaNPzoV2m0hisKK2fWCtIM,98502
4298
4294
  md_processing/data/generated_format_sets.py,sha256=ZUWlUi5BHdetUQP-Hx8nQqzd3mCEubsJQXjvPmqhY3M,54980
4295
+ md_processing/dr-egeria-outbox/Business-Imperative-DrE-2025-09-11-21-21-15.md,sha256=2_SfdjR5fJXNTzM4Yx2po7vf5t4VmX2GsUedPaRujrQ,1176
4299
4296
  md_processing/dr_egeria.py,sha256=OlzP8LkXqZ79lxsWOnz8zOpcOdhpLp7m_PDE0fi-YPs,19963
4300
4297
  md_processing/dr_egeria_inbox/glossary_creation_experiment.ipynb,sha256=dbzNu90fCKNohOWVSRBOB1GLyd95x8Qw51I5AkaPtso,11552
4301
4298
  md_processing/md_commands/__init__.py,sha256=ssEojzFlSYtY2bHqqOoKo8PFaANZ_kq_gIbtlXnuc2s,93
4302
4299
  md_processing/md_commands/data_designer_commands.py,sha256=oUXM6wvyictQZVzSH43GJdmy5Zm7nWogWuoCNo8Yskw,64389
4303
4300
  md_processing/md_commands/ext_ref_commands.py,sha256=uxVMz3QSJbMxMVYYaDQs9YlBH65Jsw0Wa0oJFcn5GnQ,24546
4304
4301
  md_processing/md_commands/glossary_commands.py,sha256=BEWcJYCWybTvbqcZD7_IFbBKiMpX6b55avrn1nckqO4,33811
4305
- md_processing/md_commands/governance_officer_commands.py,sha256=NCYrx6k1q_duVoF0bMdbyLMjHOn7Xvc0-c50a4NWcGA,21990
4302
+ md_processing/md_commands/governance_officer_commands.py,sha256=ixM-Su3q6XF-MKkVJb8R0wXfgM_ZAiucCINS_LkjgXY,22178
4306
4303
  md_processing/md_commands/old_solution_architect_commands.py,sha256=Hk-_-2aJWoG8LYzTmf84z3rakN9kIQWEM9HM9_lz6xw,55157
4307
4304
  md_processing/md_commands/product_manager_commands.py,sha256=aLagu4Tljd0gITdmvxXIe_sMGcJVkNTrncigG5TXFmo,45749
4308
4305
  md_processing/md_commands/project_commands.py,sha256=s9-n_a0lUU-oAZMYeaW6Nq_Tii9nG4hVIuBuf3q-heI,17762
4309
4306
  md_processing/md_commands/solution_architect_commands.py,sha256=4Ghb8j2wlDdWtHoSCrx5jCJFEJfqII4mnFJ_tqduRKI,52569
4310
4307
  md_processing/md_commands/view_commands.py,sha256=dvRD0Vjv1w9FTfV5W-4EMQBTk2NAUJlIP2jQ411kHS4,11815
4311
4308
  md_processing/md_processing_utils/__init__.py,sha256=LxAmxlcji26ziKV4gGar01d95gL9vgToRIeJW8N-Ifs,80
4312
- md_processing/md_processing_utils/common_md_proc_utils.py,sha256=TWQyypm9xNSf1sipnjEWQqyuaShRSldbooBBd42gODo,56637
4313
- md_processing/md_processing_utils/common_md_utils.py,sha256=dWoJEpp-yF-CPThZ1I5hMM0CSXkqfXBkgxH8rklZz8A,26452
4314
- md_processing/md_processing_utils/debug_log,sha256=s9mvtRMiX8mAE_1DYeyEWJQc_m-SMZt48KQ9u4qCT14,144
4309
+ md_processing/md_processing_utils/common_md_proc_utils.py,sha256=wZQvmFLryko-Of-MaZ9BspejTSW27V9y6Azoaeb-w0o,58607
4310
+ md_processing/md_processing_utils/common_md_utils.py,sha256=X8Kzva-sRyM6RZ6RbkUeP4fJaVhif0q6z7WhP-hhdm8,26711
4311
+ md_processing/md_processing_utils/debug_log,sha256=dDkHai9YpY-9k9-DSFzbaMgZ-AavFw-Vxk2Q1r_34Ls,43746
4312
+ md_processing/md_processing_utils/debug_log.2025-09-09_11-10-03_528597.zip,sha256=2hK1jdCdG7aR9FPxFdtmU_OxHBNYLA2vlr-OPqR6sXs,1863
4315
4313
  md_processing/md_processing_utils/determine_width.py,sha256=nzinSuSF9SeuVOfKXsg-l1cqLkNYKZnF6HYfJpft44A,4236
4316
4314
  md_processing/md_processing_utils/dr-egeria-help-2025-09-09T11:10:03.md,sha256=x_J_baA18EsMHW_O-EZiNkXAQ3MEwta8ZLsKPil55O8,166018
4317
- md_processing/md_processing_utils/extraction_utils.py,sha256=bTeoiAC0DcNl5LjYuXkyk8V3cLhAshp_IFPMeROq7Qk,20930
4315
+ md_processing/md_processing_utils/dr-egeria-help-2025-09-10T14:49:49.md,sha256=qnu8YS-7Ra0GQtPPiCKb4PpQBcJAmfaG50ufFpr9b-s,175356
4316
+ md_processing/md_processing_utils/dr-egeria-help-2025-09-10T14:57:46.md,sha256=1gBIR4iuBsAXpGdg4nPgFHOGcLcDCZbNvvg-9cHD4fM,55188
4317
+ md_processing/md_processing_utils/extraction_utils.py,sha256=nCtsnx_iSNV-h1StZ54GQLzSIqfx3hCNnmdDTWUKC10,22350
4318
4318
  md_processing/md_processing_utils/gen_format_sets.py,sha256=R5IvrajER0Xj9kZ99UxRS5Zoa5dAVPcLwCI7kf2iUak,16476
4319
4319
  md_processing/md_processing_utils/generate_dr_help.py,sha256=MJWlr_22Y9pjWqQbfSLb6C-t1GlQNlbWXkCmDnphfME,7419
4320
- md_processing/md_processing_utils/generate_md_cmd_templates.py,sha256=SbWtR3T1Y6VUpdcLzjbPA-601Sg-QzxdDYIXVoqjgCc,5813
4320
+ md_processing/md_processing_utils/generate_md_cmd_templates.py,sha256=SVdtlA6Nc9JIN-pORGbf-_shEP7egReuVejEcMjxRYM,5797
4321
4321
  md_processing/md_processing_utils/generate_md_templates.py,sha256=DMnMQ7_LbmQCS8aG-ppHGTu25obOSn4ZzSg7V21k9jo,3547
4322
4322
  md_processing/md_processing_utils/md_processing_constants.py,sha256=m-Vq0qPMkyF3riGcHWNid1_uRXPhCto8UdRxBKS3WvE,19458
4323
4323
  md_processing/md_processing_utils/message_constants.py,sha256=UBf18obM83umM6zplR7ychre4xLRbBnTzidHDZ2gNvM,548
@@ -4330,7 +4330,7 @@ pyegeria/_exceptions.py,sha256=1SrnV194V4_YJNnNAU0myTHQ3dhLn4GF2B2gZcj1u90,18153
4330
4330
  pyegeria/_exceptions_new.py,sha256=srmrlqoWy7VvOJOhPcYFKW32MCIovgEg5J7PrYDxzQA,19706
4331
4331
  pyegeria/_globals.py,sha256=qSU5hM4uuJZPp-YapEEKxfcdgH9hauc6R7gRkELLroY,1132
4332
4332
  pyegeria/_output_format_models.py,sha256=p9fTYaIa5KyTMIR4-JAbE9g66_gGMPTnUqjIq20Zr1o,14494
4333
- pyegeria/_output_formats.py,sha256=sWqLi6wtY71V93TUfP5CRPPF7e2WmztI1eYVMe6S8eQ,101106
4333
+ pyegeria/_output_formats.py,sha256=nVp-4JiYdHjz-kb7Z9c1lxRpo8BpkT4m18nclxUABvw,101115
4334
4334
  pyegeria/_validators.py,sha256=pNxND0dN2qvyuGE52N74l1Ezfrh2p9Hao2ziR_t1ENI,7425
4335
4335
  pyegeria/asset_catalog_omvs.py,sha256=P6FceMP0FgakGSOt3ePxpEbsF7nnypzo1aQahjdL_94,29021
4336
4336
  pyegeria/automated_curation_omvs.py,sha256=tzwCyXL0Hx8UjryBBWcPoEuBRajXZpLuwPQ1vuOg2yc,130349
@@ -4349,8 +4349,8 @@ pyegeria/egeria_tech_client.py,sha256=TjuwE9APWQZ4cRsxM0MoVrsikF8e4vkISDt_ra93tY
4349
4349
  pyegeria/external_references.py,sha256=XPJxE57d4e7ooasSZiYTpoppo43z1oLYvthD58__vNA,77641
4350
4350
  pyegeria/feedback_manager_omvs.py,sha256=0xBs0p54vmdfVYYgQ8pOanLC4fxfgTk1Z61Y6D1U7_I,152978
4351
4351
  pyegeria/full_omag_server_config.py,sha256=CQqLCy_3DZFvJZEOcGf50HWdFaWpiAIs6z-kKyjvpDA,47464
4352
- pyegeria/glossary_manager.py,sha256=9mJpzxPN1l2OykXVVhQaS6IaQQluFIkUJ5QMmUibJ8g,110159
4353
- pyegeria/governance_officer.py,sha256=3c-8PFUzWzPHc7OOX-Kt7vVaj4rSttCvOsgXSDX3POw,100217
4352
+ pyegeria/glossary_manager.py,sha256=LsemH2bC1jj6mquLxZMXsoZY77D8gTdWKXNs9Gee6mQ,110173
4353
+ pyegeria/governance_officer.py,sha256=d-hflvrMt-7hH6j47OicoolpU8rf6uzV-IZRgWL485Y,100023
4354
4354
  pyegeria/load_config.py,sha256=XDwPAHB3MvGRuoP8kg1lJJAI4BgMWZ3TYxfxYROgJj4,1188
4355
4355
  pyegeria/load_config_orig.py,sha256=lOM37vdIBcYfLQFTLP5bDuNc7vTFGBNYPfqHtWGNvA4,11624
4356
4356
  pyegeria/logging_configuration.py,sha256=BxTQRN-7OOdk5t1f1xSn8gKU8iT-MfWEgbn6cYWrRsY,7674
@@ -4369,11 +4369,11 @@ pyegeria/runtime_manager_omvs.py,sha256=bVAFJPRnIbTxdzmDHx7XgJBlyh_ZyHiKeUGqFT1O
4369
4369
  pyegeria/server_operations.py,sha256=dTqUEmX1B77b0x61OSU0aonsW8KwIpfzb3eioRpwaiI,16832
4370
4370
  pyegeria/solution_architect.py,sha256=hZQOEtenUGfTGYtI7kD0zI_Nf2IBy-RMNoasfp8BgGs,236903
4371
4371
  pyegeria/template_manager_omvs.py,sha256=chBljs1vy5wr9DRAtbvIt4Cob_7HxGfxLkCNlDTM-rQ,42755
4372
- pyegeria/utils.py,sha256=qgiYEdCRrrL6SpX1sceZQVYR40-rfFAhUJEhsubcx80,6889
4372
+ pyegeria/utils.py,sha256=dh7PyRPjMZkVSGodRwJxqgCndL4TvKK4g891f0rZ3HI,10762
4373
4373
  pyegeria/valid_metadata_omvs.py,sha256=Xq9DqBQvBFFJzaFIRKcVZ2k4gJvSh9yeXs_j-O3vn1w,65050
4374
4374
  pyegeria/x_action_author_omvs.py,sha256=RcqSzahUKCtvb_3u_wyintAlc9WFkC_2v0E12TZs8lQ,6433
4375
- pyegeria-5.4.4.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
4376
- pyegeria-5.4.4.dist-info/METADATA,sha256=o5o636_ex1SCceKNx8t-BeH1Ceq7_ZwDXO4-sCBXC_0,6290
4377
- pyegeria-5.4.4.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
4378
- pyegeria-5.4.4.dist-info/entry_points.txt,sha256=HAS-LHaaBfkaZ19XU9g5mXwn2uj2HK99isdijI-VIDk,6353
4379
- pyegeria-5.4.4.dist-info/RECORD,,
4375
+ pyegeria-5.4.4.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
4376
+ pyegeria-5.4.4.2.dist-info/METADATA,sha256=7akG9oixZL63LJlSGv_hLTNy2lbfLvvtcA_PJ1hKmr8,6292
4377
+ pyegeria-5.4.4.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
4378
+ pyegeria-5.4.4.2.dist-info/entry_points.txt,sha256=HAS-LHaaBfkaZ19XU9g5mXwn2uj2HK99isdijI-VIDk,6353
4379
+ pyegeria-5.4.4.2.dist-info/RECORD,,