pyegeria 5.4.3__py3-none-any.whl → 5.4.3.1__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.
- commands/cat/debug_log.2025-08-30_21-15-48_528443.log.zip +0 -0
- commands/cat/debug_log.log +9410 -1431
- commands/cat/dr_egeria_command_help.py +110 -7
- md_processing/__init__.py +6 -11
- md_processing/data/commands.json +150 -6
- md_processing/dr_egeria.py +7 -6
- md_processing/dr_egeria_inbox/glossary_test1.md +18 -3
- md_processing/dr_egeria_inbox/product.md +11 -11
- md_processing/dr_egeria_outbox/friday/processed-2025-08-31 20:57-glossary_test1.md +400 -0
- md_processing/dr_egeria_outbox/monday/processed-2025-09-01 09:26-product.md +210 -0
- md_processing/md_commands/glossary_commands.py +84 -459
- md_processing/md_commands/product_manager_commands.py +10 -7
- md_processing/md_commands/project_commands.py +2 -2
- md_processing/md_processing_utils/common_md_proc_utils.py +9 -6
- md_processing/md_processing_utils/common_md_utils.py +15 -13
- md_processing/md_processing_utils/extraction_utils.py +12 -3
- md_processing/md_processing_utils/md_processing_constants.py +5 -4
- pyegeria/__init__.py +2 -1
- pyegeria/config.py +179 -1
- pyegeria/glossary_manager.py +2 -2
- {pyegeria-5.4.3.dist-info → pyegeria-5.4.3.1.dist-info}/METADATA +1 -1
- {pyegeria-5.4.3.dist-info → pyegeria-5.4.3.1.dist-info}/RECORD +25 -22
- {pyegeria-5.4.3.dist-info → pyegeria-5.4.3.1.dist-info}/LICENSE +0 -0
- {pyegeria-5.4.3.dist-info → pyegeria-5.4.3.1.dist-info}/WHEEL +0 -0
- {pyegeria-5.4.3.dist-info → pyegeria-5.4.3.1.dist-info}/entry_points.txt +0 -0
@@ -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
|
382
|
-
if parsed_attributes
|
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
|
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
|
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
|
394
|
-
msg = f"Reference Name `{parsed_attributes
|
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
|
-
|
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 =
|
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 =
|
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
|
-
|
98
|
-
|
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", "
|
148
|
-
"
|
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
|
-
|
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 (
|
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
|
-
|
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
|
pyegeria/glossary_manager.py
CHANGED
@@ -2245,9 +2245,9 @@ class GlossaryManager(CollectionManager):
|
|
2245
2245
|
|
2246
2246
|
if body is None:
|
2247
2247
|
body = {
|
2248
|
-
"class": "
|
2248
|
+
"class": "NewRelationshipRequestBody",
|
2249
2249
|
"properties":
|
2250
|
-
{"class": "GlossaryTermRelationship"
|
2250
|
+
{"class": "GlossaryTermRelationship" }
|
2251
2251
|
}
|
2252
2252
|
|
2253
2253
|
|
@@ -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=
|
11
|
-
commands/cat/
|
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=
|
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=
|
4310
|
-
md_processing/dr_egeria.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
4472
|
-
md_processing/md_commands/project_commands.py,sha256=
|
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=
|
4477
|
-
md_processing/md_processing_utils/common_md_utils.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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
|
@@ -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=
|
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.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
4544
|
+
pyegeria-5.4.3.1.dist-info/METADATA,sha256=wB9KSfQhLxLWxoX5BRGb1xx-LJDf63XgVxATAdrpfCM,6292
|
4545
|
+
pyegeria-5.4.3.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
4546
|
+
pyegeria-5.4.3.1.dist-info/entry_points.txt,sha256=HAS-LHaaBfkaZ19XU9g5mXwn2uj2HK99isdijI-VIDk,6353
|
4547
|
+
pyegeria-5.4.3.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|