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
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Copyright Contributors to the ODPi Egeria project.
|
|
5
|
+
|
|
6
|
+
Generic list command that wraps exec_report_spec and adds TABLE output.
|
|
7
|
+
|
|
8
|
+
- TABLE: renders results as a paged Rich table; table title comes from get_report_spec_heading().
|
|
9
|
+
- MD, REPORT, FORM, HTML, MERMAID, LIST: writes the output to a timestamped file in the outbox.
|
|
10
|
+
|
|
11
|
+
Environment variables used (with defaults aligned to other commands):
|
|
12
|
+
- EGERIA_VIEW_SERVER, EGERIA_VIEW_SERVER_URL
|
|
13
|
+
- EGERIA_USER, EGERIA_USER_PASSWORD
|
|
14
|
+
- EGERIA_WIDTH, EGERIA_JUPYTER
|
|
15
|
+
- EGERIA_ROOT_PATH, EGERIA_OUTBOX_PATH
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import argparse
|
|
20
|
+
import json
|
|
21
|
+
import os
|
|
22
|
+
import sys
|
|
23
|
+
import time
|
|
24
|
+
from typing import Any, Dict, List, Mapping, Sequence
|
|
25
|
+
|
|
26
|
+
from rich import box
|
|
27
|
+
from rich.console import Console
|
|
28
|
+
from rich.table import Table
|
|
29
|
+
from rich.prompt import Prompt
|
|
30
|
+
|
|
31
|
+
from pyegeria.core.config import settings
|
|
32
|
+
from pyegeria.core._exceptions import PyegeriaException, print_exception_response
|
|
33
|
+
from pyegeria.view.base_report_formats import get_report_spec_heading, select_report_spec
|
|
34
|
+
from pyegeria.view.format_set_executor import exec_report_spec
|
|
35
|
+
EGERIA_USER = os.environ.get("EGERIA_USER", "erinoverview")
|
|
36
|
+
EGERIA_USER_PASSWORD = os.environ.get("EGERIA_USER_PASSWORD", "secret")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
app_config = settings.Environment
|
|
40
|
+
# config_logging()
|
|
41
|
+
|
|
42
|
+
TEXT_FILE_FORMATS = {"MD", "REPORT", "FORM", "HTML", "MERMAID", "LIST", "DICT", "JSON"}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def list_generic(
|
|
46
|
+
report_spec: str,
|
|
47
|
+
*,
|
|
48
|
+
output_format: str = "TABLE",
|
|
49
|
+
params: Dict[str, Any] | None = None,
|
|
50
|
+
view_server: str = app_config.egeria_view_server,
|
|
51
|
+
view_url: str = app_config.egeria_view_server_url,
|
|
52
|
+
user: str = EGERIA_USER,
|
|
53
|
+
user_pass: str = EGERIA_USER_PASSWORD,
|
|
54
|
+
jupyter: bool = app_config.egeria_jupyter,
|
|
55
|
+
width: int = app_config.console_width,
|
|
56
|
+
prompt_missing: bool = False,
|
|
57
|
+
write_file: bool = False,
|
|
58
|
+
render_table: bool = False,
|
|
59
|
+
table_caption: str | None = None,
|
|
60
|
+
use_pager: bool = True,
|
|
61
|
+
) -> Dict[str, Any]:
|
|
62
|
+
"""
|
|
63
|
+
Execute a report spec and return results, usable both as a library function and CLI.
|
|
64
|
+
|
|
65
|
+
Required vs Optional parameters are derived from the report spec's action:
|
|
66
|
+
- Required: fmt.action.required_params (or action.user_params) not supplied by spec_params.
|
|
67
|
+
- Optional: fmt.action.optional_params.
|
|
68
|
+
|
|
69
|
+
Behavior:
|
|
70
|
+
- If prompt_missing is True, will interactively Prompt.ask for any missing required params.
|
|
71
|
+
- If prompt_missing is False and required params are missing, raises ValueError.
|
|
72
|
+
- For output_format == "TABLE": returns a JSON payload for table rendering; no file I/O by default.
|
|
73
|
+
- If render_table=True, this function will also render a Rich table immediately (useful for remote/programmatic calls).
|
|
74
|
+
You can customize rendering via table_caption and use_pager.
|
|
75
|
+
- For narrative formats (MD, REPORT, FORM, MERMAID, LIST, HTML):
|
|
76
|
+
- If write_file=True, writes to outbox and returns the file path in the result.
|
|
77
|
+
- Otherwise returns the text content in the result.
|
|
78
|
+
|
|
79
|
+
Parameters (additional rendering options)
|
|
80
|
+
- render_table: bool (default False) — when True and output_format==TABLE, render the Rich table directly.
|
|
81
|
+
- table_caption: Optional[str] — custom caption; defaults to "View Server '{view_server}' @ Platform - {view_url}".
|
|
82
|
+
- use_pager: bool (default True) — wrap the table output in console.pager().
|
|
83
|
+
|
|
84
|
+
Returns a dict with keys like:
|
|
85
|
+
{"kind": "table"|"text"|"json"|"empty", "data"|"content", "file_path"?, "heading", "required", "optional", "rendered"?}
|
|
86
|
+
"""
|
|
87
|
+
params = dict(params or {})
|
|
88
|
+
ofmt = (output_format or "TABLE").upper()
|
|
89
|
+
|
|
90
|
+
# Load format spec to introspect required/optional params
|
|
91
|
+
fmt = select_report_spec(report_spec, ofmt if ofmt not in {"TABLE", "MD", "FORM", "LIST"} else "DICT")
|
|
92
|
+
if not fmt:
|
|
93
|
+
raise ValueError(f"Report spec '{report_spec}' not found for format '{ofmt}'.")
|
|
94
|
+
action = fmt.get("action", {}) or {}
|
|
95
|
+
required_params = action.get("required_params", action.get("user_params", [])) or []
|
|
96
|
+
optional_params = action.get("optional_params", []) or []
|
|
97
|
+
spec_params = action.get("spec_params", {}) or {}
|
|
98
|
+
|
|
99
|
+
# Identify missing required params (not provided by caller and not satisfied by spec_params)
|
|
100
|
+
missing = [p for p in required_params if params.get(p) in (None, "") and p not in spec_params]
|
|
101
|
+
|
|
102
|
+
if missing:
|
|
103
|
+
if prompt_missing:
|
|
104
|
+
# Prompt user for each missing required param
|
|
105
|
+
for p in missing:
|
|
106
|
+
val = Prompt.ask(f"Enter value for required parameter '{p}'")
|
|
107
|
+
params[p] = val
|
|
108
|
+
else:
|
|
109
|
+
raise ValueError(f"Missing required parameter(s): {', '.join(missing)}")
|
|
110
|
+
|
|
111
|
+
# Map only TABLE to DICT for data retrieval; pass through other formats
|
|
112
|
+
# mapped_format = "DICT" if ofmt == "TABLE" else ofmt
|
|
113
|
+
mapped_format = ofmt
|
|
114
|
+
try:
|
|
115
|
+
# Execute
|
|
116
|
+
result = exec_report_spec(
|
|
117
|
+
report_spec,
|
|
118
|
+
output_format=mapped_format,
|
|
119
|
+
params=params,
|
|
120
|
+
view_server=view_server,
|
|
121
|
+
view_url=view_url,
|
|
122
|
+
user=user,
|
|
123
|
+
user_pass=user_pass,
|
|
124
|
+
)
|
|
125
|
+
except ValueError as e:
|
|
126
|
+
console = Console(
|
|
127
|
+
style="bold bright_white on black",
|
|
128
|
+
)
|
|
129
|
+
console.print(f"Error executing report: {e}")
|
|
130
|
+
sys.exit(1)
|
|
131
|
+
|
|
132
|
+
# Normalize/augment response
|
|
133
|
+
if result is None:
|
|
134
|
+
return {
|
|
135
|
+
"kind": "empty",
|
|
136
|
+
"heading": get_report_spec_heading(report_spec) or f"Report: {report_spec}",
|
|
137
|
+
"required": required_params,
|
|
138
|
+
"optional": optional_params,
|
|
139
|
+
}
|
|
140
|
+
if result.get("kind") == "empty":
|
|
141
|
+
return {
|
|
142
|
+
"kind": "empty",
|
|
143
|
+
"heading": get_report_spec_heading(report_spec) or f"Report: {report_spec}",
|
|
144
|
+
"required": required_params,
|
|
145
|
+
"optional": optional_params,
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
# For TABLE, optionally render Rich table and return json data for caller
|
|
149
|
+
if ofmt == "TABLE":
|
|
150
|
+
if result.get("kind") == "json":
|
|
151
|
+
heading = get_report_spec_heading(report_spec) or f"Report: {report_spec}"
|
|
152
|
+
data = result.get("data")
|
|
153
|
+
rendered = False
|
|
154
|
+
if render_table:
|
|
155
|
+
console = Console(
|
|
156
|
+
style="bold bright_white on black",
|
|
157
|
+
width=width,
|
|
158
|
+
force_terminal=not jupyter,
|
|
159
|
+
)
|
|
160
|
+
caption = table_caption or f"View Server '{view_server}' @ Platform - {view_url}"
|
|
161
|
+
_render_table(console, heading, caption, data, use_pager=use_pager)
|
|
162
|
+
rendered = True
|
|
163
|
+
return {
|
|
164
|
+
"kind": "table",
|
|
165
|
+
"heading": heading,
|
|
166
|
+
"data": data,
|
|
167
|
+
"required": required_params,
|
|
168
|
+
"optional": optional_params,
|
|
169
|
+
"rendered": rendered,
|
|
170
|
+
}
|
|
171
|
+
# Fallback: unexpected shape
|
|
172
|
+
return {
|
|
173
|
+
"kind": "unknown",
|
|
174
|
+
"raw": result,
|
|
175
|
+
"required": required_params,
|
|
176
|
+
"optional": optional_params,
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
# Narrative formats (all non-TABLE should generate files)
|
|
180
|
+
content: str = ""
|
|
181
|
+
if result.get("kind") == "text":
|
|
182
|
+
# Already-rendered text like Markdown or HTML
|
|
183
|
+
content = str(result.get("content", ""))
|
|
184
|
+
elif result.get("kind") == "json":
|
|
185
|
+
data = result.get("data")
|
|
186
|
+
# For DICT/JSON explicitly produce raw JSON text; otherwise fallback to fenced JSON
|
|
187
|
+
if ofmt in {"DICT", "JSON"}:
|
|
188
|
+
content = json.dumps(data, indent=2)
|
|
189
|
+
else:
|
|
190
|
+
content = "```json\n" + json.dumps(data, indent=2) + "\n```"
|
|
191
|
+
else:
|
|
192
|
+
content = json.dumps(result, indent=2, default=str)
|
|
193
|
+
|
|
194
|
+
if write_file or ofmt in TEXT_FILE_FORMATS:
|
|
195
|
+
# Determine suffix for file naming
|
|
196
|
+
suffix = ofmt
|
|
197
|
+
path = write_output_file(content, report_spec, suffix)
|
|
198
|
+
return {
|
|
199
|
+
"kind": "text" if ofmt not in {"DICT", "JSON"} else "json",
|
|
200
|
+
"content": content,
|
|
201
|
+
"file_path": path,
|
|
202
|
+
"heading": get_report_spec_heading(report_spec) or f"Report: {report_spec}",
|
|
203
|
+
"required": required_params,
|
|
204
|
+
"optional": optional_params,
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return {
|
|
208
|
+
"kind": "text",
|
|
209
|
+
"content": content,
|
|
210
|
+
"heading": get_report_spec_heading(report_spec) or f"Report: {report_spec}",
|
|
211
|
+
"required": required_params,
|
|
212
|
+
"optional": optional_params,
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def _flatten(item: Any, parent_key: str = "", sep: str = ".") -> Dict[str, Any]:
|
|
217
|
+
"""Flatten nested dict-like objects into a single level using dot-notation keys."""
|
|
218
|
+
flat: Dict[str, Any] = {}
|
|
219
|
+
if isinstance(item, Mapping):
|
|
220
|
+
for k, v in item.items():
|
|
221
|
+
new_key = f"{parent_key}{sep}{k}" if parent_key else str(k)
|
|
222
|
+
flat.update(_flatten(v, new_key, sep))
|
|
223
|
+
elif isinstance(item, (list, tuple)):
|
|
224
|
+
# Represent short sequences inline; longer ones as counts
|
|
225
|
+
if len(item) <= 3:
|
|
226
|
+
flat[parent_key or "list"] = ", ".join([str(x) for x in item])
|
|
227
|
+
else:
|
|
228
|
+
flat[parent_key or "list"] = f"{len(item)} items"
|
|
229
|
+
else:
|
|
230
|
+
flat[parent_key or "value"] = item
|
|
231
|
+
return flat
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def _collect_columns(rows: Sequence[Mapping[str, Any]], max_cols: int = 12) -> List[str]:
|
|
235
|
+
"""Collect a union of keys across rows, up to max_cols, keeping a stable ordering."""
|
|
236
|
+
seen: List[str] = []
|
|
237
|
+
for row in rows:
|
|
238
|
+
for k in row.keys():
|
|
239
|
+
if k not in seen:
|
|
240
|
+
seen.append(k)
|
|
241
|
+
if len(seen) >= max_cols:
|
|
242
|
+
return seen
|
|
243
|
+
return seen
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _ensure_rows(data: Any) -> List[Mapping[str, Any]]:
|
|
247
|
+
"""Convert result data into a list of row mappings suitable for table rendering."""
|
|
248
|
+
if data is None:
|
|
249
|
+
return []
|
|
250
|
+
if isinstance(data, list):
|
|
251
|
+
rows: List[Mapping[str, Any]] = []
|
|
252
|
+
for item in data:
|
|
253
|
+
if isinstance(item, Mapping):
|
|
254
|
+
rows.append(_flatten(item))
|
|
255
|
+
else:
|
|
256
|
+
rows.append({"value": item})
|
|
257
|
+
return rows
|
|
258
|
+
if isinstance(data, Mapping):
|
|
259
|
+
# If a single object contains a list-like 'elements' or similar, prefer that
|
|
260
|
+
for key in ("elements", "items", "results"):
|
|
261
|
+
if isinstance(data.get(key), list):
|
|
262
|
+
return _ensure_rows(data[key])
|
|
263
|
+
return [_flatten(data)]
|
|
264
|
+
# Fallback: scalar
|
|
265
|
+
return [{"value": data}]
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def _render_table(console: Console, title: str, caption: str, data: Any, use_pager: bool = True) -> None:
|
|
269
|
+
rows = _ensure_rows(data)
|
|
270
|
+
if not rows:
|
|
271
|
+
console.print("No results found.")
|
|
272
|
+
return
|
|
273
|
+
|
|
274
|
+
columns = _collect_columns(rows)
|
|
275
|
+
|
|
276
|
+
table = Table(
|
|
277
|
+
title=title,
|
|
278
|
+
style="bright_white on black",
|
|
279
|
+
header_style="bright_white on dark_blue",
|
|
280
|
+
title_style="bold white on black",
|
|
281
|
+
caption_style="white on black",
|
|
282
|
+
show_lines=True,
|
|
283
|
+
box=box.ROUNDED,
|
|
284
|
+
caption=caption,
|
|
285
|
+
expand=True,
|
|
286
|
+
)
|
|
287
|
+
for col in columns:
|
|
288
|
+
table.add_column(str(col))
|
|
289
|
+
|
|
290
|
+
for row in rows:
|
|
291
|
+
table.add_row(*[str(row.get(col, "")) for col in columns])
|
|
292
|
+
|
|
293
|
+
# Page the table if it's large
|
|
294
|
+
if use_pager:
|
|
295
|
+
with console.pager():
|
|
296
|
+
console.print(table)
|
|
297
|
+
else:
|
|
298
|
+
console.print(table)
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def write_output_file(content: str, report_spec: str, suffix: str) -> str:
|
|
302
|
+
# Base directory is outbox/report_spec specific folder
|
|
303
|
+
file_path = os.path.join(app_config.pyegeria_root, app_config.dr_egeria_outbox, f"{report_spec}")
|
|
304
|
+
ts = time.strftime("%Y-%m-%d-%H-%M-%S")
|
|
305
|
+
safe_spec = "".join(c for c in report_spec if c.isalnum() or c in ("-", "_", "+", ".", " ")).strip().replace(" ", "_")
|
|
306
|
+
# Determine extension by content type rules
|
|
307
|
+
if suffix in {"MD", "REPORT", "FORM", "MERMAID", "LIST"}:
|
|
308
|
+
ext = ".md"
|
|
309
|
+
elif suffix in {"HTML"}:
|
|
310
|
+
ext = ".html"
|
|
311
|
+
elif suffix in {"DICT", "JSON"}:
|
|
312
|
+
ext = ".json"
|
|
313
|
+
else:
|
|
314
|
+
ext = ".txt"
|
|
315
|
+
file_name = f"{safe_spec}-{ts}-{suffix}{ext}"
|
|
316
|
+
full_file_path = os.path.join(file_path, file_name)
|
|
317
|
+
os.makedirs(os.path.dirname(full_file_path), exist_ok=True)
|
|
318
|
+
with open(full_file_path, "w", encoding="utf-8") as f:
|
|
319
|
+
f.write(content)
|
|
320
|
+
return full_file_path
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def main():
|
|
324
|
+
parser = argparse.ArgumentParser(description="Generic list command using exec_report_spec")
|
|
325
|
+
parser.add_argument("--report", dest="report_spec", help="Report spec name to execute (see report specs)")
|
|
326
|
+
parser.add_argument("--output-format", dest="output_format", default="TABLE",
|
|
327
|
+
choices=["TABLE", "MD", "REPORT", "FORM", "HTML", "MERMAID", "LIST", "JSON", "DICT"],
|
|
328
|
+
help="Output rendering format")
|
|
329
|
+
parser.add_argument("--server", dest="server", help="Egeria view server name", default=app_config.egeria_view_server)
|
|
330
|
+
parser.add_argument("--url", dest="url", help="Egeria platform URL", default=app_config.egeria_view_server_url)
|
|
331
|
+
parser.add_argument("--userid", dest="user", help="User Id", default=EGERIA_USER)
|
|
332
|
+
parser.add_argument("--password", dest="password", help="User Password", default=EGERIA_USER_PASSWORD)
|
|
333
|
+
# Allow arbitrary parameters as JSON or repeated key=value
|
|
334
|
+
parser.add_argument("--params-json", dest="params_json", help="JSON string of parameters for the report spec")
|
|
335
|
+
parser.add_argument("--param", dest="params_kv", action="append", default=[], help="Repeated key=value parameters")
|
|
336
|
+
|
|
337
|
+
args = parser.parse_args()
|
|
338
|
+
|
|
339
|
+
# Prompt for report spec if not provided
|
|
340
|
+
report_spec = args.report_spec or Prompt.ask("Enter the report spec to execute").strip()
|
|
341
|
+
output_format = (args.output_format or "TABLE").upper()
|
|
342
|
+
|
|
343
|
+
# Build params dict
|
|
344
|
+
params: Dict[str, Any] = {}
|
|
345
|
+
if args.params_json:
|
|
346
|
+
try:
|
|
347
|
+
parsed = json.loads(args.params_json)
|
|
348
|
+
if isinstance(parsed, dict):
|
|
349
|
+
params.update(parsed)
|
|
350
|
+
except Exception:
|
|
351
|
+
pass
|
|
352
|
+
for kv in (args.params_kv or []):
|
|
353
|
+
if "=" in kv:
|
|
354
|
+
k, v = kv.split("=", 1)
|
|
355
|
+
params[k.strip()] = v.strip()
|
|
356
|
+
|
|
357
|
+
console = Console(
|
|
358
|
+
style="bold bright_white on black",
|
|
359
|
+
width=app_config.console_width,
|
|
360
|
+
force_terminal=not app_config.egeria_jupyter,
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
try:
|
|
364
|
+
# Use shared function with prompting enabled for missing required params
|
|
365
|
+
write_file = output_format in TEXT_FILE_FORMATS
|
|
366
|
+
result = list_generic(report_spec, output_format=output_format, params=params, view_server=args.server,
|
|
367
|
+
view_url=args.url, user=args.user, user_pass=args.password, jupyter=app_config.egeria_jupyter,
|
|
368
|
+
width=app_config.console_width, prompt_missing=True, write_file=write_file)
|
|
369
|
+
|
|
370
|
+
if result.get("kind") == "empty":
|
|
371
|
+
console.print("No results found.")
|
|
372
|
+
return
|
|
373
|
+
|
|
374
|
+
if output_format == "TABLE":
|
|
375
|
+
heading = result.get("heading") or (get_report_spec_heading(report_spec) or f"Report: {report_spec}")
|
|
376
|
+
caption = f"View Server '{args.server}' @ Platform - {args.url}"
|
|
377
|
+
_render_table(console, heading, caption, result.get("data"))
|
|
378
|
+
return
|
|
379
|
+
|
|
380
|
+
# For narrative formats, either a file was written or content is returned
|
|
381
|
+
fpath = result.get("file_path")
|
|
382
|
+
if fpath:
|
|
383
|
+
print(f"\n==> Output written to {fpath}")
|
|
384
|
+
else:
|
|
385
|
+
print(result.get("content", ""))
|
|
386
|
+
|
|
387
|
+
except PyegeriaException as e:
|
|
388
|
+
print_exception_response(e)
|
|
389
|
+
except KeyboardInterrupt:
|
|
390
|
+
pass
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
if __name__ == "__main__":
|
|
394
|
+
main()
|