pyegeria 5.3.9.9.3__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/__init__.py +1 -17
- commands/cat/collection_actions.py +197 -0
- commands/cat/dr_egeria_command_help.py +372 -0
- commands/cat/dr_egeria_jupyter.py +7 -7
- commands/cat/dr_egeria_md.py +27 -182
- 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 +46 -138
- 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/run_report_orig.py +528 -0
- commands/cli/egeria.py +222 -247
- commands/cli/egeria_cat.py +68 -81
- commands/cli/egeria_my.py +13 -0
- commands/cli/egeria_ops.py +69 -74
- commands/cli/egeria_tech.py +17 -93
- commands/cli/ops_config.py +3 -6
- commands/{cat/list_categories.py → deprecated/list_data_designer.py} +53 -64
- commands/{cat/list_data_structures.py → 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 +35 -26
- 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 +90 -0
- 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 +17568 -0
- md_processing/data/commands_working.json +30641 -0
- 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/__init__.py +3 -0
- md_processing/md_commands/data_designer_commands.py +1276 -0
- 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 +684 -0
- md_processing/md_commands/governance_officer_commands.py +600 -0
- md_processing/md_commands/product_manager_commands.py +1266 -0
- md_processing/md_commands/project_commands.py +383 -0
- md_processing/md_commands/solution_architect_commands.py +1184 -0
- md_processing/md_commands/view_commands.py +295 -0
- md_processing/md_processing_utils/__init__.py +4 -0
- md_processing/md_processing_utils/common_md_proc_utils.py +1249 -0
- md_processing/md_processing_utils/common_md_utils.py +578 -0
- md_processing/md_processing_utils/determine_width.py +103 -0
- md_processing/md_processing_utils/extraction_utils.py +547 -0
- md_processing/md_processing_utils/gen_report_specs.py +643 -0
- md_processing/md_processing_utils/generate_dr_help.py +193 -0
- md_processing/md_processing_utils/generate_md_cmd_templates.py +144 -0
- md_processing/md_processing_utils/generate_md_templates.py +83 -0
- md_processing/md_processing_utils/md_processing_constants.py +1228 -0
- md_processing/md_processing_utils/message_constants.py +19 -0
- pyegeria/__init__.py +201 -443
- pyegeria/core/__init__.py +40 -0
- pyegeria/core/_base_platform_client.py +574 -0
- pyegeria/core/_base_server_client.py +573 -0
- pyegeria/core/_exceptions.py +457 -0
- pyegeria/core/_globals.py +60 -0
- pyegeria/core/_server_client.py +6073 -0
- pyegeria/core/_validators.py +257 -0
- 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/core/logging_configuration.py +207 -0
- pyegeria/core/mcp_adapter.py +144 -0
- pyegeria/core/mcp_server.py +212 -0
- pyegeria/core/utils.py +405 -0
- pyegeria/deprecated/__init__.py +0 -0
- pyegeria/{_client.py → deprecated/_client.py} +62 -24
- pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
- pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1988 -1878
- pyegeria/deprecated/output_formatter_with_machine_keys.py +1127 -0
- pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +216 -229
- 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 +25 -51
- pyegeria/egeria_client.py +140 -98
- pyegeria/egeria_config_client.py +48 -24
- pyegeria/egeria_tech_client.py +170 -83
- pyegeria/models/__init__.py +150 -0
- pyegeria/models/collection_models.py +168 -0
- pyegeria/models/models.py +654 -0
- 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/omvs/collection_manager.py +5780 -0
- 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_omvs.py → omvs/data_designer.py} +1991 -1691
- 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/omvs/glossary_manager.py +3231 -0
- pyegeria/omvs/governance_officer.py +3009 -0
- 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/omvs/solution_architect.py +6490 -0
- 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/view/_output_format_models.py +514 -0
- 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.3.9.9.3.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/README.md +0 -16
- commands/cli/txt_custom_v2.tcss +0 -19
- commands/my/README.md +0 -17
- commands/ops/README.md +0 -24
- commands/ops/monitor_asset_events.py +0 -108
- commands/tech/README.md +0 -24
- pyegeria/.DS_Store +0 -0
- pyegeria/README.md +0 -35
- pyegeria/_globals.py +0 -47
- pyegeria/_validators.py +0 -385
- pyegeria/asset_catalog_omvs.py +0 -864
- pyegeria/automated_curation_omvs.py +0 -3765
- pyegeria/collection_manager_omvs.py +0 -2744
- pyegeria/dr.egeria spec.md +0 -9
- pyegeria/egeria_my_client.py +0 -56
- pyegeria/feedback_manager_omvs.py +0 -4573
- pyegeria/glossary_browser_omvs.py +0 -3728
- pyegeria/glossary_manager_omvs.py +0 -2440
- pyegeria/m_test.py +0 -118
- 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/output_formatter.py +0 -389
- pyegeria/project_manager_omvs.py +0 -1933
- pyegeria/registered_info.py +0 -167
- pyegeria/solution_architect_omvs.py +0 -2156
- pyegeria/template_manager_omvs.py +0 -1414
- pyegeria/utils.py +0 -197
- pyegeria-5.3.9.9.3.dist-info/METADATA +0 -72
- pyegeria-5.3.9.9.3.dist-info/RECORD +0 -143
- pyegeria-5.3.9.9.3.dist-info/entry_points.txt +0 -99
- /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
- {pyegeria-5.3.9.9.3.dist-info → pyegeria-5.5.3.3.dist-info/licenses}/LICENSE +0 -0
commands/__init__.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
Copyright Contributors to the ODPi Egeria project.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
pyegeria md_commands available also from python.
|
|
8
|
+
"""
|
|
9
|
+
from .cat.dr_egeria_md import process_markdown_file
|
|
10
|
+
from .cat.list_deployed_catalogs import list_deployed_catalogs
|
|
11
|
+
from .cat.list_deployed_database_schemas import list_deployed_database_schemas
|
|
12
|
+
from .cat.list_deployed_databases import list_deployed_databases
|
|
13
|
+
from .cat.list_glossaries import display_glossaries
|
|
14
|
+
from .cat.list_terms import display_glossary_terms
|
|
15
|
+
from .ops.list_catalog_targets import display_catalog_targets
|
|
16
|
+
from .ops.monitor_engine_activity import display_engine_activity_c
|
|
17
|
+
from .ops.monitor_engine_status import display_gov_eng_status
|
|
18
|
+
from .ops.monitor_daemon_status import display_integration_daemon_status
|
|
19
|
+
from .ops.table_integ_daemon_status import (
|
|
20
|
+
display_integration_daemon_status as table_integ_daemon_status,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
@@ -6,8 +6,8 @@ import os
|
|
|
6
6
|
from rich import print
|
|
7
7
|
from rich.console import Console
|
|
8
8
|
|
|
9
|
-
from pyegeria.md_processing_utils import (commands,
|
|
10
|
-
|
|
9
|
+
from pyegeria.view.md_processing_utils import (commands,
|
|
10
|
+
process_provenance_command)
|
|
11
11
|
|
|
12
12
|
import click
|
|
13
13
|
from pyegeria import (extract_command, process_glossary_upsert_command, process_term_upsert_command,
|
commands/cat/__init__.py
CHANGED
|
@@ -2,22 +2,6 @@
|
|
|
2
2
|
SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
Copyright Contributors to the ODPi Egeria project.
|
|
4
4
|
"""
|
|
5
|
-
|
|
6
|
-
INTEGRATION_GUIDS,
|
|
7
|
-
TEMPLATE_GUIDS,
|
|
8
|
-
default_time_out,
|
|
9
|
-
disable_ssl_warnings,
|
|
10
|
-
enable_ssl_check,
|
|
11
|
-
is_debug,
|
|
12
|
-
max_paging_size,
|
|
13
|
-
NO_ELEMENTS_FOUND,
|
|
14
|
-
NO_ASSETS_FOUND,
|
|
15
|
-
NO_SERVERS_FOUND,
|
|
16
|
-
NO_CATALOGS_FOUND,
|
|
17
|
-
NO_GLOSSARIES_FOUND,
|
|
18
|
-
NO_TERMS_FOUND,
|
|
19
|
-
NO_CATEGORIES_FOUND,
|
|
20
|
-
NO_ELEMENT_FOUND,
|
|
21
|
-
)
|
|
5
|
+
|
|
22
6
|
|
|
23
7
|
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
Copyright Contributors to the ODPi Egeria project.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Execute Glossary actions.
|
|
8
|
+
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
|
|
13
|
+
import click
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
from pyegeria import (
|
|
17
|
+
EgeriaTech, body_slimmer, settings,
|
|
18
|
+
PyegeriaAPIException, PyegeriaClientException, print_basic_exception, print_exception_table
|
|
19
|
+
)
|
|
20
|
+
app_config = settings.Environment
|
|
21
|
+
|
|
22
|
+
EGERIA_USER = os.environ.get("EGERIA_USER", "erinoverview")
|
|
23
|
+
EGERIA_USER_PASSWORD = os.environ.get("EGERIA_USER_PASSWORD", "secret")
|
|
24
|
+
|
|
25
|
+
COLLECTION_TYPES = ["Collection", "Glossary", "CollectionFolder", "RootCollection", "WorkItemList", "SolutionBlueprint" ]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@click.command("add-element-to-collection")
|
|
29
|
+
@click.option("--element-guid", required=True, default = "",help="GUID of the element to add to a Collection")
|
|
30
|
+
@click.option("--collection-guid", required=True, default = "", help="GUID of the Collection to add an element to")
|
|
31
|
+
@click.option("--server", default=app_config.egeria_view_server, help="Egeria view server to use")
|
|
32
|
+
@click.option(
|
|
33
|
+
"--url", default=app_config.egeria_view_server_url, help="URL of Egeria platform to connect to"
|
|
34
|
+
)
|
|
35
|
+
@click.option("--userid", default=EGERIA_USER, help="Egeria user")
|
|
36
|
+
@click.option("--password", default=EGERIA_USER_PASSWORD, help="Egeria user password")
|
|
37
|
+
@click.option("--timeout", default=60, help="Number of seconds to wait")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def add_element_to_collection(server, url, userid, password, timeout, element_guid, collection_guid):
|
|
41
|
+
"""Add a glossary term to a Collection"""
|
|
42
|
+
m_client = EgeriaTech(server, url, user_id=userid, user_pwd=password)
|
|
43
|
+
token = m_client.create_egeria_bearer_token()
|
|
44
|
+
try:
|
|
45
|
+
element_guid = element_guid.strip()
|
|
46
|
+
collection_guid = collection_guid.strip()
|
|
47
|
+
m_client.add_to_collection(element_guid, collection_guid)
|
|
48
|
+
|
|
49
|
+
click.echo(
|
|
50
|
+
f"Added element with GUID: {element_guid} to Collection with GUID: {collection_guid}\n"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
except (PyegeriaAPIException, PyegeriaClientException) as e:
|
|
54
|
+
print_basic_exception(e)
|
|
55
|
+
finally:
|
|
56
|
+
m_client.close_session()
|
|
57
|
+
|
|
58
|
+
@click.command("remove-element-from-collection")
|
|
59
|
+
@click.option("--element-guid", required=True, default = "",help="GUID of the element to remove from the collection")
|
|
60
|
+
@click.option("--collection-guid", required=True, default = "", help="GUID of collection to remove the element from")
|
|
61
|
+
|
|
62
|
+
@click.option("--server", default=app_config.egeria_view_server, help="Egeria view server to use")
|
|
63
|
+
@click.option(
|
|
64
|
+
"--url", default=app_config.egeria_view_server_url, help="URL of Egeria platform to connect to"
|
|
65
|
+
)
|
|
66
|
+
@click.option("--userid", default=EGERIA_USER, help="Egeria user")
|
|
67
|
+
@click.option("--password", default=EGERIA_USER_PASSWORD, help="Egeria user password")
|
|
68
|
+
@click.option("--timeout", default=60, help="Number of seconds to wait")
|
|
69
|
+
|
|
70
|
+
def remove_element_from_collection(server, url, userid, password, timeout, element_guid, collection_guid):
|
|
71
|
+
"""Remove an element from a Collection"""
|
|
72
|
+
m_client = EgeriaTech(server, url, user_id=userid, user_pwd=password)
|
|
73
|
+
token = m_client.create_egeria_bearer_token()
|
|
74
|
+
try:
|
|
75
|
+
element_guid = element_guid.strip()
|
|
76
|
+
collection_guid = collection_guid.strip()
|
|
77
|
+
body = {
|
|
78
|
+
"class": "DeleteRelationshipRequestBody"
|
|
79
|
+
}
|
|
80
|
+
m_client.remove_from_collection( collection_guid, element_guid, body)
|
|
81
|
+
|
|
82
|
+
click.echo(
|
|
83
|
+
f"Removed term with GUID: {element_guid} from Collection with GUID: {collection_guid}\n"
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
except (PyegeriaAPIException, PyegeriaClientException) as e:
|
|
87
|
+
print_basic_exception(e)
|
|
88
|
+
finally:
|
|
89
|
+
m_client.close_session()
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@click.command("create-collection")
|
|
93
|
+
@click.option("--name", help="Collection Name",default = "", required=True)
|
|
94
|
+
@click.option("--kind", help="Kind of Collection", default = "Collection",
|
|
95
|
+
type_name = click.Choice(COLLECTION_TYPES, case_sensitive=False))
|
|
96
|
+
@click.option(
|
|
97
|
+
"--description",
|
|
98
|
+
help="Description of the Collection",
|
|
99
|
+
default="A description goes here",
|
|
100
|
+
)
|
|
101
|
+
@click.option(
|
|
102
|
+
"--category", default = "",
|
|
103
|
+
help="Category of the Collection"
|
|
104
|
+
)
|
|
105
|
+
@click.option("--server", default=app_config.egeria_view_server, help="Egeria view server to use.")
|
|
106
|
+
@click.option(
|
|
107
|
+
"--url", default=app_config.egeria_view_server_url, help="URL of Egeria platform to connect to"
|
|
108
|
+
)
|
|
109
|
+
@click.option("--userid", default=EGERIA_USER, help="Egeria user")
|
|
110
|
+
@click.option("--password", default=EGERIA_USER_PASSWORD, help="Egeria user password")
|
|
111
|
+
@click.option("--timeout", default=60, help="Number of seconds to wait")
|
|
112
|
+
def create_collection(
|
|
113
|
+
server: str,
|
|
114
|
+
url: str,
|
|
115
|
+
userid: str,
|
|
116
|
+
password: str,
|
|
117
|
+
timeout: int,
|
|
118
|
+
name: str,
|
|
119
|
+
kind: str,
|
|
120
|
+
description: str,
|
|
121
|
+
category: str,
|
|
122
|
+
) -> None:
|
|
123
|
+
"""Create a new Collection"""
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
m_client = EgeriaTech(server, url, userid, password)
|
|
127
|
+
token = m_client.create_egeria_bearer_token()
|
|
128
|
+
|
|
129
|
+
collection_guid = m_client.create_collection( display_name = name, description = description, category = category,
|
|
130
|
+
prop = [kind])
|
|
131
|
+
print(f"New categry \'{name}\' created with id of \'{collection_guid}\'")
|
|
132
|
+
|
|
133
|
+
except (PyegeriaAPIException, PyegeriaClientException) as e:
|
|
134
|
+
print_basic_exception(e)
|
|
135
|
+
finally:
|
|
136
|
+
m_client.close_session()
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@click.command("update-collection")
|
|
140
|
+
@click.option("--name", help="Collection Name", default = "",required=False)
|
|
141
|
+
@click.option("--description", default = "",help="Description of the Collection")
|
|
142
|
+
@click.option("--category", default = "", help="Category of the Collection")
|
|
143
|
+
@click.option("--server", default=app_config.egeria_view_server, help="Egeria view server to use")
|
|
144
|
+
@click.option(
|
|
145
|
+
"--url", default=app_config.egeria_view_server_url, help="URL of Egeria platform to connect to"
|
|
146
|
+
)
|
|
147
|
+
@click.option("--userid", default=EGERIA_USER, help="Egeria user")
|
|
148
|
+
@click.option("--password", default=EGERIA_USER_PASSWORD, help="Egeria user password")
|
|
149
|
+
@click.option("--timeout", default=60, help="Number of seconds to wait")
|
|
150
|
+
@click.argument("collection-guid")
|
|
151
|
+
|
|
152
|
+
def update_collection(collection_guid, name, description, category, server, url, userid, password, timeout, ):
|
|
153
|
+
"""Update the collection specified"""
|
|
154
|
+
m_client = EgeriaTech(server, url, user_id=userid, user_pwd=password)
|
|
155
|
+
token = m_client.create_egeria_bearer_token()
|
|
156
|
+
try:
|
|
157
|
+
body = {
|
|
158
|
+
"class" : "UpdateElementRequestBody",
|
|
159
|
+
"properties": {
|
|
160
|
+
"class" : "CollectionProperties",
|
|
161
|
+
"name" : name,
|
|
162
|
+
"description" : description,
|
|
163
|
+
"category": category
|
|
164
|
+
},
|
|
165
|
+
}
|
|
166
|
+
m_client.update_collection(collection_guid, body_slimmer(body))
|
|
167
|
+
|
|
168
|
+
click.echo(f"Updated glossary: {collection_guid}")
|
|
169
|
+
|
|
170
|
+
except (PyegeriaAPIException, PyegeriaClientException) as e:
|
|
171
|
+
print_basic_exception(e)
|
|
172
|
+
finally:
|
|
173
|
+
m_client.close_session()
|
|
174
|
+
|
|
175
|
+
@click.command("delete-collection")
|
|
176
|
+
@click.argument("collection-guid")
|
|
177
|
+
@click.option("--server", default=app_config.egeria_view_server, help="Egeria view server to use")
|
|
178
|
+
@click.option(
|
|
179
|
+
"--url", default=app_config.egeria_view_server_url, help="URL of Egeria platform to connect to"
|
|
180
|
+
)
|
|
181
|
+
@click.option("--userid", default=EGERIA_USER, help="Egeria user")
|
|
182
|
+
@click.option("--password", default=EGERIA_USER_PASSWORD, help="Egeria user password")
|
|
183
|
+
@click.option("--timeout", default=60, help="Number of seconds to wait")
|
|
184
|
+
|
|
185
|
+
def delete_collection(server, url, userid, password, timeout, collection_guid):
|
|
186
|
+
"""Delete the collection specified"""
|
|
187
|
+
m_client = EgeriaTech(server, url, user_id=userid, user_pwd=password)
|
|
188
|
+
token = m_client.create_egeria_bearer_token()
|
|
189
|
+
try:
|
|
190
|
+
m_client.delete_collection(collection_guid)
|
|
191
|
+
|
|
192
|
+
click.echo(f"Deleted collection: {collection_guid}")
|
|
193
|
+
|
|
194
|
+
except (PyegeriaAPIException, PyegeriaClientException) as e:
|
|
195
|
+
print_basic_exception(e)
|
|
196
|
+
finally:
|
|
197
|
+
m_client.close_session()
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Copyright Contributors to the ODPi Egeria project.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
A simple display for glossary terms
|
|
8
|
+
"""
|
|
9
|
+
import argparse
|
|
10
|
+
import os
|
|
11
|
+
import sys
|
|
12
|
+
import time
|
|
13
|
+
|
|
14
|
+
from pydantic import ValidationError
|
|
15
|
+
from rich import box
|
|
16
|
+
from rich.console import Console
|
|
17
|
+
from rich.markdown import Markdown
|
|
18
|
+
from rich.prompt import Prompt
|
|
19
|
+
from rich.table import Table
|
|
20
|
+
from rich.text import Text
|
|
21
|
+
from typing import List
|
|
22
|
+
from html import escape
|
|
23
|
+
try:
|
|
24
|
+
from markdown_it import MarkdownIt
|
|
25
|
+
except Exception:
|
|
26
|
+
MarkdownIt = None
|
|
27
|
+
|
|
28
|
+
from pyegeria import (
|
|
29
|
+
EgeriaTech,
|
|
30
|
+
PyegeriaException, print_basic_exception, print_validation_error,
|
|
31
|
+
)
|
|
32
|
+
from pyegeria.core._exceptions import (
|
|
33
|
+
PyegeriaInvalidParameterException,
|
|
34
|
+
PyegeriaAPIException as PropertyServerException,
|
|
35
|
+
PyegeriaUnauthorizedException as UserNotAuthorizedException,
|
|
36
|
+
)
|
|
37
|
+
# Default glossary GUID can be provided via environment; fall back to None
|
|
38
|
+
EGERIA_HOME_GLOSSARY_GUID = os.environ.get("EGERIA_HOME_GLOSSARY_GUID", None)
|
|
39
|
+
|
|
40
|
+
disable_ssl_warnings = True
|
|
41
|
+
|
|
42
|
+
EGERIA_METADATA_STORE = os.environ.get("EGERIA_METADATA_STORE", "active-metadata-store")
|
|
43
|
+
EGERIA_KAFKA_ENDPOINT = os.environ.get("KAFKA_ENDPOINT", "localhost:9092")
|
|
44
|
+
EGERIA_PLATFORM_URL = os.environ.get("EGERIA_PLATFORM_URL", "https://localhost:9443")
|
|
45
|
+
EGERIA_VIEW_SERVER = os.environ.get("EGERIA_VIEW_SERVER", "view-server")
|
|
46
|
+
EGERIA_VIEW_SERVER_URL = os.environ.get(
|
|
47
|
+
"EGERIA_VIEW_SERVER_URL", "https://localhost:9443"
|
|
48
|
+
)
|
|
49
|
+
EGERIA_INTEGRATION_DAEMON = os.environ.get("EGERIA_INTEGRATION_DAEMON", "integration-daemon")
|
|
50
|
+
EGERIA_ADMIN_USER = os.environ.get("ADMIN_USER", "garygeeke")
|
|
51
|
+
EGERIA_ADMIN_PASSWORD = os.environ.get("ADMIN_PASSWORD", "secret")
|
|
52
|
+
EGERIA_USER = os.environ.get("EGERIA_USER", "erinoverview")
|
|
53
|
+
EGERIA_USER_PASSWORD = os.environ.get("EGERIA_USER_PASSWORD", "secret")
|
|
54
|
+
EGERIA_JUPYTER = bool(os.environ.get("EGERIA_JUPYTER", "False"))
|
|
55
|
+
EGERIA_WIDTH = int(os.environ.get("EGERIA_WIDTH", "250"))
|
|
56
|
+
EGERIA_GLOSSARY_PATH = os.environ.get("EGERIA_GLOSSARY_PATH", None)
|
|
57
|
+
EGERIA_ROOT_PATH = os.environ.get("EGERIA_ROOT_PATH", "../../")
|
|
58
|
+
EGERIA_INBOX_PATH = os.environ.get("EGERIA_INBOX_PATH", "md_processing/dr_egeria_inbox")
|
|
59
|
+
EGERIA_OUTBOX_PATH = os.environ.get("EGERIA_OUTBOX_PATH", "md_processing/dr_egeria_outbox")
|
|
60
|
+
|
|
61
|
+
def _get_console_width_from_config(default_width: int = EGERIA_WIDTH) -> int:
|
|
62
|
+
try:
|
|
63
|
+
from pyegeria.core.config import settings
|
|
64
|
+
return int(getattr(settings.Environment, "console_width", default_width) or default_width)
|
|
65
|
+
except Exception:
|
|
66
|
+
return default_width
|
|
67
|
+
|
|
68
|
+
def _get_outbox_dir() -> str:
|
|
69
|
+
root = os.environ.get("EGERIA_ROOT_PATH", EGERIA_ROOT_PATH)
|
|
70
|
+
out = os.environ.get("EGERIA_OUTBOX_PATH", EGERIA_OUTBOX_PATH)
|
|
71
|
+
return os.path.join(root, out)
|
|
72
|
+
|
|
73
|
+
def _md_to_html(md_text: str) -> str:
|
|
74
|
+
if not md_text:
|
|
75
|
+
return ""
|
|
76
|
+
if MarkdownIt is None:
|
|
77
|
+
return f"<pre>{escape(md_text)}</pre>"
|
|
78
|
+
try:
|
|
79
|
+
return MarkdownIt().render(md_text)
|
|
80
|
+
except Exception:
|
|
81
|
+
return f"<pre>{escape(md_text)}</pre>"
|
|
82
|
+
|
|
83
|
+
def _build_html_table(columns: List[str], rows: List[List[str]]) -> str:
|
|
84
|
+
ths = ''.join(f'<th>{escape(c)}</th>' for c in columns)
|
|
85
|
+
body_rows = []
|
|
86
|
+
for r in rows:
|
|
87
|
+
tds = []
|
|
88
|
+
for cell in r:
|
|
89
|
+
if isinstance(cell, str) and cell.lstrip().startswith('<table'):
|
|
90
|
+
tds.append(f"<td>{cell}</td>")
|
|
91
|
+
else:
|
|
92
|
+
tds.append(f"<td>{escape(cell or '')}</td>")
|
|
93
|
+
body_rows.append('<tr>' + ''.join(tds) + '</tr>')
|
|
94
|
+
return '<table>\n<thead><tr>' + ths + '</tr></thead>\n<tbody>\n' + "\n".join(body_rows) + '\n</tbody>\n</table>'
|
|
95
|
+
|
|
96
|
+
def display_command_terms(
|
|
97
|
+
search_string: str = "*",
|
|
98
|
+
glossary_guid: str = EGERIA_HOME_GLOSSARY_GUID,
|
|
99
|
+
glossary_name: str = None,
|
|
100
|
+
view_server: str = EGERIA_VIEW_SERVER,
|
|
101
|
+
view_url: str = EGERIA_VIEW_SERVER_URL,
|
|
102
|
+
user_id: str = EGERIA_USER,
|
|
103
|
+
user_pass: str = EGERIA_USER_PASSWORD,
|
|
104
|
+
jupyter: bool = EGERIA_JUPYTER,
|
|
105
|
+
width: int = EGERIA_WIDTH,
|
|
106
|
+
output_format: str = "TABLE",
|
|
107
|
+
mode: str = "terminal",
|
|
108
|
+
):
|
|
109
|
+
"""Display a table of glossary terms filtered by search_string and glossary, if specified. If no
|
|
110
|
+
filters then all terms are displayed. If glossary_guid or name is specified, then only terms from that
|
|
111
|
+
glossary are displayed.
|
|
112
|
+
Parameters
|
|
113
|
+
----------
|
|
114
|
+
search_string : str, optional
|
|
115
|
+
The string to search for terms. Defaults to "*".
|
|
116
|
+
glossary_guid : str, optional
|
|
117
|
+
The unique identifier of the glossary. Defaults to None. If specified, then only terms from that glossary
|
|
118
|
+
are displayed. If both glossary_guid and glossary_name are provided then glossary_guid will take precedence.
|
|
119
|
+
glossary_name : str, optional
|
|
120
|
+
The display name of the glossary. Defaults to None. If specified, then only terms from that glossary
|
|
121
|
+
are displayed. If both glossary_guid and glossary_name are provided then glossary_guid will take precedence.
|
|
122
|
+
Note that the use of glossary display name relies on the qualified name conforming to convention. GUID is more
|
|
123
|
+
reliable.
|
|
124
|
+
view_server : str
|
|
125
|
+
The server where the glossary is hosted. Defaults to EGERIA_VIEW_SERVER.
|
|
126
|
+
view_url : str
|
|
127
|
+
The URL of the server where the glossary is hosted. Defaults to EGERIA_VIEW_SERVER_URL.
|
|
128
|
+
user_id : str
|
|
129
|
+
The user ID for authentication. Defaults to EGERIA_USER.
|
|
130
|
+
user_pass : str
|
|
131
|
+
The user password for authentication. Defaults to EGERIA_USER_PASSWORD.
|
|
132
|
+
jupyter : bool
|
|
133
|
+
Flag to indicate if the output should be formatted for Jupyter notebook. Defaults to EGERIA_JUPYTER.
|
|
134
|
+
width : int
|
|
135
|
+
The width of the console output. Defaults to EGERIA_WIDTH.
|
|
136
|
+
output_format: str, optional, default is 'JSON'
|
|
137
|
+
One of TABLE, FORM, REPORT
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
console = Console(
|
|
141
|
+
style="bold bright_white on black", width=width, force_terminal=not jupyter
|
|
142
|
+
)
|
|
143
|
+
try:
|
|
144
|
+
g_client = EgeriaTech(view_server, view_url, user_id, user_pass)
|
|
145
|
+
token = g_client.create_egeria_bearer_token(user_id, user_pass)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
if output_format == "LIST":
|
|
149
|
+
action = "LIST"
|
|
150
|
+
elif output_format == "REPORT":
|
|
151
|
+
action = "Report"
|
|
152
|
+
if output_format != "TABLE":
|
|
153
|
+
file_path = _get_outbox_dir()
|
|
154
|
+
file_name = f"Command-Help-{time.strftime('%Y-%m-%d-%H-%M-%S')}-{action}.md"
|
|
155
|
+
full_file_path = os.path.join(file_path, file_name)
|
|
156
|
+
os.makedirs(os.path.dirname(full_file_path), exist_ok=True)
|
|
157
|
+
output = g_client.find_glossary_terms(search_string, output_format=output_format, report_spec="Help-Terms")
|
|
158
|
+
if output == "NO_TERMS_FOUND":
|
|
159
|
+
print(f"\n==> No commands found for search string '{search_string}'")
|
|
160
|
+
return
|
|
161
|
+
with open(full_file_path, 'w') as f:
|
|
162
|
+
f.write(output)
|
|
163
|
+
print(f"\n==> Terms output written to {full_file_path}")
|
|
164
|
+
return
|
|
165
|
+
|
|
166
|
+
except (
|
|
167
|
+
PyegeriaException
|
|
168
|
+
) as e:
|
|
169
|
+
print_basic_exception(e)
|
|
170
|
+
except ValidationError as e:
|
|
171
|
+
print_validation_error(e)
|
|
172
|
+
except Exception as e:
|
|
173
|
+
console.print_exception(e)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def generate_table(search_string: str, glossary_guid: str) -> Table:
|
|
177
|
+
"""Make a new table."""
|
|
178
|
+
table = Table(
|
|
179
|
+
title=f"Glossary Definitions for Terms like {search_string} @ {time.asctime()}",
|
|
180
|
+
style="bright_white on black",
|
|
181
|
+
# row_styles="bright_white on black",
|
|
182
|
+
header_style="bright_white on dark_blue",
|
|
183
|
+
title_style="bold white on black",
|
|
184
|
+
caption_style="white on black",
|
|
185
|
+
show_lines=True,
|
|
186
|
+
box=box.ROUNDED,
|
|
187
|
+
caption=f"View Server '{view_server}' @ Platform - {view_url}",
|
|
188
|
+
expand=True,
|
|
189
|
+
)
|
|
190
|
+
table.add_column("Term Name", width=20)
|
|
191
|
+
# table.add_column("Summary")
|
|
192
|
+
table.add_column("Description", width=40)
|
|
193
|
+
table.add_column("Usage", min_width=100)
|
|
194
|
+
|
|
195
|
+
terms = g_client.find_glossary_terms(
|
|
196
|
+
search_string,
|
|
197
|
+
page_size=500,
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
if isinstance(terms, str):
|
|
201
|
+
print(f"No commands found - this was not the command you were looking for?! - {search_string} : {glossary_guid} ")
|
|
202
|
+
sys.exit(0)
|
|
203
|
+
sorted_terms = sorted(
|
|
204
|
+
terms, key=lambda k: (k.get("properties") or {}).get("displayName","---")
|
|
205
|
+
)
|
|
206
|
+
style = "bright_white on black"
|
|
207
|
+
if type(terms) is str:
|
|
208
|
+
return table
|
|
209
|
+
glossary_info = {}
|
|
210
|
+
for term in sorted_terms:
|
|
211
|
+
props = term.get("properties", "None")
|
|
212
|
+
if props == "None":
|
|
213
|
+
return table
|
|
214
|
+
|
|
215
|
+
display_name = props.get("displayName","---")
|
|
216
|
+
qualified_name = props["qualifiedName"]
|
|
217
|
+
term_guid = term["elementHeader"]["guid"]
|
|
218
|
+
aliases = props.get("aliases", "---")
|
|
219
|
+
q_name = Text(
|
|
220
|
+
f"{qualified_name}\n&\n{term_guid}\n&\n{aliases}", style=style, justify="center"
|
|
221
|
+
)
|
|
222
|
+
abbrev = props.get("abbreviation", "---")
|
|
223
|
+
summary = props.get("summary", "---")
|
|
224
|
+
description = props.get("description",'---')
|
|
225
|
+
version = props.get("publishVersionIdentifier", "---")
|
|
226
|
+
example = props.get("example", "---")
|
|
227
|
+
usage = props.get("usage", "---")
|
|
228
|
+
# ex_us_out = Markdown(f"Example:\n{example}\n---\nUsage: \n{usage}")
|
|
229
|
+
|
|
230
|
+
classifications = term["elementHeader"].get("classifications",None)
|
|
231
|
+
glossary_guid = None
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
if glossary_guid and glossary_guid in glossary_info:
|
|
235
|
+
glossary_name = glossary_info[glossary_guid]
|
|
236
|
+
elif glossary_guid:
|
|
237
|
+
g = g_client.get_glossary_for_term(term_guid)
|
|
238
|
+
glossary_name = g["glossaryProperties"].get("displayName", "---")
|
|
239
|
+
glossary_info[glossary_guid] = glossary_name
|
|
240
|
+
else:
|
|
241
|
+
glossary_name = "---"
|
|
242
|
+
|
|
243
|
+
term_abb_ver_out = Markdown(f"{display_name}\n---\n{abbrev}\n---\n{version}")
|
|
244
|
+
|
|
245
|
+
term_status = term["elementHeader"].get("status","---")
|
|
246
|
+
table.add_row(
|
|
247
|
+
Markdown(display_name),
|
|
248
|
+
# summary,
|
|
249
|
+
Markdown(description),
|
|
250
|
+
Markdown(usage),
|
|
251
|
+
style="bold white on black",
|
|
252
|
+
)
|
|
253
|
+
if not classifications:
|
|
254
|
+
continue
|
|
255
|
+
for c in classifications:
|
|
256
|
+
if c["classificationName"] == "Anchors":
|
|
257
|
+
glossary_guid = c["classificationProperties"]["anchorScopeGUID"]
|
|
258
|
+
|
|
259
|
+
g_client.close_session()
|
|
260
|
+
return table
|
|
261
|
+
|
|
262
|
+
# Shared fetch for md modes
|
|
263
|
+
if mode in ("md", "md-html"):
|
|
264
|
+
try:
|
|
265
|
+
terms = g_client.find_glossary_terms(search_string, page_size=500)
|
|
266
|
+
except Exception:
|
|
267
|
+
terms = []
|
|
268
|
+
if isinstance(terms, str) and terms == "NO_TERMS_FOUND":
|
|
269
|
+
print(f"\n==> No commands found for search string '{search_string}'")
|
|
270
|
+
return
|
|
271
|
+
# Build outputs
|
|
272
|
+
out_dir = _get_outbox_dir()
|
|
273
|
+
os.makedirs(out_dir, exist_ok=True)
|
|
274
|
+
stamp = time.strftime('%Y-%m-%d-%H-%M-%S')
|
|
275
|
+
if mode == "md":
|
|
276
|
+
# Simple sections per term
|
|
277
|
+
lines: List[str] = []
|
|
278
|
+
lines.append(f"# Dr.Egeria Commands (search: `{search_string}`)")
|
|
279
|
+
lines.append("")
|
|
280
|
+
sorted_terms = sorted(terms, key=lambda t: (t.get("properties") or {}).get("displayName", "---"))
|
|
281
|
+
for term in sorted_terms:
|
|
282
|
+
props = term.get("properties") or {}
|
|
283
|
+
name = props.get("displayName", "---") or "---"
|
|
284
|
+
desc = props.get("description", "") or ""
|
|
285
|
+
usage = props.get("usage", "") or ""
|
|
286
|
+
lines.append(f"## {name}")
|
|
287
|
+
lines.append("")
|
|
288
|
+
lines.append("### Description\n")
|
|
289
|
+
lines.append(desc if desc.strip() else "_No description_")
|
|
290
|
+
lines.append("")
|
|
291
|
+
if usage.strip():
|
|
292
|
+
lines.append("### Usage\n")
|
|
293
|
+
lines.append(usage)
|
|
294
|
+
lines.append("")
|
|
295
|
+
lines.append("---\n")
|
|
296
|
+
content = "\n".join(lines)
|
|
297
|
+
file_name = f"Command-Help-{stamp}-md.md"
|
|
298
|
+
else:
|
|
299
|
+
# md-html nested tables
|
|
300
|
+
columns = ["Command", "Description", "Usage"]
|
|
301
|
+
rows: List[List[str]] = []
|
|
302
|
+
sorted_terms = sorted(terms, key=lambda t: (t.get("properties") or {}).get("displayName", "---"))
|
|
303
|
+
for term in sorted_terms:
|
|
304
|
+
props = term.get("properties") or {}
|
|
305
|
+
name = props.get("displayName", "---") or "---"
|
|
306
|
+
desc = props.get("description", "") or ""
|
|
307
|
+
usage_md = props.get("usage", "") or ""
|
|
308
|
+
usage_html = _md_to_html(usage_md).strip()
|
|
309
|
+
rows.append([name, desc, usage_html])
|
|
310
|
+
content = f"# Dr.Egeria Commands (search: `{search_string}`)\n\n" + _build_html_table(columns, rows) + "\n"
|
|
311
|
+
file_name = f"Command-Help-{stamp}-md-html.md"
|
|
312
|
+
full_file_path = os.path.join(out_dir, file_name)
|
|
313
|
+
with open(full_file_path, 'w', encoding='utf-8') as f:
|
|
314
|
+
f.write(content)
|
|
315
|
+
print(f"\n==> Help written to {full_file_path}")
|
|
316
|
+
return
|
|
317
|
+
|
|
318
|
+
try:
|
|
319
|
+
with console.pager(styles=True):
|
|
320
|
+
console.print(generate_table(search_string, glossary_guid))
|
|
321
|
+
|
|
322
|
+
except (
|
|
323
|
+
PyegeriaInvalidParameterException,
|
|
324
|
+
PropertyServerException,
|
|
325
|
+
UserNotAuthorizedException,
|
|
326
|
+
) as e:
|
|
327
|
+
console.print_exception()
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def main():
|
|
331
|
+
sus_guid = "f9b78b26-6025-43fa-9299-a905cc6d1575"
|
|
332
|
+
parser = argparse.ArgumentParser()
|
|
333
|
+
parser.add_argument("--server", help="Name of the server to display status for")
|
|
334
|
+
parser.add_argument("--url", help="URL Platform to connect to")
|
|
335
|
+
parser.add_argument("--userid", help="User Id")
|
|
336
|
+
parser.add_argument("--password", help="User Password")
|
|
337
|
+
parser.add_argument("--guid", help="GUID of glossary to search")
|
|
338
|
+
parser.add_argument("--mode", choices=["terminal","md","md-html"], default="terminal", help="Output mode: terminal (default) prints Rich table; md writes Markdown; md-html writes Markdown with HTML tables.")
|
|
339
|
+
parser.add_argument("--search", help="Search string for commands", default=None)
|
|
340
|
+
|
|
341
|
+
args = parser.parse_args()
|
|
342
|
+
|
|
343
|
+
# server = args.server if args.server is not None else EGERIA_VIEW_SERVER
|
|
344
|
+
server = args.server if args.server is not None else EGERIA_VIEW_SERVER
|
|
345
|
+
|
|
346
|
+
url = args.url if args.url is not None else EGERIA_PLATFORM_URL
|
|
347
|
+
userid = args.userid if args.userid is not None else EGERIA_USER
|
|
348
|
+
user_pass = args.password if args.password is not None else EGERIA_USER_PASSWORD
|
|
349
|
+
guid = args.guid if args.guid is not None else EGERIA_HOME_GLOSSARY_GUID
|
|
350
|
+
|
|
351
|
+
try:
|
|
352
|
+
search_default = args.search or "*"
|
|
353
|
+
search_string = args.search or Prompt.ask("Enter the command you are searching for:", default=search_default)
|
|
354
|
+
|
|
355
|
+
if args.mode == "terminal":
|
|
356
|
+
output_format = Prompt.ask("What output format do you want?", choices=["TABLE", "LIST", "REPORT"], default="TABLE")
|
|
357
|
+
else:
|
|
358
|
+
output_format = "TABLE"
|
|
359
|
+
|
|
360
|
+
display_command_terms(
|
|
361
|
+
search_string, guid, 'Egeria-Markdown', server, url,
|
|
362
|
+
userid, user_pass, output_format=output_format, mode=args.mode
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
except KeyboardInterrupt:
|
|
366
|
+
pass
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
if __name__ == "__main__":
|
|
372
|
+
main()
|
|
@@ -8,13 +8,13 @@ from rich import print
|
|
|
8
8
|
from rich.console import Console
|
|
9
9
|
|
|
10
10
|
from pyegeria.egeria_tech_client import EgeriaTech
|
|
11
|
-
from pyegeria.md_processing_utils import (extract_command, process_glossary_upsert_command, process_term_upsert_command,
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
from pyegeria.view.md_processing_utils import (extract_command, process_glossary_upsert_command, process_term_upsert_command,
|
|
12
|
+
get_current_datetime_string, process_per_proj_upsert_command, command_list,
|
|
13
|
+
)
|
|
14
14
|
import click
|
|
15
15
|
|
|
16
|
-
from pyegeria._exceptions import (
|
|
17
|
-
|
|
16
|
+
from pyegeria.core._exceptions import (
|
|
17
|
+
print_basic_exception, PyegeriaException,
|
|
18
18
|
)
|
|
19
19
|
|
|
20
20
|
EGERIA_METADATA_STORE = os.environ.get("EGERIA_METADATA_STORE", "active-metadata-store")
|
|
@@ -113,8 +113,8 @@ def process_jupyter_notebook(
|
|
|
113
113
|
else:
|
|
114
114
|
click.echo("\nNo updates detected. New file not created.")
|
|
115
115
|
|
|
116
|
-
except
|
|
117
|
-
|
|
116
|
+
except PyegeriaException as e:
|
|
117
|
+
print_basic_exception(e)
|
|
118
118
|
return
|
|
119
119
|
|
|
120
120
|
|