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.

Files changed (433) hide show
  1. commands/__init__.py +24 -0
  2. commands/cat/Dr-Egeria_md-orig.py +2 -2
  3. commands/cat/collection_actions.py +197 -0
  4. commands/cat/dr_egeria_command_help.py +137 -38
  5. commands/cat/dr_egeria_jupyter.py +7 -7
  6. commands/cat/dr_egeria_md.py +10 -267
  7. commands/cat/exp_list_glossaries.py +11 -14
  8. commands/cat/get_asset_graph.py +37 -267
  9. commands/cat/{get_collection.py → get_collection_tree.py} +10 -18
  10. commands/cat/get_project_dependencies.py +14 -14
  11. commands/cat/get_project_structure.py +15 -14
  12. commands/cat/get_tech_type_elements.py +16 -116
  13. commands/cat/glossary_actions.py +145 -298
  14. commands/cat/list_assets.py +3 -11
  15. commands/cat/list_cert_types.py +17 -63
  16. commands/cat/list_collections.py +17 -139
  17. commands/cat/list_deployed_catalogs.py +15 -27
  18. commands/cat/list_deployed_database_schemas.py +27 -43
  19. commands/cat/list_deployed_databases.py +16 -31
  20. commands/cat/list_deployed_servers.py +35 -54
  21. commands/cat/list_glossaries.py +18 -17
  22. commands/cat/list_projects.py +10 -12
  23. commands/cat/list_tech_type_elements.py +21 -37
  24. commands/cat/list_tech_types.py +13 -25
  25. commands/cat/list_terms.py +38 -79
  26. commands/cat/list_todos.py +4 -11
  27. commands/cat/list_user_ids.py +3 -10
  28. commands/cat/my_reports.py +559 -0
  29. commands/cat/run_report.py +394 -0
  30. commands/cat/{list_format_set.py → run_report_orig.py} +136 -44
  31. commands/cli/egeria.py +182 -219
  32. commands/cli/egeria_cat.py +32 -59
  33. commands/cli/egeria_my.py +13 -0
  34. commands/cli/egeria_ops.py +69 -74
  35. commands/cli/egeria_tech.py +17 -93
  36. commands/{cat → deprecated}/list_data_designer.py +2 -4
  37. commands/{cat → deprecated}/list_data_structures_full.py +3 -6
  38. commands/deprecated/old_get_asset_graph.py +315 -0
  39. commands/my/__init__.py +0 -2
  40. commands/my/list_my_profile.py +27 -34
  41. commands/my/list_my_roles.py +1 -7
  42. commands/my/monitor_my_todos.py +1 -7
  43. commands/my/monitor_open_todos.py +6 -7
  44. commands/my/todo_actions.py +4 -5
  45. commands/ops/__init__.py +0 -2
  46. commands/ops/gov_server_actions.py +17 -21
  47. commands/ops/list_archives.py +17 -38
  48. commands/ops/list_catalog_targets.py +33 -40
  49. commands/ops/load_archive.py +14 -11
  50. commands/ops/{monitor_engine_activity_c.py → monitor_active_engine_activity.py} +51 -82
  51. commands/ops/{monitor_integ_daemon_status.py → monitor_daemon_status.py} +35 -55
  52. commands/ops/monitor_engine_activity.py +79 -77
  53. commands/ops/{monitor_gov_eng_status.py → monitor_engine_status.py} +10 -7
  54. commands/ops/monitor_platform_status.py +38 -50
  55. commands/ops/monitor_server_startup.py +6 -11
  56. commands/ops/monitor_server_status.py +7 -11
  57. commands/ops/orig_monitor_server_list.py +8 -8
  58. commands/ops/orig_monitor_server_status.py +1 -5
  59. commands/ops/refresh_integration_daemon.py +5 -5
  60. commands/ops/restart_integration_daemon.py +5 -5
  61. commands/ops/table_integ_daemon_status.py +6 -6
  62. commands/ops/x_engine_actions.py +7 -7
  63. commands/tech/__init__.py +0 -2
  64. commands/tech/{generic_actions.py → element_actions.py} +6 -11
  65. commands/tech/get_element_info.py +20 -29
  66. commands/tech/get_guid_info.py +23 -42
  67. commands/tech/get_tech_details.py +20 -35
  68. commands/tech/get_tech_type_template.py +28 -39
  69. commands/tech/list_all_om_type_elements.py +24 -30
  70. commands/tech/list_all_om_type_elements_x.py +22 -28
  71. commands/tech/list_all_related_elements.py +19 -28
  72. commands/tech/list_anchored_elements.py +22 -30
  73. commands/tech/list_asset_types.py +19 -24
  74. commands/tech/list_elements_by_classification_by_property_value.py +26 -32
  75. commands/tech/list_elements_by_property_value.py +19 -25
  76. commands/tech/list_elements_by_property_value_x.py +20 -28
  77. commands/tech/list_elements_for_classification.py +28 -41
  78. commands/tech/list_gov_action_processes.py +16 -27
  79. commands/tech/list_information_supply_chains.py +22 -30
  80. commands/tech/list_registered_services.py +14 -26
  81. commands/tech/list_related_elements_with_prop_value.py +15 -25
  82. commands/tech/list_related_specification.py +1 -4
  83. commands/tech/list_relationship_types.py +15 -25
  84. commands/tech/list_relationships.py +20 -36
  85. commands/tech/list_solution_blueprints.py +28 -33
  86. commands/tech/list_solution_components.py +23 -29
  87. commands/tech/list_solution_roles.py +21 -32
  88. commands/tech/list_tech_templates.py +51 -54
  89. commands/tech/list_valid_metadata_values.py +5 -9
  90. commands/tech/table_tech_templates.py +2 -6
  91. commands/tech/x_list_related_elements.py +1 -4
  92. examples/GeoSpatial Products Example.py +524 -0
  93. examples/Jupyter Notebooks/P-egeria-server-config.ipynb +2137 -0
  94. examples/Jupyter Notebooks/README.md +2 -0
  95. examples/Jupyter Notebooks/common/P-environment-check.ipynb +115 -0
  96. examples/Jupyter Notebooks/common/__init__.py +14 -0
  97. examples/Jupyter Notebooks/common/common-functions.ipynb +4694 -0
  98. examples/Jupyter Notebooks/common/environment-check.ipynb +52 -0
  99. examples/Jupyter Notebooks/common/globals.ipynb +184 -0
  100. examples/Jupyter Notebooks/common/globals.py +154 -0
  101. examples/Jupyter Notebooks/common/orig_globals.py +152 -0
  102. examples/format_sets/all_format_sets.json +910 -0
  103. examples/format_sets/custom_format_sets.json +268 -0
  104. examples/format_sets/subset_format_sets.json +187 -0
  105. examples/format_sets_save_load_example.py +291 -0
  106. examples/jacquard_data_sets.py +129 -0
  107. examples/output_formats_example.py +193 -0
  108. examples/test_jacquard_data_sets.py +54 -0
  109. examples/test_jacquard_data_sets_scenarios.py +94 -0
  110. md_processing/__init__.py +33 -24
  111. md_processing/command_dispatcher.py +33 -0
  112. md_processing/command_mapping.py +221 -0
  113. md_processing/data/commands/commands_data_designer.json +537 -0
  114. md_processing/data/commands/commands_external_reference.json +733 -0
  115. md_processing/data/commands/commands_feedback.json +155 -0
  116. md_processing/data/commands/commands_general.json +204 -0
  117. md_processing/data/commands/commands_glossary.json +218 -0
  118. md_processing/data/commands/commands_governance.json +3678 -0
  119. md_processing/data/commands/commands_product_manager.json +865 -0
  120. md_processing/data/commands/commands_project.json +642 -0
  121. md_processing/data/commands/commands_solution_architect.json +366 -0
  122. md_processing/data/commands.json +6489 -30060
  123. md_processing/data/{commands-working.json → commands_working.json} +9304 -13513
  124. md_processing/data/gened_report_specs.py +6584 -0
  125. md_processing/data/generated_format_sets.json +6533 -0
  126. md_processing/data/generated_format_sets_old.json +4137 -0
  127. md_processing/data/generated_format_sets_old.py +45 -0
  128. md_processing/dr_egeria.py +182 -0
  129. md_processing/md_commands/data_designer_commands.py +195 -583
  130. md_processing/md_commands/ext_ref_commands.py +530 -0
  131. md_processing/md_commands/feedback_commands.py +726 -0
  132. md_processing/md_commands/glossary_commands.py +106 -490
  133. md_processing/md_commands/governance_officer_commands.py +129 -18
  134. md_processing/md_commands/product_manager_commands.py +362 -115
  135. md_processing/md_commands/project_commands.py +351 -134
  136. md_processing/md_commands/solution_architect_commands.py +276 -232
  137. md_processing/md_commands/view_commands.py +295 -0
  138. md_processing/md_processing_utils/common_md_proc_utils.py +258 -166
  139. md_processing/md_processing_utils/common_md_utils.py +138 -43
  140. md_processing/md_processing_utils/determine_width.py +103 -0
  141. md_processing/md_processing_utils/extraction_utils.py +100 -39
  142. md_processing/md_processing_utils/gen_report_specs.py +643 -0
  143. md_processing/md_processing_utils/generate_dr_help.py +61 -33
  144. md_processing/md_processing_utils/generate_md_cmd_templates.py +20 -19
  145. md_processing/md_processing_utils/generate_md_templates.py +3 -12
  146. md_processing/md_processing_utils/md_processing_constants.py +1053 -72
  147. pyegeria/__init__.py +203 -158
  148. pyegeria/core/__init__.py +40 -0
  149. pyegeria/core/_base_platform_client.py +574 -0
  150. pyegeria/core/_base_server_client.py +573 -0
  151. pyegeria/{_exceptions_new.py → core/_exceptions.py} +62 -30
  152. pyegeria/{_globals.py → core/_globals.py} +14 -3
  153. pyegeria/core/_server_client.py +6073 -0
  154. pyegeria/{_validators.py → core/_validators.py} +7 -8
  155. pyegeria/core/config.py +654 -0
  156. pyegeria/{create_tech_guid_lists.py → core/create_tech_guid_lists.py} +0 -1
  157. pyegeria/core/load_config.py +37 -0
  158. pyegeria/{logging_configuration.py → core/logging_configuration.py} +1 -1
  159. pyegeria/core/mcp_adapter.py +144 -0
  160. pyegeria/core/mcp_server.py +212 -0
  161. pyegeria/core/utils.py +405 -0
  162. pyegeria/{_client.py → deprecated/_client.py} +24 -25
  163. pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
  164. pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1987 -1877
  165. pyegeria/{output_formatter.py → deprecated/output_formatter_with_machine_keys.py} +298 -45
  166. pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +155 -171
  167. pyegeria/{valid_metadata_omvs.py → deprecated/valid_metadata_omvs.py} +93 -93
  168. pyegeria/{x_action_author_omvs.py → deprecated/x_action_author_omvs.py} +2 -3
  169. pyegeria/egeria_cat_client.py +26 -70
  170. pyegeria/egeria_client.py +130 -93
  171. pyegeria/egeria_config_client.py +40 -46
  172. pyegeria/egeria_tech_client.py +141 -54
  173. pyegeria/models/__init__.py +150 -0
  174. pyegeria/{models.py → models/models.py} +156 -20
  175. pyegeria/omvs/__init__.py +84 -0
  176. pyegeria/omvs/action_author.py +342 -0
  177. pyegeria/omvs/actor_manager.py +5980 -0
  178. pyegeria/omvs/asset_catalog.py +842 -0
  179. pyegeria/omvs/asset_maker.py +2736 -0
  180. pyegeria/omvs/automated_curation.py +4403 -0
  181. pyegeria/omvs/classification_manager.py +11213 -0
  182. pyegeria/{collection_manager.py → omvs/collection_manager.py} +1334 -1160
  183. pyegeria/omvs/community_matters_omvs.py +468 -0
  184. pyegeria/{core_omag_server_config.py → omvs/core_omag_server_config.py} +157 -157
  185. pyegeria/{data_designer.py → omvs/data_designer.py} +1115 -660
  186. pyegeria/omvs/data_discovery.py +869 -0
  187. pyegeria/omvs/data_engineer.py +372 -0
  188. pyegeria/omvs/digital_business.py +1133 -0
  189. pyegeria/omvs/external_links.py +1752 -0
  190. pyegeria/omvs/feedback_manager.py +834 -0
  191. pyegeria/{full_omag_server_config.py → omvs/full_omag_server_config.py} +73 -69
  192. pyegeria/{glossary_manager.py → omvs/glossary_manager.py} +857 -519
  193. pyegeria/{governance_officer.py → omvs/governance_officer.py} +964 -468
  194. pyegeria/omvs/lineage_linker.py +314 -0
  195. pyegeria/omvs/location_arena.py +1525 -0
  196. pyegeria/omvs/metadata_expert.py +668 -0
  197. pyegeria/omvs/metadata_explorer_omvs.py +2943 -0
  198. pyegeria/omvs/my_profile.py +1042 -0
  199. pyegeria/omvs/notification_manager.py +358 -0
  200. pyegeria/omvs/people_organizer.py +394 -0
  201. pyegeria/{platform_services.py → omvs/platform_services.py} +113 -193
  202. pyegeria/omvs/product_manager.py +1825 -0
  203. pyegeria/omvs/project_manager.py +1907 -0
  204. pyegeria/omvs/reference_data.py +1140 -0
  205. pyegeria/omvs/registered_info.py +334 -0
  206. pyegeria/omvs/runtime_manager.py +2817 -0
  207. pyegeria/omvs/schema_maker.py +446 -0
  208. pyegeria/{server_operations.py → omvs/server_operations.py} +27 -26
  209. pyegeria/{solution_architect_omvs.py → omvs/solution_architect.py} +1886 -1505
  210. pyegeria/omvs/specification_properties.py +37 -0
  211. pyegeria/omvs/subject_area.py +1042 -0
  212. pyegeria/omvs/template_manager_omvs.py +236 -0
  213. pyegeria/omvs/time_keeper.py +1761 -0
  214. pyegeria/omvs/valid_metadata.py +3221 -0
  215. pyegeria/omvs/valid_metadata_lists.py +37 -0
  216. pyegeria/omvs/valid_type_lists.py +37 -0
  217. pyegeria/view/__init__.py +28 -0
  218. pyegeria/{_output_format_models.py → view/_output_format_models.py} +160 -24
  219. pyegeria/view/_output_formats.py +14 -0
  220. pyegeria/view/base_report_formats.py +2719 -0
  221. pyegeria/view/dr_egeria_reports.py +56 -0
  222. pyegeria/view/format_set_executor.py +397 -0
  223. pyegeria/{md_processing_utils.py → view/md_processing_utils.py} +5 -5
  224. pyegeria/{mermaid_utilities.py → view/mermaid_utilities.py} +2 -154
  225. pyegeria/view/output_formatter.py +1297 -0
  226. pyegeria-5.5.3.3.dist-info/METADATA +218 -0
  227. pyegeria-5.5.3.3.dist-info/RECORD +241 -0
  228. {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info}/WHEEL +2 -1
  229. pyegeria-5.5.3.3.dist-info/entry_points.txt +103 -0
  230. pyegeria-5.5.3.3.dist-info/top_level.txt +4 -0
  231. commands/cat/.DS_Store +0 -0
  232. commands/cat/.env +0 -8
  233. commands/cat/README.md +0 -16
  234. commands/cat/debug_log +0 -1126
  235. commands/cat/debug_log.2025-08-18_11-34-38_088636.zip +0 -0
  236. commands/cat/list_categories.py +0 -192
  237. commands/cat/logs/pyegeria.log +0 -4
  238. commands/cli/debug_log +0 -0
  239. commands/cli/debug_log.log +0 -0
  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/logs/pyegeria.log +0 -0
  244. commands/ops/monitor_asset_events.py +0 -108
  245. commands/tech/README.md +0 -24
  246. md_processing/.DS_Store +0 -0
  247. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-30-37.md +0 -163
  248. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-35-58.md +0 -474
  249. md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +0 -8
  250. md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +0 -873
  251. md_processing/dr_egeria_inbox/arch_test.md +0 -57
  252. md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +0 -254
  253. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +0 -696
  254. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +0 -254
  255. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +0 -298
  256. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +0 -608
  257. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +0 -94
  258. md_processing/dr_egeria_inbox/archive/freddie_intro.md +0 -284
  259. md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +0 -275
  260. md_processing/dr_egeria_inbox/archive/test-term.md +0 -110
  261. md_processing/dr_egeria_inbox/cat_test.md +0 -100
  262. md_processing/dr_egeria_inbox/collections.md +0 -39
  263. md_processing/dr_egeria_inbox/data_designer_debug.log +0 -6
  264. md_processing/dr_egeria_inbox/data_designer_out.md +0 -60
  265. md_processing/dr_egeria_inbox/data_designer_search_test.md +0 -11
  266. md_processing/dr_egeria_inbox/data_field.md +0 -54
  267. md_processing/dr_egeria_inbox/data_spec.md +0 -77
  268. md_processing/dr_egeria_inbox/data_spec_test.md +0 -2406
  269. md_processing/dr_egeria_inbox/data_test.md +0 -179
  270. md_processing/dr_egeria_inbox/data_test2.md +0 -429
  271. md_processing/dr_egeria_inbox/data_test3.md +0 -462
  272. md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +0 -124
  273. md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +0 -168
  274. md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +0 -280
  275. md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +0 -318
  276. md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +0 -1073
  277. md_processing/dr_egeria_inbox/dr_egeria_isc1.md +0 -44
  278. md_processing/dr_egeria_inbox/generated_help_report.md +0 -9
  279. md_processing/dr_egeria_inbox/glossary_creation_experiment.ipynb +0 -341
  280. md_processing/dr_egeria_inbox/glossary_list.md +0 -5
  281. md_processing/dr_egeria_inbox/glossary_search_test.md +0 -40
  282. md_processing/dr_egeria_inbox/glossary_test1.md +0 -324
  283. md_processing/dr_egeria_inbox/gov_def.md +0 -482
  284. md_processing/dr_egeria_inbox/gov_def2.md +0 -447
  285. md_processing/dr_egeria_inbox/img.png +0 -0
  286. md_processing/dr_egeria_inbox/product.md +0 -211
  287. md_processing/dr_egeria_inbox/rel.md +0 -8
  288. md_processing/dr_egeria_inbox/sb.md +0 -119
  289. md_processing/dr_egeria_inbox/solution-components.md +0 -136
  290. md_processing/dr_egeria_inbox/solution_blueprints.md +0 -118
  291. md_processing/dr_egeria_inbox/synonym_test.md +0 -42
  292. md_processing/dr_egeria_inbox/t2.md +0 -268
  293. md_processing/dr_egeria_outbox/.obsidian/app.json +0 -1
  294. md_processing/dr_egeria_outbox/.obsidian/appearance.json +0 -1
  295. md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +0 -6
  296. md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +0 -31
  297. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +0 -10
  298. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +0 -4459
  299. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +0 -10
  300. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +0 -3
  301. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +0 -153
  302. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +0 -11
  303. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +0 -1
  304. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +0 -500
  305. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +0 -12
  306. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +0 -1
  307. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +0 -37
  308. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +0 -11
  309. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +0 -220
  310. md_processing/dr_egeria_outbox/.obsidian/types.json +0 -28
  311. md_processing/dr_egeria_outbox/.obsidian/workspace.json +0 -220
  312. md_processing/dr_egeria_outbox/Untitled.canvas +0 -1
  313. md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:22-dr_egeria_intro_part1.md +0 -312
  314. md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:23-dr_egeria_intro_part1.md +0 -265
  315. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:06-dr_egeria_intro_part1.md +0 -230
  316. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:30-dr_egeria_intro_part1.md +0 -296
  317. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:31-dr_egeria_intro_part1.md +0 -253
  318. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:08-dr_egeria_intro_part2.md +0 -343
  319. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:12-dr_egeria_intro_part2.md +0 -343
  320. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:05-product.md +0 -426
  321. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:56-product.md +0 -212
  322. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 09:43-product.md +0 -201
  323. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 14:55-product.md +0 -77
  324. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:05-product.md +0 -75
  325. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:11-product.md +0 -74
  326. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 20:40-collections.md +0 -49
  327. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +0 -719
  328. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +0 -41
  329. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +0 -33
  330. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +0 -192
  331. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +0 -486
  332. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +0 -486
  333. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +0 -486
  334. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +0 -486
  335. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +0 -486
  336. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +0 -486
  337. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +0 -486
  338. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-16 19:15-gov_def2.md +0 -527
  339. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 12:08-gov_def2.md +0 -527
  340. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 14:27-gov_def2.md +0 -485
  341. md_processing/dr_egeria_outbox/tuesday/processed-2025-08-19 10:55-product.md +0 -209
  342. md_processing/family_docs/Data Designer/Create_Data_Class.md +0 -164
  343. md_processing/family_docs/Data Designer/Create_Data_Dictionary.md +0 -30
  344. md_processing/family_docs/Data Designer/Create_Data_Field.md +0 -162
  345. md_processing/family_docs/Data Designer/Create_Data_Specification.md +0 -36
  346. md_processing/family_docs/Data Designer/Create_Data_Structure.md +0 -38
  347. md_processing/family_docs/Data Designer/View_Data_Classes.md +0 -78
  348. md_processing/family_docs/Data Designer/View_Data_Dictionaries.md +0 -78
  349. md_processing/family_docs/Data Designer/View_Data_Fields.md +0 -78
  350. md_processing/family_docs/Data Designer/View_Data_Specifications.md +0 -78
  351. md_processing/family_docs/Data Designer/View_Data_Structures.md +0 -78
  352. md_processing/family_docs/Data Designer.md +0 -842
  353. md_processing/family_docs/Digital Product Manager/Add_Member->Collection.md +0 -42
  354. md_processing/family_docs/Digital Product Manager/Attach_Collection->Resource.md +0 -36
  355. md_processing/family_docs/Digital Product Manager/Create_Agreement.md +0 -96
  356. md_processing/family_docs/Digital Product Manager/Create_Data_Sharing_Agreement.md +0 -72
  357. md_processing/family_docs/Digital Product Manager/Create_DigitalSubscription.md +0 -102
  358. md_processing/family_docs/Digital Product Manager/Create_Digital_Product.md +0 -134
  359. md_processing/family_docs/Digital Product Manager/Link_Agreement_Items.md +0 -60
  360. md_processing/family_docs/Digital Product Manager/Link_Contracts.md +0 -26
  361. md_processing/family_docs/Digital Product Manager/Link_Digital_Product_-_Digital_Product.md +0 -30
  362. md_processing/family_docs/Digital Product Manager/Link_Subscribers.md +0 -48
  363. md_processing/family_docs/Digital Product Manager.md +0 -668
  364. md_processing/family_docs/Glossary/Attach_Category_Parent.md +0 -18
  365. md_processing/family_docs/Glossary/Attach_Term-Term_Relationship.md +0 -26
  366. md_processing/family_docs/Glossary/Create_Category.md +0 -38
  367. md_processing/family_docs/Glossary/Create_Glossary.md +0 -42
  368. md_processing/family_docs/Glossary/Create_Term.md +0 -70
  369. md_processing/family_docs/Glossary.md +0 -206
  370. md_processing/family_docs/Governance Officer/Create_Business_Imperative.md +0 -106
  371. md_processing/family_docs/Governance Officer/Create_Certification_Type.md +0 -112
  372. md_processing/family_docs/Governance Officer/Create_Governance_Approach.md +0 -114
  373. md_processing/family_docs/Governance Officer/Create_Governance_Obligation.md +0 -114
  374. md_processing/family_docs/Governance Officer/Create_Governance_Principle.md +0 -114
  375. md_processing/family_docs/Governance Officer/Create_Governance_Procedure.md +0 -128
  376. md_processing/family_docs/Governance Officer/Create_Governance_Process.md +0 -122
  377. md_processing/family_docs/Governance Officer/Create_Governance_Processing_Purpose.md +0 -106
  378. md_processing/family_docs/Governance Officer/Create_Governance_Responsibility.md +0 -122
  379. md_processing/family_docs/Governance Officer/Create_Governance_Rule.md +0 -122
  380. md_processing/family_docs/Governance Officer/Create_Governance_Strategy.md +0 -106
  381. md_processing/family_docs/Governance Officer/Create_License_Type.md +0 -112
  382. md_processing/family_docs/Governance Officer/Create_Naming_Standard_Rule.md +0 -122
  383. md_processing/family_docs/Governance Officer/Create_Regulation_Article.md +0 -106
  384. md_processing/family_docs/Governance Officer/Create_Regulation_Definition.md +0 -118
  385. md_processing/family_docs/Governance Officer/Create_Security_Access_Control.md +0 -114
  386. md_processing/family_docs/Governance Officer/Create_Security_Group.md +0 -120
  387. md_processing/family_docs/Governance Officer/Create_Service_Level_Objectives.md +0 -122
  388. md_processing/family_docs/Governance Officer/Create_Threat_Definition.md +0 -106
  389. md_processing/family_docs/Governance Officer/Link_Governance_Controls.md +0 -32
  390. md_processing/family_docs/Governance Officer/Link_Governance_Drivers.md +0 -32
  391. md_processing/family_docs/Governance Officer/Link_Governance_Policies.md +0 -32
  392. md_processing/family_docs/Governance Officer/View_Governance_Definitions.md +0 -82
  393. md_processing/family_docs/Governance Officer.md +0 -2412
  394. md_processing/family_docs/Solution Architect/Create_Information_Supply_Chain.md +0 -70
  395. md_processing/family_docs/Solution Architect/Create_Solution_Blueprint.md +0 -44
  396. md_processing/family_docs/Solution Architect/Create_Solution_Component.md +0 -96
  397. md_processing/family_docs/Solution Architect/Create_Solution_Role.md +0 -66
  398. md_processing/family_docs/Solution Architect/Link_Information_Supply_Chain_Peers.md +0 -32
  399. md_processing/family_docs/Solution Architect/Link_Solution_Component_Peers.md +0 -32
  400. md_processing/family_docs/Solution Architect/View_Information_Supply_Chains.md +0 -32
  401. md_processing/family_docs/Solution Architect/View_Solution_Blueprints.md +0 -32
  402. md_processing/family_docs/Solution Architect/View_Solution_Components.md +0 -32
  403. md_processing/family_docs/Solution Architect/View_Solution_Roles.md +0 -32
  404. md_processing/family_docs/Solution Architect.md +0 -490
  405. md_processing/md_processing_utils/debug_log +0 -574
  406. md_processing/md_processing_utils/debug_log.log +0 -0
  407. md_processing/md_processing_utils/dr-egeria-help-2025-07-17T17:22:09.md +0 -2065
  408. md_processing/md_processing_utils/generated_help_terms.md +0 -842
  409. pyegeria/.DS_Store +0 -0
  410. pyegeria/README.md +0 -35
  411. pyegeria/_client_new.py +0 -1102
  412. pyegeria/_output_formats.py +0 -730
  413. pyegeria/asset_catalog_omvs.py +0 -864
  414. pyegeria/automated_curation_omvs.py +0 -3765
  415. pyegeria/config.py +0 -523
  416. pyegeria/egeria_my_client.py +0 -91
  417. pyegeria/feedback_manager_omvs.py +0 -4573
  418. pyegeria/load_config_orig.py +0 -218
  419. pyegeria/md_processing_helpers.py +0 -58
  420. pyegeria/md_processing_utils_orig.py +0 -1103
  421. pyegeria/metadata_explorer_omvs.py +0 -2326
  422. pyegeria/my_profile_omvs.py +0 -1022
  423. pyegeria/project_manager.py +0 -1591
  424. pyegeria/registered_info.py +0 -167
  425. pyegeria/template_manager_omvs.py +0 -1414
  426. pyegeria/utils.py +0 -256
  427. pyegeria-5.4.0.28.dist-info/METADATA +0 -77
  428. pyegeria-5.4.0.28.dist-info/RECORD +0 -343
  429. pyegeria-5.4.0.28.dist-info/entry_points.txt +0 -105
  430. /commands/cat/debug_log.log → /pyegeria/deprecated/__init__.py +0 -0
  431. /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
  432. /pyegeria/{collection_models.py → models/collection_models.py} +0 -0
  433. {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info/licenses}/LICENSE +0 -0
@@ -1,63 +1,37 @@
1
1
  """
2
- PDX-License-Identifier: Apache-2.0
2
+ SPDX-License-Identifier: Apache-2.0
3
3
  Copyright Contributors to the ODPi Egeria project.
4
4
 
5
- This module contains an initial version of the glossary_manager omvs module. There are additional methods that will be
6
- added in subsequent versions of the glossary_omvs module.
5
+ This module contains an initial version of the glossary_manager module.
7
6
 
8
7
  """
9
8
 
10
9
  import asyncio
11
10
  import csv
12
11
  import os
13
- import time
14
- from typing import List, Annotated, Literal
12
+ from typing import List, Annotated, Literal, Optional
15
13
 
16
14
  from loguru import logger
17
15
  from pydantic import Field
18
16
 
19
- from pyegeria._client_new import Client2
20
- from pyegeria._exceptions import InvalidParameterException
21
- from pyegeria._exceptions_new import PyegeriaInvalidParameterException
22
- from pyegeria._globals import NO_GUID_RETURNED
23
- from pyegeria._validators import validate_guid
24
- from pyegeria.collection_manager import CollectionManager
25
- from pyegeria.config import settings as app_settings
26
- from pyegeria.models import (NewElementRequestBody,
27
- ReferenceableProperties, UpdateElementRequestBody, DeleteRequestBody, TemplateRequestBody,
17
+ from pyegeria.core._exceptions import PyegeriaInvalidParameterException
18
+ from pyegeria.core._globals import NO_GUID_RETURNED
19
+ from pyegeria.core._validators import validate_guid
20
+ from pyegeria.omvs.collection_manager import CollectionManager
21
+ from pyegeria.core.config import settings as app_settings
22
+ from pyegeria.models import (NewElementRequestBody, DeleteElementRequestBody, DeleteRelationshipRequestBody,
23
+ ReferenceableProperties, UpdateElementRequestBody, TemplateRequestBody,
28
24
  NewRelationshipRequestBody, UpdateRelationshipRequestBody, NewClassificationRequestBody,
29
- FilterRequestBody, GetRequestBody, SearchStringRequestBody, UpdateStatusRequestBody)
30
- from pyegeria._output_formats import select_output_format_set, get_output_format_type_match
31
- from pyegeria.output_formatter import (generate_output,
32
- _extract_referenceable_properties, populate_columns_from_properties,
33
- get_required_relationships)
34
- from pyegeria.utils import body_slimmer, dynamic_catch
25
+ FilterRequestBody, GetRequestBody, SearchStringRequestBody,
26
+ DeleteClassificationRequestBody)
27
+ from pyegeria.view.output_formatter import (generate_output,
28
+ _extract_referenceable_properties, populate_common_columns,
29
+ overlay_additional_values, resolve_output_formats)
30
+ from pyegeria.core.utils import body_slimmer, dynamic_catch
35
31
 
36
32
  EGERIA_LOCAL_QUALIFIER = app_settings.User_Profile.egeria_local_qualifier
37
33
 
38
34
 
39
- def query_seperator(current_string):
40
- if current_string == "":
41
- return "?"
42
- else:
43
- return "&"
44
-
45
-
46
- ("params are in the form of [(paramName, value), (param2Name, value)] if the value is not None, it will be added to "
47
- "the query string")
48
-
49
-
50
- def query_string(params):
51
- result = ""
52
- for i in range(len(params)):
53
- if params[i][1] is not None:
54
- result = f"{result}{query_seperator(result)}{params[i][0]}={params[i][1]}"
55
- return result
56
-
57
-
58
- def base_path(client, view_server: str):
59
- return f"{client.platform_url}/servers/{view_server}/api/open-metadata/classification-manager"
60
-
61
35
 
62
36
  class GlossaryProperties(ReferenceableProperties):
63
37
  class_: Annotated[Literal["GlossaryProperties"], Field(alias="class")]
@@ -78,22 +52,21 @@ class GlossaryTermProperties(ReferenceableProperties):
78
52
 
79
53
  class GlossaryManager(CollectionManager):
80
54
  """
81
- GlossaryManager is a class that extends the Client class. It provides methods to create and manage glossaries,
82
- terms and categories.
83
-
84
- Attributes:
85
-
86
- view_server: str
87
- The name of the View Server to connect to.
88
- platform_url : str
89
- URL of the server platform to connect to
90
- user_id : str
91
- The identity of the user calling the method - this sets a default optionally used by the methods
92
- when the user doesn't pass the user_id on a method call.
93
- user_pwd: str
94
- The password associated with the user_id. Defaults to None
95
-
96
-
55
+ Client for the Glossary Manager View Service.
56
+
57
+ The Glossary Manager View Service provides methods to create and manage glossaries,
58
+ terms, and categories.
59
+
60
+ Attributes
61
+ ----------
62
+ view_server : str
63
+ The name of the View Server to connect to.
64
+ platform_url : str
65
+ URL of the server platform to connect to.
66
+ user_id : str
67
+ The identity of the user calling the method.
68
+ user_pwd : str
69
+ The password associated with the user_id. Defaults to None.
97
70
  """
98
71
 
99
72
  def __init__(
@@ -101,17 +74,20 @@ class GlossaryManager(CollectionManager):
101
74
  view_server: str,
102
75
  platform_url: str,
103
76
  user_id: str,
104
- user_pwd: str = None,
105
- token: str = None,
77
+ user_pwd: Optional[str] = None,
78
+ token: Optional[str] = None,
106
79
  ):
107
- self.gl_mgr_command_root: str
108
80
  self.view_server = view_server
109
81
  self.platform_url = platform_url
110
82
  self.user_id = user_id
111
83
  self.user_pwd = user_pwd
84
+ self.url_marker = "glossary-manager"
112
85
 
113
- CollectionManager.__init__(self, view_server, platform_url, user_id, user_pwd, token)
114
86
 
87
+ CollectionManager.__init__(self, view_server, platform_url, user_id, user_pwd, token)
88
+ # result = self.get_platform_origin()
89
+ # logger.info(f"GlossaryManager initialized, platform origin is: {result}")
90
+ self.glossary_command_root = f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager"
115
91
  #
116
92
  # Get Valid Values for Enumerations
117
93
  #
@@ -128,9 +104,35 @@ class GlossaryManager(CollectionManager):
128
104
 
129
105
 
130
106
  @dynamic_catch
131
- async def _async_create_glossary(self, display_name: str, description: str = None, language: str = "English", usage: str = None,
132
- category: str = None, body: dict | NewElementRequestBody = None) -> str:
133
- """Create a new glossary with optional classification. """
107
+ async def _async_create_glossary(self, display_name: str, description: Optional[str] = None, language: str = "English", usage: Optional[str] = None,
108
+ category: Optional[str] = None, body: Optional[dict | NewElementRequestBody] = None) -> str:
109
+ """Create a new glossary. Async version.
110
+
111
+ Parameters
112
+ ----------
113
+ display_name : str
114
+ The name of the glossary.
115
+ description : str, optional
116
+ The description of the glossary.
117
+ language : str, optional
118
+ The language of the glossary (default is "English").
119
+ usage : str, optional
120
+ The usage information for the glossary.
121
+ category : str, optional
122
+ The category for the glossary.
123
+ body : dict | NewElementRequestBody, optional
124
+ If provided, the request body for creating the glossary.
125
+
126
+ Returns
127
+ -------
128
+ str
129
+ The GUID of the newly created glossary.
130
+
131
+ Raises
132
+ ------
133
+ PyegeriaException
134
+ If there are issues in communications, message format, or Egeria errors.
135
+ """
134
136
  if body is None:
135
137
  qualified_name = self.__create_qualified_name__("Glossary", display_name, EGERIA_LOCAL_QUALIFIER)
136
138
  body = {
@@ -149,17 +151,43 @@ class GlossaryManager(CollectionManager):
149
151
  response = await self._async_create_collection(body=body)
150
152
  return response
151
153
 
152
- def create_glossary(self, display_name: str, description: str = None, language: str = "English",
153
- usage: str = None,
154
- category: str = None, body: dict | NewElementRequestBody = None) -> str:
155
- """Create a new glossary with optional classification. """
154
+ def create_glossary(self, display_name: str, description: Optional[str] = None, language: str = "English",
155
+ usage: Optional[str] = None,
156
+ category: Optional[str] = None, body: Optional[dict | NewElementRequestBody] = None) -> str:
157
+ """Create a new glossary.
158
+
159
+ Parameters
160
+ ----------
161
+ display_name : str
162
+ The name of the glossary.
163
+ description : str, optional
164
+ The description of the glossary.
165
+ language : str, optional
166
+ The language of the glossary (default is "English").
167
+ usage : str, optional
168
+ The usage information for the glossary.
169
+ category : str, optional
170
+ The category for the glossary.
171
+ body : dict | NewElementRequestBody, optional
172
+ If provided, the request body for creating the glossary.
173
+
174
+ Returns
175
+ -------
176
+ str
177
+ The GUID of the newly created glossary.
178
+
179
+ Raises
180
+ ------
181
+ PyegeriaException
182
+ If there are issues in communications, message format, or Egeria errors.
183
+ """
156
184
  loop = asyncio.get_event_loop()
157
185
  response = loop.run_until_complete(
158
186
  self._async_create_glossary(display_name, description, language, usage, category, body)
159
187
  )
160
188
  return response
161
189
 
162
- async def _async_delete_glossary(self, glossary_guid: str, body: dict | DeleteRequestBody = None,
190
+ async def _async_delete_glossary(self, glossary_guid: str, body: Optional[dict | DeleteElementRequestBody] = None,
163
191
  cascade: bool = False) -> None:
164
192
  """Delete glossary. Async version.
165
193
 
@@ -180,7 +208,7 @@ class GlossaryManager(CollectionManager):
180
208
 
181
209
  logger.info(f"Deleted glossary {glossary_guid} with cascade {cascade}")
182
210
 
183
- def delete_glossary(self, glossary_guid: str, body: dict | DeleteRequestBody = None, cascade: bool = False) -> None:
211
+ def delete_glossary(self, glossary_guid: str, body: Optional[dict | DeleteElementRequestBody] = None, cascade: bool = False) -> None:
184
212
  """Delete a new glossary.
185
213
 
186
214
  Parameters
@@ -229,8 +257,8 @@ class GlossaryManager(CollectionManager):
229
257
 
230
258
 
231
259
 
232
- await self._async_update_collection(glossary_guid, body, is_merge_update=merge_update)
233
- logger.info(f"Updated digital subscription {glossary_guid}")
260
+ await self._async_update_collection(glossary_guid, body)
261
+ logger.info(f"Updated glossary {glossary_guid}")
234
262
 
235
263
  def update_glossary(
236
264
  self,
@@ -282,64 +310,22 @@ class GlossaryManager(CollectionManager):
282
310
  async def _async_create_glossary_term(
283
311
  self, body: dict | NewElementRequestBody
284
312
  ) -> str:
285
- """Create a term for a glossary.
286
- See also: https://egeria-project.org/types/3/0385-Controlled-Glossary-Development/?h=controlled
287
- The request body also supports the specification of an effective time for the query.
288
-
289
- Async Version.
313
+ """Create a term for a glossary. Async version.
290
314
 
291
315
  Parameters
292
316
  ----------
293
- body: dict | NewElementRequestBody
294
- The dictionary to create glossary term for. Example below.
295
-
317
+ body : dict | NewElementRequestBody
318
+ The request body for creating the glossary term.
296
319
 
297
320
  Returns
298
321
  -------
299
- str:
300
- The unique guid for the created term.
322
+ str
323
+ The unique GUID for the created term.
301
324
 
302
325
  Raises
303
326
  ------
304
- InvalidParameterException
305
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
306
- PropertyServerException
307
- Raised by the server when an issue arises in processing a valid request.
308
- NotAuthorizedException
309
- The principle specified by the user_id does not have authorization for the requested action.
310
- Notes
311
- -----
312
-
313
- Sample body like:
314
- {
315
- "class" : "NewElementRequestBody",
316
- "parentGUID" : "Glossary GUID here",
317
- "isOwnAnchor" : true,
318
- "anchorScopeGUID" : "Glossary GUID here",
319
- "parentRelationshipTypeName" : "ParentGlossary",
320
- "parentAtEnd1": true,
321
- "properties" :
322
- {
323
- "class" : "GlossaryTermProperties",
324
- "qualifiedName" : "GlossaryTerm::term name",
325
- "displayName" : "term name",
326
- "aliases": []
327
- "summary" : "This is the short description.",
328
- "description" : "This is the long description of the term.",
329
- "abbreviation" : "aabrev",
330
- "examples" : "Add examples and descriptions here.",
331
- "usage" : "This is how the concept described by the glossary term is used.",
332
- "versionIdentifier" : "V1.0",
333
- "category" : "A user defined category",
334
- "additionalProperties" :
335
- {
336
- "propertyName1" : "xxxx",
337
- "propertyName2" : "xxxx"
338
- }
339
- },
340
- "initialStatus" : "DRAFT"
341
- }
342
-
327
+ PyegeriaException
328
+ If there are issues in communications, message format, or Egeria errors.
343
329
  """
344
330
 
345
331
  url = (
@@ -348,63 +334,22 @@ class GlossaryManager(CollectionManager):
348
334
  return await self._async_create_element_body_request(url, "GlossaryTermProperties", body)
349
335
 
350
336
  def create_glossary_term(self, body: dict | NewElementRequestBody) -> str:
351
- """Create a term for a controlled glossary.
352
- See also: https://egeria-project.org/types/3/0385-Controlled-Glossary-Development/?h=controlled
353
- The request body also supports the specification of an effective time for the query.
337
+ """Create a term for a glossary.
354
338
 
355
339
  Parameters
356
340
  ----------
357
-
358
- body: dict
359
- The dictionary to create glossary term for. Example below.
360
-
341
+ body : dict | NewElementRequestBody
342
+ The request body for creating the glossary term.
361
343
 
362
344
  Returns
363
345
  -------
364
- str:
365
- The unique guid for the created term.
346
+ str
347
+ The unique GUID for the created term.
366
348
 
367
349
  Raises
368
350
  ------
369
- InvalidParameterException
370
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
371
- PropertyServerException
372
- Raised by the server when an issue arises in processing a valid request.
373
- NotAuthorizedException
374
- The principle specified by the user_id does not have authorization for the requested action.
375
- Notes
376
- -----
377
-
378
- Sample body like:
379
- {
380
- "class" : "NewElementRequestBody",
381
- "parentGUID" : "Glossary GUID here",
382
- "isOwnAnchor" : true,
383
- "anchorScopeGUID" : "Glossary GUID here",
384
- "parentRelationshipTypeName" : "ParentGlossary",
385
- "parentAtEnd1": true,
386
- "properties" :
387
- {
388
- "class" : "GlossaryTermProperties",
389
- "qualifiedName" : "GlossaryTerm::term name",
390
- "displayName" : "term name",
391
- "aliases": []
392
- "summary" : "This is the short description.",
393
- "description" : "This is the long description of the term.",
394
- "abbreviation" : "aabrev",
395
- "examples" : "Add examples and descriptions here.",
396
- "usage" : "This is how the concept described by the glossary term is used.",
397
- "versionIdentifier" : "V1.0",
398
- "category" : "A user defined category",
399
- "additionalProperties" :
400
- {
401
- "propertyName1" : "xxxx",
402
- "propertyName2" : "xxxx"
403
- }
404
- },
405
- "initialStatus" : "DRAFT"
406
- }
407
-
351
+ PyegeriaException
352
+ If there are issues in communications, message format, or Egeria errors.
408
353
  """
409
354
  loop = asyncio.get_event_loop()
410
355
  response = loop.run_until_complete(
@@ -452,9 +397,9 @@ class GlossaryManager(CollectionManager):
452
397
 
453
398
  Raises
454
399
  ------
455
- InvalidParameterException
400
+ PyegeriaInvalidParameterException
456
401
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
457
- PropertyServerException
402
+ PyegeriaAPIException
458
403
  Raised by the server when an issue arises in processing a valid request.
459
404
  NotAuthorizedException
460
405
  The principle specified by the user_id does not have authorization for the requested action.
@@ -513,7 +458,11 @@ class GlossaryManager(CollectionManager):
513
458
  term_info = []
514
459
  # check that the column headers are known
515
460
  if all(header in term_properties for header in headers) is False:
516
- raise InvalidParameterException("Invalid headers in CSV File")
461
+ raise PyegeriaInvalidParameterException(
462
+ None,
463
+ context={"caller_method": "load_terms_from_csv"},
464
+ additional_info={"reason": "Invalid headers in CSV File"},
465
+ )
517
466
 
518
467
  # process each row and validate values
519
468
  for row in csv_reader:
@@ -760,9 +709,9 @@ class GlossaryManager(CollectionManager):
760
709
  glossary_guid: str,
761
710
  glossary_term_guid: str,
762
711
  new_display_name: str,
763
- version_id: str = None,
712
+ version_id: Optional[str] = None,
764
713
  term_status: str = "PROPOSED",
765
- body: dict | TemplateRequestBody = None,
714
+ body: Optional[dict | TemplateRequestBody] = None,
766
715
  ) -> str:
767
716
  """Create a new term from an existing term.
768
717
 
@@ -789,9 +738,9 @@ class GlossaryManager(CollectionManager):
789
738
 
790
739
  Raises
791
740
  ------
792
- InvalidParameterException
741
+ PyegeriaInvalidParameterException
793
742
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
794
- PropertyServerException
743
+ PyegeriaAPIException
795
744
  Raised by the server when an issue arises in processing a valid request.
796
745
  NotAuthorizedException
797
746
  The principle specified by the user_id does not have authorization for the requested action.
@@ -810,37 +759,22 @@ class GlossaryManager(CollectionManager):
810
759
  body = {
811
760
  "class" : "TemplateRequestBody",
812
761
  "templateGUID": glossary_term_guid,
813
- "replacementProperties": {
814
- "class": "ElementProperties",
815
- "propertyValueMap": {
816
- "qualifiedName": {
817
- "class": "PrimitiveTypePropertyValue",
818
- "typeName": "string",
819
- "primitiveValue": qualified_name,
820
- },
821
-
822
- "displayName": {
823
- "class": "PrimitiveTypePropertyValue",
824
- "typeName": "string",
825
- "primitiveValue": new_display_name,
826
- },
827
-
828
- # "publishVersionIdentifier": {
829
- # "class": "PrimitiveTypePropertyValue",
830
- # "typeName": "string",
831
- # "primitiveValue": version_id,
832
- # },
762
+ "parentGuid": glossary_guid,
763
+ "parentAtEnd1": True,
833
764
 
834
- }
765
+ "replacementProperties": {
766
+ "class": "GlossaryTermProperties",
767
+ "qualifiedName": qualified_name,
768
+ "displayName": new_display_name,
769
+ "status": term_status,
770
+ "versionIdentifier": version_id
835
771
  },
836
- "initialStatus": term_status,
837
772
  }
838
773
  validated_body = self._template_request_adapter.validate_python(body)
839
-
774
+ validated_body._templateGUID = glossary_term_guid
840
775
  v_body = body_slimmer(validated_body.model_dump(exclude_none=True))
841
776
  logger.info(v_body)
842
777
 
843
-
844
778
  url = (
845
779
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/"
846
780
  f"terms/from-template/{glossary_term_guid}"
@@ -856,9 +790,9 @@ class GlossaryManager(CollectionManager):
856
790
  glossary_guid: str,
857
791
  glossary_term_guid: str,
858
792
  new_display_name: str,
859
- version_id: str = None,
793
+ version_id: Optional[str] = None,
860
794
  term_status: str = "PROPOSED",
861
- body: dict | TemplateRequestBody = None,
795
+ body: Optional[dict | TemplateRequestBody] = None,
862
796
  ) -> str:
863
797
  """Create a new term from an existing term.
864
798
 
@@ -883,9 +817,9 @@ class GlossaryManager(CollectionManager):
883
817
 
884
818
  Raises
885
819
  ------
886
- InvalidParameterException
820
+ PyegeriaInvalidParameterException
887
821
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
888
- PropertyServerException
822
+ PyegeriaAPIException
889
823
  Raised by the server when an issue arises in processing a valid request.
890
824
  NotAuthorizedException
891
825
  The principle specified by the user_id does not have authorization for the requested action.
@@ -907,6 +841,7 @@ class GlossaryManager(CollectionManager):
907
841
 
908
842
  return response
909
843
 
844
+ @dynamic_catch
910
845
  async def _async_update_glossary_term(
911
846
  self,
912
847
  glossary_term_guid: str,
@@ -928,9 +863,9 @@ class GlossaryManager(CollectionManager):
928
863
 
929
864
  Raises
930
865
  ------
931
- InvalidParameterException
866
+ PyegeriaInvalidParameterException
932
867
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
933
- PropertyServerException
868
+ PyegeriaAPIException
934
869
  Raised by the server when an issue arises in processing a valid request.
935
870
  NotAuthorizedException
936
871
  The principle specified by the user_id does not have authorization for the requested action.
@@ -948,7 +883,7 @@ class GlossaryManager(CollectionManager):
948
883
  )
949
884
  await self._async_update_element_body_request(url, ["GlossaryTermProperties"], body)
950
885
  logger.info(f"Updated digital subscription {glossary_term_guid}")
951
-
886
+ @dynamic_catch
952
887
  def update_glossary_term(
953
888
  self,
954
889
  glossary_term_guid: str,
@@ -975,9 +910,9 @@ class GlossaryManager(CollectionManager):
975
910
 
976
911
  Raises
977
912
  ------
978
- InvalidParameterException
913
+ PyegeriaInvalidParameterException
979
914
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
980
- PropertyServerException
915
+ PyegeriaAPIException
981
916
  Raised by the server when an issue arises in processing a valid request.
982
917
  NotAuthorizedException
983
918
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1004,103 +939,101 @@ class GlossaryManager(CollectionManager):
1004
939
  )
1005
940
  )
1006
941
 
1007
-
1008
942
  @dynamic_catch
1009
- async def _async_update_term_status(self, term_guid: str, status: str = None,
1010
- body: dict | UpdateStatusRequestBody = None):
1011
- """Update the status of a collection. Async version.
943
+ async def _async_update_glossary_term_status(
944
+ self,
945
+ glossary_term_guid: str,
946
+ term_status: str = "DRAFT",
947
+ body: Optional[dict | UpdateElementRequestBody] = None,
948
+ ) -> None:
949
+ """Update the status of a term. Async version.
1012
950
 
1013
951
  Parameters
1014
952
  ----------
1015
- collection_guid: str
1016
- The guid of the collection to update.
1017
- status: str, optional
1018
- The new lifecycle status for the collection. Ignored, if the body is provided.
1019
- body: dict | UpdateStatusRequestBody, optional
1020
- A structure representing the details of the collection to create. If supplied, these details
1021
- supersede the status parameter provided.
953
+ glossary_term_guid: str
954
+ Unique identifier for the source glossary term.
955
+ term_status: str
956
+ new status of the term.
957
+ body: dict | UpdateElementRequestBody
958
+ Body containing information about the status change. Supersedes other parameters.
1022
959
 
1023
960
  Returns
1024
961
  -------
1025
- Nothing
962
+ None
1026
963
 
1027
964
  Raises
1028
965
  ------
1029
- InvalidParameterException
1030
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
1031
- PropertyServerException
1032
- Raised by the server when an issue arises in processing a valid request
1033
- NotAuthorizedException
1034
- The principle specified by the user_id does not have authorization for the requested action
966
+ PyegeriaException
1035
967
 
1036
- Notes
1037
- -----
1038
- JSON Structure looks like:
1039
- {
1040
- "class": "UpdateStatusRequestBody",
1041
- "status": "APPROVED",
1042
- "externalSourceGUID": "add guid here",
1043
- "externalSourceName": "add qualified name here",
1044
- "effectiveTime": "{{$isoTimestamp}}",
1045
- "forLineage": false,
1046
- "forDuplicateProcessing": false
1047
- }
1048
968
  """
1049
969
 
1050
- url = f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/metadata-elements/{term_guid}/update-status"
1051
- await self._async_update_status_request(url, status, body)
1052
- logger.info(f"Updated status for term {term_guid}")
970
+ validate_guid(glossary_term_guid)
971
+
972
+ if body is None:
973
+ body = {
974
+ "class": "UpdateElementRequestBody",
975
+ "contentStatus": term_status,
976
+ "mergeUpdate": True,
977
+ }
978
+ await self._async_update_glossary_term( glossary_term_guid, body)
979
+ logger.info(f"Updated term status {glossary_term_guid}")
980
+
1053
981
 
1054
982
  @dynamic_catch
1055
- def update_term_status(self, term_guid: str, status: str = None,
1056
- body: dict | UpdateStatusRequestBody = None):
1057
- """Update the status of a DigitalProduct collection.
983
+ def update_glossary_term_status(
984
+ self,
985
+ glossary_term_guid: str, term_status: str = "DRAFT",
986
+ body: Optional[dict | UpdateElementRequestBody] = None,
987
+ ) -> None:
988
+ """Add the data field values classification to a glossary term
989
+
990
+ Async Version.
1058
991
 
1059
992
  Parameters
1060
993
  ----------
1061
- collection_guid: str
1062
- The guid of the collection to update.
1063
- status: str, optional
1064
- The new lifecycle status for the digital product. Ignored, if the body is provided.
1065
- body: dict | UpdateStatusRequestBody, optional
1066
- A structure representing the details of the collection to create. If supplied, these details
1067
- supersede the status parameter provided.
994
+ glossary_term_guid: str
995
+ Unique identifier for the source glossary term.
996
+ term_status: str
997
+ new status of the term.
998
+ body: dict | UpdateStatusRequestBody
999
+ Body containing information about the status change. Supersedes other parameters.
1068
1000
 
1069
1001
  Returns
1070
1002
  -------
1071
- Nothing
1003
+ None
1072
1004
 
1073
1005
  Raises
1074
1006
  ------
1075
- InvalidParameterException
1076
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
1077
- PropertyServerException
1078
- Raised by the server when an issue arises in processing a valid request
1079
- NotAuthorizedException
1080
- The principle specified by the user_id does not have authorization for the requested action
1081
-
1007
+ PyegeriaException
1008
+ If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1009
+ PyegeriaAPIException
1010
+ Raised by the server when an issue arises in processing a valid request.
1011
+ NotAuthoclearizedException
1012
+ The principle specified by the user_id does not have authorization for the requested action.
1082
1013
  Notes
1083
1014
  -----
1084
- JSON Structure looks like:
1085
- {
1086
- "class": "UpdateStatusRequestBody",
1087
- "status": "APPROVED",
1088
- "externalSourceGUID": "add guid here",
1089
- "externalSourceName": "add qualified name here",
1090
- "effectiveTime": "{{$isoTimestamp}}",
1091
- "forLineage": false,
1092
- "forDuplicateProcessing": false
1015
+ An example body is:
1016
+
1017
+ {
1018
+ "class" : "UpdateStatusRequestBody",
1019
+ "newStatus" : "DRAFT"
1093
1020
  }
1021
+
1094
1022
  """
1095
1023
  loop = asyncio.get_event_loop()
1096
- loop.run_until_complete(self._async_update_collection_status(term_guid, status, body))
1097
-
1024
+ loop.run_until_complete(
1025
+ self._async_update_glossary_term_status(
1026
+ glossary_term_guid,
1027
+ body,
1028
+ )
1029
+ )
1098
1030
 
1031
+ @dynamic_catch
1099
1032
  async def _async_delete_term(
1100
1033
  self,
1101
1034
  term_guid: str,
1102
1035
  cascade: bool = False,
1103
- body: dict | DeleteRequestBody = None
1036
+ body: Optional[dict | DeleteElementRequestBody] = None
1104
1037
  ) -> None:
1105
1038
  """Delete the glossary terms associated with the specified glossary. Async version.
1106
1039
 
@@ -1119,9 +1052,9 @@ class GlossaryManager(CollectionManager):
1119
1052
 
1120
1053
  Raises
1121
1054
  ------
1122
- InvalidParameterException
1055
+ PyegeriaInvalidParameterException
1123
1056
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1124
- PropertyServerException
1057
+ PyegeriaAPIException
1125
1058
  Raised by the server when an issue arises in processing a valid request.
1126
1059
  NotAuthorizedException
1127
1060
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1135,7 +1068,7 @@ class GlossaryManager(CollectionManager):
1135
1068
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/"
1136
1069
  f"terms/{term_guid}/delete"
1137
1070
  )
1138
- await self._async_delete_request(url, body, cascade)
1071
+ await self._async_delete_element_request(url, body, cascade)
1139
1072
  logger.info(f"Deleted collection {term_guid} with cascade {cascade}")
1140
1073
 
1141
1074
 
@@ -1143,7 +1076,7 @@ class GlossaryManager(CollectionManager):
1143
1076
  self,
1144
1077
  term_guid: str,
1145
1078
  cascade: bool = False,
1146
- body: dict | DeleteRequestBody = None
1079
+ body: Optional[dict | DeleteElementRequestBody] = None
1147
1080
  ) -> None:
1148
1081
  """Delete the glossary terms associated with the specified glossary.
1149
1082
 
@@ -1162,9 +1095,9 @@ class GlossaryManager(CollectionManager):
1162
1095
 
1163
1096
  Raises
1164
1097
  ------
1165
- InvalidParameterException
1098
+ PyegeriaInvalidParameterException
1166
1099
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1167
- PropertyServerException
1100
+ PyegeriaAPIException
1168
1101
  Raised by the server when an issue arises in processing a valid request.
1169
1102
  NotAuthorizedException
1170
1103
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1180,7 +1113,7 @@ class GlossaryManager(CollectionManager):
1180
1113
  self,
1181
1114
  term_guid: str,
1182
1115
  glossary_guid: str,
1183
- body: dict | DeleteRequestBody = None
1116
+ body: Optional[dict | DeleteRelationshipRequestBody] = None
1184
1117
  ) -> None:
1185
1118
  """Move the glossary terms to the specified glossary. Async version.
1186
1119
 
@@ -1196,9 +1129,9 @@ class GlossaryManager(CollectionManager):
1196
1129
 
1197
1130
  Raises
1198
1131
  ------
1199
- InvalidParameterException
1132
+ PyegeriaInvalidParameterException
1200
1133
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1201
- PropertyServerException
1134
+ PyegeriaAPIException
1202
1135
  Raised by the server when an issue arises in processing a valid request.
1203
1136
  NotAuthorizedException
1204
1137
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1212,7 +1145,7 @@ class GlossaryManager(CollectionManager):
1212
1145
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/"
1213
1146
  f"terms/{term_guid}/move-to/{glossary_guid}"
1214
1147
  )
1215
- await self._async_delete_request(url, body)
1148
+ await self._async_delete_relationship_request(url, body)
1216
1149
  logger.info(f"Moved collection {term_guid} to glossary {glossary_guid}")
1217
1150
 
1218
1151
 
@@ -1220,7 +1153,7 @@ class GlossaryManager(CollectionManager):
1220
1153
  self,
1221
1154
  term_guid: str,
1222
1155
  glossary_guid: str,
1223
- body: dict | DeleteRequestBody = None
1156
+ body: Optional[dict | DeleteRelationshipRequestBody] = None
1224
1157
  ) -> None:
1225
1158
  """Move the glossary terms to the specified glossary.
1226
1159
 
@@ -1236,9 +1169,9 @@ class GlossaryManager(CollectionManager):
1236
1169
 
1237
1170
  Raises
1238
1171
  ------
1239
- InvalidParameterException
1172
+ PyegeriaInvalidParameterException
1240
1173
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1241
- PropertyServerException
1174
+ PyegeriaAPIException
1242
1175
  Raised by the server when an issue arises in processing a valid request.
1243
1176
  NotAuthorizedException
1244
1177
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1257,16 +1190,16 @@ class GlossaryManager(CollectionManager):
1257
1190
  #
1258
1191
 
1259
1192
 
1193
+
1194
+
1260
1195
  #
1261
1196
  # From glossary browser
1262
1197
  #
1263
1198
 
1264
1199
 
1265
1200
 
1266
-
1267
-
1268
1201
  async def _async_add_is_abstract_concepts(
1269
- self, term_guid: str, body: dict | NewClassificationRequestBody = None,
1202
+ self, term_guid: str, body: Optional[dict | NewClassificationRequestBody] = None,
1270
1203
  ) -> None:
1271
1204
  """Add a relationship between terms. Async Version.
1272
1205
 
@@ -1288,9 +1221,9 @@ class GlossaryManager(CollectionManager):
1288
1221
 
1289
1222
  Raises
1290
1223
  ------
1291
- InvalidParameterException
1224
+ PyegeriaInvalidParameterException
1292
1225
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1293
- PropertyServerException
1226
+ PyegeriaAPIException
1294
1227
  Raised by the server when an issue arises in processing a valid request.
1295
1228
  NotAuthorizedException
1296
1229
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1326,12 +1259,12 @@ class GlossaryManager(CollectionManager):
1326
1259
  }
1327
1260
  }
1328
1261
 
1329
- await self._async_new_classification_request(url, "AbstractConceptProperties",body)
1262
+ await self._async_new_classification_request(url, "AbstractConceptProperties", body)
1330
1263
  logger.info(f"Added AbstractConcept classification to {term_guid}")
1331
1264
 
1332
1265
 
1333
1266
  def add_is_abstract_concept(
1334
- self, term_guid: str, body: dict | NewClassificationRequestBody = None,
1267
+ self, term_guid: str, body: Optional[dict | NewClassificationRequestBody] = None,
1335
1268
  ) -> None:
1336
1269
  """Add a relationship between terms.
1337
1270
 
@@ -1352,9 +1285,9 @@ class GlossaryManager(CollectionManager):
1352
1285
 
1353
1286
  Raises
1354
1287
  ------
1355
- InvalidParameterException
1288
+ PyegeriaInvalidParameterException
1356
1289
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1357
- PropertyServerException
1290
+ PyegeriaAPIException
1358
1291
  Raised by the server when an issue arises in processing a valid request.
1359
1292
  NotAuthorizedException
1360
1293
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1387,7 +1320,7 @@ class GlossaryManager(CollectionManager):
1387
1320
  )
1388
1321
 
1389
1322
  async def _async_remove_is_abstract_concepts(
1390
- self, term_guid: str, body: dict | DeleteRequestBody = None,
1323
+ self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None,
1391
1324
  ) -> None:
1392
1325
  """Add a relationship between terms. Async Version.
1393
1326
 
@@ -1409,9 +1342,9 @@ class GlossaryManager(CollectionManager):
1409
1342
 
1410
1343
  Raises
1411
1344
  ------
1412
- InvalidParameterException
1345
+ PyegeriaInvalidParameterException
1413
1346
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1414
- PropertyServerException
1347
+ PyegeriaAPIException
1415
1348
  Raised by the server when an issue arises in processing a valid request.
1416
1349
  NotAuthorizedException
1417
1350
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1438,11 +1371,11 @@ class GlossaryManager(CollectionManager):
1438
1371
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/"
1439
1372
  f"terms/{term_guid}/is-abstract-concept/remove"
1440
1373
  )
1441
- await self._async_delete_request(url, body)
1374
+ await self._async_delete_classification_request(url, body)
1442
1375
  logger.info(f"Removed AbstractConcept classification to {term_guid}")
1443
1376
 
1444
1377
  def remove_is_abstract_concept(
1445
- self, term_guid: str, body: dict | DeleteRequestBody = None,
1378
+ self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None,
1446
1379
  ) -> None:
1447
1380
  """Add a relationship between terms.
1448
1381
 
@@ -1463,9 +1396,9 @@ class GlossaryManager(CollectionManager):
1463
1396
 
1464
1397
  Raises
1465
1398
  ------
1466
- InvalidParameterException
1399
+ PyegeriaInvalidParameterException
1467
1400
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1468
- PropertyServerException
1401
+ PyegeriaAPIException
1469
1402
  Raised by the server when an issue arises in processing a valid request.
1470
1403
  NotAuthorizedException
1471
1404
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1499,7 +1432,7 @@ class GlossaryManager(CollectionManager):
1499
1432
 
1500
1433
 
1501
1434
  async def _async_add_is_context_definition(
1502
- self, term_guid: str, body: dict | NewClassificationRequestBody = None,
1435
+ self, term_guid: str, body: Optional[dict | NewClassificationRequestBody] = None,
1503
1436
  ) -> None:
1504
1437
  """Add a relationship between terms. Async Version.
1505
1438
 
@@ -1521,9 +1454,9 @@ class GlossaryManager(CollectionManager):
1521
1454
 
1522
1455
  Raises
1523
1456
  ------
1524
- InvalidParameterException
1457
+ PyegeriaInvalidParameterException
1525
1458
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1526
- PropertyServerException
1459
+ PyegeriaAPIException
1527
1460
  Raised by the server when an issue arises in processing a valid request.
1528
1461
  NotAuthorizedException
1529
1462
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1559,13 +1492,13 @@ class GlossaryManager(CollectionManager):
1559
1492
  }
1560
1493
  }
1561
1494
 
1562
- await self._async_new_classification_request(url, "ContextDefinitionProperties",body)
1495
+ await self._async_new_classification_request(url, "ContextDefinitionProperties", body)
1563
1496
  logger.info(f"Added AbstractConcept classification to {term_guid}")
1564
1497
 
1565
1498
 
1566
1499
 
1567
1500
  def add_is_context_definition(
1568
- self, term_guid: str, body: dict | NewClassificationRequestBody = None,
1501
+ self, term_guid: str, body: Optional[dict | NewClassificationRequestBody] = None,
1569
1502
  ) -> None:
1570
1503
  """Add a relationship between terms.
1571
1504
 
@@ -1586,9 +1519,9 @@ class GlossaryManager(CollectionManager):
1586
1519
 
1587
1520
  Raises
1588
1521
  ------
1589
- InvalidParameterException
1522
+ PyegeriaInvalidParameterException
1590
1523
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1591
- PropertyServerException
1524
+ PyegeriaAPIException
1592
1525
  Raised by the server when an issue arises in processing a valid request.
1593
1526
  NotAuthorizedException
1594
1527
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1621,7 +1554,7 @@ class GlossaryManager(CollectionManager):
1621
1554
  )
1622
1555
 
1623
1556
  async def _async_remove_is_context_definition(
1624
- self, term_guid: str, body: dict | DeleteRequestBody = None,
1557
+ self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None,
1625
1558
  ) -> None:
1626
1559
  """Add a relationship between terms. Async Version.
1627
1560
 
@@ -1643,9 +1576,9 @@ class GlossaryManager(CollectionManager):
1643
1576
 
1644
1577
  Raises
1645
1578
  ------
1646
- InvalidParameterException
1579
+ PyegeriaInvalidParameterException
1647
1580
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1648
- PropertyServerException
1581
+ PyegeriaAPIException
1649
1582
  Raised by the server when an issue arises in processing a valid request.
1650
1583
  NotAuthorizedException
1651
1584
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1672,11 +1605,11 @@ class GlossaryManager(CollectionManager):
1672
1605
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/"
1673
1606
  f"terms/{term_guid}/is-context-definition/remove"
1674
1607
  )
1675
- await self._async_delete_request(url, body)
1608
+ await self._async_delete_classification_request(url, body)
1676
1609
  logger.info(f"Removed ContextDefinition classification to {term_guid}")
1677
1610
 
1678
1611
  def remove_is_context_definition(
1679
- self, term_guid: str, body: dict | DeleteRequestBody = None,
1612
+ self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None,
1680
1613
  ) -> None:
1681
1614
  """Add a relationship between terms.
1682
1615
 
@@ -1697,9 +1630,9 @@ class GlossaryManager(CollectionManager):
1697
1630
 
1698
1631
  Raises
1699
1632
  ------
1700
- InvalidParameterException
1633
+ PyegeriaInvalidParameterException
1701
1634
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1702
- PropertyServerException
1635
+ PyegeriaAPIException
1703
1636
  Raised by the server when an issue arises in processing a valid request.
1704
1637
  NotAuthorizedException
1705
1638
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1733,7 +1666,7 @@ class GlossaryManager(CollectionManager):
1733
1666
 
1734
1667
 
1735
1668
  async def _async_add_is_data_value(
1736
- self, term_guid: str, body: dict | NewClassificationRequestBody = None,
1669
+ self, term_guid: str, body: Optional[dict | NewClassificationRequestBody] = None,
1737
1670
  ) -> None:
1738
1671
  """Add a relationship between terms. Async Version.
1739
1672
 
@@ -1755,9 +1688,9 @@ class GlossaryManager(CollectionManager):
1755
1688
 
1756
1689
  Raises
1757
1690
  ------
1758
- InvalidParameterException
1691
+ PyegeriaInvalidParameterException
1759
1692
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1760
- PropertyServerException
1693
+ PyegeriaAPIException
1761
1694
  Raised by the server when an issue arises in processing a valid request.
1762
1695
  NotAuthorizedException
1763
1696
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1793,13 +1726,13 @@ class GlossaryManager(CollectionManager):
1793
1726
  }
1794
1727
  }
1795
1728
 
1796
- await self._async_new_classification_request(url, "DataValueProperties",body)
1729
+ await self._async_new_classification_request(url, "DataValueProperties", body)
1797
1730
  logger.info(f"Added DataValue classification to {term_guid}")
1798
1731
 
1799
1732
 
1800
1733
 
1801
1734
  def add_is_data_value(
1802
- self, term_guid: str, body: dict | NewClassificationRequestBody = None,
1735
+ self, term_guid: str, body: Optional[dict | NewClassificationRequestBody] = None,
1803
1736
  ) -> None:
1804
1737
  """Add a relationship between terms.
1805
1738
 
@@ -1820,9 +1753,9 @@ class GlossaryManager(CollectionManager):
1820
1753
 
1821
1754
  Raises
1822
1755
  ------
1823
- InvalidParameterException
1756
+ PyegeriaInvalidParameterException
1824
1757
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1825
- PropertyServerException
1758
+ PyegeriaAPIException
1826
1759
  Raised by the server when an issue arises in processing a valid request.
1827
1760
  NotAuthorizedException
1828
1761
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1855,7 +1788,7 @@ class GlossaryManager(CollectionManager):
1855
1788
  )
1856
1789
 
1857
1790
  async def _async_remove_is_data_value(
1858
- self, term_guid: str, body: dict | DeleteRequestBody = None,
1791
+ self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None,
1859
1792
  ) -> None:
1860
1793
  """Add a relationship between terms. Async Version.
1861
1794
 
@@ -1877,9 +1810,9 @@ class GlossaryManager(CollectionManager):
1877
1810
 
1878
1811
  Raises
1879
1812
  ------
1880
- InvalidParameterException
1813
+ PyegeriaInvalidParameterException
1881
1814
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1882
- PropertyServerException
1815
+ PyegeriaAPIException
1883
1816
  Raised by the server when an issue arises in processing a valid request.
1884
1817
  NotAuthorizedException
1885
1818
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1906,11 +1839,11 @@ class GlossaryManager(CollectionManager):
1906
1839
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/"
1907
1840
  f"terms/{term_guid}/is-data-value/remove"
1908
1841
  )
1909
- await self._async_delete_request(url, body)
1842
+ await self._async_delete_classification_request(url, body)
1910
1843
  logger.info(f"Removed DataValue classification to {term_guid}")
1911
1844
 
1912
1845
  def remove_is_data_value(
1913
- self, term_guid: str, body: dict | DeleteRequestBody = None,
1846
+ self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None,
1914
1847
  ) -> None:
1915
1848
  """Add a relationship between terms.
1916
1849
 
@@ -1931,9 +1864,9 @@ class GlossaryManager(CollectionManager):
1931
1864
 
1932
1865
  Raises
1933
1866
  ------
1934
- InvalidParameterException
1867
+ PyegeriaInvalidParameterException
1935
1868
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1936
- PropertyServerException
1869
+ PyegeriaAPIException
1937
1870
  Raised by the server when an issue arises in processing a valid request.
1938
1871
  NotAuthorizedException
1939
1872
  The principle specified by the user_id does not have authorization for the requested action.
@@ -1967,7 +1900,7 @@ class GlossaryManager(CollectionManager):
1967
1900
 
1968
1901
 
1969
1902
  async def _async_add_activity_description(
1970
- self, term_guid: str, activity_type: int = None, body: dict | NewClassificationRequestBody = None,
1903
+ self, term_guid: str, activity_type: int = None, body: Optional[dict | NewClassificationRequestBody] = None,
1971
1904
  ) -> None:
1972
1905
  """Add a relationship between terms. Async Version.
1973
1906
 
@@ -1989,9 +1922,9 @@ class GlossaryManager(CollectionManager):
1989
1922
 
1990
1923
  Raises
1991
1924
  ------
1992
- InvalidParameterException
1925
+ PyegeriaInvalidParameterException
1993
1926
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
1994
- PropertyServerException
1927
+ PyegeriaAPIException
1995
1928
  Raised by the server when an issue arises in processing a valid request.
1996
1929
  NotAuthorizedException
1997
1930
  The principle specified by the user_id does not have authorization for the requested action.
@@ -2027,13 +1960,13 @@ class GlossaryManager(CollectionManager):
2027
1960
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/"
2028
1961
  f"terms/{term_guid}/is-activity"
2029
1962
  )
2030
- await self._async_new_classification_request(url, "ActivityDescriptionProperties",body)
1963
+ await self._async_new_classification_request(url, "ActivityDescriptionProperties", body)
2031
1964
  logger.info(f"Added DataValue classification to {term_guid}")
2032
1965
 
2033
1966
 
2034
1967
 
2035
1968
  def add_activity_description(
2036
- self, term_guid: str, activity_type: int = None, body: dict | NewClassificationRequestBody = None,
1969
+ self, term_guid: str, activity_type: int = None, body: Optional[dict | NewClassificationRequestBody] = None,
2037
1970
  ) -> None:
2038
1971
  """Add a relationship between terms.
2039
1972
 
@@ -2054,9 +1987,9 @@ class GlossaryManager(CollectionManager):
2054
1987
 
2055
1988
  Raises
2056
1989
  ------
2057
- InvalidParameterException
1990
+ PyegeriaInvalidParameterException
2058
1991
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
2059
- PropertyServerException
1992
+ PyegeriaAPIException
2060
1993
  Raised by the server when an issue arises in processing a valid request.
2061
1994
  NotAuthorizedException
2062
1995
  The principle specified by the user_id does not have authorization for the requested action.
@@ -2089,7 +2022,7 @@ class GlossaryManager(CollectionManager):
2089
2022
  )
2090
2023
 
2091
2024
  async def _async_remove_activity_description(
2092
- self, term_guid: str, body: dict | DeleteRequestBody = None,
2025
+ self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None,
2093
2026
  ) -> None:
2094
2027
  """Add a relationship between terms. Async Version.
2095
2028
 
@@ -2111,9 +2044,9 @@ class GlossaryManager(CollectionManager):
2111
2044
 
2112
2045
  Raises
2113
2046
  ------
2114
- InvalidParameterException
2047
+ PyegeriaInvalidParameterException
2115
2048
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
2116
- PropertyServerException
2049
+ PyegeriaAPIException
2117
2050
  Raised by the server when an issue arises in processing a valid request.
2118
2051
  NotAuthorizedException
2119
2052
  The principle specified by the user_id does not have authorization for the requested action.
@@ -2140,11 +2073,11 @@ class GlossaryManager(CollectionManager):
2140
2073
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/"
2141
2074
  f"terms/{term_guid}/is-activity/remove"
2142
2075
  )
2143
- await self._async_delete_request(url, body)
2076
+ await self._async_delete_classification_request(url, body)
2144
2077
  logger.info(f"Removed ActivityDescription classification to {term_guid}")
2145
2078
 
2146
2079
  def remove_activity_description(
2147
- self, term_guid: str, body: dict | DeleteRequestBody = None,
2080
+ self, term_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None,
2148
2081
  ) -> None:
2149
2082
  """Add a relationship between terms.
2150
2083
 
@@ -2165,9 +2098,9 @@ class GlossaryManager(CollectionManager):
2165
2098
 
2166
2099
  Raises
2167
2100
  ------
2168
- InvalidParameterException
2101
+ PyegeriaInvalidParameterException
2169
2102
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
2170
- PropertyServerException
2103
+ PyegeriaAPIException
2171
2104
  Raised by the server when an issue arises in processing a valid request.
2172
2105
  NotAuthorizedException
2173
2106
  The principle specified by the user_id does not have authorization for the requested action.
@@ -2204,7 +2137,7 @@ class GlossaryManager(CollectionManager):
2204
2137
  #
2205
2138
 
2206
2139
  async def _async_add_relationship_between_terms(
2207
- self, term1_guid: str, term2_guid: str, relationship_type: str, body: dict | NewRelationshipRequestBody = None,
2140
+ self, term1_guid: str, term2_guid: str, relationship_type: str, body: Optional[dict | NewRelationshipRequestBody] = None,
2208
2141
  ) -> None:
2209
2142
  """Add a relationship between terms. Async Version.
2210
2143
 
@@ -2226,9 +2159,9 @@ class GlossaryManager(CollectionManager):
2226
2159
 
2227
2160
  Raises
2228
2161
  ------
2229
- InvalidParameterException
2162
+ PyegeriaInvalidParameterException
2230
2163
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
2231
- PropertyServerException
2164
+ PyegeriaAPIException
2232
2165
  Raised by the server when an issue arises in processing a valid request.
2233
2166
  NotAuthorizedException
2234
2167
  The principle specified by the user_id does not have authorization for the requested action.
@@ -2261,9 +2194,9 @@ class GlossaryManager(CollectionManager):
2261
2194
 
2262
2195
  if body is None:
2263
2196
  body = {
2264
- "class": "RelationshipRequestBody",
2197
+ "class": "NewRelationshipRequestBody",
2265
2198
  "properties":
2266
- {"class": "GlossaryTermRelationship", }
2199
+ {"class": "GlossaryTermRelationship" }
2267
2200
  }
2268
2201
 
2269
2202
 
@@ -2276,7 +2209,7 @@ class GlossaryManager(CollectionManager):
2276
2209
  logger.info(f"Added relationship between {term1_guid} and {term2_guid} of type {relationship_type}")
2277
2210
 
2278
2211
  def add_relationship_between_terms(
2279
- self, term1_guid: str, term2_guid: str, relationship_type: str, body: dict | NewRelationshipRequestBody = None,
2212
+ self, term1_guid: str, term2_guid: str, relationship_type: str, body: Optional[dict | NewRelationshipRequestBody] = None,
2280
2213
  ) -> None:
2281
2214
  """Add a relationship between terms.
2282
2215
 
@@ -2297,9 +2230,9 @@ class GlossaryManager(CollectionManager):
2297
2230
 
2298
2231
  Raises
2299
2232
  ------
2300
- InvalidParameterException
2233
+ PyegeriaInvalidParameterException
2301
2234
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
2302
- PropertyServerException
2235
+ PyegeriaAPIException
2303
2236
  Raised by the server when an issue arises in processing a valid request.
2304
2237
  NotAuthorizedException
2305
2238
  The principle specified by the user_id does not have authorization for the requested action.
@@ -2333,7 +2266,7 @@ class GlossaryManager(CollectionManager):
2333
2266
  )
2334
2267
 
2335
2268
  async def _async_update_relationship_between_terms(
2336
- self, term1_guid: str, term2_guid: str, relationship_type: str, body: dict | UpdateRelationshipRequestBody = None
2269
+ self, term1_guid: str, term2_guid: str, relationship_type: str, body: Optional[dict | UpdateRelationshipRequestBody] = None
2337
2270
  ) -> None:
2338
2271
 
2339
2272
  """Update a relationship between terms. Async Version.
@@ -2355,9 +2288,9 @@ class GlossaryManager(CollectionManager):
2355
2288
 
2356
2289
  Raises
2357
2290
  ------
2358
- InvalidParameterException
2291
+ PyegeriaInvalidParameterException
2359
2292
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
2360
- PropertyServerException
2293
+ PyegeriaAPIException
2361
2294
  Raised by the server when an issue arises in processing a valid request.
2362
2295
  NotAuthorizedException
2363
2296
  The principle specified by the user_id does not have authorization for the requested action.
@@ -2398,7 +2331,7 @@ class GlossaryManager(CollectionManager):
2398
2331
  logger.info(f"Updated relationship between {term1_guid} and {term2_guid} of type {relationship_type}")
2399
2332
 
2400
2333
  def update_relationship_between_terms(
2401
- self, term1_guid: str, term2_guid: str, relationship_type: str, body: dict | UpdateRelationshipRequestBody = None
2334
+ self, term1_guid: str, term2_guid: str, relationship_type: str, body: Optional[dict | UpdateRelationshipRequestBody] = None
2402
2335
  ) -> None:
2403
2336
  """Update a relationship between terms.
2404
2337
 
@@ -2420,9 +2353,9 @@ class GlossaryManager(CollectionManager):
2420
2353
 
2421
2354
  Raises
2422
2355
  ------
2423
- InvalidParameterException
2356
+ PyegeriaInvalidParameterException
2424
2357
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
2425
- PropertyServerException
2358
+ PyegeriaAPIException
2426
2359
  Raised by the server when an issue arises in processing a valid request.
2427
2360
  NotAuthorizedException
2428
2361
  The principle specified by the user_id does not have authorization for the requested action.
@@ -2456,7 +2389,7 @@ class GlossaryManager(CollectionManager):
2456
2389
  )
2457
2390
 
2458
2391
  async def _async_remove_relationship_between_terms(
2459
- self, term1_guid: str, term2_guid: str, relationship_type: str, body: dict | DeleteRequestBody = None,
2392
+ self, term1_guid: str, term2_guid: str, relationship_type: str, body: Optional[dict | DeleteRelationshipRequestBody] = None,
2460
2393
  ) -> None:
2461
2394
  """Remove a relationship between terms. Async Version.
2462
2395
 
@@ -2481,9 +2414,9 @@ class GlossaryManager(CollectionManager):
2481
2414
 
2482
2415
  Raises
2483
2416
  ------
2484
- InvalidParameterException
2417
+ PyegeriaInvalidParameterException
2485
2418
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
2486
- PropertyServerException
2419
+ PyegeriaAPIException
2487
2420
  Raised by the server when an issue arises in processing a valid request.
2488
2421
  NotAuthorizedException
2489
2422
  The principle specified by the user_id does not have authorization for the requested action.
@@ -2500,10 +2433,10 @@ class GlossaryManager(CollectionManager):
2500
2433
  f"terms/{term1_guid}/relationships/{relationship_type}/terms/{term2_guid}/remove"
2501
2434
  )
2502
2435
 
2503
- await self._async_delete_request(url, body)
2436
+ await self._async_delete_relationship_request(url, body)
2504
2437
 
2505
2438
  def remove_relationship_between_terms(
2506
- self, term1_guid: str, term2_guid: str, relationship_type: str, body: dict | DeleteRequestBody = None) -> None:
2439
+ self, term1_guid: str, term2_guid: str, relationship_type: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None:
2507
2440
 
2508
2441
  """Remove a relationship between terms.
2509
2442
 
@@ -2524,9 +2457,9 @@ class GlossaryManager(CollectionManager):
2524
2457
 
2525
2458
  Raises
2526
2459
  ------
2527
- InvalidParameterException
2460
+ PyegeriaInvalidParameterException
2528
2461
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values.
2529
- PropertyServerException
2462
+ PyegeriaAPIException
2530
2463
  Raised by the server when an issue arises in processing a valid request.
2531
2464
  NotAuthorizedException
2532
2465
  The principle specified by the user_id does not have authorization for the requested action.
@@ -2543,84 +2476,90 @@ class GlossaryManager(CollectionManager):
2543
2476
  #
2544
2477
 
2545
2478
  def _extract_glossary_properties(self, element: dict, columns_struct: dict) -> dict:
2546
- props = element.get('properties', {}) or {}
2547
- normalized = {
2548
- 'properties': props,
2549
- 'elementHeader': element.get('elementHeader', {}),
2550
- }
2551
- col_data = populate_columns_from_properties(normalized, columns_struct)
2552
- columns_list = col_data.get('formats', {}).get('columns', [])
2479
+ """Extract glossary columns for rendering.
2480
+
2481
+ This extractor uses `populate_common_columns` for standard fields (properties, header, relationships,
2482
+ subject area, mermaid). It then overlays glossary-specific values such as:
2483
+ - categories_names: comma/newline separated Display Names of categories in the glossary
2484
+ - categories_qualified_names: comma/newline separated Qualified Names of categories in the glossary
2485
+
2486
+ Parameters
2487
+ ----------
2488
+ element : dict
2489
+ Raw element as returned by the OMVS.
2490
+ columns_struct : dict
2491
+ The selected output format structure (from _output_formats), whose columns' `value` fields will be filled.
2492
+
2493
+ Returns
2494
+ -------
2495
+ dict
2496
+ The same columns_struct with values populated. Non-empty values are not overwritten.
2497
+ """
2498
+ # Common population first
2499
+ col_data = populate_common_columns(element, columns_struct)
2500
+ # Overlay glossary-specific extras: categories lists
2553
2501
  header_props = _extract_referenceable_properties(element)
2554
2502
  guid = header_props.get('GUID')
2555
- for column in columns_list:
2556
- key = column.get('key')
2557
- if key in header_props:
2558
- column['value'] = header_props.get(key)
2559
- elif isinstance(key, str) and key.lower() == 'guid':
2560
- column['value'] = guid
2503
+ extra: dict = {}
2561
2504
  if guid:
2562
- categories = None
2563
2505
  try:
2564
2506
  categories = self.get_categories_for_glossary(guid)
2565
2507
  except Exception:
2566
2508
  categories = None
2567
- cat_display_list = []
2568
- cat_qn_list = []
2569
2509
  if isinstance(categories, list):
2510
+ cat_display_list = []
2511
+ cat_qn_list = []
2570
2512
  for category in categories:
2571
2513
  gcp = category.get('glossaryCategoryProperties', {})
2572
- dn = gcp.get('displayName', '') or ''
2573
- qn = gcp.get('qualifiedName', '') or ''
2514
+ dn = (gcp.get('displayName') or '')
2515
+ qn = (gcp.get('qualifiedName') or '')
2574
2516
  if dn:
2575
2517
  cat_display_list.append(dn)
2576
2518
  if qn:
2577
2519
  cat_qn_list.append(qn)
2578
- cat_names_md = (", \n".join(cat_display_list)).rstrip(',') if cat_display_list else ''
2579
- cat_qn_md = (", \n".join(cat_qn_list)).rstrip(',') if cat_qn_list else ''
2580
- for column in columns_list:
2581
- if column.get('key') == 'categories_names' and not column.get('value'):
2582
- column['value'] = cat_names_md
2583
- if column.get('key') == 'categories_qualified_names' and not column.get('value'):
2584
- column['value'] = cat_qn_md
2585
- for column in columns_list:
2586
- if column.get('key') == 'mermaid' and not column.get('value'):
2587
- column['value'] = element.get('mermaidGraph', '') or ''
2588
- break
2589
- return col_data
2520
+ if cat_display_list:
2521
+ extra['categories_names'] = ", \n".join(cat_display_list)
2522
+ if cat_qn_list:
2523
+ extra['categories_qualified_names'] = ", \n".join(cat_qn_list)
2524
+ return overlay_additional_values(col_data, extra)
2590
2525
 
2591
2526
  def _extract_term_properties(self, element: dict, columns_struct: dict) -> dict:
2592
- col_data = populate_columns_from_properties(element, columns_struct)
2593
- columns_list = col_data.get("formats", {}).get("columns", [])
2594
- header_props = _extract_referenceable_properties(element)
2595
- for column in columns_list:
2596
- key = column.get('key')
2597
- if key in header_props:
2598
- column['value'] = header_props.get(key)
2599
- elif isinstance(key, str) and key.lower() == 'guid':
2600
- column['value'] = header_props.get('GUID')
2601
- classification_names = ""
2602
- classifications = element.get('elementHeader', {}).get("collectionCategories", [])
2603
- for classification in classifications:
2604
- classification_names += f"{classification['classificationName']}, "
2605
- if classification_names:
2606
- for column in columns_list:
2607
- if column.get('key') == 'classifications':
2608
- column['value'] = classification_names[:-2]
2609
- break
2610
- col_data = get_required_relationships(element, col_data)
2611
- subject_area = element.get('elementHeader', {}).get("subjectArea", "") or ""
2612
- subj_val = ""
2613
- if isinstance(subject_area, dict):
2614
- subj_val = subject_area.get("classificationProperties", {}).get("subjectAreaName", "")
2615
- for column in columns_list:
2616
- if column.get('key') == 'subject_area':
2617
- column['value'] = subj_val
2618
- break
2619
- mermaid_val = element.get('mermaidGraph', "") or ""
2620
- for column in columns_list:
2621
- if column.get('key') == 'mermaid':
2622
- column['value'] = mermaid_val
2623
- break
2527
+ """Extract glossary term columns for rendering.
2528
+
2529
+ Populates standard columns via `populate_common_columns`, and if requested by the
2530
+ selected columns, derives a classifications string (from `elementHeader.collectionCategories`)
2531
+ into the `classifications` column.
2532
+
2533
+ Parameters
2534
+ ----------
2535
+ element : dict
2536
+ Raw term element returned by the OMVS.
2537
+ columns_struct : dict
2538
+ The chosen format-set structure whose column `value`s will be set.
2539
+
2540
+ Returns
2541
+ -------
2542
+ dict
2543
+ The same `columns_struct` with values populated.
2544
+ """
2545
+ # Use centralized population
2546
+ col_data = populate_common_columns(element, columns_struct)
2547
+ # Term-specific classifications (collectionCategories) to 'classifications' column
2548
+ columns_list = col_data.get('formats', {}).get('attributes', [])
2549
+ try:
2550
+ classification_names = ""
2551
+ classifications = element.get('elementHeader', {}).get("collectionCategories", [])
2552
+ for classification in classifications:
2553
+ nm = classification.get('classificationName')
2554
+ if nm:
2555
+ classification_names += f"{nm}, "
2556
+ if classification_names:
2557
+ for column in columns_list:
2558
+ if column.get('key') == 'classifications' and column.get('value') in (None, ""):
2559
+ column['value'] = classification_names[:-2]
2560
+ break
2561
+ except Exception:
2562
+ pass
2624
2563
  return col_data
2625
2564
 
2626
2565
  def _get_term_additional_properties(self, element: dict, term_guid: str, output_format: str = None) -> dict:
@@ -2664,19 +2603,9 @@ class GlossaryManager(CollectionManager):
2664
2603
  def _generate_glossary_output(self, elements: dict | list[dict], search_string: str,
2665
2604
  element_type_name: str | None,
2666
2605
  output_format: str = 'DICT',
2667
- output_format_set: dict | str = None) -> str | list[dict]:
2606
+ report_spec: dict | str = None) -> str | list[dict]:
2668
2607
  entity_type = 'Glossary'
2669
- if output_format_set:
2670
- if isinstance(output_format_set, str):
2671
- output_formats = select_output_format_set(output_format_set, output_format)
2672
- elif isinstance(output_format_set, dict):
2673
- output_formats = get_output_format_type_match(output_format_set, output_format)
2674
- else:
2675
- output_formats = None
2676
- else:
2677
- output_formats = select_output_format_set(entity_type, output_format)
2678
- if output_formats is None:
2679
- output_formats = select_output_format_set('Default', output_format)
2608
+ output_formats = resolve_output_formats(entity_type, output_format, report_spec)
2680
2609
  return generate_output(
2681
2610
  elements=elements,
2682
2611
  search_string=search_string,
@@ -2690,19 +2619,9 @@ class GlossaryManager(CollectionManager):
2690
2619
  def _generate_term_output(self, elements: dict | list[dict], search_string: str,
2691
2620
  element_type_name: str | None,
2692
2621
  output_format: str = 'DICT',
2693
- output_format_set: dict | str = None) -> str | list[dict]:
2622
+ report_spec: dict | str = None) -> str | list[dict]:
2694
2623
  entity_type = 'GlossaryTerm'
2695
- if output_format_set:
2696
- if isinstance(output_format_set, str):
2697
- output_formats = select_output_format_set(output_format_set, output_format)
2698
- elif isinstance(output_format_set, dict):
2699
- output_formats = get_output_format_type_match(output_format_set, output_format)
2700
- else:
2701
- output_formats = None
2702
- else:
2703
- output_formats = select_output_format_set(entity_type, output_format)
2704
- if output_formats is None:
2705
- output_formats = select_output_format_set('Default', output_format)
2624
+ output_formats = resolve_output_formats(entity_type, output_format, report_spec)
2706
2625
  return generate_output(
2707
2626
  elements=elements,
2708
2627
  search_string=search_string,
@@ -2757,69 +2676,280 @@ class GlossaryManager(CollectionManager):
2757
2676
  response = loop.run_until_complete(self._async_get_term_relationship_types())
2758
2677
  return response
2759
2678
 
2760
- async def _async_find_glossaries(self, search_string: str = "*", classificaton_names: list[str] = None,
2761
- metadata_element_types: list[str] = ["Glossary"],
2762
- starts_with: bool = False, ends_with: bool = False, ignore_case: bool = False,
2763
- start_from: int = 0,page_size: int = 0, output_format: str = 'JSON',
2764
- output_format_set: str | dict = None,
2765
- body: dict | SearchStringRequestBody = None) -> list | str:
2679
+ @dynamic_catch
2680
+ async def _async_find_glossaries(self, search_string: str = "*",
2681
+ starts_with: bool = True, ends_with: bool = False,
2682
+ ignore_case: bool = False,
2683
+ anchor_domain: Optional[str] = None,
2684
+ metadata_element_type: str = "Glossary",
2685
+ metadata_element_subtypes: Optional[list[str]] = None,
2686
+ skip_relationships: Optional[list[str]] = None,
2687
+ include_only_relationships: Optional[list[str]] = None,
2688
+ skip_classified_elements: Optional[list[str]] = None,
2689
+ include_only_classified_elements: Optional[list[str]] = None,
2690
+ graph_query_depth: int = 3,
2691
+ governance_zone_filter: Optional[list[str]] = None, as_of_time: Optional[str] = None,
2692
+ effective_time: Optional[str] = None, relationship_page_size: int = 0,
2693
+ limit_results_by_status: Optional[list[str]] = None, sequencing_order: Optional[str] = None,
2694
+ sequencing_property: Optional[str] = None,
2695
+ output_format: str = "JSON",
2696
+ report_spec: str | dict = None,
2697
+ start_from: int = 0, page_size: int = 100,
2698
+ property_names: Optional[list[str]] = None,
2699
+ body: Optional[dict | SearchStringRequestBody] = None) -> list | str:
2700
+ """ Retrieve the list of glossary metadata elements that contain the search string. Async Version.
2766
2701
 
2767
- response = await self._async_find_collections(search_string, classificaton_names,
2768
- metadata_element_types, starts_with, ends_with, ignore_case,
2769
- start_from, page_size, output_format, output_format_set, body)
2770
- return response
2702
+ Parameters
2703
+ ----------
2704
+ search_string: str
2705
+ Search string to match against - None or '*' indicate match against all glossaries.
2706
+ starts_with : bool, [default=True], optional
2707
+ Starts with the supplied string.
2708
+ ends_with : bool, [default=False], optional
2709
+ Ends with the supplied string
2710
+ ignore_case : bool, [default=False], optional
2711
+ Ignore case when searching
2712
+ anchor_domain: str, optional
2713
+ The anchor domain to search in.
2714
+ metadata_element_type: str, optional, [default="Glossary"]
2715
+ The type of metadata element to search for.
2716
+ metadata_element_subtypes: list[str], optional
2717
+ The subtypes of metadata element to search for.
2718
+ skip_relationships: list[str], optional
2719
+ The types of relationships to skip.
2720
+ include_only_relationships: list[str], optional
2721
+ The types of relationships to include.
2722
+ skip_classified_elements: list[str], optional
2723
+ The types of classified elements to skip.
2724
+ include_only_classified_elements: list[str], optional
2725
+ The types of classified elements to include.
2726
+ graph_query_depth: int, [default=3], optional
2727
+ The depth of the graph query.
2728
+ governance_zone_filter: list[str], optional
2729
+ The governance zones to search in.
2730
+ as_of_time: str, optional
2731
+ The time to search as of.
2732
+ effective_time: str, optional
2733
+ The effective time to search at.
2734
+ relationship_page_size: int, [default=0], optional
2735
+ The page size for relationships.
2736
+ limit_results_by_status: list[str], optional
2737
+ The statuses to limit results by.
2738
+ sequencing_order: str, optional
2739
+ The order to sequence results by.
2740
+ sequencing_property: str, optional
2741
+ The property to sequence results by.
2742
+ output_format: str, default = "JSON"
2743
+ - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
2744
+ report_spec: str | dict , optional, default = None
2745
+ - The desired output columns/fields to include.
2746
+ start_from: int, [default=0], optional
2747
+ When multiple pages of results are available, the page number to start from.
2748
+ page_size: int, [default=100]
2749
+ The number of items to return in a single page.
2750
+ property_names: list[str], optional
2751
+ The names of properties to search for.
2752
+ body: dict | SearchStringRequestBody, optional, default = None
2753
+ - if provided, the search parameters in the body will supercede other attributes, such as "search_string"
2771
2754
 
2772
- def find_glossaries(self, search_string: str = "*", classificaton_names: list[str] = None,
2773
- metadata_element_types: list[str] = ["Glossary"],
2774
- starts_with: bool = False, ends_with: bool = False, ignore_case: bool = False,
2775
- start_from: int = 0,page_size: int = 0, output_format: str = 'JSON',
2776
- output_format_set: str | dict = None,
2777
- body: dict | SearchStringRequestBody = None) -> list | str:
2778
- loop = asyncio.get_event_loop()
2779
- response = loop.run_until_complete(
2780
- self._async_find_glossaries(search_string, classificaton_names, metadata_element_types, starts_with, ends_with, ignore_case, start_from, page_size, output_format, output_format_set, body))
2755
+ Returns
2756
+ -------
2757
+ List | str
2758
+
2759
+ Output depends on the output format specified.
2760
+
2761
+ Raises
2762
+ ------
2763
+
2764
+ ValidationError
2765
+ If the client passes incorrect parameters on the request that don't conform to the data model.
2766
+ PyegeriaException
2767
+ Issues raised in communicating or server side processing.
2768
+ NotAuthorizedException
2769
+ The principle specified by the user_id does not have authorization for the requested action
2770
+
2771
+ """
2772
+ response = await self._async_find_collections(search_string=search_string, starts_with=starts_with,
2773
+ ends_with=ends_with, ignore_case=ignore_case,
2774
+ anchor_domain=anchor_domain,
2775
+ metadata_element_type=metadata_element_type,
2776
+ metadata_element_subtypes=metadata_element_subtypes,
2777
+ skip_relationships=skip_relationships,
2778
+ include_only_relationships=include_only_relationships,
2779
+ skip_classified_elements=skip_classified_elements,
2780
+ include_only_classified_elements=include_only_classified_elements,
2781
+ graph_query_depth=graph_query_depth,
2782
+ governance_zone_filter=governance_zone_filter,
2783
+ as_of_time=as_of_time, effective_time=effective_time,
2784
+ relationship_page_size=relationship_page_size,
2785
+ limit_results_by_status=limit_results_by_status,
2786
+ sequencing_order=sequencing_order,
2787
+ sequencing_property=sequencing_property,
2788
+ output_format=output_format, report_spec=report_spec,
2789
+ start_from=start_from, page_size=page_size,
2790
+ property_names=property_names, body=body)
2781
2791
  return response
2782
2792
 
2783
- async def _async_get_glossaries_by_name(self, filter_string: str = None, classification_names: list[str] = None,
2784
- body: dict | FilterRequestBody = None,
2793
+ @dynamic_catch
2794
+ def find_glossaries(self, search_string: str = "*",
2795
+ starts_with: bool = True, ends_with: bool = False,
2796
+ ignore_case: bool = False,
2797
+ anchor_domain: Optional[str] = None,
2798
+ metadata_element_type: str = "Glossary",
2799
+ metadata_element_subtypes: Optional[list[str]] = None,
2800
+ skip_relationships: Optional[list[str]] = None,
2801
+ include_only_relationships: Optional[list[str]] = None,
2802
+ skip_classified_elements: Optional[list[str]] = None,
2803
+ include_only_classified_elements: Optional[list[str]] = None,
2804
+ graph_query_depth: int = 3,
2805
+ governance_zone_filter: Optional[list[str]] = None, as_of_time: Optional[str] = None,
2806
+ effective_time: Optional[str] = None, relationship_page_size: int = 0,
2807
+ limit_results_by_status: Optional[list[str]] = None, sequencing_order: Optional[str] = None,
2808
+ sequencing_property: Optional[str] = None,
2809
+ output_format: str = "JSON",
2810
+ report_spec: str | dict = None,
2811
+ start_from: int = 0, page_size: int = 100,
2812
+ property_names: Optional[list[str]] = None,
2813
+ body: Optional[dict | SearchStringRequestBody] = None) -> list | str:
2814
+ """ Retrieve the list of glossary metadata elements that contain the search string.
2815
+
2816
+ Parameters
2817
+ ----------
2818
+ search_string: str
2819
+ Search string to match against - None or '*' indicate match against all glossaries.
2820
+ starts_with : bool, [default=True], optional
2821
+ Starts with the supplied string.
2822
+ ends_with : bool, [default=False], optional
2823
+ Ends with the supplied string
2824
+ ignore_case : bool, [default=False], optional
2825
+ Ignore case when searching
2826
+ anchor_domain: str, optional
2827
+ The anchor domain to search in.
2828
+ metadata_element_type: str, optional, [default="Glossary"]
2829
+ The type of metadata element to search for.
2830
+ metadata_element_subtypes: list[str], optional
2831
+ The subtypes of metadata element to search for.
2832
+ skip_relationships: list[str], optional
2833
+ The types of relationships to skip.
2834
+ include_only_relationships: list[str], optional
2835
+ The types of relationships to include.
2836
+ skip_classified_elements: list[str], optional
2837
+ The types of classified elements to skip.
2838
+ include_only_classified_elements: list[str], optional
2839
+ The types of classified elements to include.
2840
+ graph_query_depth: int, [default=3], optional
2841
+ The depth of the graph query.
2842
+ governance_zone_filter: list[str], optional
2843
+ The governance zones to search in.
2844
+ as_of_time: str, optional
2845
+ The time to search as of.
2846
+ effective_time: str, optional
2847
+ The effective time to search at.
2848
+ relationship_page_size: int, [default=0], optional
2849
+ The page size for relationships.
2850
+ limit_results_by_status: list[str], optional
2851
+ The statuses to limit results by.
2852
+ sequencing_order: str, optional
2853
+ The order to sequence results by.
2854
+ sequencing_property: str, optional
2855
+ The property to sequence results by.
2856
+ output_format: str, default = "JSON"
2857
+ - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
2858
+ report_spec: str | dict , optional, default = None
2859
+ - The desired output columns/fields to include.
2860
+ start_from: int, [default=0], optional
2861
+ When multiple pages of results are available, the page number to start from.
2862
+ page_size: int, [default=100]
2863
+ The number of items to return in a single page.
2864
+ property_names: list[str], optional
2865
+ The names of properties to search for.
2866
+ body: dict | SearchStringRequestBody, optional, default = None
2867
+ - if provided, the search parameters in the body will supercede other attributes, such as "search_string"
2868
+
2869
+ Returns
2870
+ -------
2871
+ List | str
2872
+
2873
+ Output depends on the output format specified.
2874
+
2875
+ Raises
2876
+ -------
2877
+
2878
+ ValidationError
2879
+ If the client passes incorrect parameters on the request that don't conform to the data model.
2880
+ PyegeriaException
2881
+ Issues raised in communicating or server side processing.
2882
+ NotAuthorizedException
2883
+ The principle specified by the user_id does not have authorization for the requested action
2884
+
2885
+ """
2886
+ loop = asyncio.get_event_loop()
2887
+ return loop.run_until_complete(self._async_find_glossaries(search_string=search_string,
2888
+ starts_with=starts_with,
2889
+ ends_with=ends_with,
2890
+ ignore_case=ignore_case,
2891
+ anchor_domain=anchor_domain,
2892
+ metadata_element_type=metadata_element_type,
2893
+ metadata_element_subtypes=metadata_element_subtypes,
2894
+ skip_relationships=skip_relationships,
2895
+ include_only_relationships=include_only_relationships,
2896
+ skip_classified_elements=skip_classified_elements,
2897
+ include_only_classified_elements=include_only_classified_elements,
2898
+ graph_query_depth=graph_query_depth,
2899
+ governance_zone_filter=governance_zone_filter,
2900
+ as_of_time=as_of_time,
2901
+ effective_time=effective_time,
2902
+ relationship_page_size=relationship_page_size,
2903
+ limit_results_by_status=limit_results_by_status,
2904
+ sequencing_order=sequencing_order,
2905
+ sequencing_property=sequencing_property,
2906
+ output_format=output_format,
2907
+ report_spec=report_spec,
2908
+ start_from=start_from,
2909
+ page_size=page_size,
2910
+ property_names=property_names,
2911
+ body=body))
2912
+
2913
+ async def _async_get_glossaries_by_name(self, filter_string: Optional[str] = None, classification_names: Optional[list[str]] = None,
2914
+ body: Optional[dict | FilterRequestBody] = None,
2785
2915
  start_from: int = 0, page_size: int = 0,
2786
2916
  output_format: str = 'JSON',
2787
- output_format_set: str | dict = None) -> dict | str:
2788
- return await self._async_get_collections_by_name(filter_string, classification_names, body, start_from, page_size, output_format, output_format_set)
2917
+ report_spec: str | dict = None) -> dict | str:
2918
+ return await self._async_get_collections_by_name(filter_string, classification_names, body, start_from, page_size, output_format, report_spec)
2789
2919
 
2790
2920
 
2791
- def get_glossaries_by_name(self, filter_string: str = None, classification_names: list[str] = None,
2792
- body: dict | FilterRequestBody = None,
2921
+ def get_glossaries_by_name(self, filter_string: Optional[str] = None, classification_names: Optional[list[str]] = None,
2922
+ body: Optional[dict | FilterRequestBody] = None,
2793
2923
  start_from: int = 0, page_size: int = 0,
2794
2924
  output_format: str = 'JSON',
2795
- output_format_set: str | dict = None) -> dict | str:
2925
+ report_spec: str | dict = None) -> dict | str:
2796
2926
  loop = asyncio.get_event_loop()
2797
2927
  response = loop.run_until_complete(
2798
2928
  self._async_get_glossaries_by_name(filter_string, classification_names, body,start_from, page_size,
2799
- output_format, output_format_set))
2929
+ output_format, report_spec))
2800
2930
  return response
2801
2931
 
2802
- async def _async_get_glossary_by_guid(self, glossary_guid: str, element_type: str = "Glossary", body: dict | GetRequestBody = None,
2803
- output_format: str = "JSON", output_format_set: str | dict = None) -> dict | str:
2932
+ async def _async_get_glossary_by_guid(self, glossary_guid: str, element_type: str = "Glossary", body: Optional[dict | GetRequestBody] = None,
2933
+ output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
2804
2934
 
2805
- return await self._async_get_collection_by_guid(glossary_guid, element_type, body, output_format, output_format_set)
2935
+ return await self._async_get_collection_by_guid(glossary_guid, element_type, body, output_format, report_spec)
2806
2936
 
2807
2937
 
2808
2938
 
2809
2939
  def get_glossary_by_guid(self, glossary_guid: str, element_type: str = "Glossary", body: dict| GetRequestBody=None,
2810
- output_format: str = "JSON", output_format_set: str | dict = None) -> dict | str:
2940
+ output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
2811
2941
  loop = asyncio.get_event_loop()
2812
2942
  response = loop.run_until_complete(
2813
- self._async_get_glossary_by_guid(glossary_guid, element_type, body,output_format, output_format_set))
2943
+ self._async_get_glossary_by_guid(glossary_guid, element_type, body,output_format, report_spec))
2814
2944
  return response
2815
2945
 
2816
2946
 
2817
2947
 
2818
- async def _async_get_terms_by_name(self, filter_string: str = None, classification_names: list[str] = None,
2819
- body: dict | FilterRequestBody = None,
2948
+ async def _async_get_terms_by_name(self, filter_string: Optional[str] = None, classification_names: Optional[list[str]] = None,
2949
+ body: Optional[dict | FilterRequestBody] = None,
2820
2950
  start_from: int = 0, page_size: int = 0,
2821
2951
  output_format: str = 'JSON',
2822
- output_format_set: str | dict = None) -> list:
2952
+ report_spec: str | dict = None) -> list:
2823
2953
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/"
2824
2954
  f"terms/by-name")
2825
2955
  response = await self._async_get_name_request(url, _type="GlossaryTerm",
@@ -2827,66 +2957,274 @@ class GlossaryManager(CollectionManager):
2827
2957
  filter_string=filter_string,
2828
2958
  classification_names=classification_names,
2829
2959
  start_from=start_from, page_size=page_size,
2830
- output_format=output_format, output_format_set=output_format_set,
2960
+ output_format=output_format, report_spec=report_spec,
2831
2961
  body=body)
2832
2962
  return response
2833
2963
 
2834
- def get_terms_by_name(self, filter_string: str = None, classification_names: list[str] = None,
2835
- body: dict | FilterRequestBody = None,
2964
+ def get_terms_by_name(self, filter_string: Optional[str] = None, classification_names: Optional[list[str]] = None,
2965
+ body: Optional[dict | FilterRequestBody] = None,
2836
2966
  start_from: int = 0, page_size: int = 0,
2837
2967
  output_format: str = 'JSON',
2838
- output_format_set: str | dict = None) -> list:
2968
+ report_spec: str | dict = None) -> list:
2839
2969
  loop = asyncio.get_event_loop()
2840
2970
  response = loop.run_until_complete(
2841
2971
  self._async_get_terms_by_name(filter_string, classification_names, body,start_from, page_size,
2842
- output_format, output_format_set))
2972
+ output_format, report_spec))
2843
2973
  return response
2844
2974
 
2845
2975
  async def _async_get_term_by_guid(self, term_guid: str, element_type: str = "GlossaryTerm", body: dict| GetRequestBody=None,
2846
- output_format: str = "JSON", output_format_set: str | dict = None) -> dict | str:
2976
+ output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
2847
2977
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/terms/"
2848
2978
  f"{term_guid}")
2849
2979
  response = await self._async_get_guid_request(url, _type=element_type,
2850
2980
  _gen_output=self._generate_term_output,
2851
- output_format=output_format, output_format_set=output_format_set,
2981
+ output_format=output_format, report_spec=report_spec,
2852
2982
  body=body)
2853
2983
  return response
2854
2984
 
2855
2985
  def get_term_by_guid(self, term_guid: str, element_type: str = "GlossaryTerm", body: dict| GetRequestBody=None,
2856
- output_format: str = "JSON", output_format_set: str | dict = None) -> dict | str:
2986
+ output_format: str = "JSON", report_spec: str | dict = None) -> dict | str:
2857
2987
  loop = asyncio.get_event_loop()
2858
- response = loop.run_until_complete(self._async_get_term_by_guid(term_guid, element_type, body, output_format, output_format_set))
2988
+ response = loop.run_until_complete(self._async_get_term_by_guid(term_guid, element_type, body, output_format, report_spec))
2859
2989
  return response
2860
2990
 
2861
- async def _async_find_glossary_terms(self, search_string: str, starts_with: bool = False,
2862
- ends_with: bool = False, ignore_case: bool = False, type_name: str = "GlossaryTerm",
2863
- classification_names: list[str] = None, start_from: int = 0,
2864
- page_size: int = 0, output_format: str = 'JSON',
2865
- output_format_set: str | dict = None, body: dict = None) -> list | str:
2991
+ @dynamic_catch
2992
+ async def _async_find_glossary_terms(self, search_string: str = "*",
2993
+ starts_with: bool = True, ends_with: bool = False,
2994
+ ignore_case: bool = False,
2995
+ anchor_domain: Optional[str] = None,
2996
+ metadata_element_type: str = "GlossaryTerm",
2997
+ metadata_element_subtypes: Optional[list[str]] = None,
2998
+ skip_relationships: Optional[list[str]] = None,
2999
+ include_only_relationships: Optional[list[str]] = None,
3000
+ skip_classified_elements: Optional[list[str]] = None,
3001
+ include_only_classified_elements: Optional[list[str]] = None,
3002
+ graph_query_depth: int = 3,
3003
+ governance_zone_filter: Optional[list[str]] = None, as_of_time: Optional[str] = None,
3004
+ effective_time: Optional[str] = None, relationship_page_size: int = 0,
3005
+ limit_results_by_status: Optional[list[str]] = None, sequencing_order: Optional[str] = None,
3006
+ sequencing_property: Optional[str] = None,
3007
+ output_format: str = "JSON",
3008
+ report_spec: str | dict = "Glossary-Term-DrE",
3009
+ start_from: int = 0, page_size: int = 100,
3010
+ property_names: Optional[list[str]] = None,
3011
+ body: Optional[dict | SearchStringRequestBody] = None) -> list | str:
3012
+ """ Retrieve the list of glossary term metadata elements that contain the search string. Async Version.
3013
+
3014
+ Parameters
3015
+ ----------
3016
+ search_string: str
3017
+ Search string to match against - None or '*' indicate match against all glossary terms.
3018
+ starts_with : bool, [default=True], optional
3019
+ Starts with the supplied string.
3020
+ ends_with : bool, [default=False], optional
3021
+ Ends with the supplied string
3022
+ ignore_case : bool, [default=False], optional
3023
+ Ignore case when searching
3024
+ anchor_domain: str, optional
3025
+ The anchor domain to search in.
3026
+ metadata_element_type: str, optional, [default="GlossaryTerm"]
3027
+ The type of metadata element to search for.
3028
+ metadata_element_subtypes: list[str], optional
3029
+ The subtypes of metadata element to search for.
3030
+ skip_relationships: list[str], optional
3031
+ The types of relationships to skip.
3032
+ include_only_relationships: list[str], optional
3033
+ The types of relationships to include.
3034
+ skip_classified_elements: list[str], optional
3035
+ The types of classified elements to skip.
3036
+ include_only_classified_elements: list[str], optional
3037
+ The types of classified elements to include.
3038
+ graph_query_depth: int, [default=3], optional
3039
+ The depth of the graph query.
3040
+ governance_zone_filter: list[str], optional
3041
+ The governance zones to search in.
3042
+ as_of_time: str, optional
3043
+ The time to search as of.
3044
+ effective_time: str, optional
3045
+ The effective time to search at.
3046
+ relationship_page_size: int, [default=0], optional
3047
+ The page size for relationships.
3048
+ limit_results_by_status: list[str], optional
3049
+ The statuses to limit results by.
3050
+ sequencing_order: str, optional
3051
+ The order to sequence results by.
3052
+ sequencing_property: str, optional
3053
+ The property to sequence results by.
3054
+ output_format: str, default = "JSON"
3055
+ - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
3056
+ report_spec: str | dict , optional, default = "Glossary-Term-DrE"
3057
+ - The desired output columns/fields to include.
3058
+ start_from: int, [default=0], optional
3059
+ When multiple pages of results are available, the page number to start from.
3060
+ page_size: int, [default=100]
3061
+ The number of items to return in a single page.
3062
+ property_names: list[str], optional
3063
+ The names of properties to search for.
3064
+ body: dict | SearchStringRequestBody, optional, default = None
3065
+ - if provided, the search parameters in the body will supercede other attributes, such as "search_string"
3066
+
3067
+ Returns
3068
+ -------
3069
+ List | str
3070
+
3071
+ Output depends on the output format specified.
3072
+
3073
+ Raises
3074
+ ------
3075
+
3076
+ ValidationError
3077
+ If the client passes incorrect parameters on the request that don't conform to the data model.
3078
+ PyegeriaException
3079
+ Issues raised in communicating or server side processing.
3080
+ NotAuthorizedException
3081
+ The principle specified by the user_id does not have authorization for the requested action
3082
+
3083
+ """
2866
3084
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/glossary-manager/glossaries/terms/"
2867
3085
  f"by-search-string")
2868
- response = await self._async_find_request(url, _type= type_name,
2869
- _gen_output=self._generate_term_output,
2870
- search_string = search_string, classification_names = classification_names,
2871
- metadata_element_types = ["GlossaryTerm"],
2872
- starts_with = starts_with, ends_with = ends_with, ignore_case = ignore_case,
2873
- start_from = start_from, page_size = page_size,
2874
- output_format=output_format, output_format_set=output_format_set,
2875
- body=body)
3086
+ response = await self._async_find_request(url, _type=metadata_element_type, _gen_output=self._generate_term_output,
3087
+ search_string=search_string, starts_with=starts_with,
3088
+ ends_with=ends_with, ignore_case=ignore_case,
3089
+ anchor_domain=anchor_domain,
3090
+ metadata_element_type=metadata_element_type,
3091
+ metadata_element_subtypes=metadata_element_subtypes,
3092
+ skip_relationships=skip_relationships,
3093
+ include_only_relationships=include_only_relationships,
3094
+ skip_classified_elements=skip_classified_elements,
3095
+ include_only_classified_elements=include_only_classified_elements,
3096
+ graph_query_depth=graph_query_depth,
3097
+ governance_zone_filter=governance_zone_filter,
3098
+ as_of_time=as_of_time, effective_time=effective_time,
3099
+ relationship_page_size=relationship_page_size,
3100
+ limit_results_by_status=limit_results_by_status,
3101
+ sequencing_order=sequencing_order,
3102
+ sequencing_property=sequencing_property,
3103
+ output_format=output_format, report_spec=report_spec,
3104
+ start_from=start_from, page_size=page_size,
3105
+ property_names=property_names, body=body)
3106
+
2876
3107
  return response
2877
3108
 
2878
- def find_glossary_terms(self, search_string: str, starts_with: bool = False,
2879
- ends_with: bool = False, ignore_case: bool = False, type_name: str = "GlossaryTerm",
2880
- classification_names: list[str] = None, start_from: int = 0,
2881
- page_size: int = 0, output_format: str = 'JSON',
2882
- output_format_set: str | dict = None, body: dict = None) -> list | str:
3109
+ @dynamic_catch
3110
+ def find_glossary_terms(self, search_string: str = "*",
3111
+ starts_with: bool = True, ends_with: bool = False,
3112
+ ignore_case: bool = False,
3113
+ anchor_domain: Optional[str] = None,
3114
+ metadata_element_type: str = "GlossaryTerm",
3115
+ metadata_element_subtypes: Optional[list[str]] = None,
3116
+ skip_relationships: Optional[list[str]] = None,
3117
+ include_only_relationships: Optional[list[str]] = None,
3118
+ skip_classified_elements: Optional[list[str]] = None,
3119
+ include_only_classified_elements: Optional[list[str]] = None,
3120
+ graph_query_depth: int = 3,
3121
+ governance_zone_filter: Optional[list[str]] = None, as_of_time: Optional[str] = None,
3122
+ effective_time: Optional[str] = None, relationship_page_size: int = 0,
3123
+ limit_results_by_status: Optional[list[str]] = None, sequencing_order: Optional[str] = None,
3124
+ sequencing_property: Optional[str] = None,
3125
+ output_format: str = "JSON",
3126
+ report_spec: str | dict = "Glossary-Term-DrE",
3127
+ start_from: int = 0, page_size: int = 100,
3128
+ property_names: Optional[list[str]] = None,
3129
+ body: Optional[dict | SearchStringRequestBody] = None) -> list | str:
3130
+ """ Retrieve the list of glossary term metadata elements that contain the search string.
3131
+
3132
+ Parameters
3133
+ ----------
3134
+ search_string: str
3135
+ Search string to match against - None or '*' indicate match against all glossary terms.
3136
+ starts_with : bool, [default=True], optional
3137
+ Starts with the supplied string.
3138
+ ends_with : bool, [default=False], optional
3139
+ Ends with the supplied string
3140
+ ignore_case : bool, [default=False], optional
3141
+ Ignore case when searching
3142
+ anchor_domain: str, optional
3143
+ The anchor domain to search in.
3144
+ metadata_element_type: str, optional, [default="GlossaryTerm"]
3145
+ The type of metadata element to search for.
3146
+ metadata_element_subtypes: list[str], optional
3147
+ The subtypes of metadata element to search for.
3148
+ skip_relationships: list[str], optional
3149
+ The types of relationships to skip.
3150
+ include_only_relationships: list[str], optional
3151
+ The types of relationships to include.
3152
+ skip_classified_elements: list[str], optional
3153
+ The types of classified elements to skip.
3154
+ include_only_classified_elements: list[str], optional
3155
+ The types of classified elements to include.
3156
+ graph_query_depth: int, [default=3], optional
3157
+ The depth of the graph query.
3158
+ governance_zone_filter: list[str], optional
3159
+ The governance zones to search in.
3160
+ as_of_time: str, optional
3161
+ The time to search as of.
3162
+ effective_time: str, optional
3163
+ The effective time to search at.
3164
+ relationship_page_size: int, [default=0], optional
3165
+ The page size for relationships.
3166
+ limit_results_by_status: list[str], optional
3167
+ The statuses to limit results by.
3168
+ sequencing_order: str, optional
3169
+ The order to sequence results by.
3170
+ sequencing_property: str, optional
3171
+ The property to sequence results by.
3172
+ output_format: str, default = "JSON"
3173
+ - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
3174
+ report_spec: str | dict , optional, default = "Glossary-Term-DrE"
3175
+ - The desired output columns/fields to include.
3176
+ start_from: int, [default=0], optional
3177
+ When multiple pages of results are available, the page number to start from.
3178
+ page_size: int, [default=100]
3179
+ The number of items to return in a single page.
3180
+ property_names: list[str], optional
3181
+ The names of properties to search for.
3182
+ body: dict | SearchStringRequestBody, optional, default = None
3183
+ - if provided, the search parameters in the body will supercede other attributes, such as "search_string"
3184
+
3185
+ Returns
3186
+ -------
3187
+ List | str
3188
+
3189
+ Output depends on the output format specified.
3190
+
3191
+ Raises
3192
+ -------
3193
+
3194
+ ValidationError
3195
+ If the client passes incorrect parameters on the request that don't conform to the data model.
3196
+ PyegeriaException
3197
+ Issues raised in communicating or server side processing.
3198
+ NotAuthorizedException
3199
+ The principle specified by the user_id does not have authorization for the requested action
3200
+
3201
+ """
2883
3202
  loop = asyncio.get_event_loop()
2884
- response = loop.run_until_complete(
2885
- self._async_find_glossary_terms(search_string, starts_with,
2886
- ends_with, ignore_case, type_name,classification_names,
2887
- start_from,
2888
- page_size, output_format, output_format_set, body))
2889
- return response
3203
+ return loop.run_until_complete(self._async_find_glossary_terms(search_string=search_string,
3204
+ starts_with=starts_with,
3205
+ ends_with=ends_with,
3206
+ ignore_case=ignore_case,
3207
+ anchor_domain=anchor_domain,
3208
+ metadata_element_type=metadata_element_type,
3209
+ metadata_element_subtypes=metadata_element_subtypes,
3210
+ skip_relationships=skip_relationships,
3211
+ include_only_relationships=include_only_relationships,
3212
+ skip_classified_elements=skip_classified_elements,
3213
+ include_only_classified_elements=include_only_classified_elements,
3214
+ graph_query_depth=graph_query_depth,
3215
+ governance_zone_filter=governance_zone_filter,
3216
+ as_of_time=as_of_time,
3217
+ effective_time=effective_time,
3218
+ relationship_page_size=relationship_page_size,
3219
+ limit_results_by_status=limit_results_by_status,
3220
+ sequencing_order=sequencing_order,
3221
+ sequencing_property=sequencing_property,
3222
+ output_format=output_format,
3223
+ report_spec=report_spec,
3224
+ start_from=start_from,
3225
+ page_size=page_size,
3226
+ property_names=property_names,
3227
+ body=body))
2890
3228
 
2891
3229
 
2892
3230
  if __name__ == "__main__":