pyegeria 5.4.0.28__py3-none-any.whl → 5.5.3.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyegeria might be problematic. Click here for more details.
- commands/__init__.py +24 -0
- commands/cat/Dr-Egeria_md-orig.py +2 -2
- commands/cat/collection_actions.py +197 -0
- commands/cat/dr_egeria_command_help.py +137 -38
- commands/cat/dr_egeria_jupyter.py +7 -7
- commands/cat/dr_egeria_md.py +10 -267
- commands/cat/exp_list_glossaries.py +11 -14
- commands/cat/get_asset_graph.py +37 -267
- commands/cat/{get_collection.py → get_collection_tree.py} +10 -18
- commands/cat/get_project_dependencies.py +14 -14
- commands/cat/get_project_structure.py +15 -14
- commands/cat/get_tech_type_elements.py +16 -116
- commands/cat/glossary_actions.py +145 -298
- commands/cat/list_assets.py +3 -11
- commands/cat/list_cert_types.py +17 -63
- commands/cat/list_collections.py +17 -139
- commands/cat/list_deployed_catalogs.py +15 -27
- commands/cat/list_deployed_database_schemas.py +27 -43
- commands/cat/list_deployed_databases.py +16 -31
- commands/cat/list_deployed_servers.py +35 -54
- commands/cat/list_glossaries.py +18 -17
- commands/cat/list_projects.py +10 -12
- commands/cat/list_tech_type_elements.py +21 -37
- commands/cat/list_tech_types.py +13 -25
- commands/cat/list_terms.py +38 -79
- commands/cat/list_todos.py +4 -11
- commands/cat/list_user_ids.py +3 -10
- commands/cat/my_reports.py +559 -0
- commands/cat/run_report.py +394 -0
- commands/cat/{list_format_set.py → run_report_orig.py} +136 -44
- commands/cli/egeria.py +182 -219
- commands/cli/egeria_cat.py +32 -59
- commands/cli/egeria_my.py +13 -0
- commands/cli/egeria_ops.py +69 -74
- commands/cli/egeria_tech.py +17 -93
- commands/{cat → deprecated}/list_data_designer.py +2 -4
- commands/{cat → deprecated}/list_data_structures_full.py +3 -6
- commands/deprecated/old_get_asset_graph.py +315 -0
- commands/my/__init__.py +0 -2
- commands/my/list_my_profile.py +27 -34
- commands/my/list_my_roles.py +1 -7
- commands/my/monitor_my_todos.py +1 -7
- commands/my/monitor_open_todos.py +6 -7
- commands/my/todo_actions.py +4 -5
- commands/ops/__init__.py +0 -2
- commands/ops/gov_server_actions.py +17 -21
- commands/ops/list_archives.py +17 -38
- commands/ops/list_catalog_targets.py +33 -40
- commands/ops/load_archive.py +14 -11
- commands/ops/{monitor_engine_activity_c.py → monitor_active_engine_activity.py} +51 -82
- commands/ops/{monitor_integ_daemon_status.py → monitor_daemon_status.py} +35 -55
- commands/ops/monitor_engine_activity.py +79 -77
- commands/ops/{monitor_gov_eng_status.py → monitor_engine_status.py} +10 -7
- commands/ops/monitor_platform_status.py +38 -50
- commands/ops/monitor_server_startup.py +6 -11
- commands/ops/monitor_server_status.py +7 -11
- commands/ops/orig_monitor_server_list.py +8 -8
- commands/ops/orig_monitor_server_status.py +1 -5
- commands/ops/refresh_integration_daemon.py +5 -5
- commands/ops/restart_integration_daemon.py +5 -5
- commands/ops/table_integ_daemon_status.py +6 -6
- commands/ops/x_engine_actions.py +7 -7
- commands/tech/__init__.py +0 -2
- commands/tech/{generic_actions.py → element_actions.py} +6 -11
- commands/tech/get_element_info.py +20 -29
- commands/tech/get_guid_info.py +23 -42
- commands/tech/get_tech_details.py +20 -35
- commands/tech/get_tech_type_template.py +28 -39
- commands/tech/list_all_om_type_elements.py +24 -30
- commands/tech/list_all_om_type_elements_x.py +22 -28
- commands/tech/list_all_related_elements.py +19 -28
- commands/tech/list_anchored_elements.py +22 -30
- commands/tech/list_asset_types.py +19 -24
- commands/tech/list_elements_by_classification_by_property_value.py +26 -32
- commands/tech/list_elements_by_property_value.py +19 -25
- commands/tech/list_elements_by_property_value_x.py +20 -28
- commands/tech/list_elements_for_classification.py +28 -41
- commands/tech/list_gov_action_processes.py +16 -27
- commands/tech/list_information_supply_chains.py +22 -30
- commands/tech/list_registered_services.py +14 -26
- commands/tech/list_related_elements_with_prop_value.py +15 -25
- commands/tech/list_related_specification.py +1 -4
- commands/tech/list_relationship_types.py +15 -25
- commands/tech/list_relationships.py +20 -36
- commands/tech/list_solution_blueprints.py +28 -33
- commands/tech/list_solution_components.py +23 -29
- commands/tech/list_solution_roles.py +21 -32
- commands/tech/list_tech_templates.py +51 -54
- commands/tech/list_valid_metadata_values.py +5 -9
- commands/tech/table_tech_templates.py +2 -6
- commands/tech/x_list_related_elements.py +1 -4
- examples/GeoSpatial Products Example.py +524 -0
- examples/Jupyter Notebooks/P-egeria-server-config.ipynb +2137 -0
- examples/Jupyter Notebooks/README.md +2 -0
- examples/Jupyter Notebooks/common/P-environment-check.ipynb +115 -0
- examples/Jupyter Notebooks/common/__init__.py +14 -0
- examples/Jupyter Notebooks/common/common-functions.ipynb +4694 -0
- examples/Jupyter Notebooks/common/environment-check.ipynb +52 -0
- examples/Jupyter Notebooks/common/globals.ipynb +184 -0
- examples/Jupyter Notebooks/common/globals.py +154 -0
- examples/Jupyter Notebooks/common/orig_globals.py +152 -0
- examples/format_sets/all_format_sets.json +910 -0
- examples/format_sets/custom_format_sets.json +268 -0
- examples/format_sets/subset_format_sets.json +187 -0
- examples/format_sets_save_load_example.py +291 -0
- examples/jacquard_data_sets.py +129 -0
- examples/output_formats_example.py +193 -0
- examples/test_jacquard_data_sets.py +54 -0
- examples/test_jacquard_data_sets_scenarios.py +94 -0
- md_processing/__init__.py +33 -24
- md_processing/command_dispatcher.py +33 -0
- md_processing/command_mapping.py +221 -0
- md_processing/data/commands/commands_data_designer.json +537 -0
- md_processing/data/commands/commands_external_reference.json +733 -0
- md_processing/data/commands/commands_feedback.json +155 -0
- md_processing/data/commands/commands_general.json +204 -0
- md_processing/data/commands/commands_glossary.json +218 -0
- md_processing/data/commands/commands_governance.json +3678 -0
- md_processing/data/commands/commands_product_manager.json +865 -0
- md_processing/data/commands/commands_project.json +642 -0
- md_processing/data/commands/commands_solution_architect.json +366 -0
- md_processing/data/commands.json +6489 -30060
- md_processing/data/{commands-working.json → commands_working.json} +9304 -13513
- md_processing/data/gened_report_specs.py +6584 -0
- md_processing/data/generated_format_sets.json +6533 -0
- md_processing/data/generated_format_sets_old.json +4137 -0
- md_processing/data/generated_format_sets_old.py +45 -0
- md_processing/dr_egeria.py +182 -0
- md_processing/md_commands/data_designer_commands.py +195 -583
- md_processing/md_commands/ext_ref_commands.py +530 -0
- md_processing/md_commands/feedback_commands.py +726 -0
- md_processing/md_commands/glossary_commands.py +106 -490
- md_processing/md_commands/governance_officer_commands.py +129 -18
- md_processing/md_commands/product_manager_commands.py +362 -115
- md_processing/md_commands/project_commands.py +351 -134
- md_processing/md_commands/solution_architect_commands.py +276 -232
- md_processing/md_commands/view_commands.py +295 -0
- md_processing/md_processing_utils/common_md_proc_utils.py +258 -166
- md_processing/md_processing_utils/common_md_utils.py +138 -43
- md_processing/md_processing_utils/determine_width.py +103 -0
- md_processing/md_processing_utils/extraction_utils.py +100 -39
- md_processing/md_processing_utils/gen_report_specs.py +643 -0
- md_processing/md_processing_utils/generate_dr_help.py +61 -33
- md_processing/md_processing_utils/generate_md_cmd_templates.py +20 -19
- md_processing/md_processing_utils/generate_md_templates.py +3 -12
- md_processing/md_processing_utils/md_processing_constants.py +1053 -72
- pyegeria/__init__.py +203 -158
- pyegeria/core/__init__.py +40 -0
- pyegeria/core/_base_platform_client.py +574 -0
- pyegeria/core/_base_server_client.py +573 -0
- pyegeria/{_exceptions_new.py → core/_exceptions.py} +62 -30
- pyegeria/{_globals.py → core/_globals.py} +14 -3
- pyegeria/core/_server_client.py +6073 -0
- pyegeria/{_validators.py → core/_validators.py} +7 -8
- pyegeria/core/config.py +654 -0
- pyegeria/{create_tech_guid_lists.py → core/create_tech_guid_lists.py} +0 -1
- pyegeria/core/load_config.py +37 -0
- pyegeria/{logging_configuration.py → core/logging_configuration.py} +1 -1
- pyegeria/core/mcp_adapter.py +144 -0
- pyegeria/core/mcp_server.py +212 -0
- pyegeria/core/utils.py +405 -0
- pyegeria/{_client.py → deprecated/_client.py} +24 -25
- pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
- pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1987 -1877
- pyegeria/{output_formatter.py → deprecated/output_formatter_with_machine_keys.py} +298 -45
- pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +155 -171
- pyegeria/{valid_metadata_omvs.py → deprecated/valid_metadata_omvs.py} +93 -93
- pyegeria/{x_action_author_omvs.py → deprecated/x_action_author_omvs.py} +2 -3
- pyegeria/egeria_cat_client.py +26 -70
- pyegeria/egeria_client.py +130 -93
- pyegeria/egeria_config_client.py +40 -46
- pyegeria/egeria_tech_client.py +141 -54
- pyegeria/models/__init__.py +150 -0
- pyegeria/{models.py → models/models.py} +156 -20
- pyegeria/omvs/__init__.py +84 -0
- pyegeria/omvs/action_author.py +342 -0
- pyegeria/omvs/actor_manager.py +5980 -0
- pyegeria/omvs/asset_catalog.py +842 -0
- pyegeria/omvs/asset_maker.py +2736 -0
- pyegeria/omvs/automated_curation.py +4403 -0
- pyegeria/omvs/classification_manager.py +11213 -0
- pyegeria/{collection_manager.py → omvs/collection_manager.py} +1334 -1160
- pyegeria/omvs/community_matters_omvs.py +468 -0
- pyegeria/{core_omag_server_config.py → omvs/core_omag_server_config.py} +157 -157
- pyegeria/{data_designer.py → omvs/data_designer.py} +1115 -660
- pyegeria/omvs/data_discovery.py +869 -0
- pyegeria/omvs/data_engineer.py +372 -0
- pyegeria/omvs/digital_business.py +1133 -0
- pyegeria/omvs/external_links.py +1752 -0
- pyegeria/omvs/feedback_manager.py +834 -0
- pyegeria/{full_omag_server_config.py → omvs/full_omag_server_config.py} +73 -69
- pyegeria/{glossary_manager.py → omvs/glossary_manager.py} +857 -519
- pyegeria/{governance_officer.py → omvs/governance_officer.py} +964 -468
- pyegeria/omvs/lineage_linker.py +314 -0
- pyegeria/omvs/location_arena.py +1525 -0
- pyegeria/omvs/metadata_expert.py +668 -0
- pyegeria/omvs/metadata_explorer_omvs.py +2943 -0
- pyegeria/omvs/my_profile.py +1042 -0
- pyegeria/omvs/notification_manager.py +358 -0
- pyegeria/omvs/people_organizer.py +394 -0
- pyegeria/{platform_services.py → omvs/platform_services.py} +113 -193
- pyegeria/omvs/product_manager.py +1825 -0
- pyegeria/omvs/project_manager.py +1907 -0
- pyegeria/omvs/reference_data.py +1140 -0
- pyegeria/omvs/registered_info.py +334 -0
- pyegeria/omvs/runtime_manager.py +2817 -0
- pyegeria/omvs/schema_maker.py +446 -0
- pyegeria/{server_operations.py → omvs/server_operations.py} +27 -26
- pyegeria/{solution_architect_omvs.py → omvs/solution_architect.py} +1886 -1505
- pyegeria/omvs/specification_properties.py +37 -0
- pyegeria/omvs/subject_area.py +1042 -0
- pyegeria/omvs/template_manager_omvs.py +236 -0
- pyegeria/omvs/time_keeper.py +1761 -0
- pyegeria/omvs/valid_metadata.py +3221 -0
- pyegeria/omvs/valid_metadata_lists.py +37 -0
- pyegeria/omvs/valid_type_lists.py +37 -0
- pyegeria/view/__init__.py +28 -0
- pyegeria/{_output_format_models.py → view/_output_format_models.py} +160 -24
- pyegeria/view/_output_formats.py +14 -0
- pyegeria/view/base_report_formats.py +2719 -0
- pyegeria/view/dr_egeria_reports.py +56 -0
- pyegeria/view/format_set_executor.py +397 -0
- pyegeria/{md_processing_utils.py → view/md_processing_utils.py} +5 -5
- pyegeria/{mermaid_utilities.py → view/mermaid_utilities.py} +2 -154
- pyegeria/view/output_formatter.py +1297 -0
- pyegeria-5.5.3.3.dist-info/METADATA +218 -0
- pyegeria-5.5.3.3.dist-info/RECORD +241 -0
- {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info}/WHEEL +2 -1
- pyegeria-5.5.3.3.dist-info/entry_points.txt +103 -0
- pyegeria-5.5.3.3.dist-info/top_level.txt +4 -0
- commands/cat/.DS_Store +0 -0
- commands/cat/.env +0 -8
- commands/cat/README.md +0 -16
- commands/cat/debug_log +0 -1126
- commands/cat/debug_log.2025-08-18_11-34-38_088636.zip +0 -0
- commands/cat/list_categories.py +0 -192
- commands/cat/logs/pyegeria.log +0 -4
- commands/cli/debug_log +0 -0
- commands/cli/debug_log.log +0 -0
- commands/cli/txt_custom_v2.tcss +0 -19
- commands/my/README.md +0 -17
- commands/ops/README.md +0 -24
- commands/ops/logs/pyegeria.log +0 -0
- commands/ops/monitor_asset_events.py +0 -108
- commands/tech/README.md +0 -24
- md_processing/.DS_Store +0 -0
- md_processing/dr-egeria-outbox/Collections-2025-08-12-13-30-37.md +0 -163
- md_processing/dr-egeria-outbox/Collections-2025-08-12-13-35-58.md +0 -474
- md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +0 -8
- md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +0 -873
- md_processing/dr_egeria_inbox/arch_test.md +0 -57
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +0 -254
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +0 -696
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +0 -254
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +0 -298
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +0 -608
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +0 -94
- md_processing/dr_egeria_inbox/archive/freddie_intro.md +0 -284
- md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +0 -275
- md_processing/dr_egeria_inbox/archive/test-term.md +0 -110
- md_processing/dr_egeria_inbox/cat_test.md +0 -100
- md_processing/dr_egeria_inbox/collections.md +0 -39
- md_processing/dr_egeria_inbox/data_designer_debug.log +0 -6
- md_processing/dr_egeria_inbox/data_designer_out.md +0 -60
- md_processing/dr_egeria_inbox/data_designer_search_test.md +0 -11
- md_processing/dr_egeria_inbox/data_field.md +0 -54
- md_processing/dr_egeria_inbox/data_spec.md +0 -77
- md_processing/dr_egeria_inbox/data_spec_test.md +0 -2406
- md_processing/dr_egeria_inbox/data_test.md +0 -179
- md_processing/dr_egeria_inbox/data_test2.md +0 -429
- md_processing/dr_egeria_inbox/data_test3.md +0 -462
- md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +0 -124
- md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +0 -168
- md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +0 -280
- md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +0 -318
- md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +0 -1073
- md_processing/dr_egeria_inbox/dr_egeria_isc1.md +0 -44
- md_processing/dr_egeria_inbox/generated_help_report.md +0 -9
- md_processing/dr_egeria_inbox/glossary_creation_experiment.ipynb +0 -341
- md_processing/dr_egeria_inbox/glossary_list.md +0 -5
- md_processing/dr_egeria_inbox/glossary_search_test.md +0 -40
- md_processing/dr_egeria_inbox/glossary_test1.md +0 -324
- md_processing/dr_egeria_inbox/gov_def.md +0 -482
- md_processing/dr_egeria_inbox/gov_def2.md +0 -447
- md_processing/dr_egeria_inbox/img.png +0 -0
- md_processing/dr_egeria_inbox/product.md +0 -211
- md_processing/dr_egeria_inbox/rel.md +0 -8
- md_processing/dr_egeria_inbox/sb.md +0 -119
- md_processing/dr_egeria_inbox/solution-components.md +0 -136
- md_processing/dr_egeria_inbox/solution_blueprints.md +0 -118
- md_processing/dr_egeria_inbox/synonym_test.md +0 -42
- md_processing/dr_egeria_inbox/t2.md +0 -268
- md_processing/dr_egeria_outbox/.obsidian/app.json +0 -1
- md_processing/dr_egeria_outbox/.obsidian/appearance.json +0 -1
- md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +0 -6
- md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +0 -31
- md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +0 -10
- md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +0 -4459
- md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +0 -10
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +0 -3
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +0 -153
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +0 -11
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +0 -1
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +0 -500
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +0 -12
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +0 -1
- md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +0 -37
- md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +0 -11
- md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +0 -220
- md_processing/dr_egeria_outbox/.obsidian/types.json +0 -28
- md_processing/dr_egeria_outbox/.obsidian/workspace.json +0 -220
- md_processing/dr_egeria_outbox/Untitled.canvas +0 -1
- md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:22-dr_egeria_intro_part1.md +0 -312
- md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:23-dr_egeria_intro_part1.md +0 -265
- md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:06-dr_egeria_intro_part1.md +0 -230
- md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:30-dr_egeria_intro_part1.md +0 -296
- md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:31-dr_egeria_intro_part1.md +0 -253
- md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:08-dr_egeria_intro_part2.md +0 -343
- md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:12-dr_egeria_intro_part2.md +0 -343
- md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:05-product.md +0 -426
- md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:56-product.md +0 -212
- md_processing/dr_egeria_outbox/monday/processed-2025-08-19 09:43-product.md +0 -201
- md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 14:55-product.md +0 -77
- md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:05-product.md +0 -75
- md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:11-product.md +0 -74
- md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 20:40-collections.md +0 -49
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +0 -719
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +0 -41
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +0 -33
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +0 -192
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/tuesday/processed-2025-07-16 19:15-gov_def2.md +0 -527
- md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 12:08-gov_def2.md +0 -527
- md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 14:27-gov_def2.md +0 -485
- md_processing/dr_egeria_outbox/tuesday/processed-2025-08-19 10:55-product.md +0 -209
- md_processing/family_docs/Data Designer/Create_Data_Class.md +0 -164
- md_processing/family_docs/Data Designer/Create_Data_Dictionary.md +0 -30
- md_processing/family_docs/Data Designer/Create_Data_Field.md +0 -162
- md_processing/family_docs/Data Designer/Create_Data_Specification.md +0 -36
- md_processing/family_docs/Data Designer/Create_Data_Structure.md +0 -38
- md_processing/family_docs/Data Designer/View_Data_Classes.md +0 -78
- md_processing/family_docs/Data Designer/View_Data_Dictionaries.md +0 -78
- md_processing/family_docs/Data Designer/View_Data_Fields.md +0 -78
- md_processing/family_docs/Data Designer/View_Data_Specifications.md +0 -78
- md_processing/family_docs/Data Designer/View_Data_Structures.md +0 -78
- md_processing/family_docs/Data Designer.md +0 -842
- md_processing/family_docs/Digital Product Manager/Add_Member->Collection.md +0 -42
- md_processing/family_docs/Digital Product Manager/Attach_Collection->Resource.md +0 -36
- md_processing/family_docs/Digital Product Manager/Create_Agreement.md +0 -96
- md_processing/family_docs/Digital Product Manager/Create_Data_Sharing_Agreement.md +0 -72
- md_processing/family_docs/Digital Product Manager/Create_DigitalSubscription.md +0 -102
- md_processing/family_docs/Digital Product Manager/Create_Digital_Product.md +0 -134
- md_processing/family_docs/Digital Product Manager/Link_Agreement_Items.md +0 -60
- md_processing/family_docs/Digital Product Manager/Link_Contracts.md +0 -26
- md_processing/family_docs/Digital Product Manager/Link_Digital_Product_-_Digital_Product.md +0 -30
- md_processing/family_docs/Digital Product Manager/Link_Subscribers.md +0 -48
- md_processing/family_docs/Digital Product Manager.md +0 -668
- md_processing/family_docs/Glossary/Attach_Category_Parent.md +0 -18
- md_processing/family_docs/Glossary/Attach_Term-Term_Relationship.md +0 -26
- md_processing/family_docs/Glossary/Create_Category.md +0 -38
- md_processing/family_docs/Glossary/Create_Glossary.md +0 -42
- md_processing/family_docs/Glossary/Create_Term.md +0 -70
- md_processing/family_docs/Glossary.md +0 -206
- md_processing/family_docs/Governance Officer/Create_Business_Imperative.md +0 -106
- md_processing/family_docs/Governance Officer/Create_Certification_Type.md +0 -112
- md_processing/family_docs/Governance Officer/Create_Governance_Approach.md +0 -114
- md_processing/family_docs/Governance Officer/Create_Governance_Obligation.md +0 -114
- md_processing/family_docs/Governance Officer/Create_Governance_Principle.md +0 -114
- md_processing/family_docs/Governance Officer/Create_Governance_Procedure.md +0 -128
- md_processing/family_docs/Governance Officer/Create_Governance_Process.md +0 -122
- md_processing/family_docs/Governance Officer/Create_Governance_Processing_Purpose.md +0 -106
- md_processing/family_docs/Governance Officer/Create_Governance_Responsibility.md +0 -122
- md_processing/family_docs/Governance Officer/Create_Governance_Rule.md +0 -122
- md_processing/family_docs/Governance Officer/Create_Governance_Strategy.md +0 -106
- md_processing/family_docs/Governance Officer/Create_License_Type.md +0 -112
- md_processing/family_docs/Governance Officer/Create_Naming_Standard_Rule.md +0 -122
- md_processing/family_docs/Governance Officer/Create_Regulation_Article.md +0 -106
- md_processing/family_docs/Governance Officer/Create_Regulation_Definition.md +0 -118
- md_processing/family_docs/Governance Officer/Create_Security_Access_Control.md +0 -114
- md_processing/family_docs/Governance Officer/Create_Security_Group.md +0 -120
- md_processing/family_docs/Governance Officer/Create_Service_Level_Objectives.md +0 -122
- md_processing/family_docs/Governance Officer/Create_Threat_Definition.md +0 -106
- md_processing/family_docs/Governance Officer/Link_Governance_Controls.md +0 -32
- md_processing/family_docs/Governance Officer/Link_Governance_Drivers.md +0 -32
- md_processing/family_docs/Governance Officer/Link_Governance_Policies.md +0 -32
- md_processing/family_docs/Governance Officer/View_Governance_Definitions.md +0 -82
- md_processing/family_docs/Governance Officer.md +0 -2412
- md_processing/family_docs/Solution Architect/Create_Information_Supply_Chain.md +0 -70
- md_processing/family_docs/Solution Architect/Create_Solution_Blueprint.md +0 -44
- md_processing/family_docs/Solution Architect/Create_Solution_Component.md +0 -96
- md_processing/family_docs/Solution Architect/Create_Solution_Role.md +0 -66
- md_processing/family_docs/Solution Architect/Link_Information_Supply_Chain_Peers.md +0 -32
- md_processing/family_docs/Solution Architect/Link_Solution_Component_Peers.md +0 -32
- md_processing/family_docs/Solution Architect/View_Information_Supply_Chains.md +0 -32
- md_processing/family_docs/Solution Architect/View_Solution_Blueprints.md +0 -32
- md_processing/family_docs/Solution Architect/View_Solution_Components.md +0 -32
- md_processing/family_docs/Solution Architect/View_Solution_Roles.md +0 -32
- md_processing/family_docs/Solution Architect.md +0 -490
- md_processing/md_processing_utils/debug_log +0 -574
- md_processing/md_processing_utils/debug_log.log +0 -0
- md_processing/md_processing_utils/dr-egeria-help-2025-07-17T17:22:09.md +0 -2065
- md_processing/md_processing_utils/generated_help_terms.md +0 -842
- pyegeria/.DS_Store +0 -0
- pyegeria/README.md +0 -35
- pyegeria/_client_new.py +0 -1102
- pyegeria/_output_formats.py +0 -730
- pyegeria/asset_catalog_omvs.py +0 -864
- pyegeria/automated_curation_omvs.py +0 -3765
- pyegeria/config.py +0 -523
- pyegeria/egeria_my_client.py +0 -91
- pyegeria/feedback_manager_omvs.py +0 -4573
- pyegeria/load_config_orig.py +0 -218
- pyegeria/md_processing_helpers.py +0 -58
- pyegeria/md_processing_utils_orig.py +0 -1103
- pyegeria/metadata_explorer_omvs.py +0 -2326
- pyegeria/my_profile_omvs.py +0 -1022
- pyegeria/project_manager.py +0 -1591
- pyegeria/registered_info.py +0 -167
- pyegeria/template_manager_omvs.py +0 -1414
- pyegeria/utils.py +0 -256
- pyegeria-5.4.0.28.dist-info/METADATA +0 -77
- pyegeria-5.4.0.28.dist-info/RECORD +0 -343
- pyegeria-5.4.0.28.dist-info/entry_points.txt +0 -105
- /commands/cat/debug_log.log → /pyegeria/deprecated/__init__.py +0 -0
- /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
- /pyegeria/{collection_models.py → models/collection_models.py} +0 -0
- {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info/licenses}/LICENSE +0 -0
pyegeria/config.py
DELETED
|
@@ -1,523 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
Copyright Contributors to the ODPi Egeria project.
|
|
4
|
-
|
|
5
|
-
This module manages configuration information for pyegeria and pyegeria clients.
|
|
6
|
-
|
|
7
|
-
The load_app_config() function loads configuration information:
|
|
8
|
-
1) Default configuration variables are specified in the Pydantic models below.
|
|
9
|
-
2) Environment variables are loaded from the .env file using pydantic-settings.
|
|
10
|
-
- PYEGERIA_ROOT_PATH and PYEGERIA_CONFIG_FILE are loaded first to locate the config file
|
|
11
|
-
- Additional environment variables are loaded from the operating system
|
|
12
|
-
3) We construct a path to an external configuration JSON file from the Environment Variables
|
|
13
|
-
- PYEGERIA_ROOT_PATH
|
|
14
|
-
- PYEGERIA_CONFIG_FILE
|
|
15
|
-
4) If a valid configuration file is found, the configuration will be loaded on top of the default configuration.
|
|
16
|
-
5) We then update the in-memory configuration from Environment Variables, if set.
|
|
17
|
-
|
|
18
|
-
The result is that Environment Variable values take priority over configuration file values which override the defaults.
|
|
19
|
-
|
|
20
|
-
The get_app_config() function is used by other modules to get configuration information from the configuration structure
|
|
21
|
-
and makes it available as a Pydantic model.
|
|
22
|
-
|
|
23
|
-
"""
|
|
24
|
-
import inspect
|
|
25
|
-
import os
|
|
26
|
-
import json
|
|
27
|
-
from typing import List, Optional, Union, Dict, Any
|
|
28
|
-
|
|
29
|
-
from loguru import logger
|
|
30
|
-
from pydantic import BaseModel, Field, validator
|
|
31
|
-
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
32
|
-
|
|
33
|
-
from pyegeria._exceptions_new import PyegeriaInvalidParameterException, PyegeriaException
|
|
34
|
-
|
|
35
|
-
logger.disable("pyegeria")
|
|
36
|
-
# --- Pydantic Settings for Environment Variables ---
|
|
37
|
-
|
|
38
|
-
class PyegeriaSettings(BaseSettings):
|
|
39
|
-
"""
|
|
40
|
-
Settings loaded from environment variables using pydantic-settings.
|
|
41
|
-
This class is used to load environment variables from the .env file.
|
|
42
|
-
|
|
43
|
-
The .env file path can be specified when creating an instance of this class
|
|
44
|
-
by passing the `_env_file` parameter. If not specified, it defaults to ".env"
|
|
45
|
-
in the current directory.
|
|
46
|
-
"""
|
|
47
|
-
# Core settings needed to locate the config file
|
|
48
|
-
pyegeria_root_path: str = ""
|
|
49
|
-
pyegeria_config_directory: str = ""
|
|
50
|
-
pyegeria_config_file: str = "config.json"
|
|
51
|
-
|
|
52
|
-
# Additional settings that can be loaded from .env
|
|
53
|
-
pyegeria_console_width: int = 200
|
|
54
|
-
pyegeria_user_format_sets_dir: str = "~/.pyegeria/format_sets"
|
|
55
|
-
egeria_user_name: str = ""
|
|
56
|
-
egeria_user_password: str = ""
|
|
57
|
-
|
|
58
|
-
model_config = SettingsConfigDict(
|
|
59
|
-
env_file=".env",
|
|
60
|
-
env_file_encoding="utf-8",
|
|
61
|
-
extra="ignore",
|
|
62
|
-
case_sensitive=False
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
@classmethod
|
|
66
|
-
def with_env_file(cls, env_file: str):
|
|
67
|
-
"""
|
|
68
|
-
Create a PyegeriaSettings instance with a specific .env file.
|
|
69
|
-
|
|
70
|
-
Args:
|
|
71
|
-
env_file: Path to the .env file to load
|
|
72
|
-
|
|
73
|
-
Returns:
|
|
74
|
-
PyegeriaSettings: A new PyegeriaSettings instance
|
|
75
|
-
"""
|
|
76
|
-
# Create a new class with a custom model_config that specifies the env_file
|
|
77
|
-
class CustomSettings(cls):
|
|
78
|
-
model_config = SettingsConfigDict(
|
|
79
|
-
env_file=env_file,
|
|
80
|
-
env_file_encoding="utf-8",
|
|
81
|
-
extra="ignore",
|
|
82
|
-
case_sensitive=False
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
# Create and return an instance of the custom class
|
|
86
|
-
return CustomSettings()
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
# --- Pydantic Models for Configuration ---
|
|
90
|
-
|
|
91
|
-
class EnvironmentConfig(BaseModel):
|
|
92
|
-
"""Environment configuration settings"""
|
|
93
|
-
console_width: int = Field(default=200, alias="Console Width")
|
|
94
|
-
dr_egeria_inbox: str = Field(default="md_processing/dr-egeria-inbox", alias="Dr.Egeria Inbox")
|
|
95
|
-
dr_egeria_outbox: str = Field(default="md_processing/dr-egeria-outbox", alias="Dr.Egeria Outbox")
|
|
96
|
-
egeria_engine_host_url: str = Field(default="", alias="Egeria Engine Host URL")
|
|
97
|
-
egeria_engine_host: str = Field(default="qs-engine-host", alias="Egeria Engine Host")
|
|
98
|
-
egeria_glossary_path: str = Field(default="glossary", alias="Egeria Glossary Path")
|
|
99
|
-
egeria_integration_daemon_url: str = Field(default="https://localhost:9443", alias="Egeria Integration Daemon URL")
|
|
100
|
-
egeria_integration_daemon: str = Field(default="qs-integration-daemon", alias="Egeria Integration Daemon")
|
|
101
|
-
egeria_jupyter: bool = Field(default=True, alias="Egeria Jupyter")
|
|
102
|
-
egeria_kafka_endpoint: str = Field(default="localhost:9192", alias="Egeria Kafka Endpoint")
|
|
103
|
-
egeria_mermaid_folder: str = Field(default="mermaid_graphs", alias="Egeria Mermaid Folder")
|
|
104
|
-
egeria_metadata_store: str = Field(default="qs-metadata-store", alias="Egeria Metadata Store")
|
|
105
|
-
egeria_platform_url: str = Field(default="https://localhost:9443", alias="Egeria Platform URL")
|
|
106
|
-
egeria_view_server_url: str = Field(default="https://localhost:9443", alias="Egeria View Server URL")
|
|
107
|
-
egeria_view_server: str = Field(default="qs-view-server", alias="Egeria View Server")
|
|
108
|
-
pyegeria_root: str = Field(default="/Users/dwolfson/localGit/egeria-v5-3/egeria-python", alias="Pyegeria Root")
|
|
109
|
-
pyegeria_config_directory: str = Field(default="", alias="Pyegeria Config Directory")
|
|
110
|
-
pyegeria_config_file: str = Field(default="config.json", alias="Egeria Config File")
|
|
111
|
-
pyegeria_publishing_root: str = Field(default="/dr-egeria-outbox", alias="Pyegeria Publishing Root")
|
|
112
|
-
pyegeria_user_format_sets_dir: str = Field(default="~/.pyegeria/format_sets", alias="Pyegeria User Format Sets Dir")
|
|
113
|
-
|
|
114
|
-
class Config:
|
|
115
|
-
populate_by_name = True
|
|
116
|
-
extra = "allow"
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
class DebugConfig(BaseModel):
|
|
120
|
-
"""Debug configuration settings"""
|
|
121
|
-
debug_mode: bool = False
|
|
122
|
-
enable_logger_catch: bool = False
|
|
123
|
-
timeout_seconds: int = 30
|
|
124
|
-
|
|
125
|
-
class Config:
|
|
126
|
-
populate_by_name = True
|
|
127
|
-
extra = "allow"
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
class LoggingConfig(BaseModel):
|
|
131
|
-
"""Logging configuration settings"""
|
|
132
|
-
console_filter_levels: List[str] = ["ERROR"]
|
|
133
|
-
console_logging_enabled: List[str] = ["_client_new", "_exceptions_new", "collections_manager_omvs", "tests"]
|
|
134
|
-
console_logging_level: str = "INFO"
|
|
135
|
-
enable_logging: bool = False
|
|
136
|
-
file_logging_level: str = "INFO"
|
|
137
|
-
log_directory: str = "logs"
|
|
138
|
-
logging_console_format: str = " <green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level}</level> | <cyan>{name}</cyan>:<cyan>{line}</cyan> - <level>{message}</level> -{extra}"
|
|
139
|
-
logging_file_format: str = " {time:YYYY-MM-DD HH:mm:ss} | {level} | {function}:{line} - {message }-{extra}"
|
|
140
|
-
|
|
141
|
-
class Config:
|
|
142
|
-
populate_by_name = True
|
|
143
|
-
extra = "allow"
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
class UserProfileConfig(BaseModel):
|
|
147
|
-
"""User profile configuration settings"""
|
|
148
|
-
egeria_home_collection: str = Field(default="MyHome", alias="Egeria Home Collection")
|
|
149
|
-
egeria_home_glossary_name: str = Field(default="Egeria-Markdown", alias="Egeria Home Glossary Name")
|
|
150
|
-
egeria_local_qualifier: str = Field(default="PDR", alias="Egeria Local Qualifier")
|
|
151
|
-
user_name: Optional[str] = "erinoverview"
|
|
152
|
-
user_pwd: Optional[str] = "secret"
|
|
153
|
-
|
|
154
|
-
@validator('user_name')
|
|
155
|
-
def validate_user_name(cls, v):
|
|
156
|
-
if not v:
|
|
157
|
-
raise ValueError("Egeria user name is not found in the configuration")
|
|
158
|
-
return v
|
|
159
|
-
|
|
160
|
-
@validator('user_pwd')
|
|
161
|
-
def validate_user_pwd(cls, v):
|
|
162
|
-
if not v:
|
|
163
|
-
raise ValueError("Egeria user password is not found in the configuration")
|
|
164
|
-
return v
|
|
165
|
-
|
|
166
|
-
class Config:
|
|
167
|
-
populate_by_name = True
|
|
168
|
-
extra = "allow"
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
class AppConfig(BaseModel):
|
|
172
|
-
"""Main application configuration"""
|
|
173
|
-
Environment: EnvironmentConfig
|
|
174
|
-
Debug: DebugConfig
|
|
175
|
-
Logging: LoggingConfig
|
|
176
|
-
User_Profile: UserProfileConfig = Field(alias="User Profile")
|
|
177
|
-
feature_x_enabled: bool = False
|
|
178
|
-
|
|
179
|
-
def get(self, key, default=None):
|
|
180
|
-
"""
|
|
181
|
-
Dictionary-like get method for backward compatibility.
|
|
182
|
-
|
|
183
|
-
Args:
|
|
184
|
-
key: The key to look up
|
|
185
|
-
default: The default value to return if the key is not found
|
|
186
|
-
|
|
187
|
-
Returns:
|
|
188
|
-
The value for the key if found, otherwise the default value
|
|
189
|
-
"""
|
|
190
|
-
# First check if the key is a direct attribute of this model
|
|
191
|
-
if hasattr(self, key):
|
|
192
|
-
return getattr(self, key)
|
|
193
|
-
|
|
194
|
-
# Then check if it's in any of the nested models
|
|
195
|
-
for section in [self.Environment, self.Debug, self.Logging, self.User_Profile]:
|
|
196
|
-
if hasattr(section, key):
|
|
197
|
-
return getattr(section, key)
|
|
198
|
-
# Also check using the original field names (with aliases)
|
|
199
|
-
for field_name, field in section.model_fields.items():
|
|
200
|
-
# In Pydantic v2, the alias is stored in json_schema_extra
|
|
201
|
-
alias = None
|
|
202
|
-
if hasattr(field, 'alias'):
|
|
203
|
-
alias = field.alias
|
|
204
|
-
elif hasattr(field, 'json_schema_extra') and field.json_schema_extra:
|
|
205
|
-
alias = field.json_schema_extra.get('alias')
|
|
206
|
-
|
|
207
|
-
if alias == key:
|
|
208
|
-
return getattr(section, field_name)
|
|
209
|
-
|
|
210
|
-
# If not found, return the default
|
|
211
|
-
return default
|
|
212
|
-
|
|
213
|
-
class Config:
|
|
214
|
-
populate_by_name = True
|
|
215
|
-
extra = "allow"
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
# --- Configuration Loading Logic ---
|
|
219
|
-
|
|
220
|
-
# Private variable to hold the loaded configuration
|
|
221
|
-
_app_config = None
|
|
222
|
-
|
|
223
|
-
def load_app_config(env_file: str = None):
|
|
224
|
-
"""
|
|
225
|
-
Loads application configuration from files and environment variables.
|
|
226
|
-
This function should ideally be called only once at application startup.
|
|
227
|
-
|
|
228
|
-
The function follows this precedence order for configuration settings:
|
|
229
|
-
1. If env_file is passed in, it uses that file to load environment variables
|
|
230
|
-
2. Otherwise, it first checks if OS environment variables are set for PYEGERIA_ROOT_PATH and PYEGERIA_CONFIG_FILE
|
|
231
|
-
3. If they are not set, it checks for a .env file in the current directory
|
|
232
|
-
4. It then loads the configuration from the config file if available
|
|
233
|
-
5. Finally, it updates the configuration with environment variables from the operating system,
|
|
234
|
-
which take precedence over the config file values
|
|
235
|
-
|
|
236
|
-
Args:
|
|
237
|
-
env_file: Optional path to a specific .env file to load. If not specified,
|
|
238
|
-
the function follows the precedence order described above.
|
|
239
|
-
|
|
240
|
-
Returns:
|
|
241
|
-
AppConfig: The loaded configuration as a Pydantic model
|
|
242
|
-
"""
|
|
243
|
-
global _app_config # Declare intent to modify the global _app_config
|
|
244
|
-
|
|
245
|
-
if _app_config is not None:
|
|
246
|
-
# Configuration already loaded, return existing instance
|
|
247
|
-
return _app_config
|
|
248
|
-
|
|
249
|
-
# Start with default configuration from Pydantic models
|
|
250
|
-
config_dict = {
|
|
251
|
-
"Environment": {},
|
|
252
|
-
"Debug": {},
|
|
253
|
-
"Logging": {},
|
|
254
|
-
"User Profile": {},
|
|
255
|
-
"feature_x_enabled": False
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
# Initialize env_settings with default values
|
|
259
|
-
env_settings = PyegeriaSettings()
|
|
260
|
-
|
|
261
|
-
# First check if OS environment variables are set for PYEGERIA_CONFIG_DIRECTORY, PYEGERIA_ROOT_PATH and PYEGERIA_CONFIG_FILE
|
|
262
|
-
config_directory = os.getenv("PYEGERIA_CONFIG_DIRECTORY")
|
|
263
|
-
root_path = os.getenv("PYEGERIA_ROOT_PATH")
|
|
264
|
-
config_file = os.getenv("PYEGERIA_CONFIG_FILE")
|
|
265
|
-
|
|
266
|
-
logger.info(f"DEBUG: Initial config_directory from OS env: {config_directory}")
|
|
267
|
-
logger.info(f"DEBUG: Initial root_path from OS env: {root_path}")
|
|
268
|
-
logger.info(f"DEBUG: Initial config_file from OS env: {config_file}")
|
|
269
|
-
logger.info(f"DEBUG: env_file parameter: {env_file}")
|
|
270
|
-
|
|
271
|
-
# If env_file is specified, use it to load environment variables
|
|
272
|
-
if env_file is not None:
|
|
273
|
-
logger.trace(f"DEBUG: Loading environment variables from {env_file}")
|
|
274
|
-
env_settings = PyegeriaSettings.with_env_file(env_file)
|
|
275
|
-
|
|
276
|
-
# If env_file is specified, always use its values, regardless of OS environment variables
|
|
277
|
-
config_directory = env_settings.pyegeria_config_directory
|
|
278
|
-
root_path = env_settings.pyegeria_root_path
|
|
279
|
-
config_file = env_settings.pyegeria_config_file
|
|
280
|
-
# If config_file is set but config_directory and root_path are not, we'll try to load the config file first
|
|
281
|
-
# and only check the .env file if we still don't have a config_directory or root_path after loading the config file
|
|
282
|
-
elif config_file is not None and config_directory is None and root_path is None:
|
|
283
|
-
# We'll check for a .env file later if needed
|
|
284
|
-
pass
|
|
285
|
-
# If any of config_directory, root_path, or config_file is not set, check for a .env file in the current directory
|
|
286
|
-
elif (config_directory is None or root_path is None or config_file is None):
|
|
287
|
-
if os.path.exists(".env"):
|
|
288
|
-
logger.info("Found .env file")
|
|
289
|
-
logger.debug(f"DEBUG: Loading environment variables from .env in current directory")
|
|
290
|
-
env_settings = PyegeriaSettings()
|
|
291
|
-
logger.debug(f"DEBUG: env_settings.pyegeria_config_directory: {env_settings.pyegeria_config_directory}")
|
|
292
|
-
logger.debug(f"DEBUG: env_settings.pyegeria_root_path: {env_settings.pyegeria_root_path}")
|
|
293
|
-
logger.debug(f"DEBUG: env_settings.pyegeria_config_file: {env_settings.pyegeria_config_file}")
|
|
294
|
-
if config_directory is None:
|
|
295
|
-
config_directory = env_settings.pyegeria_config_directory
|
|
296
|
-
if root_path is None:
|
|
297
|
-
root_path = env_settings.pyegeria_root_path
|
|
298
|
-
if config_file is None:
|
|
299
|
-
config_file = env_settings.pyegeria_config_file
|
|
300
|
-
else:
|
|
301
|
-
logger.error(f"The .env file at {env_file} wasn't found")
|
|
302
|
-
else:
|
|
303
|
-
logger.error(f"The .env file at {env_file} wasn't found-outer")
|
|
304
|
-
# Use default values if still not set
|
|
305
|
-
if config_directory is None:
|
|
306
|
-
config_directory = ""
|
|
307
|
-
if root_path is None:
|
|
308
|
-
root_path = ""
|
|
309
|
-
if config_file is None:
|
|
310
|
-
config_file = "config.json"
|
|
311
|
-
|
|
312
|
-
# Construct the config file path - prefer config_directory over root_path
|
|
313
|
-
if config_directory:
|
|
314
|
-
config_file_path = os.path.join(config_directory, config_file)
|
|
315
|
-
else:
|
|
316
|
-
config_file_path = os.path.join(root_path, config_file)
|
|
317
|
-
|
|
318
|
-
if os.path.exists(config_file_path):
|
|
319
|
-
logger.info("Found config file at {}".format(config_file_path))
|
|
320
|
-
try:
|
|
321
|
-
with open(config_file_path, 'r') as f:
|
|
322
|
-
file_config = json.load(f)
|
|
323
|
-
config_dict.update(file_config) # Merge/override defaults
|
|
324
|
-
|
|
325
|
-
# If config_directory is not set from environment variables or .env file,
|
|
326
|
-
# set it from the config file if available
|
|
327
|
-
if not config_directory and "Environment" in file_config and "Pyegeria Config Directory" in file_config["Environment"]:
|
|
328
|
-
config_directory = file_config["Environment"]["Pyegeria Config Directory"]
|
|
329
|
-
logger.debug(f"DEBUG: Setting config_directory from config file: {config_directory}")
|
|
330
|
-
# If config_directory is still not set and root_path is not set from environment variables or .env file,
|
|
331
|
-
# set root_path from the config file if available
|
|
332
|
-
if not config_directory and not root_path and "Environment" in file_config and "Pyegeria Root" in file_config["Environment"]:
|
|
333
|
-
root_path = file_config["Environment"]["Pyegeria Root"]
|
|
334
|
-
logger.debug(f"DEBUG: Setting root_path from config file: {root_path}")
|
|
335
|
-
except json.JSONDecodeError:
|
|
336
|
-
logger.warning(f"Warning: Could not parse {config_file_path}. Using defaults/env vars.")
|
|
337
|
-
except Exception as e:
|
|
338
|
-
logger.warning(f"Warning: Error reading {config_file_path}: {e}. Using defaults/env vars.")
|
|
339
|
-
else:
|
|
340
|
-
logger.warning(f"Warning: Could not find {config_file_path}. Using defaults/env vars.")
|
|
341
|
-
|
|
342
|
-
# The root_path has already been set with the correct precedence order:
|
|
343
|
-
# 1. If env_file is passed in, use that file to load environment variables
|
|
344
|
-
# 2. Otherwise, first check OS environment variables
|
|
345
|
-
# 3. If not set, check for a .env file in the current directory
|
|
346
|
-
# 4. If still not set, use the default value
|
|
347
|
-
# We don't need to set it again here, as that would override the precedence order
|
|
348
|
-
env = config_dict.get("Environment", {})
|
|
349
|
-
|
|
350
|
-
# Update configuration from environment variables
|
|
351
|
-
# Debug section
|
|
352
|
-
debug = config_dict["Debug"]
|
|
353
|
-
debug['debug_mode'] = _parse_bool_env("PYEGERIA_DEBUG_MODE", debug.get("debug_mode", False))
|
|
354
|
-
debug["enable_logger_catch"] = _parse_bool_env("PYEGERIA_ENABLE_LOGGER_CATCH", debug.get("enable_logger_catch", False))
|
|
355
|
-
debug["timeout_seconds"] = int(os.getenv("PYEGERIA_TIMEOUT_SECONDS", debug.get("timeout_seconds", 30)))
|
|
356
|
-
|
|
357
|
-
# Environment section
|
|
358
|
-
env = config_dict["Environment"]
|
|
359
|
-
# Use the settings from .env file, but allow OS environment variables to override them
|
|
360
|
-
env["Console Width"] = int(os.getenv("PYEGERIA_CONSOLE_WIDTH", env.get("Console Width", env_settings.pyegeria_console_width)))
|
|
361
|
-
env["Dr.Egeria Inbox"] = os.getenv("DR_EGERIA_INBOX_PATH", env.get("Dr.Egeria Inbox", "md_processing/dr-egeria-inbox"))
|
|
362
|
-
env["Dr.Egeria Outbox"] = os.getenv("DR_EGERIA_OUTBOX_PATH", env.get("Dr.Egeria Outbox", "md_processing/dr-egeria-outbox"))
|
|
363
|
-
env["Egeria Engine Host"] = os.getenv("EGERIA_ENGINE_HOST", env.get("Egeria Engine Host", "qs-engine-host"))
|
|
364
|
-
env["Egeria Engine Host URL"] = os.getenv("EGERIA_ENGINE_HOST_URL", env.get("Egeria Engine Host URL", "https://localhost:9443"))
|
|
365
|
-
env["Egeria Glossary Path"] = os.getenv("EGERIA_GLOSSARY_PATH", env.get("Egeria Glossary Path", "glossary"))
|
|
366
|
-
env["Egeria Integration Daemon"] = os.getenv("EGERIA_INTEGRATION_DAEMON", env.get("Egeria Integration Daemon", "qs-integration-daemon"))
|
|
367
|
-
env["Egeria Integration Daemon URL"] = os.getenv("EGERIA_INTEGRATION_DAEMON_URL", env.get("Egeria Integration Daemon URL", "https://localhost:9443"))
|
|
368
|
-
env["Egeria Jupyter"] = _parse_bool_env("EGERIA_JUPYTER", env.get("Egeria Jupyter", True))
|
|
369
|
-
env["Egeria Kafka Endpoint"] = os.getenv("EGERIA_KAFKA", env.get("Egeria Kafka Endpoint", "localhost:9192"))
|
|
370
|
-
env["Egeria Mermaid Folder"] = os.getenv("EGERIA_MERMAID_FOLDER", env.get("Egeria Mermaid Folder", "mermaid_graphs"))
|
|
371
|
-
env["Egeria Metadata Store"] = os.getenv("EGERIA_METADATA_STORE", env.get("Egeria Metadata Store", "qs-metadata-store"))
|
|
372
|
-
env["Egeria Platform URL"] = os.getenv("EGERIA_PLATFORM_URL", env.get("Egeria Platform URL", "https://localhost:9443"))
|
|
373
|
-
env["Egeria View Server"] = os.getenv("EGERIA_VIEW_SERVER", env.get("Egeria View Server", "qs-view-server"))
|
|
374
|
-
env["Egeria View Server URL"] = os.getenv("EGERIA_VIEW_SERVER_URL", env.get("Egeria View Server URL", "https://localhost:9443"))
|
|
375
|
-
env['Pyegeria Publishing Root'] = os.getenv("PYEGERIA_PUBLISHING_ROOT", env.get("Pyegeria Publishing Root", "/dr-egeria-outbox"))
|
|
376
|
-
env['Pyegeria User Format Sets Dir'] = os.getenv("PYEGERIA_USER_FORMAT_SETS_DIR", env.get("Pyegeria User Format Sets Dir", "~/.pyegeria/format_sets"))
|
|
377
|
-
# Set Pyegeria Config Directory to the config_directory value we've already determined with the correct precedence order
|
|
378
|
-
env["Pyegeria Config Directory"] = config_directory
|
|
379
|
-
# Set Pyegeria Root to the root_path value we've already determined with the correct precedence order
|
|
380
|
-
env["Pyegeria Root"] = root_path
|
|
381
|
-
|
|
382
|
-
# Logging section
|
|
383
|
-
log = config_dict["Logging"]
|
|
384
|
-
log["console_filter_levels"] = _parse_list_env("PYEGERIA_CONSOLE_FILTER_LEVELS", log.get("console_filter_levels", ["ERROR","WARNING","INFO","SUCCESS"]))
|
|
385
|
-
log["console_logging_enabled"] = _parse_list_env("PYEGERIA_CONSOLE_LOGGING_ENABLED", log.get("console_logging_enabled", ["pyegeria"]))
|
|
386
|
-
log["console_logging_level"] = os.getenv("PYEGERIA_CONSOLE_LOG_LVL", log.get("console_logging_level", "INFO"))
|
|
387
|
-
log["enable_logging"] = _parse_bool_env("PYEGERIA_ENABLE_LOGGING", log.get("enable_logging", False))
|
|
388
|
-
log["file_logging_level"] = os.getenv("PYEGERIA_FILE_LOG_LVL", log.get("file_logging_level", "INFO"))
|
|
389
|
-
log["log_directory"] = os.getenv("PYEGERIA_LOG_DIRECTORY", log.get("log_directory", 'logs'))
|
|
390
|
-
log["logging_console_format"] = os.getenv("PYEGERIA_LOGGING_CONSOLE_FORMAT", log.get("logging_console_format",
|
|
391
|
-
"<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level}</level> | "
|
|
392
|
-
"<cyan>{name}</cyan>:<cyan>{line}</cyan> - "
|
|
393
|
-
"<level>{message}</level> -{extra}"))
|
|
394
|
-
log["logging_file_format"] = os.getenv("PYEGERIA_LOGGING_FILE_FORMAT", log.get("logging_file_format",
|
|
395
|
-
"{time:YYYY-MM-DD HH:mm:ss} | {level} | {function}:{line} "
|
|
396
|
-
"- {message}-{extra}"))
|
|
397
|
-
|
|
398
|
-
# User Profile section
|
|
399
|
-
user = config_dict["User Profile"]
|
|
400
|
-
user["Egeria Home Collection"] = os.getenv("EGERIA_HOME_COLLECTION", user.get("Egeria Home Collection", "myHome"))
|
|
401
|
-
user["Egeria Home Glossary Name"] = os.getenv("EGERIA_HOME_GLOSSARY_NAME", user.get("Egeria Home Glossary Name", "Egeria-Markdown"))
|
|
402
|
-
user["Egeria Local Qualifier"] = os.getenv("EGERIA_LOCAL_QUALIFIER", user.get("Egeria Local Qualifier", "myLocal"))
|
|
403
|
-
|
|
404
|
-
# Load user credentials with proper precedence
|
|
405
|
-
# 1. Check OS environment variables
|
|
406
|
-
user_name = os.getenv("EGERIA_USER")
|
|
407
|
-
user_pwd = os.getenv("EGERIA_USER_PASSWORD")
|
|
408
|
-
|
|
409
|
-
# 2. If not set, check config file
|
|
410
|
-
if user_name is None:
|
|
411
|
-
user_name = user.get("user_name")
|
|
412
|
-
if user_pwd is None:
|
|
413
|
-
user_pwd = user.get("user_pwd")
|
|
414
|
-
|
|
415
|
-
# 3. If still not set and we have env_settings, check .env file
|
|
416
|
-
if (user_name is None or user_pwd is None) and 'env_settings' in locals():
|
|
417
|
-
if user_name is None:
|
|
418
|
-
user_name = env_settings.egeria_user_name
|
|
419
|
-
if user_pwd is None:
|
|
420
|
-
user_pwd = env_settings.egeria_user_password
|
|
421
|
-
|
|
422
|
-
# Set the values in the config dictionary
|
|
423
|
-
user["user_name"] = user_name
|
|
424
|
-
user["user_pwd"] = user_pwd
|
|
425
|
-
|
|
426
|
-
# Feature flags
|
|
427
|
-
# Ensure feature_x_enabled is a boolean, regardless of what's in the config file
|
|
428
|
-
feature_x = config_dict.get("feature_x_enabled", False)
|
|
429
|
-
feature_x = _parse_bool_value(feature_x)
|
|
430
|
-
# Check if the environment variable is set, which would override the config value
|
|
431
|
-
if "FEATURE_X_ENABLED" in os.environ:
|
|
432
|
-
feature_x = _parse_bool_value(os.getenv("FEATURE_X_ENABLED"))
|
|
433
|
-
config_dict["feature_x_enabled"] = feature_x
|
|
434
|
-
|
|
435
|
-
try:
|
|
436
|
-
# Create Pydantic model from the configuration dictionary
|
|
437
|
-
_app_config = AppConfig(**config_dict)
|
|
438
|
-
except ValueError as e:
|
|
439
|
-
# Handle validation errors from Pydantic
|
|
440
|
-
context = {"caller method": inspect.currentframe().f_back.f_code.co_name}
|
|
441
|
-
additional_info = {"reason": str(e)}
|
|
442
|
-
raise PyegeriaInvalidParameterException(None, context, additional_info)
|
|
443
|
-
|
|
444
|
-
return _app_config
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
def get_app_config(env_file: str = None)-> AppConfig:
|
|
448
|
-
"""
|
|
449
|
-
Provides access to the loaded application configuration.
|
|
450
|
-
Ensures config is loaded if not already (useful for testing or simple scripts).
|
|
451
|
-
For structured apps, load_app_config() should be called explicitly once at startup.
|
|
452
|
-
|
|
453
|
-
Args:
|
|
454
|
-
env_file: Optional path to a specific .env file to load. If not specified,
|
|
455
|
-
the default .env file in the current directory is used.
|
|
456
|
-
|
|
457
|
-
Returns:
|
|
458
|
-
AppConfig: The loaded configuration as a Pydantic model
|
|
459
|
-
"""
|
|
460
|
-
if _app_config is None:
|
|
461
|
-
# If get_app_config is called before load_app_config, load it now.
|
|
462
|
-
# This can be convenient but explicit loading is generally better.
|
|
463
|
-
logger.info(f"The env_file {env_file} is being passed in")
|
|
464
|
-
return load_app_config(env_file)
|
|
465
|
-
return _app_config
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
def _parse_bool_env(env_var: str, default: bool) -> bool:
|
|
471
|
-
"""
|
|
472
|
-
Parse a boolean environment variable.
|
|
473
|
-
|
|
474
|
-
Args:
|
|
475
|
-
env_var: The name of the environment variable
|
|
476
|
-
default: The default value if the environment variable is not set
|
|
477
|
-
|
|
478
|
-
Returns:
|
|
479
|
-
bool: The parsed boolean value
|
|
480
|
-
"""
|
|
481
|
-
if env_var in os.environ:
|
|
482
|
-
value = os.getenv(env_var).lower()
|
|
483
|
-
return value in ('true', '1', 't', 'y', 'yes', 'on')
|
|
484
|
-
return default
|
|
485
|
-
|
|
486
|
-
def _parse_bool_value(value: Any) -> bool:
|
|
487
|
-
"""
|
|
488
|
-
Parse a boolean value from any type.
|
|
489
|
-
|
|
490
|
-
Args:
|
|
491
|
-
value: The value to parse
|
|
492
|
-
|
|
493
|
-
Returns:
|
|
494
|
-
bool: The parsed boolean value
|
|
495
|
-
"""
|
|
496
|
-
if isinstance(value, bool):
|
|
497
|
-
return value
|
|
498
|
-
if isinstance(value, str):
|
|
499
|
-
return value.lower() in ('true', '1', 't', 'y', 'yes', 'on')
|
|
500
|
-
if isinstance(value, (int, float)):
|
|
501
|
-
return bool(value)
|
|
502
|
-
return False
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
def _parse_list_env(env_var: str, default: List[str]) -> List[str]:
|
|
506
|
-
"""
|
|
507
|
-
Parse a list environment variable (comma-separated).
|
|
508
|
-
|
|
509
|
-
Args:
|
|
510
|
-
env_var: The name of the environment variable
|
|
511
|
-
default: The default value if the environment variable is not set
|
|
512
|
-
|
|
513
|
-
Returns:
|
|
514
|
-
List[str]: The parsed list value
|
|
515
|
-
"""
|
|
516
|
-
if env_var in os.environ:
|
|
517
|
-
value = os.getenv(env_var)
|
|
518
|
-
if value:
|
|
519
|
-
return [item.strip() for item in value.split(',')]
|
|
520
|
-
return default
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
settings = get_app_config()
|
pyegeria/egeria_my_client.py
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
Copyright Contributors to the ODPi Egeria project.
|
|
4
|
-
|
|
5
|
-
Runtime manager is a view service that supports user interaction with the running platforms.
|
|
6
|
-
|
|
7
|
-
"""
|
|
8
|
-
from pyegeria.feedback_manager_omvs import FeedbackManager
|
|
9
|
-
from pyegeria.my_profile_omvs import MyProfile
|
|
10
|
-
from pyegeria.utils import body_slimmer
|
|
11
|
-
|
|
12
|
-
from pyegeria._exceptions import InvalidParameterException
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class EgeriaMy:
|
|
16
|
-
"""
|
|
17
|
-
Client to issue Runtime status requests using composition of MyProfile and FeedbackManager.
|
|
18
|
-
|
|
19
|
-
Attributes:
|
|
20
|
-
view_server: str
|
|
21
|
-
Name of the view server to use.
|
|
22
|
-
platform_url : str
|
|
23
|
-
URL of the server platform to connect to
|
|
24
|
-
user_id : str
|
|
25
|
-
The identity of the user calling the method - this sets a default optionally used by the methods
|
|
26
|
-
when the user doesn't pass the user_id on a method call.
|
|
27
|
-
user_pwd: str
|
|
28
|
-
The password associated with the user_id. Defaults to None
|
|
29
|
-
token: str, optional
|
|
30
|
-
Bearer token used for authentication.
|
|
31
|
-
|
|
32
|
-
Methods:
|
|
33
|
-
Methods are provided by composed sub-clients (MyProfile, FeedbackManager) via delegation.
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
def __init__(
|
|
37
|
-
self,
|
|
38
|
-
view_server: str,
|
|
39
|
-
platform_url: str,
|
|
40
|
-
user_id: str,
|
|
41
|
-
user_pwd: str = None,
|
|
42
|
-
token: str = None,
|
|
43
|
-
):
|
|
44
|
-
self.view_server = view_server
|
|
45
|
-
self.platform_url = platform_url
|
|
46
|
-
self.user_id = user_id
|
|
47
|
-
self.user_pwd = user_pwd
|
|
48
|
-
|
|
49
|
-
# Compose sub-clients
|
|
50
|
-
self._my_profile = MyProfile(view_server, platform_url, user_id, user_pwd, token)
|
|
51
|
-
self._feedback = FeedbackManager(view_server, platform_url, user_id, user_pwd, token)
|
|
52
|
-
# Keep an ordered list for delegation lookups and bulk operations
|
|
53
|
-
self._subclients = [self._my_profile, self._feedback]
|
|
54
|
-
|
|
55
|
-
# Delegation: route unknown attributes to first sub-client that has it
|
|
56
|
-
def __getattr__(self, name):
|
|
57
|
-
for sub in self._subclients:
|
|
58
|
-
if hasattr(sub, name):
|
|
59
|
-
return getattr(sub, name)
|
|
60
|
-
raise AttributeError(f"{self.__class__.__name__!s} object has no attribute {name!r}")
|
|
61
|
-
|
|
62
|
-
# Token management across subclients
|
|
63
|
-
def create_egeria_bearer_token(self, user_id: str = None, user_pwd: str = None):
|
|
64
|
-
token_val = None
|
|
65
|
-
for sub in self._subclients:
|
|
66
|
-
token_val = sub.create_egeria_bearer_token(user_id, user_pwd)
|
|
67
|
-
return token_val
|
|
68
|
-
|
|
69
|
-
def set_bearer_token(self, token: str) -> None:
|
|
70
|
-
for sub in self._subclients:
|
|
71
|
-
sub.set_bearer_token(token)
|
|
72
|
-
|
|
73
|
-
def get_token(self) -> str:
|
|
74
|
-
# Return token from the first sub-client that provides it
|
|
75
|
-
for sub in self._subclients:
|
|
76
|
-
if hasattr(sub, "get_token"):
|
|
77
|
-
return sub.get_token()
|
|
78
|
-
return None
|
|
79
|
-
|
|
80
|
-
def close_session(self) -> None:
|
|
81
|
-
for sub in self._subclients:
|
|
82
|
-
if hasattr(sub, "close_session"):
|
|
83
|
-
try:
|
|
84
|
-
sub.close_session()
|
|
85
|
-
except Exception:
|
|
86
|
-
# Best-effort close; ignore individual errors
|
|
87
|
-
pass
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if __name__ == "__main__":
|
|
91
|
-
print("Main-Egeria My Client")
|