pyegeria 5.4.3__py3-none-any.whl → 5.4.3.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.
@@ -70,6 +70,9 @@ def parse_upsert_command(egeria_client: EgeriaTech, object_type: str, object_act
70
70
  labels = {}
71
71
 
72
72
  command_spec = get_command_spec(f"Create {object_type}")
73
+ if command_spec is None:
74
+ logger.error("Command not found in command spec")
75
+ raise Exception("Command not found in command spec")
73
76
  attributes = command_spec.get('Attributes', [])
74
77
  command_display_name = command_spec.get('display_name', None)
75
78
  command_qn_prefix = command_spec.get('qn_prefix', None)
@@ -378,20 +381,20 @@ def parse_view_command(egeria_client: EgeriaTech, object_type: str, object_actio
378
381
 
379
382
  parsed_output['guid'] = parsed_attributes[key].get('guid', None)
380
383
  parsed_output['qualified_name'] = parsed_attributes[key].get('qualified_name', None)
381
- parsed_output['exists'] = parsed_attributes[key]['exists']
382
- if parsed_attributes[key]['valid'] is False:
384
+ parsed_output['exists'] = parsed_attributes.get(key,{}).get('exists',None)
385
+ if parsed_attributes.get(key,{}).get('valid',None) is False:
383
386
  parsed_output['valid'] = False
384
- parsed_output['reason'] += parsed_attributes[key]['reason']
387
+ parsed_output['reason'] += parsed_attributes.get(key,{}).get('reason',None)
385
388
 
386
389
  elif style == 'Reference Name':
387
390
  parsed_attributes[key] = proc_ids(egeria_client, key, labels, txt, object_action, if_missing)
388
391
  if ((if_missing == ERROR) and parsed_attributes[key].get("value", None) is None):
389
- msg = f"Required parameter `{parsed_attributes[key]['value']}` is missing"
392
+ msg = f"Required parameter `{parsed_attributes.get(key,{}).get('value',None)}` is missing"
390
393
  logger.error(msg)
391
394
  parsed_output['valid'] = False
392
395
  parsed_output['reason'] += msg
393
- elif parsed_attributes[key]['value'] and parsed_attributes[key]['exists'] is False:
394
- msg = f"Reference Name `{parsed_attributes[key]['value']}` is specified but does not exist"
396
+ elif parsed_attributes.get(key,{}).get('value',None) and parsed_attributes.get(key,{}).get('exists',None) is False:
397
+ msg = f"Reference Name `{parsed_attributes.get(key,{}).get('value',None)}` is specified but does not exist"
395
398
  logger.error(msg)
396
399
  parsed_output['valid'] = False
397
400
  parsed_output['reason'] += msg
@@ -55,16 +55,6 @@ ALL_GOVERNANCE_DEFINITIONS = GENERAL_GOVERNANCE_DEFINITIONS + GOVERNANCE_CONTROL
55
55
  debug_level = DEBUG_LEVEL
56
56
  global COMMAND_DEFINITIONS
57
57
 
58
- # def setup_log():
59
- # logger.remove()
60
- # logger.add(sys.stderr, level="SUCCESS", format=CONSOLE_LOG_FORMAT, colorize=True)
61
- # full_file_path = os.path.join(EGERIA_ROOT_PATH, EGERIA_INBOX_PATH, "data_designer_debug.log")
62
- # # logger.add(full_file_path, rotation="1 day", retention="1 week", compression="zip", level="TRACE", format=log_format,
63
- # # colorize=True)
64
- # logger.add("debug_log", rotation="1 day", retention="1 week", compression="zip", level="INFO", format=LOG_FORMAT,
65
- # colorize=True)
66
-
67
-
68
58
  def split_tb_string(input: str)-> [Any]:
69
59
  """Split the string and trim the items"""
70
60
  l = [item.strip() for item in re.split(r'[;,\n]+',input)] if input is not None else None
@@ -294,9 +284,21 @@ def set_update_body(object_type: str, attributes: dict)->dict:
294
284
  "mergeUpdate": attributes.get('Merge Update', {}).get('value', True),
295
285
  "properties": "",
296
286
  }
287
+ def set_rel_prop_body(object_type: str, attributes: dict)->dict:
288
+ prop_name = object_type.replace(" ", "")
289
+ display_name = attributes.get('Display Name', {}).get('value', None)
297
290
 
298
- def set_prop_body(object_type: str, qualified_name: str, attributes: dict)->dict:
291
+ return {
292
+ "class": prop_name + "Properties",
293
+ "description": attributes['Description'].get('value', None),
294
+ "label": attributes.get('Label', {}).get('value', None),
295
+ "typeName" : attributes.get('Type Name', {}).get('value', None),
296
+ "effectiveFrom": attributes.get('Effective From', {}).get('value', None),
297
+ "effectiveTo": attributes.get('Effective To', {}).get('value', None),
298
+ "extendedProperties": attributes.get('Extended Properties', {}).get('value', None),
299
+ }
299
300
 
301
+ def set_element_prop_body(object_type: str, qualified_name: str, attributes: dict)->dict:
300
302
  prop_name = object_type.replace(" ", "")
301
303
  display_name = attributes.get('Display Name', {}).get('value', None)
302
304
 
@@ -318,7 +320,7 @@ def set_prop_body(object_type: str, qualified_name: str, attributes: dict)->dict
318
320
  }
319
321
 
320
322
  def set_product_body(object_type: str, qualified_name: str, attributes: dict)->dict:
321
- prop_bod = set_prop_body(object_type, qualified_name, attributes)
323
+ prop_bod = set_element_prop_body(object_type, qualified_name, attributes)
322
324
  prop_bod["identifier"] = attributes.get('Identifier', {}).get('value', None)
323
325
  prop_bod["productName"] = attributes.get('Product Name', {}).get('value', None)
324
326
  prop_bod["maturity"] = attributes.get('Maturity', {}).get('value', None)
@@ -341,7 +343,7 @@ def set_update_status_body(object_type: str, attributes: dict)->dict:
341
343
 
342
344
  def set_gov_prop_body(object_type: str, qualified_name: str, attributes: dict)->dict:
343
345
  prop_name = object_type.replace(" ", "")
344
- prop_bod = set_prop_body(object_type, qualified_name, attributes)
346
+ prop_bod = set_element_prop_body(object_type, qualified_name, attributes)
345
347
  prop_bod["domainIdentifier"] = attributes.get('Domain Identifier', {}).get('value', None)
346
348
  prop_bod["displayName"]= attributes.get('Display Name', {}).get('value', None)
347
349
  prop_bod['qualifiedName'] = qualified_name
@@ -92,11 +92,20 @@ def extract_attribute(text: str, labels: set) -> str | None:
92
92
  for label in labels:
93
93
  # Construct pattern for the current label
94
94
  # text = re.sub(r'\s+', ' ', text).strip() # just added
95
- text = re.sub(r'\n\n+', '\n\n', text).strip()
95
+ # text = re.sub(r'\n\n+', '\n\n', text).strip()
96
96
 
97
- label = label.strip()
98
- pattern = rf"##\s*{re.escape(label)}\s*\n(?:\s*\n)*?(.*?)(?:#|___|$)"
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()
99
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)*?(.*?)(?:#|___|$)"
100
109
  # pattern = rf"##\s+{re.escape(label)}\n(.*?)(?:#|___|$)" # modified from --- to enable embedded tables
101
110
  match = re.search(pattern, text, re.DOTALL)
102
111
  if match:
@@ -144,8 +144,8 @@ command_list = ["Provenance", "Create Glossary", "Update Glossary", "Create Term
144
144
  "Link Information Supply Chain Peers", "Link Supply Chains", "Link Information Supply Chains",
145
145
  "Unlink Information Supply Chain Peers", "Unlink Information Supply Chains", "Unlink Supply Chains",
146
146
  "Create Solution Component", "Update Solution Component", "Link Solution Components", "Wire Solution Components",
147
- "Detach Solution Components", "Unlink Solution Components", "Create Term-Term Relationship",
148
- "Update Term-Term Relationship", "Create Data Spec", "Create Data Specification", "Update Data Spec",
147
+ "Detach Solution Components", "Unlink Solution Components", "Link Term-Term Relationship", "Link Terms", "Detach Terms",
148
+ "Detach Term-Term Relationship", "Create Data Spec", "Create Data Specification", "Update Data Spec",
149
149
  "Update Data Specification", "Create Data Field", "Update Data Field", "Create Data Structure",
150
150
  "Update Data Structure", "Create Data Dictionary", "Update Data Dictionary", "Create Data Dict",
151
151
  "Update Data Dict",
@@ -251,7 +251,8 @@ def does_command_match(command: str, alt_names: list[str]) -> bool:
251
251
  for primary_verb, synonyms in verbs_synonyms.items():
252
252
  for synonym in synonyms:
253
253
  for alt_name in alt_names:
254
- if f"{synonym} {alt_name}" == command:
254
+ tst = f"{synonym} {alt_name}"
255
+ if tst == command:
255
256
  return True
256
257
  return False
257
258
 
@@ -266,7 +267,7 @@ def find_alternate_names(command: str) -> str | None:
266
267
  verb = command.split()[0] if command else ""
267
268
  normalized_command = " ".join(command.split())
268
269
  # normalized_alternates = (" ".join(s.split()) for s in v)
269
- if (command in v):
270
+ if (normalized_command in v):
270
271
  return key
271
272
  elif does_command_match(normalized_command, v):
272
273
  return key
pyegeria/__init__.py CHANGED
@@ -17,7 +17,7 @@ from ._globals import (INTEGRATION_GUIDS, TEMPLATE_GUIDS, default_time_out, disa
17
17
  NO_CATALOGS_FOUND, NO_GLOSSARIES_FOUND, NO_TERMS_FOUND, NO_CATEGORIES_FOUND, NO_ELEMENT_FOUND,
18
18
  NO_PROJECTS_FOUND, DEBUG_LEVEL, NO_COLLECTION_FOUND, NO_GUID_RETURNED)
19
19
 
20
- from ._output_formats import select_output_format_set
20
+
21
21
 
22
22
  if disable_ssl_warnings:
23
23
  from urllib3 import disable_warnings
@@ -67,6 +67,7 @@ from .valid_metadata_omvs import ValidMetadataManager
67
67
  from .x_action_author_omvs import ActionAuthor
68
68
  from .template_manager_omvs import TemplateManager
69
69
  from .data_designer import DataDesigner
70
+ from ._output_formats import select_output_format_set
70
71
  #
71
72
  global template_guids, integration_guids
72
73
 
pyegeria/config.py CHANGED
@@ -445,4 +445,182 @@ class _LazySettings:
445
445
  cfg = get_app_config()
446
446
  return getattr(cfg, name)
447
447
 
448
- settings = _LazySettings()
448
+ settings = _LazySettings()
449
+
450
+
451
+ def pretty_print_config(env_file: str | None = None, safe: bool = True, to_console: bool = True) -> Dict[str, Dict[str, Any]]:
452
+ """
453
+ Pretty print the current configuration and indicate the source of each value
454
+ (Environment, .env file, config file, or default). Uses Rich if available.
455
+
456
+ Args:
457
+ env_file: Optional .env path to force loading before printing (if config not yet loaded).
458
+ safe: Mask sensitive values such as passwords/tokens.
459
+ to_console: If True, prints to console; function always returns a structured dict.
460
+
461
+ Returns:
462
+ dict mapping section -> { key -> {"value": ..., "source": ...} }
463
+ """
464
+ # Ensure config is loaded
465
+ cfg = get_app_config(env_file)
466
+
467
+ # Try import rich lazily
468
+ try:
469
+ from rich.console import Console
470
+ from rich.table import Table
471
+ from rich import box
472
+ console = Console(width=getattr(cfg.Environment, 'console_width', 200))
473
+ use_rich = True
474
+ except Exception:
475
+ console = None
476
+ use_rich = False
477
+
478
+ # Helper to mask sensitive keys
479
+ def _mask(key: str, val: Any) -> Any:
480
+ if not safe:
481
+ return val
482
+ key_l = (key or "").lower()
483
+ if any(s in key_l for s in ["password", "pwd", "secret", "token", "apikey", "api_key"]):
484
+ if val is None:
485
+ return None
486
+ s = str(val)
487
+ if len(s) <= 4:
488
+ return "****"
489
+ return s[:2] + "****" + s[-2:]
490
+ return val
491
+
492
+ # Determine sources. Because we merge defaults, config.json, and env, we infer source:
493
+ # - If an OS env var exists for a specific setting name we used, it's "env".
494
+ # - Else if a config file was found (by our path resolver) and provided an override, mark "config".
495
+ # - Else if value equals model default and neither env nor config provided, "default".
496
+
497
+ # We need to reconstruct which keys are influenced by ENV VAR names.
498
+ env_var_map = {
499
+ # Debug
500
+ ("Debug", "debug_mode"): "PYEGERIA_DEBUG_MODE",
501
+ ("Debug", "enable_logger_catch"): "PYEGERIA_ENABLE_LOGGER_CATCH",
502
+ ("Debug", "timeout_seconds"): "PYEGERIA_TIMEOUT_SECONDS",
503
+ # Environment
504
+ ("Environment", "Console Width"): "PYEGERIA_CONSOLE_WIDTH",
505
+ ("Environment", "Dr.Egeria Inbox"): "DR_EGERIA_INBOX_PATH",
506
+ ("Environment", "Dr.Egeria Outbox"): "DR_EGERIA_OUTBOX_PATH",
507
+ ("Environment", "Egeria Engine Host"): "EGERIA_ENGINE_HOST",
508
+ ("Environment", "Egeria Engine Host URL"): "EGERIA_ENGINE_HOST_URL",
509
+ ("Environment", "Egeria Glossary Path"): "EGERIA_GLOSSARY_PATH",
510
+ ("Environment", "Egeria Integration Daemon"): "EGERIA_INTEGRATION_DAEMON",
511
+ ("Environment", "Egeria Integration Daemon URL"): "EGERIA_INTEGRATION_DAEMON_URL",
512
+ ("Environment", "Egeria Jupyter"): "EGERIA_JUPYTER",
513
+ ("Environment", "Egeria Kafka Endpoint"): "EGERIA_KAFKA",
514
+ ("Environment", "Egeria Mermaid Folder"): "EGERIA_MERMAID_FOLDER",
515
+ ("Environment", "Egeria Metadata Store"): "EGERIA_METADATA_STORE",
516
+ ("Environment", "Egeria Platform URL"): "EGERIA_PLATFORM_URL",
517
+ ("Environment", "Egeria View Server"): "EGERIA_VIEW_SERVER",
518
+ ("Environment", "Egeria View Server URL"): "EGERIA_VIEW_SERVER_URL",
519
+ ("Environment", "Pyegeria Publishing Root"): "PYEGERIA_PUBLISHING_ROOT",
520
+ ("Environment", "Pyegeria User Format Sets Dir"): "PYEGERIA_USER_FORMAT_SETS_DIR",
521
+ ("Environment", "Pyegeria Root"): "PYEGERIA_ROOT_PATH",
522
+ ("Environment", "Pyegeria Config Directory"): "PYEGERIA_CONFIG_DIRECTORY",
523
+ ("Environment", "Egeria Config File"): "PYEGERIA_CONFIG_FILE",
524
+ # Logging
525
+ ("Logging", "console_filter_levels"): "PYEGERIA_CONSOLE_FILTER_LEVELS",
526
+ ("Logging", "console_logging_enabled"): "PYEGERIA_CONSOLE_LOGGING_ENABLED",
527
+ ("Logging", "console_logging_level"): "PYEGERIA_CONSOLE_LOG_LVL",
528
+ ("Logging", "enable_logging"): "PYEGERIA_ENABLE_LOGGING",
529
+ ("Logging", "file_logging_level"): "PYEGERIA_FILE_LOG_LVL",
530
+ ("Logging", "log_directory"): "PYEGERIA_LOG_DIRECTORY",
531
+ ("Logging", "logging_console_format"): "PYEGERIA_LOGGING_CONSOLE_FORMAT",
532
+ ("Logging", "logging_file_format"): "PYEGERIA_LOGGING_FILE_FORMAT",
533
+ # User profile
534
+ ("User Profile", "Egeria Home Collection"): "EGERIA_HOME_COLLECTION",
535
+ ("User Profile", "Egeria Home Glossary Name"): "EGERIA_HOME_GLOSSARY_NAME",
536
+ ("User Profile", "Egeria Local Qualifier"): "EGERIA_LOCAL_QUALIFIER",
537
+ ("User Profile", "user_name"): "EGERIA_USER",
538
+ ("User Profile", "user_pwd"): "EGERIA_USER_PASSWORD",
539
+ # Feature flag example
540
+ (None, "feature_x_enabled"): "FEATURE_X_ENABLED",
541
+ }
542
+
543
+ # Attempt to detect if a config.json was used
544
+ env_settings = _resolve_env_settings(env_file)
545
+ config_file_path = _find_config_file_path(env_settings)
546
+
547
+ # Build a snapshot of defaults by instantiating empty models
548
+ defaults = {
549
+ "Environment": EnvironmentConfig().model_dump(by_alias=True),
550
+ "Debug": DebugConfig().model_dump(by_alias=True),
551
+ "Logging": LoggingConfig().model_dump(by_alias=False),
552
+ "User Profile": UserProfileConfig().model_dump(by_alias=True),
553
+ "feature_x_enabled": False,
554
+ }
555
+
556
+ # Current values from cfg
557
+ sections = [
558
+ ("Environment", cfg.Environment.model_dump(by_alias=True)),
559
+ ("Debug", cfg.Debug.model_dump(by_alias=False)),
560
+ ("Logging", cfg.Logging.model_dump(by_alias=False)),
561
+ ("User Profile", cfg.User_Profile.model_dump(by_alias=True)),
562
+ ]
563
+
564
+ result: Dict[str, Dict[str, Any]] = {}
565
+
566
+ for section_name, values in sections:
567
+ section_out: Dict[str, Any] = {}
568
+ for key, val in values.items():
569
+ # Prefer alias keys in display; ensure key exists in defaults appropriately
570
+ default_section = defaults.get(section_name, {})
571
+ default_val = default_section.get(key, None)
572
+
573
+ # Identify env var used for this key if any
574
+ env_var = env_var_map.get((section_name, key))
575
+ source = "default"
576
+ if env_var and env_var in os.environ:
577
+ source = "env"
578
+ elif config_file_path and (key in (defaults.get(section_name, {}) or {}) or True):
579
+ # If a config file exists and value differs from default and no env var set
580
+ if val != default_val:
581
+ source = "config"
582
+ else:
583
+ source = "default"
584
+ else:
585
+ source = "default"
586
+
587
+ section_out[key] = {
588
+ "value": _mask(key, val),
589
+ "source": source,
590
+ }
591
+ result[section_name] = section_out
592
+
593
+ # Add top-level feature flags
594
+ feat_val = getattr(cfg, "feature_x_enabled", False)
595
+ source = "env" if ("FEATURE_X_ENABLED" in os.environ) else ("config" if config_file_path and feat_val != defaults["feature_x_enabled"] else "default")
596
+ result["feature_x_enabled"] = {"value": _mask("feature_x_enabled", feat_val), "source": source}
597
+
598
+ if to_console:
599
+ if use_rich and console:
600
+ for section_name in ["Environment", "Debug", "Logging", "User Profile"]:
601
+ table = Table(title=f"{section_name} Settings", box=box.SIMPLE_HEAVY)
602
+ table.add_column("Key")
603
+ table.add_column("Value")
604
+ table.add_column("Source")
605
+ for k, info in result[section_name].items():
606
+ table.add_row(str(k), str(info["value"]), info["source"])
607
+ console.print(table)
608
+ # Feature flags
609
+ table = Table(title="Feature Flags", box=box.SIMPLE_HEAVY)
610
+ table.add_column("Key")
611
+ table.add_column("Value")
612
+ table.add_column("Source")
613
+ ff = result["feature_x_enabled"]
614
+ table.add_row("feature_x_enabled", str(ff["value"]), ff["source"])
615
+ console.print(table)
616
+ else:
617
+ # Plain text fallback
618
+ print("Configuration:")
619
+ for section_name in ["Environment", "Debug", "Logging", "User Profile"]:
620
+ print(f"[{section_name}]")
621
+ for k, info in result[section_name].items():
622
+ print(f"- {k}: {info['value']} (source: {info['source']})")
623
+ ff = result["feature_x_enabled"]
624
+ print(f"feature_x_enabled: {ff['value']} (source: {ff['source']})")
625
+
626
+ return result
@@ -2245,9 +2245,9 @@ class GlossaryManager(CollectionManager):
2245
2245
 
2246
2246
  if body is None:
2247
2247
  body = {
2248
- "class": "RelationshipRequestBody",
2248
+ "class": "NewRelationshipRequestBody",
2249
2249
  "properties":
2250
- {"class": "GlossaryTermRelationship", }
2250
+ {"class": "GlossaryTermRelationship" }
2251
2251
  }
2252
2252
 
2253
2253
 
@@ -9,7 +9,7 @@ Copyright Contributors to the ODPi Egeria project.
9
9
 
10
10
  import asyncio
11
11
 
12
- from pyegeria import select_output_format_set
12
+ from pyegeria._output_formats import select_output_format_set
13
13
  from pyegeria._client_new import Client2
14
14
  from pyegeria._output_formats import get_output_format_type_match
15
15
  from pyegeria.config import settings as app_settings
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyegeria
3
- Version: 5.4.3
3
+ Version: 5.4.3.2
4
4
  Summary: A python client for Egeria
5
5
  License: Apache 2.0
6
6
  Keywords: egeria,metadata,governance
@@ -7,8 +7,9 @@ commands/cat/Dr-Egeria_md-orig.py,sha256=ZX20BvRo0fIFisvy5Z-VJDLVyKbQoud89-CUV2S
7
7
  commands/cat/README.md,sha256=-aaAnIT2fcfU63vajgB-RzQk4l4yFdhkyVfSaTPiqRY,967
8
8
  commands/cat/__init__.py,sha256=l4CImkjEiTQKS7QR-RQwzHIgRpfP032Mn_NZEuIILwg,98
9
9
  commands/cat/debug_log.2025-08-29_07-07-27_848189.log.zip,sha256=HoB9W87JqdI2elYVqJZ6txNApmjIVzo_IuHx3YDn-Gs,8644
10
- commands/cat/debug_log.log,sha256=nL-sd2qDDwkFBe__9TINYWB6fvpsJLFhf65t86bH4rM,106688
11
- commands/cat/dr_egeria_command_help.py,sha256=YLGZfd-jW-p_2xVRywmNMxkOJHxL-EWgObIGlcVteRk,11031
10
+ commands/cat/debug_log.2025-08-30_21-15-48_528443.log.zip,sha256=nFMKEGEEwCxRmcRgAdPm02_viN0GulQOZ9bimIjeGxA,10436
11
+ commands/cat/debug_log.log,sha256=FyzAODF7CtU0rMVZcSj_YFRZee9HBVIz0gdkpPZ_72g,734116
12
+ commands/cat/dr_egeria_command_help.py,sha256=z4EmOKNW_-5XS6eHFqIrq_9y4iyIiV3x_8B7nZjkncw,15677
12
13
  commands/cat/dr_egeria_jupyter.py,sha256=rfLVV_84Q8Pqcq1flmijKvZ7sEZFy7JAcAP_NAbb46Y,5656
13
14
  commands/cat/dr_egeria_md.py,sha256=zz-XtRW0sfBOG8kA51OFR5uKQ7JULGoOgXeJBXQBqTM,4889
14
15
  commands/cat/exp_list_glossaries.py,sha256=dC6Bnfm3YSMTKPP146qeslIFRiZnGu5b7iDYE07p4iU,5817
@@ -4304,10 +4305,10 @@ md_processing/.obsidian/plugins/obsidian-sample-plugin/tsconfig.json,sha256=1WZq
4304
4305
  md_processing/.obsidian/plugins/obsidian-sample-plugin/version-bump.mjs,sha256=Abvp-AsbUJhsRdgmx6QRQeYkq1naolNfEaV84BhwXO0,648
4305
4306
  md_processing/.obsidian/plugins/obsidian-sample-plugin/versions.json,sha256=BUExoIjmkWRH0yMlAATwxxkgaaxTTZ6GQhT4JBDGofI,23
4306
4307
  md_processing/.obsidian/workspace.json,sha256=NLVJEOtsowljw7Ka035ReHLPu4iitk2ZsuSDN6zUAFY,4282
4307
- md_processing/__init__.py,sha256=eH6gYAVFHuDu9KyTYcUZnEXRpUIyCZfvpWxskMLR-GA,7698
4308
+ md_processing/__init__.py,sha256=bz-PGl_lrIxYJVWgkVxP60Hvv47DgTNq7jWuvfAnxo4,7133
4308
4309
  md_processing/data/commands-working.json,sha256=uCo_azcuuYqGm7QffJeCGj7PyZuZRGdu7kKf4XWmMoA,1162560
4309
- md_processing/data/commands.json,sha256=JtuiXkeEcUPsK-R7MCmDr4NWlmX9KaNB8i2QeeUmSOw,1464314
4310
- md_processing/dr_egeria.py,sha256=WhQsAnqnFF_89k31Xs2X6lZIQUXG6GoD6vN30-HAspY,19541
4310
+ md_processing/data/commands.json,sha256=s7sKLZL7Qoy3Ht0FuV9NEkn971gtKUQW7MaV39mPvWY,1468803
4311
+ md_processing/dr_egeria.py,sha256=EnyehAcJW58refcXYLpKGS2KrHNUUQK7wk9GS9WVUzE,19478
4311
4312
  md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md,sha256=9nmRdFbyXgEYSraBoXS5AzkH0-18kdL7IIMiuUgSNIo,191
4312
4313
  md_processing/dr_egeria_inbox/Dr.Egeria Templates.md,sha256=-6nV6beEV8bBbW3Eggyssf-yrRc8c_Kwekyz9RN-gXc,28088
4313
4314
  md_processing/dr_egeria_inbox/arch_test.md,sha256=6GUfq0q6sA8LIMZcQHNZ8CBBn6rAaevt8IM8AyNqQy0,952
@@ -4342,12 +4343,12 @@ md_processing/dr_egeria_inbox/generated_help_terms.md,sha256=9-Qt2_reHLXMb6H1VHt
4342
4343
  md_processing/dr_egeria_inbox/glossary_creation_experiment.ipynb,sha256=dbzNu90fCKNohOWVSRBOB1GLyd95x8Qw51I5AkaPtso,11552
4343
4344
  md_processing/dr_egeria_inbox/glossary_list.md,sha256=MH1nrjwoo_UBDCj3w7Vuw4pv7TNll9wdrZj7SO49eoA,72
4344
4345
  md_processing/dr_egeria_inbox/glossary_search_test.md,sha256=AC_hyZHizAaqBp0yGK1WLyxkorxcWg8eKZlGHFGWQxE,294
4345
- md_processing/dr_egeria_inbox/glossary_test1.md,sha256=Incc3MMRaX2MXITJG8vFtpT7GNbsF8I70auiaJF5rGg,5148
4346
+ md_processing/dr_egeria_inbox/glossary_test1.md,sha256=nidMj-VRoblbWoAH0mhdSa6XK28gyx3OKfvFl2eHm2c,5331
4346
4347
  md_processing/dr_egeria_inbox/gov_def.md,sha256=WDz_zOB1qAmvPeNet-odaa893Wi-q7782vSpq7mBQSs,5294
4347
4348
  md_processing/dr_egeria_inbox/gov_def2.md,sha256=eTjRYhl8JdZpWbTZ8slLVURwYwHqccmxfMiQCmJjMk8,4825
4348
4349
  md_processing/dr_egeria_inbox/img.png,sha256=LnVAD6fnVn98zQT_AE--K1csbvPEG3LvQLdhw1bK-CI,73120
4349
4350
  md_processing/dr_egeria_inbox/output_tests.md,sha256=ar83hxpq5p4wudZPS2431os6-e7vuWpmzdoNZCzVjhU,1700
4350
- md_processing/dr_egeria_inbox/product.md,sha256=nbxoMcUki5rlIz1Jw4mkCSNBq11dEdDeo42DXxjrYzc,2945
4351
+ md_processing/dr_egeria_inbox/product.md,sha256=TqKC25JhhduMFULgo2ymkA0bzF_kczfgFpQTlNREM-E,2930
4351
4352
  md_processing/dr_egeria_inbox/rel.md,sha256=stIzGh1FTXuCW_GniFKS1_mtmQPTwA1a1OmYeP5TszQ,97
4352
4353
  md_processing/dr_egeria_inbox/sb.md,sha256=aY5QlVMxi5lh91ttr8bMCbl2z4qmsIN6XJ4SojFz8VU,1945
4353
4354
  md_processing/dr_egeria_inbox/solution-components.md,sha256=lv9krrKNV7LB4jdBAB8qDVqb23L0A0yFe858UWk2Pro,2150
@@ -4388,6 +4389,8 @@ md_processing/dr_egeria_outbox/friday/processed-2025-08-29 16:40-output_tests.md
4388
4389
  md_processing/dr_egeria_outbox/friday/processed-2025-08-30 21:15-glossary_test1.md,sha256=7kqNL3VuhHnkg_48ZNJCYVX-LjA5Au4QK7ELPCIWa-g,4956
4389
4390
  md_processing/dr_egeria_outbox/friday/processed-2025-08-31 13:27-glossary_test1.md,sha256=-yJ8hesI48yg8_Vzn7DSF4Ysv5E4NEucDZf89H7DI3M,5271
4390
4391
  md_processing/dr_egeria_outbox/friday/processed-2025-08-31 13:33-glossary_test1.md,sha256=qI-IiwdGEcOWwK5bQcSXyAYcKV1-Ds-ciFlC4HJsOI0,5798
4392
+ md_processing/dr_egeria_outbox/friday/processed-2025-08-31 20:57-glossary_test1.md,sha256=EziyMucteu6nv3egzbrocwwvmmmInOlqm4UvQRZYp9U,5803
4393
+ md_processing/dr_egeria_outbox/monday/processed-2025-09-01 09:26-product.md,sha256=8WZhjJLd5iwOitfNMsTEMk7uOACnOO-pwwyrLx04x5o,3000
4391
4394
  md_processing/dr_egeria_outbox/processed-2025-08-30 16:56-generated_help_terms.md,sha256=YV57Ou3n4_gAz29CxQxIgthMD8554h66kB2Fg8UzR3Q,31259
4392
4395
  md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md,sha256=GtPpB0F0gQ39Gq3iDFYlSwbWi5zqI6ffpOPln52sXfM,19609
4393
4396
  md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md,sha256=9MnOXSw3Z84Mivwn8grJZTH6sawguwiaandGqbBB77M,1695
@@ -4465,30 +4468,30 @@ md_processing/family_docs/Solution Architect/View_Solution_Roles.md,sha256=TN8rH
4465
4468
  md_processing/family_docs/Solution Architect.md,sha256=Wu8BSjkZCupBMzjjo4UcuXm_BfVHkfH6RqOgkw90AcU,10572
4466
4469
  md_processing/md_commands/__init__.py,sha256=ssEojzFlSYtY2bHqqOoKo8PFaANZ_kq_gIbtlXnuc2s,93
4467
4470
  md_processing/md_commands/data_designer_commands.py,sha256=wGdm8xPl4Na_F-SEPXH1S8-sceMNoidJ7mYonhlVsfs,87043
4468
- md_processing/md_commands/glossary_commands.py,sha256=5Ye-zUN4niOofQpm1cPfYjFqL26BfWyjo7-fzNnDMIA,50362
4471
+ md_processing/md_commands/glossary_commands.py,sha256=BEWcJYCWybTvbqcZD7_IFbBKiMpX6b55avrn1nckqO4,33811
4469
4472
  md_processing/md_commands/governance_officer_commands.py,sha256=NCYrx6k1q_duVoF0bMdbyLMjHOn7Xvc0-c50a4NWcGA,21990
4470
4473
  md_processing/md_commands/old_project_commands.py,sha256=LPt8fWJHfjYzh31jcfzBekHqZkn_C93RGVrA_HIQJqU,8075
4471
- md_processing/md_commands/product_manager_commands.py,sha256=Cec50-hklSvv5_zeFywb7xc_zR7BEbeFYHCm9Yfr760,45579
4472
- md_processing/md_commands/project_commands.py,sha256=OQvmNyuBoKScABq2_yAtozaeYt8SqV2t5S5aZV_bQlw,17746
4474
+ md_processing/md_commands/product_manager_commands.py,sha256=MA6VSWLxQH5MdhdzmbsXz7ESDQZvK0WbAi8vnR7P_Mg,45746
4475
+ md_processing/md_commands/project_commands.py,sha256=s9-n_a0lUU-oAZMYeaW6Nq_Tii9nG4hVIuBuf3q-heI,17762
4473
4476
  md_processing/md_commands/solution_architect_commands.py,sha256=Hk-_-2aJWoG8LYzTmf84z3rakN9kIQWEM9HM9_lz6xw,55157
4474
4477
  md_processing/md_commands/view_commands.py,sha256=dvRD0Vjv1w9FTfV5W-4EMQBTk2NAUJlIP2jQ411kHS4,11815
4475
4478
  md_processing/md_processing_utils/__init__.py,sha256=LxAmxlcji26ziKV4gGar01d95gL9vgToRIeJW8N-Ifs,80
4476
- md_processing/md_processing_utils/common_md_proc_utils.py,sha256=mod6YXbbujS6pKs3VQENHRIDCtJvTwfEuiqy1uFrge0,56377
4477
- md_processing/md_processing_utils/common_md_utils.py,sha256=3KNFdtXOqBK9rwyu5caRNIWGcTus4FTGccu6EE6fYCI,23470
4479
+ md_processing/md_processing_utils/common_md_proc_utils.py,sha256=TWQyypm9xNSf1sipnjEWQqyuaShRSldbooBBd42gODo,56637
4480
+ md_processing/md_processing_utils/common_md_utils.py,sha256=gpeShplskwzju3oi7E211b68z2gUzPl-uA8-y5p1SWE,23659
4478
4481
  md_processing/md_processing_utils/debug_log,sha256=ThG1oGHi5wDLelXX9N2g45guDczbZhW-hOitueorEdU,432
4479
4482
  md_processing/md_processing_utils/debug_log.log,sha256=eyeGWuxYgDBSNz896mrVdLGEKE_qdQecVuCUZNk4Dww,350881
4480
4483
  md_processing/md_processing_utils/determine_width.py,sha256=nzinSuSF9SeuVOfKXsg-l1cqLkNYKZnF6HYfJpft44A,4236
4481
- md_processing/md_processing_utils/extraction_utils.py,sha256=6QysDJdCq9UOs6F0lGK5-rYfx7qWvpS8M5_U6uDUuA4,20078
4484
+ md_processing/md_processing_utils/extraction_utils.py,sha256=yvlEzcQYvW3-XsKVatJzkSQgtVmyVUs9ZJrNCEX_ynI,20537
4482
4485
  md_processing/md_processing_utils/generate_dr_help.py,sha256=MJWlr_22Y9pjWqQbfSLb6C-t1GlQNlbWXkCmDnphfME,7419
4483
4486
  md_processing/md_processing_utils/generate_md_cmd_templates.py,sha256=SbWtR3T1Y6VUpdcLzjbPA-601Sg-QzxdDYIXVoqjgCc,5813
4484
4487
  md_processing/md_processing_utils/generate_md_templates.py,sha256=DMnMQ7_LbmQCS8aG-ppHGTu25obOSn4ZzSg7V21k9jo,3547
4485
4488
  md_processing/md_processing_utils/generated_help_terms.md,sha256=9-Qt2_reHLXMb6H1VHtPPQME4_riEgr0CL1yYYwNSFc,35503
4486
4489
  md_processing/md_processing_utils/logs/pyegeria.log,sha256=9MxTkQ-Q9WhJ8nzba3wVYgXP5v5QKvJN0iYQieJpwNc,6072
4487
- md_processing/md_processing_utils/md_processing_constants.py,sha256=c4ggEHJyw0asNVrqO-xZZGDQmrdr1BYDcDmTidpD688,17976
4490
+ md_processing/md_processing_utils/md_processing_constants.py,sha256=AYNzMxv6fgpK7QVhknyMVUiMpIzctWfOZnxgpp1Qiu4,18041
4488
4491
  md_processing/md_processing_utils/message_constants.py,sha256=UBf18obM83umM6zplR7ychre4xLRbBnTzidHDZ2gNvM,548
4489
4492
  pyegeria/.DS_Store,sha256=0aBMLyHzOdNfPdpm4fywtgy9RMl0MhMXfemUF9e7eaw,6148
4490
4493
  pyegeria/README.md,sha256=PwX5OC7-YSZUCIsoyHh1O-WBM2hE84sm3Bd4O353NOk,1464
4491
- pyegeria/__init__.py,sha256=XxbaEpv8bsxyKZ_Oj5uvyOv1YETOILihyrjHVV5rTys,11863
4494
+ pyegeria/__init__.py,sha256=UkpPLpbkifmuD9qKG69aDG1zSJmEEt5fSSCf_cwD7f4,11864
4492
4495
  pyegeria/_client.py,sha256=hJHn5pD8sbelP_M9dK-M5Z2CYqpRXzXfg1UCgAdQ6dQ,33416
4493
4496
  pyegeria/_client_new.py,sha256=0ExEG7-R69pUDfy8vl7FhqiepK-MnbXxxKLRas8U9WM,49550
4494
4497
  pyegeria/_deprecated_gov_engine.py,sha256=dWNcwVsE5__dF2u4QiIyQrssozzzOjBbLld8MdpmVCQ,17264
@@ -4503,7 +4506,7 @@ pyegeria/automated_curation_omvs.py,sha256=tzwCyXL0Hx8UjryBBWcPoEuBRajXZpLuwPQ1v
4503
4506
  pyegeria/classification_manager_omvs.py,sha256=kMyDP_dtHf2czU4ZlWYrakQtccPoteadlUCpWRRFJ1Q,187235
4504
4507
  pyegeria/collection_manager.py,sha256=Atx-9M-GCJB9Ej0TXlSxB4NOxSZCDuuLKyW04UYANlw,234516
4505
4508
  pyegeria/collection_models.py,sha256=d3DdWONqDdAeuUQgussiCNfvhKIDFpaI35cdW_Tv4_0,5315
4506
- pyegeria/config.py,sha256=MZ8_V8A9p8mFgARuk1nuK4z-U1_EeEZTJeESSwu-VzU,20435
4509
+ pyegeria/config.py,sha256=vRbaCPTKX4L2n2EbKQt53RQZa3J0IImKuZW0jXIi31k,28939
4507
4510
  pyegeria/core_omag_server_config.py,sha256=pNQpocICkZx8sRsTw5DPUe-TFyxlIo1U88qqgci_f7I,97764
4508
4511
  pyegeria/create_tech_guid_lists.py,sha256=hf5q8Xrdsz-bqeIW3yTORZ1XB6_BrKzLDWWwC_bNG2g,4811
4509
4512
  pyegeria/data_designer.py,sha256=i7tsR1_7puyW4MGdMHjJRAozz6MYuOn-hdw24O-rmVY,185907
@@ -4514,7 +4517,7 @@ pyegeria/egeria_my_client.py,sha256=3dSBUlrivzih75hodNHe-2BM9pGB8AQVLru-_NbhYNE,
4514
4517
  pyegeria/egeria_tech_client.py,sha256=rtUNHXM-zWMAvUm1MO5jQY-G9ll76u9cVD4pD-xWVJA,4510
4515
4518
  pyegeria/feedback_manager_omvs.py,sha256=0xBs0p54vmdfVYYgQ8pOanLC4fxfgTk1Z61Y6D1U7_I,152978
4516
4519
  pyegeria/full_omag_server_config.py,sha256=CQqLCy_3DZFvJZEOcGf50HWdFaWpiAIs6z-kKyjvpDA,47464
4517
- pyegeria/glossary_manager.py,sha256=H9puosVy1ni0bqJ0sCeRZiKMzvXU8kOvkY5Qwh02CgI,111189
4520
+ pyegeria/glossary_manager.py,sha256=izi355YxWtQOEe-Sm6rvxDGAM6_kQyb5dWgPr2_1J4g,111191
4518
4521
  pyegeria/governance_officer.py,sha256=Omgn1ZLQRAH0Ob5cdLA1P5BcbIpuJ2cIbGnTDovreMc,100285
4519
4522
  pyegeria/load_config.py,sha256=XDwPAHB3MvGRuoP8kg1lJJAI4BgMWZ3TYxfxYROgJj4,1188
4520
4523
  pyegeria/load_config_orig.py,sha256=lOM37vdIBcYfLQFTLP5bDuNc7vTFGBNYPfqHtWGNvA4,11624
@@ -4528,7 +4531,7 @@ pyegeria/models.py,sha256=JX81Wfskn5G4vTXFYl9Ctk-dnr6X2zuto-4gqbuAI9Y,19963
4528
4531
  pyegeria/my_profile_omvs.py,sha256=d0oJYCJG7pS9BINPuGciVa00ac0jwPHNANXDCLginEc,34720
4529
4532
  pyegeria/output_formatter.py,sha256=sjStIfMMpM1sQ3XXbQulPbcVoCpzjUK4NRC6oYGTWY4,36611
4530
4533
  pyegeria/platform_services.py,sha256=AJNa8n2mKfAMK68q886YCD-p5bpCxIlCxBsRdr0R9O4,41708
4531
- pyegeria/project_manager.py,sha256=QLWfXf6sYd78j02_gKFFhUnN9vEwhWBJfHRke5bhg4U,65908
4534
+ pyegeria/project_manager.py,sha256=byffBJ13MkFXGHgIk8_dWQ2HP8qvzmE2EtiiostpUgk,65924
4532
4535
  pyegeria/registered_info.py,sha256=y0-LgDIQXpph0lEWxIOG3_HsqX_Z2iAIb3xu4Aa4B70,6344
4533
4536
  pyegeria/runtime_manager_omvs.py,sha256=bVAFJPRnIbTxdzmDHx7XgJBlyh_ZyHiKeUGqFT1Ozpg,80293
4534
4537
  pyegeria/server_operations.py,sha256=dTqUEmX1B77b0x61OSU0aonsW8KwIpfzb3eioRpwaiI,16832
@@ -4537,8 +4540,8 @@ pyegeria/template_manager_omvs.py,sha256=chBljs1vy5wr9DRAtbvIt4Cob_7HxGfxLkCNlDT
4537
4540
  pyegeria/utils.py,sha256=qgiYEdCRrrL6SpX1sceZQVYR40-rfFAhUJEhsubcx80,6889
4538
4541
  pyegeria/valid_metadata_omvs.py,sha256=Xq9DqBQvBFFJzaFIRKcVZ2k4gJvSh9yeXs_j-O3vn1w,65050
4539
4542
  pyegeria/x_action_author_omvs.py,sha256=RcqSzahUKCtvb_3u_wyintAlc9WFkC_2v0E12TZs8lQ,6433
4540
- pyegeria-5.4.3.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
4541
- pyegeria-5.4.3.dist-info/METADATA,sha256=bfze_AmW_t2p-wiIuL7_qsIWHY0X7Hd9FSM7Z2FVbBg,6290
4542
- pyegeria-5.4.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
4543
- pyegeria-5.4.3.dist-info/entry_points.txt,sha256=HAS-LHaaBfkaZ19XU9g5mXwn2uj2HK99isdijI-VIDk,6353
4544
- pyegeria-5.4.3.dist-info/RECORD,,
4543
+ pyegeria-5.4.3.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
4544
+ pyegeria-5.4.3.2.dist-info/METADATA,sha256=cq1w3b5ja6KBfYRN2UBJmLIN-CTr1nei_FyUY4XzUk4,6292
4545
+ pyegeria-5.4.3.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
4546
+ pyegeria-5.4.3.2.dist-info/entry_points.txt,sha256=HAS-LHaaBfkaZ19XU9g5mXwn2uj2HK99isdijI-VIDk,6353
4547
+ pyegeria-5.4.3.2.dist-info/RECORD,,