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.

Files changed (272) hide show
  1. commands/__init__.py +24 -0
  2. commands/cat/Dr-Egeria_md-orig.py +2 -2
  3. commands/cat/__init__.py +1 -17
  4. commands/cat/collection_actions.py +197 -0
  5. commands/cat/dr_egeria_command_help.py +372 -0
  6. commands/cat/dr_egeria_jupyter.py +7 -7
  7. commands/cat/dr_egeria_md.py +27 -182
  8. commands/cat/exp_list_glossaries.py +11 -14
  9. commands/cat/get_asset_graph.py +37 -267
  10. commands/cat/{get_collection.py → get_collection_tree.py} +10 -18
  11. commands/cat/get_project_dependencies.py +14 -14
  12. commands/cat/get_project_structure.py +15 -14
  13. commands/cat/get_tech_type_elements.py +16 -116
  14. commands/cat/glossary_actions.py +145 -298
  15. commands/cat/list_assets.py +3 -11
  16. commands/cat/list_cert_types.py +17 -63
  17. commands/cat/list_collections.py +46 -138
  18. commands/cat/list_deployed_catalogs.py +15 -27
  19. commands/cat/list_deployed_database_schemas.py +27 -43
  20. commands/cat/list_deployed_databases.py +16 -31
  21. commands/cat/list_deployed_servers.py +35 -54
  22. commands/cat/list_glossaries.py +18 -17
  23. commands/cat/list_projects.py +10 -12
  24. commands/cat/list_tech_type_elements.py +21 -37
  25. commands/cat/list_tech_types.py +13 -25
  26. commands/cat/list_terms.py +38 -79
  27. commands/cat/list_todos.py +4 -11
  28. commands/cat/list_user_ids.py +3 -10
  29. commands/cat/my_reports.py +559 -0
  30. commands/cat/run_report.py +394 -0
  31. commands/cat/run_report_orig.py +528 -0
  32. commands/cli/egeria.py +222 -247
  33. commands/cli/egeria_cat.py +68 -81
  34. commands/cli/egeria_my.py +13 -0
  35. commands/cli/egeria_ops.py +69 -74
  36. commands/cli/egeria_tech.py +17 -93
  37. commands/cli/ops_config.py +3 -6
  38. commands/{cat/list_categories.py → deprecated/list_data_designer.py} +53 -64
  39. commands/{cat/list_data_structures.py → deprecated/list_data_structures_full.py} +3 -6
  40. commands/deprecated/old_get_asset_graph.py +315 -0
  41. commands/my/__init__.py +0 -2
  42. commands/my/list_my_profile.py +27 -34
  43. commands/my/list_my_roles.py +1 -7
  44. commands/my/monitor_my_todos.py +1 -7
  45. commands/my/monitor_open_todos.py +6 -7
  46. commands/my/todo_actions.py +4 -5
  47. commands/ops/__init__.py +0 -2
  48. commands/ops/gov_server_actions.py +17 -21
  49. commands/ops/list_archives.py +17 -38
  50. commands/ops/list_catalog_targets.py +33 -40
  51. commands/ops/load_archive.py +35 -26
  52. commands/ops/{monitor_engine_activity_c.py → monitor_active_engine_activity.py} +51 -82
  53. commands/ops/{monitor_integ_daemon_status.py → monitor_daemon_status.py} +35 -55
  54. commands/ops/monitor_engine_activity.py +79 -77
  55. commands/ops/{monitor_gov_eng_status.py → monitor_engine_status.py} +10 -7
  56. commands/ops/monitor_platform_status.py +38 -50
  57. commands/ops/monitor_server_startup.py +6 -11
  58. commands/ops/monitor_server_status.py +7 -11
  59. commands/ops/orig_monitor_server_list.py +8 -8
  60. commands/ops/orig_monitor_server_status.py +1 -5
  61. commands/ops/refresh_integration_daemon.py +5 -5
  62. commands/ops/restart_integration_daemon.py +5 -5
  63. commands/ops/table_integ_daemon_status.py +6 -6
  64. commands/ops/x_engine_actions.py +7 -7
  65. commands/tech/__init__.py +0 -2
  66. commands/tech/{generic_actions.py → element_actions.py} +6 -11
  67. commands/tech/get_element_info.py +20 -29
  68. commands/tech/get_guid_info.py +23 -42
  69. commands/tech/get_tech_details.py +20 -35
  70. commands/tech/get_tech_type_template.py +28 -39
  71. commands/tech/list_all_om_type_elements.py +24 -30
  72. commands/tech/list_all_om_type_elements_x.py +22 -28
  73. commands/tech/list_all_related_elements.py +19 -28
  74. commands/tech/list_anchored_elements.py +22 -30
  75. commands/tech/list_asset_types.py +19 -24
  76. commands/tech/list_elements_by_classification_by_property_value.py +26 -32
  77. commands/tech/list_elements_by_property_value.py +19 -25
  78. commands/tech/list_elements_by_property_value_x.py +20 -28
  79. commands/tech/list_elements_for_classification.py +28 -41
  80. commands/tech/list_gov_action_processes.py +16 -27
  81. commands/tech/list_information_supply_chains.py +22 -30
  82. commands/tech/list_registered_services.py +14 -26
  83. commands/tech/list_related_elements_with_prop_value.py +15 -25
  84. commands/tech/list_related_specification.py +1 -4
  85. commands/tech/list_relationship_types.py +15 -25
  86. commands/tech/list_relationships.py +20 -36
  87. commands/tech/list_solution_blueprints.py +28 -33
  88. commands/tech/list_solution_components.py +23 -29
  89. commands/tech/list_solution_roles.py +21 -32
  90. commands/tech/list_tech_templates.py +51 -54
  91. commands/tech/list_valid_metadata_values.py +5 -9
  92. commands/tech/table_tech_templates.py +2 -6
  93. commands/tech/x_list_related_elements.py +1 -4
  94. examples/GeoSpatial Products Example.py +524 -0
  95. examples/Jupyter Notebooks/P-egeria-server-config.ipynb +2137 -0
  96. examples/Jupyter Notebooks/README.md +2 -0
  97. examples/Jupyter Notebooks/common/P-environment-check.ipynb +115 -0
  98. examples/Jupyter Notebooks/common/__init__.py +14 -0
  99. examples/Jupyter Notebooks/common/common-functions.ipynb +4694 -0
  100. examples/Jupyter Notebooks/common/environment-check.ipynb +52 -0
  101. examples/Jupyter Notebooks/common/globals.ipynb +184 -0
  102. examples/Jupyter Notebooks/common/globals.py +154 -0
  103. examples/Jupyter Notebooks/common/orig_globals.py +152 -0
  104. examples/format_sets/all_format_sets.json +910 -0
  105. examples/format_sets/custom_format_sets.json +268 -0
  106. examples/format_sets/subset_format_sets.json +187 -0
  107. examples/format_sets_save_load_example.py +291 -0
  108. examples/jacquard_data_sets.py +129 -0
  109. examples/output_formats_example.py +193 -0
  110. examples/test_jacquard_data_sets.py +54 -0
  111. examples/test_jacquard_data_sets_scenarios.py +94 -0
  112. md_processing/__init__.py +90 -0
  113. md_processing/command_dispatcher.py +33 -0
  114. md_processing/command_mapping.py +221 -0
  115. md_processing/data/commands/commands_data_designer.json +537 -0
  116. md_processing/data/commands/commands_external_reference.json +733 -0
  117. md_processing/data/commands/commands_feedback.json +155 -0
  118. md_processing/data/commands/commands_general.json +204 -0
  119. md_processing/data/commands/commands_glossary.json +218 -0
  120. md_processing/data/commands/commands_governance.json +3678 -0
  121. md_processing/data/commands/commands_product_manager.json +865 -0
  122. md_processing/data/commands/commands_project.json +642 -0
  123. md_processing/data/commands/commands_solution_architect.json +366 -0
  124. md_processing/data/commands.json +17568 -0
  125. md_processing/data/commands_working.json +30641 -0
  126. md_processing/data/gened_report_specs.py +6584 -0
  127. md_processing/data/generated_format_sets.json +6533 -0
  128. md_processing/data/generated_format_sets_old.json +4137 -0
  129. md_processing/data/generated_format_sets_old.py +45 -0
  130. md_processing/dr_egeria.py +182 -0
  131. md_processing/md_commands/__init__.py +3 -0
  132. md_processing/md_commands/data_designer_commands.py +1276 -0
  133. md_processing/md_commands/ext_ref_commands.py +530 -0
  134. md_processing/md_commands/feedback_commands.py +726 -0
  135. md_processing/md_commands/glossary_commands.py +684 -0
  136. md_processing/md_commands/governance_officer_commands.py +600 -0
  137. md_processing/md_commands/product_manager_commands.py +1266 -0
  138. md_processing/md_commands/project_commands.py +383 -0
  139. md_processing/md_commands/solution_architect_commands.py +1184 -0
  140. md_processing/md_commands/view_commands.py +295 -0
  141. md_processing/md_processing_utils/__init__.py +4 -0
  142. md_processing/md_processing_utils/common_md_proc_utils.py +1249 -0
  143. md_processing/md_processing_utils/common_md_utils.py +578 -0
  144. md_processing/md_processing_utils/determine_width.py +103 -0
  145. md_processing/md_processing_utils/extraction_utils.py +547 -0
  146. md_processing/md_processing_utils/gen_report_specs.py +643 -0
  147. md_processing/md_processing_utils/generate_dr_help.py +193 -0
  148. md_processing/md_processing_utils/generate_md_cmd_templates.py +144 -0
  149. md_processing/md_processing_utils/generate_md_templates.py +83 -0
  150. md_processing/md_processing_utils/md_processing_constants.py +1228 -0
  151. md_processing/md_processing_utils/message_constants.py +19 -0
  152. pyegeria/__init__.py +201 -443
  153. pyegeria/core/__init__.py +40 -0
  154. pyegeria/core/_base_platform_client.py +574 -0
  155. pyegeria/core/_base_server_client.py +573 -0
  156. pyegeria/core/_exceptions.py +457 -0
  157. pyegeria/core/_globals.py +60 -0
  158. pyegeria/core/_server_client.py +6073 -0
  159. pyegeria/core/_validators.py +257 -0
  160. pyegeria/core/config.py +654 -0
  161. pyegeria/{create_tech_guid_lists.py → core/create_tech_guid_lists.py} +0 -1
  162. pyegeria/core/load_config.py +37 -0
  163. pyegeria/core/logging_configuration.py +207 -0
  164. pyegeria/core/mcp_adapter.py +144 -0
  165. pyegeria/core/mcp_server.py +212 -0
  166. pyegeria/core/utils.py +405 -0
  167. pyegeria/deprecated/__init__.py +0 -0
  168. pyegeria/{_client.py → deprecated/_client.py} +62 -24
  169. pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
  170. pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1988 -1878
  171. pyegeria/deprecated/output_formatter_with_machine_keys.py +1127 -0
  172. pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +216 -229
  173. pyegeria/{valid_metadata_omvs.py → deprecated/valid_metadata_omvs.py} +93 -93
  174. pyegeria/{x_action_author_omvs.py → deprecated/x_action_author_omvs.py} +2 -3
  175. pyegeria/egeria_cat_client.py +25 -51
  176. pyegeria/egeria_client.py +140 -98
  177. pyegeria/egeria_config_client.py +48 -24
  178. pyegeria/egeria_tech_client.py +170 -83
  179. pyegeria/models/__init__.py +150 -0
  180. pyegeria/models/collection_models.py +168 -0
  181. pyegeria/models/models.py +654 -0
  182. pyegeria/omvs/__init__.py +84 -0
  183. pyegeria/omvs/action_author.py +342 -0
  184. pyegeria/omvs/actor_manager.py +5980 -0
  185. pyegeria/omvs/asset_catalog.py +842 -0
  186. pyegeria/omvs/asset_maker.py +2736 -0
  187. pyegeria/omvs/automated_curation.py +4403 -0
  188. pyegeria/omvs/classification_manager.py +11213 -0
  189. pyegeria/omvs/collection_manager.py +5780 -0
  190. pyegeria/omvs/community_matters_omvs.py +468 -0
  191. pyegeria/{core_omag_server_config.py → omvs/core_omag_server_config.py} +157 -157
  192. pyegeria/{data_designer_omvs.py → omvs/data_designer.py} +1991 -1691
  193. pyegeria/omvs/data_discovery.py +869 -0
  194. pyegeria/omvs/data_engineer.py +372 -0
  195. pyegeria/omvs/digital_business.py +1133 -0
  196. pyegeria/omvs/external_links.py +1752 -0
  197. pyegeria/omvs/feedback_manager.py +834 -0
  198. pyegeria/{full_omag_server_config.py → omvs/full_omag_server_config.py} +73 -69
  199. pyegeria/omvs/glossary_manager.py +3231 -0
  200. pyegeria/omvs/governance_officer.py +3009 -0
  201. pyegeria/omvs/lineage_linker.py +314 -0
  202. pyegeria/omvs/location_arena.py +1525 -0
  203. pyegeria/omvs/metadata_expert.py +668 -0
  204. pyegeria/omvs/metadata_explorer_omvs.py +2943 -0
  205. pyegeria/omvs/my_profile.py +1042 -0
  206. pyegeria/omvs/notification_manager.py +358 -0
  207. pyegeria/omvs/people_organizer.py +394 -0
  208. pyegeria/{platform_services.py → omvs/platform_services.py} +113 -193
  209. pyegeria/omvs/product_manager.py +1825 -0
  210. pyegeria/omvs/project_manager.py +1907 -0
  211. pyegeria/omvs/reference_data.py +1140 -0
  212. pyegeria/omvs/registered_info.py +334 -0
  213. pyegeria/omvs/runtime_manager.py +2817 -0
  214. pyegeria/omvs/schema_maker.py +446 -0
  215. pyegeria/{server_operations.py → omvs/server_operations.py} +27 -26
  216. pyegeria/omvs/solution_architect.py +6490 -0
  217. pyegeria/omvs/specification_properties.py +37 -0
  218. pyegeria/omvs/subject_area.py +1042 -0
  219. pyegeria/omvs/template_manager_omvs.py +236 -0
  220. pyegeria/omvs/time_keeper.py +1761 -0
  221. pyegeria/omvs/valid_metadata.py +3221 -0
  222. pyegeria/omvs/valid_metadata_lists.py +37 -0
  223. pyegeria/omvs/valid_type_lists.py +37 -0
  224. pyegeria/view/__init__.py +28 -0
  225. pyegeria/view/_output_format_models.py +514 -0
  226. pyegeria/view/_output_formats.py +14 -0
  227. pyegeria/view/base_report_formats.py +2719 -0
  228. pyegeria/view/dr_egeria_reports.py +56 -0
  229. pyegeria/view/format_set_executor.py +397 -0
  230. pyegeria/{md_processing_utils.py → view/md_processing_utils.py} +5 -5
  231. pyegeria/{mermaid_utilities.py → view/mermaid_utilities.py} +2 -154
  232. pyegeria/view/output_formatter.py +1297 -0
  233. pyegeria-5.5.3.3.dist-info/METADATA +218 -0
  234. pyegeria-5.5.3.3.dist-info/RECORD +241 -0
  235. {pyegeria-5.3.9.9.3.dist-info → pyegeria-5.5.3.3.dist-info}/WHEEL +2 -1
  236. pyegeria-5.5.3.3.dist-info/entry_points.txt +103 -0
  237. pyegeria-5.5.3.3.dist-info/top_level.txt +4 -0
  238. commands/cat/.DS_Store +0 -0
  239. commands/cat/README.md +0 -16
  240. commands/cli/txt_custom_v2.tcss +0 -19
  241. commands/my/README.md +0 -17
  242. commands/ops/README.md +0 -24
  243. commands/ops/monitor_asset_events.py +0 -108
  244. commands/tech/README.md +0 -24
  245. pyegeria/.DS_Store +0 -0
  246. pyegeria/README.md +0 -35
  247. pyegeria/_globals.py +0 -47
  248. pyegeria/_validators.py +0 -385
  249. pyegeria/asset_catalog_omvs.py +0 -864
  250. pyegeria/automated_curation_omvs.py +0 -3765
  251. pyegeria/collection_manager_omvs.py +0 -2744
  252. pyegeria/dr.egeria spec.md +0 -9
  253. pyegeria/egeria_my_client.py +0 -56
  254. pyegeria/feedback_manager_omvs.py +0 -4573
  255. pyegeria/glossary_browser_omvs.py +0 -3728
  256. pyegeria/glossary_manager_omvs.py +0 -2440
  257. pyegeria/m_test.py +0 -118
  258. pyegeria/md_processing_helpers.py +0 -58
  259. pyegeria/md_processing_utils_orig.py +0 -1103
  260. pyegeria/metadata_explorer_omvs.py +0 -2326
  261. pyegeria/my_profile_omvs.py +0 -1022
  262. pyegeria/output_formatter.py +0 -389
  263. pyegeria/project_manager_omvs.py +0 -1933
  264. pyegeria/registered_info.py +0 -167
  265. pyegeria/solution_architect_omvs.py +0 -2156
  266. pyegeria/template_manager_omvs.py +0 -1414
  267. pyegeria/utils.py +0 -197
  268. pyegeria-5.3.9.9.3.dist-info/METADATA +0 -72
  269. pyegeria-5.3.9.9.3.dist-info/RECORD +0 -143
  270. pyegeria-5.3.9.9.3.dist-info/entry_points.txt +0 -99
  271. /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
  272. {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
- process_provenance_command)
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
- from pyegeria import (
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
- get_current_datetime_string, process_per_proj_upsert_command, command_list,
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
- print_exception_response,
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 Exception as e:
117
- print_exception_response(e)
116
+ except PyegeriaException as e:
117
+ print_basic_exception(e)
118
118
  return
119
119
 
120
120