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/core/utils.py
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
Copyright Contributors to the ODPi Egeria project.
|
|
4
|
+
|
|
5
|
+
General utility functions in support of the Egeria Python Client package.
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from loguru import logger
|
|
10
|
+
from rich import print, print_json
|
|
11
|
+
from rich.console import Console
|
|
12
|
+
from pyegeria.core.config import settings as app_settings
|
|
13
|
+
from typing import Callable, TypeVar
|
|
14
|
+
|
|
15
|
+
T = TypeVar('T', bound=Callable)
|
|
16
|
+
|
|
17
|
+
console = Console(width=200)
|
|
18
|
+
|
|
19
|
+
def init_log():
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
def print_rest_request_body(body):
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
body:
|
|
27
|
+
"""
|
|
28
|
+
pretty_body = json.dumps(body, indent=4)
|
|
29
|
+
print_json(pretty_body, indent=4, sort_keys=True)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def print_rest_response(response):
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
response:
|
|
37
|
+
"""
|
|
38
|
+
print("Returns:")
|
|
39
|
+
pretty_body = json.dumps(response, indent=4)
|
|
40
|
+
print_json(pretty_body, indent=4, sort_keys=True)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def print_guid_list(guids):
|
|
44
|
+
"""Print a list of guids"""
|
|
45
|
+
if guids is None:
|
|
46
|
+
print("No assets created")
|
|
47
|
+
else:
|
|
48
|
+
pretty_guids = json.dumps(guids, indent=4)
|
|
49
|
+
print_json(pretty_guids, indent=4, sort_keys=True)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
# OCF Common services
|
|
54
|
+
# Working with assets - this set of functions displays assets returned from the open metadata repositories.
|
|
55
|
+
#
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def body_slimmer(body: dict) -> dict:
|
|
61
|
+
"""body_slimmer is a little function to remove unused keys from a dict
|
|
62
|
+
and recursively slim embedded dicts
|
|
63
|
+
|
|
64
|
+
Parameters
|
|
65
|
+
----------
|
|
66
|
+
body : the dictionary that you want to slim
|
|
67
|
+
|
|
68
|
+
Returns
|
|
69
|
+
-------
|
|
70
|
+
dict:
|
|
71
|
+
a slimmed body with all embedded dictionaries also slimmed
|
|
72
|
+
"""
|
|
73
|
+
if body is None:
|
|
74
|
+
return {}
|
|
75
|
+
|
|
76
|
+
slimmed = {}
|
|
77
|
+
for key, value in body.items():
|
|
78
|
+
if value and not isinstance(value, tuple):
|
|
79
|
+
if isinstance(value, dict):
|
|
80
|
+
# Recursively slim embedded dictionaries
|
|
81
|
+
slimmed_value = body_slimmer(value)
|
|
82
|
+
if slimmed_value: # Only include non-empty dictionaries
|
|
83
|
+
slimmed[key] = slimmed_value
|
|
84
|
+
else:
|
|
85
|
+
slimmed[key] = value
|
|
86
|
+
return slimmed
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def camel_to_title_case(input_string):
|
|
90
|
+
# Add a space before uppercase letters and capitalize each word
|
|
91
|
+
result = re.sub(r'([a-z])([A-Z])', r'\1 \2', input_string).title()
|
|
92
|
+
return result
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def to_camel_case(input_string):
|
|
96
|
+
"""Convert an input string to camelCase, singularizing if plural.
|
|
97
|
+
|
|
98
|
+
This function takes an input string, converts it to singular form if it's plural,
|
|
99
|
+
and then transforms it to camelCase format (first word lowercase, subsequent words
|
|
100
|
+
capitalized with no spaces).
|
|
101
|
+
|
|
102
|
+
Parameters
|
|
103
|
+
----------
|
|
104
|
+
input_string : str
|
|
105
|
+
The string to convert to camelCase
|
|
106
|
+
|
|
107
|
+
Returns
|
|
108
|
+
-------
|
|
109
|
+
str:
|
|
110
|
+
The input string converted to camelCase, after singularization if needed
|
|
111
|
+
|
|
112
|
+
Examples
|
|
113
|
+
--------
|
|
114
|
+
>>> to_camel_case("data categories")
|
|
115
|
+
'dataCategory'
|
|
116
|
+
>>> to_camel_case("business terms")
|
|
117
|
+
'businessTerm'
|
|
118
|
+
>>> to_camel_case("glossary categories")
|
|
119
|
+
'glossaryCategory'
|
|
120
|
+
"""
|
|
121
|
+
if not input_string:
|
|
122
|
+
return ""
|
|
123
|
+
|
|
124
|
+
# Convert to lowercase for consistent processing
|
|
125
|
+
lowercase_input = input_string.lower()
|
|
126
|
+
|
|
127
|
+
# First, convert to singular if plural
|
|
128
|
+
singular = lowercase_input
|
|
129
|
+
|
|
130
|
+
# Handle common plural endings
|
|
131
|
+
if singular.endswith('ies'):
|
|
132
|
+
singular = singular[:-3] + 'y'
|
|
133
|
+
elif singular.endswith('es'):
|
|
134
|
+
# Special cases like 'classes' -> 'class'
|
|
135
|
+
if singular.endswith('sses') or singular.endswith('ches') or singular.endswith('shes') or singular.endswith('xes'):
|
|
136
|
+
singular = singular[:-2]
|
|
137
|
+
else:
|
|
138
|
+
singular = singular[:-1]
|
|
139
|
+
elif singular.endswith('s') and not singular.endswith('ss'):
|
|
140
|
+
singular = singular[:-1]
|
|
141
|
+
|
|
142
|
+
# Split the string into words and convert to camelCase
|
|
143
|
+
words = singular.split()
|
|
144
|
+
if not words:
|
|
145
|
+
return ""
|
|
146
|
+
|
|
147
|
+
# First word is lowercase, rest are capitalized
|
|
148
|
+
result = words[0]
|
|
149
|
+
for word in words[1:]:
|
|
150
|
+
result += word.capitalize()
|
|
151
|
+
|
|
152
|
+
return result
|
|
153
|
+
|
|
154
|
+
def to_pascal_case(input_string)->str:
|
|
155
|
+
"""
|
|
156
|
+
Convert input string to PascalCase, singularizing if plural.
|
|
157
|
+
Args:
|
|
158
|
+
input_string ():
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
transformed string
|
|
162
|
+
"""
|
|
163
|
+
result = to_camel_case(input_string)
|
|
164
|
+
output_string = result[0].upper() + result[1:]
|
|
165
|
+
return output_string
|
|
166
|
+
|
|
167
|
+
def flatten_dict_to_string(d: dict) -> str:
|
|
168
|
+
"""Flatten a dictionary into a string and replace quotes with backticks."""
|
|
169
|
+
try:
|
|
170
|
+
flat_string = ", ".join(
|
|
171
|
+
# Change replace(\"'\", '`') to replace("'", '`')
|
|
172
|
+
f"{key}=`{str(value).replace('\"', '`').replace("'", '`')}`"
|
|
173
|
+
for key, value in d.items()
|
|
174
|
+
)
|
|
175
|
+
return flat_string
|
|
176
|
+
except Exception as e:
|
|
177
|
+
# Corrected syntax for exception chaining
|
|
178
|
+
raise Exception("Error flattening dictionary") from e
|
|
179
|
+
# The decorator logic, which applies @logger.catch dynamically
|
|
180
|
+
|
|
181
|
+
def dict_to_markdown_list(data: dict, level: int = 0) -> str:
|
|
182
|
+
"""
|
|
183
|
+
Recursively converts a dictionary into a nested markdown bullet list string.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
data (dict): The dictionary to convert.
|
|
187
|
+
level (int): The current indentation level (default is 0).
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
str: The markdown formatted string.
|
|
191
|
+
"""
|
|
192
|
+
markdown_str = ""
|
|
193
|
+
# Standard markdown indent is often 2 or 4 spaces. Using 2 for compactness in recursion.
|
|
194
|
+
indent = " " * level
|
|
195
|
+
|
|
196
|
+
for key, value in data.items():
|
|
197
|
+
if isinstance(value, dict):
|
|
198
|
+
markdown_str += f"{indent}* **{key}**:\n{dict_to_markdown_list(value, level + 1)}"
|
|
199
|
+
elif isinstance(value, list):
|
|
200
|
+
markdown_str += f"{indent}* **{key}**:\n"
|
|
201
|
+
for item in value:
|
|
202
|
+
if isinstance(item, dict):
|
|
203
|
+
markdown_str += f"{indent} * \n{dict_to_markdown_list(item, level + 2)}"
|
|
204
|
+
else:
|
|
205
|
+
markdown_str += f"{indent} * {item}\n"
|
|
206
|
+
else:
|
|
207
|
+
markdown_str += f"{indent}* **{key}**: {value}\n"
|
|
208
|
+
|
|
209
|
+
return markdown_str
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
import csv
|
|
213
|
+
import io
|
|
214
|
+
from typing import Dict, Any
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def transform_json_to_tabular(json_data: Dict[str, Any], output_format: str = 'rich'):
|
|
218
|
+
"""
|
|
219
|
+
Transforms Egeria TabularDataSetReportResponse JSON to CSV, Rich table, or Markdown table (LIST).
|
|
220
|
+
|
|
221
|
+
:param json_data: The JSON data as a dictionary.
|
|
222
|
+
:param output_format: 'CSV', 'RICH-TABLE', or 'LIST'.
|
|
223
|
+
"""
|
|
224
|
+
report = json_data.json().get('tabularDataSetReport')
|
|
225
|
+
if not report:
|
|
226
|
+
print("No tabularDataSetReport found in JSON.")
|
|
227
|
+
return
|
|
228
|
+
|
|
229
|
+
column_descriptions = report.get('columnDescriptions', [])
|
|
230
|
+
headers = [col.get('columnName') for col in column_descriptions]
|
|
231
|
+
data_records = report.get('dataRecords', {})
|
|
232
|
+
|
|
233
|
+
# Sort keys to ensure correct order if they are numeric strings
|
|
234
|
+
sorted_record_keys = sorted(data_records.keys(), key=lambda x: int(x))
|
|
235
|
+
rows = [data_records[key] for key in sorted_record_keys]
|
|
236
|
+
|
|
237
|
+
if output_format == 'CSV':
|
|
238
|
+
output = io.StringIO()
|
|
239
|
+
writer = csv.writer(output)
|
|
240
|
+
writer.writerow(headers)
|
|
241
|
+
writer.writerows(rows)
|
|
242
|
+
print(output.getvalue())
|
|
243
|
+
elif output_format == 'RICH-TABLE':
|
|
244
|
+
try:
|
|
245
|
+
from rich.console import Console
|
|
246
|
+
from rich.table import Table
|
|
247
|
+
|
|
248
|
+
console = Console()
|
|
249
|
+
table = Table(title=report.get('tableName', 'Report'))
|
|
250
|
+
|
|
251
|
+
for header in headers:
|
|
252
|
+
table.add_column(header)
|
|
253
|
+
|
|
254
|
+
for row in rows:
|
|
255
|
+
# Convert all items to string for Rich
|
|
256
|
+
str_row = [str(item) if item is not None else "" for item in row]
|
|
257
|
+
table.add_row(*str_row)
|
|
258
|
+
|
|
259
|
+
console.print(table)
|
|
260
|
+
except ImportError:
|
|
261
|
+
print("Rich library not installed. Defaulting to simple text output.")
|
|
262
|
+
print(f"Headers: {headers}")
|
|
263
|
+
for row in rows:
|
|
264
|
+
print(row)
|
|
265
|
+
elif output_format == 'LIST':
|
|
266
|
+
# Generate a markdown table
|
|
267
|
+
markdown_output = f"### {report.get('tableName', 'Report')}\n\n"
|
|
268
|
+
markdown_output += "| " + " | ".join(headers) + " |\n"
|
|
269
|
+
markdown_output += "| " + " | ".join(["---"] * len(headers)) + " |\n"
|
|
270
|
+
for row in rows:
|
|
271
|
+
str_row = [str(item) if item is not None else "" for item in row]
|
|
272
|
+
markdown_output += "| " + " | ".join(str_row) + " |\n"
|
|
273
|
+
print(markdown_output)
|
|
274
|
+
else:
|
|
275
|
+
print(f"Unknown output format: {output_format}")
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
# Example usage:
|
|
279
|
+
# with open('path/to/your/file.json', 'r') as f:
|
|
280
|
+
# data = json.load(f)
|
|
281
|
+
# transform_json_to_tabular(data, 'CSV') # or 'RICH-TABLE' or 'LIST'
|
|
282
|
+
|
|
283
|
+
import json
|
|
284
|
+
import re
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
# def parse_to_dict(input_str: str):
|
|
288
|
+
# """
|
|
289
|
+
# Check if a string is valid JSON or a name:value list without braces and convert to a dictionary.
|
|
290
|
+
#
|
|
291
|
+
# Args:
|
|
292
|
+
# input_str: The input string to parse.
|
|
293
|
+
#
|
|
294
|
+
# Returns:
|
|
295
|
+
# dict: A dictionary converted from the input string.
|
|
296
|
+
# None: If the input is neither valid JSON nor a valid name:value list.
|
|
297
|
+
# """
|
|
298
|
+
#
|
|
299
|
+
# if input_str is None:
|
|
300
|
+
# return None
|
|
301
|
+
#
|
|
302
|
+
# # Check if the input string is valid JSON
|
|
303
|
+
# try:
|
|
304
|
+
# result = json.loads(input_str)
|
|
305
|
+
# if isinstance(result, dict): # Ensure it's a dictionary
|
|
306
|
+
# return result
|
|
307
|
+
# except json.JSONDecodeError:
|
|
308
|
+
# pass
|
|
309
|
+
#
|
|
310
|
+
# # Check if input string looks like a name:value list
|
|
311
|
+
# # Supports both comma and newline as separators
|
|
312
|
+
# pattern = r'^(\s*("[^"]+"|\'[^\']+\'|[a-zA-Z0-9_-]+)\s*:\s*("[^"]+"|\'[^\']+\'|[a-zA-Z0-9 _-]*)\s*)' \
|
|
313
|
+
# r'(\s*[,|\n]\s*("[^"]+"|\'[^\']+\'|[a-zA-Z0-9_-]+)\s*:\s*("[^"]+"|\'[^\']+\'|[a-zA-Z0-9 _-]*)\s*)*$'
|
|
314
|
+
# if re.match(pattern, input_str.strip()):
|
|
315
|
+
# try:
|
|
316
|
+
# # Split by ',' or '\n' and process key-value pairs
|
|
317
|
+
# pairs = [pair.split(":", 1) for pair in re.split(r'[,|\n]+', input_str.strip())]
|
|
318
|
+
# return {key.strip().strip('\'"'): value.strip().strip('\'"') for key, value in pairs}
|
|
319
|
+
# except Exception:
|
|
320
|
+
# return None
|
|
321
|
+
#
|
|
322
|
+
# # If neither pattern matches, return None
|
|
323
|
+
# return None
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def parse_to_dict(input_str: str) -> dict | None:
|
|
327
|
+
"""
|
|
328
|
+
Parse input strings into a dictionary, handling both JSON and key-value pairs.
|
|
329
|
+
Recovers from malformed JSON (e.g., where commas are missing between key-value pairs)
|
|
330
|
+
and supports multiline values.
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
input_str (str): The input string to parse.
|
|
334
|
+
|
|
335
|
+
Returns:
|
|
336
|
+
dict: A parsed dictionary if validation is successful, or None if the string cannot be parsed.
|
|
337
|
+
"""
|
|
338
|
+
if not input_str:
|
|
339
|
+
return None
|
|
340
|
+
|
|
341
|
+
# Attempt to parse valid JSON
|
|
342
|
+
try:
|
|
343
|
+
result = json.loads(input_str)
|
|
344
|
+
if isinstance(result, dict):
|
|
345
|
+
return result
|
|
346
|
+
except json.JSONDecodeError:
|
|
347
|
+
pass
|
|
348
|
+
|
|
349
|
+
# Fix malformed JSON or attempt alternate parsing for "key: value" patterns
|
|
350
|
+
try:
|
|
351
|
+
# Step 1: Inject missing commas where they are omitted between key-value pairs
|
|
352
|
+
fixed_input = re.sub(
|
|
353
|
+
r'("\s*:[^,}\n]+)\s*("(?![:,}\n]))', # Find missing commas (key-value-value sequences)
|
|
354
|
+
r'\1,\2', # Add a comma between the values
|
|
355
|
+
input_str
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
# Attempt to parse the fixed string as JSON
|
|
359
|
+
try:
|
|
360
|
+
result = json.loads(fixed_input)
|
|
361
|
+
if isinstance(result, dict):
|
|
362
|
+
return result
|
|
363
|
+
except json.JSONDecodeError:
|
|
364
|
+
pass
|
|
365
|
+
|
|
366
|
+
# Step 2: Handle key-value format fallback (supports multiline strings)
|
|
367
|
+
# Matches `key: value` pairs, including multiline quoted values
|
|
368
|
+
key_value_pattern = re.compile(r'''
|
|
369
|
+
(?:"([^"]+)"|'([^']+)'|([a-zA-Z0-9_-]+)) # Key: quoted "key", 'key', or unquoted key
|
|
370
|
+
\s*:\s* # Key-value separator
|
|
371
|
+
(?:"((?:\\.|[^"\\])*?)"|'((?:\\.|[^'\\])*?)'|([^\n,]+)) # Value: quoted or unquoted
|
|
372
|
+
''', re.VERBOSE | re.DOTALL)
|
|
373
|
+
|
|
374
|
+
matches = key_value_pattern.findall(input_str)
|
|
375
|
+
|
|
376
|
+
# Build dictionary from matches
|
|
377
|
+
result_dict = {}
|
|
378
|
+
for match in matches:
|
|
379
|
+
key = next((group for group in match[:3] if group), "").strip()
|
|
380
|
+
value = next((group for group in match[3:] if group), "").strip()
|
|
381
|
+
result_dict[key] = value
|
|
382
|
+
|
|
383
|
+
if result_dict:
|
|
384
|
+
return result_dict
|
|
385
|
+
except Exception as e:
|
|
386
|
+
# Log or handle parsing exception if needed
|
|
387
|
+
pass
|
|
388
|
+
|
|
389
|
+
# If all parsing attempts fail, return None
|
|
390
|
+
return None
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
def dynamic_catch(func: T) -> T:
|
|
394
|
+
if app_settings.get("enable_logger_catchh", False):
|
|
395
|
+
return logger.catch(func) # Apply the logger.catch decorator
|
|
396
|
+
else:
|
|
397
|
+
return func # Return the function unwrapped
|
|
398
|
+
|
|
399
|
+
def make_format_set_name_from_type(obj_type: str)-> str:
|
|
400
|
+
formatted_name = obj_type.replace(" ", "-")
|
|
401
|
+
return f"{formatted_name}-DrE"
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
if __name__ == "__main__":
|
|
405
|
+
print("Main-Utils")
|
|
@@ -11,21 +11,20 @@ import asyncio
|
|
|
11
11
|
import inspect
|
|
12
12
|
import json
|
|
13
13
|
import os
|
|
14
|
-
import re
|
|
15
14
|
from datetime import datetime
|
|
16
15
|
|
|
17
16
|
import httpx
|
|
18
17
|
from httpx import AsyncClient, Response
|
|
19
18
|
|
|
20
|
-
from pyegeria.utils import body_slimmer
|
|
21
|
-
from pyegeria._exceptions import (
|
|
19
|
+
from pyegeria.core.utils import body_slimmer
|
|
20
|
+
from pyegeria.core._exceptions import (
|
|
22
21
|
InvalidParameterException,
|
|
23
22
|
OMAGCommonErrorCode,
|
|
24
23
|
PropertyServerException,
|
|
25
24
|
UserNotAuthorizedException,
|
|
26
25
|
)
|
|
27
|
-
from pyegeria._globals import enable_ssl_check, max_paging_size, NO_ELEMENTS_FOUND
|
|
28
|
-
from pyegeria._validators import (
|
|
26
|
+
from pyegeria.core._globals import enable_ssl_check, max_paging_size, NO_ELEMENTS_FOUND
|
|
27
|
+
from pyegeria.core._validators import (
|
|
29
28
|
is_json,
|
|
30
29
|
validate_name,
|
|
31
30
|
validate_server_name,
|
|
@@ -180,9 +179,9 @@ class Client:
|
|
|
180
179
|
|
|
181
180
|
Raises
|
|
182
181
|
------
|
|
183
|
-
|
|
182
|
+
PyegeriaInvalidParameterException
|
|
184
183
|
If the client passes incorrect parameters on the request - such as bad URLs or invalid values
|
|
185
|
-
|
|
184
|
+
PyegeriaAPIException
|
|
186
185
|
Raised by the server when an issue arises in processing a valid request
|
|
187
186
|
NotAuthorizedException
|
|
188
187
|
The principle specified by the user_id does not have authorization for the requested action
|
|
@@ -236,9 +235,9 @@ class Client:
|
|
|
236
235
|
|
|
237
236
|
Raises
|
|
238
237
|
------
|
|
239
|
-
|
|
238
|
+
PyegeriaInvalidParameterException
|
|
240
239
|
If the client passes incorrect parameters on the request - such as bad URLs or invalid values
|
|
241
|
-
|
|
240
|
+
PyegeriaAPIException
|
|
242
241
|
Raised by the server when an issue arises in processing a valid request
|
|
243
242
|
NotAuthorizedException
|
|
244
243
|
The principle specified by the user_id does not have authorization for the requested action
|
|
@@ -262,7 +261,7 @@ class Client:
|
|
|
262
261
|
This method is used to refresh the bearer token used for authentication with Egeria. It checks if the token
|
|
263
262
|
source is 'Egeria', and if the user ID and password are valid. If all conditions are met, it calls the
|
|
264
263
|
`create_egeria_bearer_token` method to create a new bearer token. Otherwise,
|
|
265
|
-
it raises an `
|
|
264
|
+
it raises an `PyegeriaInvalidParameterException`.
|
|
266
265
|
|
|
267
266
|
Parameters:
|
|
268
267
|
|
|
@@ -270,7 +269,7 @@ class Client:
|
|
|
270
269
|
None
|
|
271
270
|
|
|
272
271
|
Raises:
|
|
273
|
-
|
|
272
|
+
PyegeriaInvalidParameterException: If the token source is invalid.
|
|
274
273
|
"""
|
|
275
274
|
if (
|
|
276
275
|
(self.token_src == "Egeria")
|
|
@@ -291,7 +290,7 @@ class Client:
|
|
|
291
290
|
This method is used to refresh the bearer token used for authentication with Egeria. It checks if the token
|
|
292
291
|
source is 'Egeria', and if the user ID and password are valid. If all conditions are met, it calls the
|
|
293
292
|
`create_egeria_bearer_token` method to create a new bearer token. Otherwise,
|
|
294
|
-
it raises an `
|
|
293
|
+
it raises an `PyegeriaInvalidParameterException`.
|
|
295
294
|
|
|
296
295
|
Parameters:
|
|
297
296
|
|
|
@@ -299,8 +298,8 @@ class Client:
|
|
|
299
298
|
None
|
|
300
299
|
|
|
301
300
|
Raises:
|
|
302
|
-
|
|
303
|
-
|
|
301
|
+
PyegeriaInvalidParameterException: If the token source is invalid.
|
|
302
|
+
PyegeriaAPIException
|
|
304
303
|
Raised by the server when an issue arises in processing a valid request
|
|
305
304
|
NotAuthorizedException
|
|
306
305
|
The principle specified by the user_id does not have authorization for the requested action
|
|
@@ -323,9 +322,9 @@ class Client:
|
|
|
323
322
|
|
|
324
323
|
Raises
|
|
325
324
|
------
|
|
326
|
-
|
|
325
|
+
PyegeriaInvalidParameterException
|
|
327
326
|
If the client passes incorrect parameters on the request - such as bad URLs or invalid values
|
|
328
|
-
|
|
327
|
+
PyegeriaAPIException
|
|
329
328
|
Raised by the server when an issue arises in processing a valid request
|
|
330
329
|
NotAuthorizedException
|
|
331
330
|
The principle specified by the user_id does not have authorization for the requested action
|
|
@@ -365,7 +364,7 @@ class Client:
|
|
|
365
364
|
) -> Response | str:
|
|
366
365
|
"""Make a request to the Egeria API - Async Version
|
|
367
366
|
Function to make an API call via the self.session Library. Raise an exception if the HTTP response code
|
|
368
|
-
is not 200/201. IF there is a REST communication exception, raise
|
|
367
|
+
is not 200/201. IF there is a REST communication exception, raise PyegeriaInvalidParameterException.
|
|
369
368
|
|
|
370
369
|
:param request_type: Type of Request.
|
|
371
370
|
Supported Values - GET, POST, (not PUT, PATCH, DELETE).
|
|
@@ -443,7 +442,7 @@ class Client:
|
|
|
443
442
|
{
|
|
444
443
|
"class": "VoidResponse",
|
|
445
444
|
"relatedHTTPCode": response.status_code,
|
|
446
|
-
"exceptionClassName": "
|
|
445
|
+
"exceptionClassName": "PyegeriaInvalidParameterException",
|
|
447
446
|
"actionDescription": caller_method,
|
|
448
447
|
"exceptionErrorMessage": msg,
|
|
449
448
|
"exceptionErrorMessageId": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
|
@@ -486,7 +485,7 @@ class Client:
|
|
|
486
485
|
{
|
|
487
486
|
"class": "VoidResponse",
|
|
488
487
|
"relatedHTTPCode": response.status_code,
|
|
489
|
-
"exceptionClassName": "
|
|
488
|
+
"exceptionClassName": "PyegeriaInvalidParameterException",
|
|
490
489
|
"actionDescription": caller_method,
|
|
491
490
|
"exceptionErrorMessage": msg,
|
|
492
491
|
"exceptionErrorMessageId": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
|
@@ -536,7 +535,7 @@ class Client:
|
|
|
536
535
|
{
|
|
537
536
|
"class": "VoidResponse",
|
|
538
537
|
"relatedHTTPCode": response.status_code,
|
|
539
|
-
"exceptionClassName": "
|
|
538
|
+
"exceptionClassName": "PyegeriaAPIException",
|
|
540
539
|
"actionDescription": caller_method,
|
|
541
540
|
"exceptionErrorMessage": msg,
|
|
542
541
|
"exceptionErrorMessageId": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
|
@@ -595,7 +594,7 @@ class Client:
|
|
|
595
594
|
{
|
|
596
595
|
"class": "VoidResponse",
|
|
597
596
|
"relatedHTTPCode": 400,
|
|
598
|
-
"exceptionClassName": "
|
|
597
|
+
"exceptionClassName": "PyegeriaInvalidParameterException",
|
|
599
598
|
"actionDescription": caller_method,
|
|
600
599
|
"exceptionErrorMessage": msg,
|
|
601
600
|
"exceptionErrorMessageId": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
|
@@ -770,7 +769,7 @@ class Client:
|
|
|
770
769
|
)
|
|
771
770
|
return result
|
|
772
771
|
|
|
773
|
-
def __create_qualified_name__(self,
|
|
772
|
+
def __create_qualified_name__(self, type_name: str, display_name: str, local_qualifier: str = None,
|
|
774
773
|
version_identifier: str = None) -> str:
|
|
775
774
|
"""Helper function to create a qualified name for a given type and display name.
|
|
776
775
|
If present, the local qualifier will be prepended to the qualified name."""
|
|
@@ -803,11 +802,11 @@ class Client:
|
|
|
803
802
|
|
|
804
803
|
Raises
|
|
805
804
|
------
|
|
806
|
-
|
|
805
|
+
PyegeriaInvalidParameterException
|
|
807
806
|
one of the parameters is null or invalid or
|
|
808
|
-
|
|
807
|
+
PyegeriaAPIException
|
|
809
808
|
There is a problem adding the element properties to the metadata repository or
|
|
810
|
-
|
|
809
|
+
PyegeriaUnauthorizedException
|
|
811
810
|
the requesting user is not authorized to issue this request.
|
|
812
811
|
"""
|
|
813
812
|
|
|
@@ -78,7 +78,7 @@ class GovEng(Client):
|
|
|
78
78
|
List[str]: A list of JSON representations of governance action processes matching the provided name.
|
|
79
79
|
|
|
80
80
|
Raises:
|
|
81
|
-
|
|
81
|
+
PyegeriaInvalidParameterException: If the API response indicates an error (non-200 status code),
|
|
82
82
|
this exception is raised with details from the response content.
|
|
83
83
|
|
|
84
84
|
Note:
|
|
@@ -110,9 +110,9 @@ class GovEng(Client):
|
|
|
110
110
|
|
|
111
111
|
Raises
|
|
112
112
|
------
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
PyegeriaInvalidParameterException
|
|
114
|
+
PyegeriaAPIException
|
|
115
|
+
PyegeriaUnauthorizedException
|
|
116
116
|
"""
|
|
117
117
|
|
|
118
118
|
url = self.engine_command_root + "/engine-actions/" + engine_action_guid
|
|
@@ -134,7 +134,7 @@ class GovEng(Client):
|
|
|
134
134
|
List[str]: A list of JSON representations of governance action processes matching the provided name.
|
|
135
135
|
|
|
136
136
|
Raises:
|
|
137
|
-
|
|
137
|
+
PyegeriaInvalidParameterException: If the API response indicates an error (non-200 status code),
|
|
138
138
|
this exception is raised with details from the response content.
|
|
139
139
|
|
|
140
140
|
Note:
|
|
@@ -165,7 +165,7 @@ class GovEng(Client):
|
|
|
165
165
|
List[str]: A list of JSON representations of governance action processes matching the provided name.
|
|
166
166
|
|
|
167
167
|
Raises:
|
|
168
|
-
|
|
168
|
+
PyegeriaInvalidParameterException: If the API response indicates an error (non-200 status code),
|
|
169
169
|
this exception is raised with details from the response content.
|
|
170
170
|
|
|
171
171
|
Note:
|
|
@@ -199,7 +199,7 @@ class GovEng(Client):
|
|
|
199
199
|
List[str]: A list of JSON representations of governance action processes matching the provided name.
|
|
200
200
|
|
|
201
201
|
Raises:
|
|
202
|
-
|
|
202
|
+
PyegeriaInvalidParameterException: If the API response indicates an error (non-200 status code),
|
|
203
203
|
this exception is raised with details from the response content.
|
|
204
204
|
|
|
205
205
|
Note:
|
|
@@ -229,10 +229,10 @@ class GovEng(Client):
|
|
|
229
229
|
str: The JSON representation of the governance action process element.
|
|
230
230
|
|
|
231
231
|
Raises:
|
|
232
|
-
|
|
232
|
+
PyegeriaInvalidParameterException: If the API response indicates an error (non-200 status code),
|
|
233
233
|
this exception is raised with details from the response content.
|
|
234
|
-
|
|
235
|
-
|
|
234
|
+
PyegeriaAPIException: If the API response indicates a server side error.
|
|
235
|
+
PyegeriaUnauthorizedException:
|
|
236
236
|
|
|
237
237
|
Note:
|
|
238
238
|
This method assumes that the provided GUID is valid and corresponds to an existing
|
|
@@ -263,7 +263,7 @@ class GovEng(Client):
|
|
|
263
263
|
List[str]: A list of JSON representations of governance action processes matching the provided name.
|
|
264
264
|
|
|
265
265
|
Raises:
|
|
266
|
-
|
|
266
|
+
PyegeriaInvalidParameterException: If the API response indicates an error (non-200 status code),
|
|
267
267
|
this exception is raised with details from the response content.
|
|
268
268
|
|
|
269
269
|
Note:
|
|
@@ -296,7 +296,7 @@ class GovEng(Client):
|
|
|
296
296
|
List[str]: A list of JSON representations of governance action processes matching the provided name.
|
|
297
297
|
|
|
298
298
|
Raises:
|
|
299
|
-
|
|
299
|
+
PyegeriaInvalidParameterException: If the API response indicates an error (non-200 status code),
|
|
300
300
|
this exception is raised with details from the response content.
|
|
301
301
|
|
|
302
302
|
Note:
|
|
@@ -353,9 +353,9 @@ class GovEng(Client):
|
|
|
353
353
|
|
|
354
354
|
Raises
|
|
355
355
|
------
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
356
|
+
PyegeriaInvalidParameterException
|
|
357
|
+
PyegeriaAPIException
|
|
358
|
+
PyegeriaUnauthorizedException
|
|
359
359
|
|
|
360
360
|
"""
|
|
361
361
|
url = self.engine_command_root + "/governance-action-processes/initiate"
|
|
@@ -416,7 +416,7 @@ class GovEng(Client):
|
|
|
416
416
|
str: The GUID (Globally Unique Identifier) of the initiated governance action.
|
|
417
417
|
|
|
418
418
|
Raises:
|
|
419
|
-
|
|
419
|
+
PyegeriaInvalidParameterException: If the API response indicates an error (non-200 status code),
|
|
420
420
|
this exception is raised with details from the response content.
|
|
421
421
|
|
|
422
422
|
Note:
|