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,5 +1,5 @@
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
5
  Maintain and explore the contents of nested collections.
@@ -7,27 +7,26 @@ Copyright Contributors to the ODPi Egeria project.
7
7
  """
8
8
 
9
9
  import asyncio
10
- import inspect
11
10
  from datetime import datetime
12
11
  from typing import Optional, Annotated, Literal, Union
13
12
 
14
13
  from loguru import logger
15
- from pydantic import ValidationError, Field, HttpUrl
14
+ from pydantic import Field, HttpUrl
16
15
 
17
- from pyegeria._exceptions_new import PyegeriaInvalidParameterException
18
- from pyegeria._globals import NO_ELEMENTS_FOUND, NO_GUID_RETURNED, NO_MEMBERS_FOUND
19
- from pyegeria._output_formats import select_output_format_set, get_output_format_type_match
20
- from pyegeria.config import settings
16
+ from pyegeria.core._exceptions import PyegeriaInvalidParameterException
17
+ from pyegeria.core._globals import NO_ELEMENTS_FOUND, NO_GUID_RETURNED
18
+ from pyegeria.view.base_report_formats import select_report_spec, get_report_spec_match
19
+ from pyegeria.core.config import settings
21
20
  from pyegeria.models import (SearchStringRequestBody, FilterRequestBody, GetRequestBody, NewElementRequestBody,
22
21
  ReferenceableProperties, InitialClassifications, TemplateRequestBody,
23
- UpdateElementRequestBody, UpdateStatusRequestBody, NewRelationshipRequestBody,
24
- DeleteRequestBody, UpdateRelationshipRequestBody, ResultsRequestBody,
22
+ UpdateElementRequestBody, NewRelationshipRequestBody,
23
+ DeleteElementRequestBody, DeleteRelationshipRequestBody, UpdateRelationshipRequestBody,
24
+ ResultsRequestBody,
25
+ DeploymentStatusSearchString, DeploymentStatusFilterRequestBody,
25
26
  get_defined_field_values, PyegeriaModel)
26
- from pyegeria.output_formatter import (generate_output,
27
- _extract_referenceable_properties, populate_columns_from_properties,
28
- get_required_relationships)
29
- from pyegeria.utils import body_slimmer, dynamic_catch
30
-
27
+ from pyegeria.view.output_formatter import (generate_output,
28
+ populate_common_columns)
29
+ from pyegeria.core.utils import body_slimmer, dynamic_catch
31
30
 
32
31
  app_settings = settings
33
32
  EGERIA_LOCAL_QUALIFIER = app_settings.User_Profile.egeria_local_qualifier
@@ -57,7 +56,7 @@ def query_string(params):
57
56
  result = f"{result}{query_seperator(result)}{params[i][0]}={params[i][1]}"
58
57
  return result
59
58
 
60
- from pyegeria._client_new import Client2
59
+ from pyegeria.core._server_client import ServerClient
61
60
 
62
61
  class CollectionProperties(ReferenceableProperties):
63
62
  class_: Annotated[Literal["CollectionProperties"], Field(alias="class")]
@@ -93,12 +92,24 @@ class DigitalProductProperties(CollectionProperties):
93
92
  next_version_date: datetime | None = None
94
93
  withdrawal_date: datetime | None = None
95
94
 
95
+ class DigitalProductFamilyProperties(CollectionProperties):
96
+ class_: Annotated[Literal["DigitalProductFamilyProperties"], Field(alias="class")]
97
+ user_defined_status: str | None = None
98
+ product_name: str | None = None
99
+ identifier: str | None = None
100
+ introduction_date: datetime | None = None
101
+ maturity: str | None = None
102
+ service_life: str | None = None
103
+ next_version_date: datetime | None = None
104
+ withdrawal_date: datetime | None = None
105
+
106
+
96
107
  class Collections(PyegeriaModel):
97
- collection: Union[CollectionProperties, DigitalSubscriptionProperties, DigitalProductProperties, AgreementProperties,
108
+ collection: Union[CollectionProperties, DigitalSubscriptionProperties, DigitalProductProperties, DigitalProductFamilyProperties,AgreementProperties,
98
109
  DataSpecProperties, DataDictionaryProperties] = Field(desciminator="class_")
99
110
 
100
111
 
101
- class CollectionManager(Client2):
112
+ class CollectionManager(ServerClient):
102
113
  """
103
114
  Maintain and explore the contents of nested collections. These collections can be used to represent digital
104
115
  products, or collections of resources for a particular project or team. They can be used to organize assets and
@@ -121,16 +132,16 @@ class CollectionManager(Client2):
121
132
  """
122
133
 
123
134
 
124
- def __init__(self, view_server: str, platform_url: str, user_id: str, user_pwd: str = None, token: str = None, ):
135
+ def __init__(self, view_server: str, platform_url: str, user_id: str, user_pwd: Optional[str] = None, token: Optional[str] = None, ):
125
136
  self.view_server = view_server
126
137
  self.platform_url = platform_url
127
138
  self.user_id = user_id
128
139
  self.user_pwd = user_pwd
129
140
 
130
141
 
131
- Client2.__init__(self, view_server, platform_url, user_id, user_pwd, token)
132
- result = self.get_platform_origin()
133
- logger.info(f"CollectionManager initialized, platform origin is: {result}")
142
+ ServerClient.__init__(self, view_server, platform_url, user_id, user_pwd, token)
143
+ # result = self.get_platform_origin()
144
+ # logger.info(f"CollectionManager initialized, platform origin is: {result}")
134
145
  self.collection_command_root: str = (
135
146
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/collection-manager/collections")
136
147
  #
@@ -140,9 +151,9 @@ class CollectionManager(Client2):
140
151
 
141
152
  @dynamic_catch
142
153
  async def _async_get_attached_collections(self, parent_guid: str, start_from: int = 0, page_size: int = 0,
143
- category: str = None, classification_names: list[str]= None,
144
- body: dict | FilterRequestBody = None, output_format: str = "JSON",
145
- output_format_set: str | dict = None) -> list | str:
154
+ category: Optional[str] = None, classification_names: list[str]= None,
155
+ body: Optional[dict | FilterRequestBody] = None, output_format: str = "JSON",
156
+ report_spec: str | dict = None) -> list | str:
146
157
  """Returns the list of collections that are linked off of the supplied element using the ResourceList
147
158
  relationship. Async version.
148
159
 
@@ -159,7 +170,7 @@ class CollectionManager(Client2):
159
170
  If supplied, adds addition request details - for instance, to filter the results on collectionType
160
171
  output_format: str, default = "JSON"
161
172
  - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
162
- output_format_set: str | dict = None), optional, default = None
173
+ report_spec: str | dict = None), optional, default = None
163
174
  The desired output columns/fields to include.
164
175
 
165
176
  Returns
@@ -171,9 +182,9 @@ class CollectionManager(Client2):
171
182
  Raises
172
183
  ------
173
184
 
174
- InvalidParameterException
185
+ PyegeriaInvalidParameterException
175
186
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
176
- PropertyServerException
187
+ PyegeriaAPIException
177
188
  Raised by the server when an issue arises in processing a valid request
178
189
  NotAuthorizedException
179
190
  The principle specified by the user_id does not have authorization for the requested action
@@ -197,7 +208,7 @@ class CollectionManager(Client2):
197
208
 
198
209
  url = (f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/collection-manager/"
199
210
  f"metadata-elements/{parent_guid}/collections")
200
- return await self._async_get_name_request(url, body, output_format, output_format_set)
211
+
201
212
  response = await self._async_make_request("POST", url, body_slimmer(body))
202
213
  elements = response.json().get("elements", NO_ELEMENTS_FOUND)
203
214
  if type(elements) is str:
@@ -205,14 +216,14 @@ class CollectionManager(Client2):
205
216
  return NO_ELEMENTS_FOUND
206
217
 
207
218
  if output_format != 'JSON': # return a simplified markdown representation
208
- logger.info(f"Found elements, output format: {output_format}, output_format_set: {output_format_set}")
219
+ logger.info(f"Found elements, output format: {output_format}, report_spec: {report_spec}")
209
220
  return self._generate_collection_output(elements, None, None, output_format,
210
- output_format_set=output_format_set)
221
+ report_spec=report_spec)
211
222
  return elements
212
223
 
213
224
 
214
225
  def get_attached_collections(self, parent_guid: str, start_from: int = 0, page_size: int = 0, body: dict = None,
215
- output_format: str = "JSON", output_format_set: str | dict = None) -> list:
226
+ output_format: str = "JSON", report_spec: str | dict = None) -> list:
216
227
  """Returns the list of collections that are linked off of the supplied element using the ResourceList
217
228
  relationship. Async version.
218
229
 
@@ -229,7 +240,7 @@ class CollectionManager(Client2):
229
240
  If supplied, adds addition request details - for instance, to filter the results on collectionType
230
241
  output_format: str, default = "JSON"
231
242
  - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
232
- output_format_set: str | dict = None), optional, default = None
243
+ report_spec: str | dict = None), optional, default = None
233
244
  The desired output columns/fields to include.
234
245
 
235
246
 
@@ -242,9 +253,9 @@ class CollectionManager(Client2):
242
253
  Raises
243
254
  ------
244
255
 
245
- InvalidParameterException
256
+ PyegeriaInvalidParameterException
246
257
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
247
- PropertyServerException
258
+ PyegeriaAPIException
248
259
  Raised by the server when an issue arises in processing a valid request
249
260
  NotAuthorizedException
250
261
  The principle specified by the user_id does not have authorization for the requested action
@@ -267,47 +278,87 @@ class CollectionManager(Client2):
267
278
  """
268
279
  return asyncio.get_event_loop().run_until_complete(
269
280
  self._async_get_attached_collections(parent_guid, start_from, page_size,
270
- body, output_format, output_format_set))
281
+ body, output_format, report_spec))
271
282
 
272
283
 
273
284
  @dynamic_catch
274
- async def _async_find_collections(self, search_string: str = "*", classification_names: list[str] = None,
275
- metadata_element_types: list[str] = None,
276
- starts_with: bool = True, ends_with: bool = False, ignore_case: bool = False,
277
- start_from: int = 0, page_size: int = 0, output_format: str = 'JSON',
278
- output_format_set: str | dict = None,
279
- body: dict | SearchStringRequestBody = None) -> list | str:
280
- """ Returns the list of collections matching the search string filtered by the optional classification.
281
- This method can either be used with a body, allowing full control, or with the individual parameters.
282
- If the body is provided it will be used and the search_string will be ignored.
285
+ async def _async_find_collections(self, search_string: str = "*",
286
+ starts_with: bool = True, ends_with: bool = False,
287
+ ignore_case: bool = False,
288
+ anchor_domain: Optional[str] = None,
289
+ metadata_element_type: Optional[str] = None,
290
+ metadata_element_subtypes: Optional[list[str]] = None,
291
+ skip_relationships: Optional[list[str]] = None,
292
+ include_only_relationships: Optional[list[str]] = None,
293
+ skip_classified_elements: Optional[list[str]] = None,
294
+ include_only_classified_elements: Optional[list[str]] = None,
295
+ graph_query_depth: int = 3,
296
+ governance_zone_filter: Optional[list[str]] = None, as_of_time: Optional[str] = None,
297
+ effective_time: Optional[str] = None, relationship_page_size: int = 0,
298
+ limit_results_by_status: Optional[list[str]] = None, sequencing_order: Optional[str] = None,
299
+ sequencing_property: Optional[str] = None,
300
+ output_format: str = "JSON",
301
+ report_spec: str | dict = None,
302
+ start_from: int = 0, page_size: int = 100,
303
+ property_names: Optional[list[str]] = None,
304
+ body: Optional[dict | SearchStringRequestBody] = None,
305
+ _type: str = "Collection") -> list | str:
306
+ """ Retrieve the list of collection metadata elements that contain the search string. Async Version.
283
307
 
284
308
  Parameters
285
309
  ----------
286
310
  search_string: str
287
- Search string to match against - None or '*' indicate match against all collections (may be filtered by
288
- classification).
289
- classification_names: list[str], optional, default=None
290
- A list of classification names to filter on - for example, ["DataSpec"], for data specifications. If none,
291
- then all classifications are returned.
292
- metadata_element_types: list[str], optional, default=None
293
- A list of metadata element types to filter on - for example, ["DataSpec"], for data specifications. If none,
294
- starts_with : bool, [default=False], optional
311
+ Search string to match against - None or '*' indicate match against all collections.
312
+ starts_with : bool, [default=True], optional
295
313
  Starts with the supplied string.
296
314
  ends_with : bool, [default=False], optional
297
315
  Ends with the supplied string
298
316
  ignore_case : bool, [default=False], optional
299
317
  Ignore case when searching
300
- start_from: int, [default=0], optional
301
- When multiple pages of results are available, the page number to start from.
302
- page_size: int, [default=None]
303
- The number of items to return in a single page. If not specified, the default will be taken from
304
- the class instance.
318
+ anchor_domain: str, optional
319
+ The anchor domain to search in.
320
+ metadata_element_type: str, optional
321
+ The type of metadata element to search for.
322
+ metadata_element_subtypes: list[str], optional
323
+ The subtypes of metadata element to search for.
324
+ skip_relationships: list[str], optional
325
+ The types of relationships to skip.
326
+ include_only_relationships: list[str], optional
327
+ The types of relationships to include.
328
+ skip_classified_elements: list[str], optional
329
+ The types of classified elements to skip.
330
+ include_only_classified_elements: list[str], optional
331
+ The types of classified elements to include.
332
+ graph_query_depth: int, [default=3], optional
333
+ The depth of the graph query.
334
+ governance_zone_filter: list[str], optional
335
+ The governance zones to search in.
336
+ as_of_time: str, optional
337
+ The time to search as of.
338
+ effective_time: str, optional
339
+ The effective time to search at.
340
+ relationship_page_size: int, [default=0], optional
341
+ The page size for relationships.
342
+ limit_results_by_status: list[str], optional
343
+ The statuses to limit results by.
344
+ sequencing_order: str, optional
345
+ The order to sequence results by.
346
+ sequencing_property: str, optional
347
+ The property to sequence results by.
305
348
  output_format: str, default = "JSON"
306
349
  - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
307
- output_format_set: str | dict , optional, default = None
350
+ report_spec: str | dict , optional, default = None
308
351
  - The desired output columns/fields to include.
352
+ start_from: int, [default=0], optional
353
+ When multiple pages of results are available, the page number to start from.
354
+ page_size: int, [default=100]
355
+ The number of items to return in a single page.
356
+ property_names: list[str], optional
357
+ The names of properties to search for.
309
358
  body: dict | SearchStringRequestBody, optional, default = None
310
359
  - if provided, the search parameters in the body will supercede other attributes, such as "search_string"
360
+ _type: str, [default="Collection"], optional
361
+ - The type of element to search for.
311
362
 
312
363
  Returns
313
364
  -------
@@ -327,56 +378,107 @@ class CollectionManager(Client2):
327
378
 
328
379
  """
329
380
  url = str(HttpUrl(f"{self.collection_command_root}/by-search-string"))
330
- response = await self._async_find_request(url, _type="Collection",
331
- _gen_output=self._generate_collection_output,
332
- search_string = search_string, classification_names = classification_names,
333
- metadata_element_types = metadata_element_types,
334
- starts_with = starts_with, ends_with = ends_with, ignore_case = ignore_case,
335
- start_from = start_from, page_size = page_size,
336
- output_format=output_format, output_format_set=output_format_set,
337
- body=body)
381
+ response = await self._async_find_request(url, _type=_type, _gen_output=self._generate_collection_output,
382
+ search_string=search_string, starts_with=starts_with,
383
+ ends_with=ends_with, ignore_case=ignore_case,
384
+ anchor_domain=anchor_domain,
385
+ metadata_element_type=metadata_element_type,
386
+ metadata_element_subtypes=metadata_element_subtypes,
387
+ skip_relationships=skip_relationships,
388
+ include_only_relationships=include_only_relationships,
389
+ skip_classified_elements=skip_classified_elements,
390
+ include_only_classified_elements=include_only_classified_elements,
391
+ graph_query_depth=graph_query_depth,
392
+ governance_zone_filter=governance_zone_filter,
393
+ as_of_time=as_of_time, effective_time=effective_time,
394
+ relationship_page_size=relationship_page_size,
395
+ limit_results_by_status=limit_results_by_status,
396
+ sequencing_order=sequencing_order,
397
+ sequencing_property=sequencing_property,
398
+ output_format=output_format, report_spec=report_spec,
399
+ start_from=start_from, page_size=page_size,
400
+ property_names=property_names, body=body)
338
401
 
339
402
  return response
340
403
 
341
404
  @dynamic_catch
342
- def find_collections(self, search_string: str = '*', classification_names: str = None,
343
- metadata_element_types: list[str] = None, starts_with: bool = True,
344
- ends_with: bool = False, ignore_case: bool = False,
345
- start_from: int = 0, page_size: int = 0, output_format: str = 'JSON',
346
- output_format_set: str | dict = None,
347
- body: dict | SearchStringRequestBody = None) -> list | str:
348
- """ Returns the list of collections matching the search string filtered by the optional classification.
349
- This method can either be used with a body, allowing full control, or with the individual parameters.
350
- If the body is provided it will be used and the search_string will be ignored.
405
+ def find_collections(self, search_string: str = "*",
406
+ starts_with: bool = True, ends_with: bool = False,
407
+ ignore_case: bool = False,
408
+ anchor_domain: Optional[str] = None,
409
+ metadata_element_type: Optional[str] = None,
410
+ metadata_element_subtypes: Optional[list[str]] = None,
411
+ skip_relationships: Optional[list[str]] = None,
412
+ include_only_relationships: Optional[list[str]] = None,
413
+ skip_classified_elements: Optional[list[str]] = None,
414
+ include_only_classified_elements: Optional[list[str]] = None,
415
+ graph_query_depth: int = 3,
416
+ governance_zone_filter: Optional[list[str]] = None, as_of_time: Optional[str] = None,
417
+ effective_time: Optional[str] = None, relationship_page_size: int = 0,
418
+ limit_results_by_status: Optional[list[str]] = None, sequencing_order: Optional[str] = None,
419
+ sequencing_property: Optional[str] = None,
420
+ output_format: str = "JSON",
421
+ report_spec: str | dict = None,
422
+ start_from: int = 0, page_size: int = 100,
423
+ property_names: Optional[list[str]] = None,
424
+ body: Optional[dict | SearchStringRequestBody] = None,
425
+ _type: str = "Collection") -> list | str:
426
+ """ Retrieve the list of collection metadata elements that contain the search string.
351
427
 
352
428
  Parameters
353
429
  ----------
354
430
  search_string: str
355
- Search string to match against - None or '*' indicate match against all collections (may be filtered by
356
- classification).
357
- classification_names: list[str], optional, default=None
358
- A list of classification names to filter on - for example, ["DataSpec"], for data specifications. If none,
359
- then all classifications are returned.
360
- metadata_element_types: list[str], optional, default=None
361
- A list of metadata element types to filter on - for example, ["DataSpec"], for data specifications. If none,
362
- then all metadata element types are returned.
363
- starts_with : bool, [default=False], optional
431
+ Search string to match against - None or '*' indicate match against all collections.
432
+ starts_with : bool, [default=True], optional
364
433
  Starts with the supplied string.
365
434
  ends_with : bool, [default=False], optional
366
435
  Ends with the supplied string
367
436
  ignore_case : bool, [default=False], optional
368
437
  Ignore case when searching
369
- start_from: int, [default=0], optional
370
- When multiple pages of results are available, the page number to start from.
371
- page_size: int, [default=None]
372
- The number of items to return in a single page. If not specified, the default will be taken from
373
- the class instance.
438
+ anchor_domain: str, optional
439
+ The anchor domain to search in.
440
+ metadata_element_type: str, optional
441
+ The type of metadata element to search for.
442
+ metadata_element_subtypes: list[str], optional
443
+ The subtypes of metadata element to search for.
444
+ skip_relationships: list[str], optional
445
+ The types of relationships to skip.
446
+ include_only_relationships: list[str], optional
447
+ The types of relationships to include.
448
+ skip_classified_elements: list[str], optional
449
+ The types of classified elements to skip.
450
+ include_only_classified_elements: list[str], optional
451
+ The types of classified elements to include.
452
+ graph_query_depth: int, [default=3], optional
453
+ The depth of the graph query.
454
+ governance_zone_filter: list[str], optional
455
+ The governance zones to search in.
456
+ as_of_time: str, optional
457
+ The time to search as of.
458
+ effective_time: str, optional
459
+ The effective time to search at.
460
+ relationship_page_size: int, [default=0], optional
461
+ The page size for relationships.
462
+ limit_results_by_status: list[str], optional
463
+ The statuses to limit results by.
464
+ sequencing_order: str, optional
465
+ The order to sequence results by.
466
+ sequencing_property: str, optional
467
+ The property to sequence results by.
374
468
  output_format: str, default = "JSON"
375
469
  - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
376
- output_format_set: str | dict , optional, default = None
470
+ report_spec: str | dict , optional, default = None
377
471
  - The desired output columns/fields to include.
472
+ start_from: int, [default=0], optional
473
+ When multiple pages of results are available, the page number to start from.
474
+ page_size: int, [default=100]
475
+ The number of items to return in a single page.
476
+ property_names: list[str], optional
477
+ The names of properties to search for.
378
478
  body: dict | SearchStringRequestBody, optional, default = None
379
479
  - if provided, the search parameters in the body will supercede other attributes, such as "search_string"
480
+ _type: str, [default="Collection"], optional
481
+ - The type of element to search for.
380
482
 
381
483
  Returns
382
484
  -------
@@ -394,24 +496,278 @@ class CollectionManager(Client2):
394
496
  NotAuthorizedException
395
497
  The principle specified by the user_id does not have authorization for the requested action
396
498
 
397
- Args:
398
- classification_names ():
399
- metadata_element_types ():
499
+ """
500
+ loop = asyncio.get_event_loop()
501
+ return loop.run_until_complete(self._async_find_collections(search_string=search_string,
502
+ starts_with=starts_with,
503
+ ends_with=ends_with,
504
+ ignore_case=ignore_case,
505
+ anchor_domain=anchor_domain,
506
+ metadata_element_type=metadata_element_type,
507
+ metadata_element_subtypes=metadata_element_subtypes,
508
+ skip_relationships=skip_relationships,
509
+ include_only_relationships=include_only_relationships,
510
+ skip_classified_elements=skip_classified_elements,
511
+ include_only_classified_elements=include_only_classified_elements,
512
+ graph_query_depth=graph_query_depth,
513
+ governance_zone_filter=governance_zone_filter,
514
+ as_of_time=as_of_time,
515
+ effective_time=effective_time,
516
+ relationship_page_size=relationship_page_size,
517
+ limit_results_by_status=limit_results_by_status,
518
+ sequencing_order=sequencing_order,
519
+ sequencing_property=sequencing_property,
520
+ output_format=output_format,
521
+ report_spec=report_spec,
522
+ start_from=start_from,
523
+ page_size=page_size,
524
+ property_names=property_names,
525
+ body=body,
526
+ _type=_type))
527
+
528
+
529
+ @dynamic_catch
530
+ async def _async_find_digital_products(
531
+ self,
532
+ search_string: str = "*",
533
+ deployment_status: Optional[str] = None,
534
+ starts_with: bool = True,
535
+ ends_with: bool = False,
536
+ ignore_case: bool = False,
537
+ start_from: int = 0,
538
+ page_size: int = 100,
539
+ output_format: str = "JSON",
540
+ report_spec: str | dict = None,
541
+ body: Optional[dict | DeploymentStatusSearchString] = None,
542
+ ) -> list | str:
543
+ """
544
+ Returns the list of digital products matching the search string and optional deployment status.
545
+
546
+ Parameters
547
+ ----------
548
+ search_string: str, default = "*"
549
+ - the search string to use to find matching digital products
550
+ deployment_status: str, optional
551
+ - optional deployment status to filter by (e.g., ACTIVE)
552
+ starts_with: bool, default = True
553
+ - if True, the search string must match the start of the property value
554
+ ends_with: bool, default = False
555
+ - if True, the search string must match the end of the property value
556
+ ignore_case: bool, default = False
557
+ - if True, the search is case-insensitive
558
+ start_from: int, default = 0
559
+ - the starting point in the results list
560
+ page_size: int, default = 100
561
+ - the maximum number of results to return
562
+ output_format: str, default = "JSON"
563
+ - the format of the output (JSON, DICT, etc.)
564
+ report_spec: str | dict, optional
565
+ - the report specification to use for the output
566
+ body: dict | DeploymentStatusSearchString, optional
567
+ - the request body to use for the request. If specified, this takes precedence over other parameters.
568
+
569
+ Returns
570
+ -------
571
+ list | str
572
+ - a list of digital products or a string message if no products are found
573
+
574
+ Note:
575
+ -----
576
+ Sample body:
577
+ {
578
+ "class": "DeploymentStatusSearchString",
579
+ "searchString" : "add search string here",
580
+ "deploymentStatus" : "ACTIVE",
581
+ "startsWith" : false,
582
+ "endsWith" : false,
583
+ "ignoreCase" : true,
584
+ "startFrom" : 0,
585
+ "pageSize": 0
586
+ }
587
+ """
588
+ url = (
589
+ f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/collection-manager"
590
+ f"/digital-products/by-search-string"
591
+ )
592
+
593
+ if isinstance(body, DeploymentStatusSearchString):
594
+ validated_body = body
595
+ elif isinstance(body, dict):
596
+ validated_body = self._deployment_status_search_request_adapter.validate_python(body)
597
+ else:
598
+ search_string = None if search_string == "*" else search_string
599
+ body_dict = {
600
+ "class": "DeploymentStatusSearchString",
601
+ "searchString": search_string,
602
+ "deploymentStatus": deployment_status,
603
+ "startsWith": starts_with,
604
+ "endsWith": ends_with,
605
+ "ignoreCase": ignore_case,
606
+ "startFrom": start_from,
607
+ "pageSize": page_size,
608
+ }
609
+ validated_body = DeploymentStatusSearchString.model_validate(body_dict)
610
+
611
+ json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
612
+ response = await self._async_make_request("POST", url, json_body)
613
+ elements = response.json().get("elements", NO_ELEMENTS_FOUND)
614
+
615
+ if type(elements) is str or len(elements) == 0:
616
+ logger.info(NO_ELEMENTS_FOUND)
617
+ return NO_ELEMENTS_FOUND
618
+
619
+ if output_format.upper() != "JSON":
620
+ return self._generate_collection_output(
621
+ elements, search_string, "DigitalProduct", output_format, report_spec
622
+ )
623
+ return elements
624
+
625
+ def find_digital_products(
626
+ self,
627
+ search_string: str = "*",
628
+ deployment_status: Optional[str] = None,
629
+ starts_with: bool = True,
630
+ ends_with: bool = False,
631
+ ignore_case: bool = False,
632
+ start_from: int = 0,
633
+ page_size: int = 100,
634
+ output_format: str = "JSON",
635
+ report_spec: str | dict = None,
636
+ body: Optional[dict | DeploymentStatusSearchString] = None,
637
+ ) -> list | str:
638
+ """
639
+ Returns the list of digital products matching the search string and optional deployment status. Sync version.
400
640
 
641
+ See _async_find_digital_products for more details.
401
642
  """
402
643
  return asyncio.get_event_loop().run_until_complete(
403
- self._async_find_collections(search_string, classification_names, metadata_element_types,
404
- starts_with, ends_with, ignore_case,
405
- start_from, page_size, output_format,
406
- output_format_set, body))
644
+ self._async_find_digital_products(
645
+ search_string,
646
+ deployment_status,
647
+ starts_with,
648
+ ends_with,
649
+ ignore_case,
650
+ start_from,
651
+ page_size,
652
+ output_format,
653
+ report_spec,
654
+ body,
655
+ )
656
+ )
657
+
658
+ @dynamic_catch
659
+ async def _async_get_digital_products_by_category(
660
+ self,
661
+ category: str,
662
+ deployment_status: Optional[str] = None,
663
+ start_from: int = 0,
664
+ page_size: int = 100,
665
+ output_format: str = "JSON",
666
+ report_spec: str | dict = None,
667
+ body: Optional[dict | DeploymentStatusFilterRequestBody] = None,
668
+ ) -> list | str:
669
+ """
670
+ Returns the list of digital products matching the category and optional deployment status.
671
+
672
+ Parameters
673
+ ----------
674
+ category: str
675
+ - the category to use to find matching digital products
676
+ deployment_status: str, optional
677
+ - optional deployment status to filter by (e.g., ACTIVE)
678
+ start_from: int, default = 0
679
+ - the starting point in the results list
680
+ page_size: int, default = 100
681
+ - the maximum number of results to return
682
+ output_format: str, default = "JSON"
683
+ - the format of the output (JSON, DICT, etc.)
684
+ report_spec: str | dict, optional
685
+ - the report specification to use for the output
686
+ body: dict | DeploymentStatusFilterRequestBody, optional
687
+ - the request body to use for the request. If specified, this takes precedence over other parameters.
688
+
689
+ Returns
690
+ -------
691
+ list | str
692
+ - a list of digital products or a string message if no products are found
693
+
694
+ Note:
695
+ -----
696
+ Sample body:
697
+ {
698
+ "class" : "DeploymentStatusFilterRequestBody",
699
+ "filter" : "xxx",
700
+ "deploymentStatus" : "ACTIVE",
701
+ "startFrom" : 0,
702
+ "pageSize": 0
703
+ }
704
+ """
705
+ url = (
706
+ f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/collection-manager"
707
+ f"/digital-products/by-category"
708
+ )
709
+
710
+ if isinstance(body, DeploymentStatusFilterRequestBody):
711
+ validated_body = body
712
+ elif isinstance(body, dict):
713
+ validated_body = self._deployment_status_filter_request_adapter.validate_python(body)
714
+ else:
715
+ body_dict = {
716
+ "class": "DeploymentStatusFilterRequestBody",
717
+ "filter": category,
718
+ "deploymentStatus": deployment_status,
719
+ "startFrom": start_from,
720
+ "pageSize": page_size,
721
+ }
722
+ validated_body = DeploymentStatusFilterRequestBody.model_validate(body_dict)
723
+
724
+ json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
725
+ response = await self._async_make_request("POST", url, json_body)
726
+ elements = response.json().get("elements", NO_ELEMENTS_FOUND)
727
+
728
+ if type(elements) is str or len(elements) == 0:
729
+ logger.info(NO_ELEMENTS_FOUND)
730
+ return NO_ELEMENTS_FOUND
731
+
732
+ if output_format.upper() != "JSON":
733
+ return self._generate_collection_output(
734
+ elements, category, "DigitalProduct", output_format, report_spec
735
+ )
736
+ return elements
407
737
 
738
+ def get_digital_products_by_category(
739
+ self,
740
+ category: str,
741
+ deployment_status: Optional[str] = None,
742
+ start_from: int = 0,
743
+ page_size: int = 100,
744
+ output_format: str = "JSON",
745
+ report_spec: str | dict = None,
746
+ body: Optional[dict | DeploymentStatusFilterRequestBody] = None,
747
+ ) -> list | str:
748
+ """
749
+ Returns the list of digital products matching the category and optional deployment status. Sync version.
750
+
751
+ See _async_get_digital_products_by_category for more details.
752
+ """
753
+ return asyncio.get_event_loop().run_until_complete(
754
+ self._async_get_digital_products_by_category(
755
+ category,
756
+ deployment_status,
757
+ start_from,
758
+ page_size,
759
+ output_format,
760
+ report_spec,
761
+ body,
762
+ )
763
+ )
408
764
 
409
765
  @dynamic_catch
410
- async def _async_get_collections_by_name(self, filter_string: str = None, classification_names: list[str] = None,
411
- body: dict | FilterRequestBody = None,
766
+ async def _async_get_collections_by_name(self, filter_string: Optional[str] = None, classification_names: Optional[list[str]] = None,
767
+ body: Optional[dict | FilterRequestBody] = None,
412
768
  start_from: int = 0, page_size: int = 0,
413
769
  output_format: str = 'JSON',
414
- output_format_set: str | dict = None) -> list | str:
770
+ report_spec: str | dict = None) -> list | str:
415
771
  """ Returns the list of collections with a particular name.
416
772
 
417
773
  Parameters
@@ -429,7 +785,7 @@ class CollectionManager(Client2):
429
785
  the class instance.
430
786
  output_format: str, default = "JSON"
431
787
  - one of "DICT", "MERMAID" or "JSON"
432
- output_format_set: dict , optional, default = None
788
+ report_spec: dict , optional, default = None
433
789
  The desired output columns/fields to include.
434
790
 
435
791
  Returns
@@ -441,9 +797,9 @@ class CollectionManager(Client2):
441
797
  Raises
442
798
  ------
443
799
 
444
- InvalidParameterException
800
+ PyegeriaInvalidParameterException
445
801
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
446
- PropertyServerException
802
+ PyegeriaAPIException
447
803
  Raised by the server when an issue arises in processing a valid request
448
804
  NotAuthorizedException
449
805
  The principle specified by the user_id does not have authorization for the requested action
@@ -453,23 +809,23 @@ class CollectionManager(Client2):
453
809
  _gen_output=self._generate_collection_output,
454
810
  filter_string = filter_string, classification_names = classification_names,
455
811
  start_from = start_from, page_size = page_size,
456
- output_format=output_format, output_format_set=output_format_set,
812
+ output_format=output_format, report_spec=report_spec,
457
813
  body=body)
458
814
 
459
815
  return response
460
816
 
461
817
 
462
- def get_collections_by_name(self, name: str = None, classification_names: list[str] = None,
463
- body: dict | FilterRequestBody = None,
818
+ def get_collections_by_name(self, filter_string: Optional[str] = None, classification_names: Optional[list[str]] = None,
819
+ body: Optional[dict | FilterRequestBody] = None,
464
820
  start_from: int = 0, page_size: int = 0, output_format: str = 'JSON',
465
- output_format_set: str | dict = None) -> list | str:
821
+ report_spec: str | dict = None) -> list | str:
466
822
  """Returns the list of collections matching the search string. Async version.
467
823
  The search string is located in the request body and is interpreted as a plain string.
468
824
  The request parameters, startsWith, endsWith and ignoreCase can be used to allow a fuzzy search.
469
825
 
470
826
  Parameters
471
827
  ----------
472
- name: str,
828
+ filter_string: str,
473
829
  name to use to find matching collections.
474
830
  classification_names: list[str], optional, default = None
475
831
  type of collection to filter by - e.g., DataDict, Folder, Root
@@ -482,7 +838,7 @@ class CollectionManager(Client2):
482
838
  the class instance.
483
839
  output_format: str, default = "JSON"
484
840
  - one of "DICT", "MERMAID" or "JSON"
485
- output_format_set: str | dict, optional, default = None
841
+ report_spec: str | dict, optional, default = None
486
842
  The desired output columns/fields to include.
487
843
 
488
844
  Returns
@@ -497,15 +853,15 @@ class CollectionManager(Client2):
497
853
 
498
854
  """
499
855
  return asyncio.get_event_loop().run_until_complete(
500
- self._async_get_collections_by_name(name, classification_names, body, start_from, page_size,
501
- output_format, output_format_set))
856
+ self._async_get_collections_by_name(filter_string, classification_names, body, start_from, page_size,
857
+ output_format, report_spec))
502
858
 
503
859
 
504
860
  @dynamic_catch
505
- async def _async_get_collections_by_category(self, category: str, classification_names: list[str] = None,
506
- body: dict | FilterRequestBody = None, start_from: int = 0, page_size: int = 0,
861
+ async def _async_get_collections_by_category(self, category: str, classification_names: Optional[list[str]] = None,
862
+ body: Optional[dict | FilterRequestBody] = None, start_from: int = 0, page_size: int = 0,
507
863
  output_format: str = 'JSON',
508
- output_format_set: str | dict = None) -> list | str:
864
+ report_spec: str | dict = None) -> list | str:
509
865
  """Returns the list of collections with a particular category. This is an optional text field in the
510
866
  collection element.
511
867
 
@@ -525,7 +881,7 @@ class CollectionManager(Client2):
525
881
  the class instance.
526
882
  output_format: str, default = "JSON"
527
883
  - one of "DICT", "MERMAID" or "JSON"
528
- output_format_set: str | dict , optional, default = None
884
+ report_spec: str | dict , optional, default = None
529
885
  The desired output columns/fields to include.
530
886
 
531
887
  Returns
@@ -560,17 +916,17 @@ class CollectionManager(Client2):
560
916
  _gen_output=self._generate_collection_output,
561
917
  filter_string = category, classification_names = classification_names,
562
918
  start_from = start_from, page_size = page_size,
563
- output_format=output_format, output_format_set=output_format_set,
919
+ output_format=output_format, report_spec=report_spec,
564
920
  body=body)
565
921
 
566
922
  return response
567
923
 
568
924
 
569
925
 
570
- def get_collections_by_category(self, category: str, classification_names: list[str] = None,
571
- body: dict | FilterRequestBody = None,
926
+ def get_collections_by_category(self, category: str, classification_names: Optional[list[str]] = None,
927
+ body: Optional[dict | FilterRequestBody] = None,
572
928
  start_from: int = 0, page_size: int = 0, output_format: str = 'JSON',
573
- output_format_set: str | dict = None) -> list | str:
929
+ report_spec: str | dict = None) -> list | str:
574
930
  """Returns the list of collections with a particular collectionType. This is an optional text field in the
575
931
  collection element.
576
932
 
@@ -590,7 +946,7 @@ class CollectionManager(Client2):
590
946
  the class instance.
591
947
  output_format: str, default = "JSON"
592
948
  - one of "DICT", "MERMAID" or "JSON"
593
- output_format_set: str | dict, optional, default = None
949
+ report_spec: str | dict, optional, default = None
594
950
  The desired output columns/fields to include.
595
951
 
596
952
  Returns
@@ -602,9 +958,9 @@ class CollectionManager(Client2):
602
958
  Raises
603
959
  ------
604
960
 
605
- InvalidParameterException
961
+ PyegeriaInvalidParameterException
606
962
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
607
- PropertyServerException
963
+ PyegeriaAPIException
608
964
  Raised by the server when an issue arises in processing a valid request
609
965
  NotAuthorizedException
610
966
  The principle specified by the user_id does not have authorization for the requested action
@@ -629,14 +985,14 @@ class CollectionManager(Client2):
629
985
 
630
986
  return asyncio.get_event_loop().run_until_complete(
631
987
  self._async_get_collections_by_category(category, classification_names, body, start_from, page_size,
632
- output_format, output_format_set))
988
+ output_format, report_spec))
633
989
 
634
990
 
635
991
  @dynamic_catch
636
- async def _async_get_collection_by_guid(self, collection_guid: str, element_type: str = None,
637
- body: dict | GetRequestBody = None,
992
+ async def _async_get_collection_by_guid(self, collection_guid: str, element_type: Optional[str] = None,
993
+ body: Optional[dict | GetRequestBody] = None,
638
994
  output_format: str = 'JSON',
639
- output_format_set: str | dict = None) -> dict | str:
995
+ report_spec: str | dict = None) -> dict | str:
640
996
  """Return the properties of a specific collection. Async version.
641
997
 
642
998
  Parameters
@@ -649,7 +1005,7 @@ class CollectionManager(Client2):
649
1005
  full request body.
650
1006
  output_format: str, default = "JSON"
651
1007
  - one of "DICT", "MERMAID" or "JSON"
652
- output_format_set: str | dict, optional, default = None
1008
+ report_spec: str | dict, optional, default = None
653
1009
  The desired output columns/fields to include.
654
1010
 
655
1011
  Returns
@@ -661,9 +1017,9 @@ class CollectionManager(Client2):
661
1017
  Raises
662
1018
  ------
663
1019
 
664
- InvalidParameterException
1020
+ PyegeriaInvalidParameterException
665
1021
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
666
- PropertyServerException
1022
+ PyegeriaAPIException
667
1023
  Raised by the server when an issue arises in processing a valid request
668
1024
  NotAuthorizedException
669
1025
  The principle specified by the user_id does not have authorization for the requested action
@@ -685,7 +1041,7 @@ class CollectionManager(Client2):
685
1041
 
686
1042
  response = await self._async_get_guid_request(url, _type=type,
687
1043
  _gen_output=self._generate_collection_output,
688
- output_format=output_format, output_format_set=output_format_set,
1044
+ output_format=output_format, report_spec=report_spec,
689
1045
  body=body)
690
1046
 
691
1047
  return response
@@ -693,8 +1049,8 @@ class CollectionManager(Client2):
693
1049
 
694
1050
 
695
1051
 
696
- def get_collection_by_guid(self, collection_guid: str, element_type: str = None, body: dict | GetRequestBody= None,
697
- output_format: str = 'JSON', output_format_set: str | dict = None) -> dict | str:
1052
+ def get_collection_by_guid(self, collection_guid: str, element_type: Optional[str] = None, body: dict | GetRequestBody= None,
1053
+ output_format: str = 'JSON', report_spec: str | dict = None) -> dict | str:
698
1054
  """ Return the properties of a specific collection. Async version.
699
1055
 
700
1056
  Parameters
@@ -707,7 +1063,7 @@ class CollectionManager(Client2):
707
1063
  full request body.
708
1064
  output_format: str, default = "JSON"
709
1065
  - one of "DICT", "MERMAID" or "JSON"
710
- output_format_set: dict , optional, default = None
1066
+ report_spec: dict , optional, default = None
711
1067
  The desired output columns/fields to include.
712
1068
 
713
1069
 
@@ -720,9 +1076,9 @@ class CollectionManager(Client2):
720
1076
  Raises
721
1077
  ------
722
1078
 
723
- InvalidParameterException
1079
+ PyegeriaInvalidParameterException
724
1080
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
725
- PropertyServerException
1081
+ PyegeriaAPIException
726
1082
  Raised by the server when an issue arises in processing a valid request
727
1083
  NotAuthorizedException
728
1084
  The principle specified by the user_id does not have authorization for the requested action
@@ -740,14 +1096,14 @@ class CollectionManager(Client2):
740
1096
  """
741
1097
  return asyncio.get_event_loop().run_until_complete(
742
1098
  self._async_get_collection_by_guid(collection_guid, element_type, body,
743
- output_format, output_format_set))
1099
+ output_format, report_spec))
744
1100
 
745
1101
 
746
1102
  @dynamic_catch
747
- async def _async_get_collection_members(self, collection_guid: str = None, collection_name: str = None,
748
- collection_qname: str = None, body: dict | ResultsRequestBody = None, start_from: int = 0,
1103
+ async def _async_get_collection_members(self, collection_guid: Optional[str] = None, collection_name: Optional[str] = None,
1104
+ collection_qname: Optional[str] = None, body: Optional[dict | ResultsRequestBody] = None, start_from: int = 0,
749
1105
  page_size: int = 0, output_format: str = "JSON",
750
- output_format_set: str | dict = None) -> list | str:
1106
+ report_spec: str | dict = None) -> list | str:
751
1107
  """Return a list of elements that are a member of a collection. Async version.
752
1108
 
753
1109
  Parameters
@@ -770,7 +1126,7 @@ class CollectionManager(Client2):
770
1126
  the class instance.
771
1127
  output_format: str, default = "JSON"
772
1128
  - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
773
- output_format_set: str | dict , optional, default = None
1129
+ report_spec: str | dict , optional, default = None
774
1130
  The desired output columns/fields to include.
775
1131
 
776
1132
  Returns
@@ -782,9 +1138,9 @@ class CollectionManager(Client2):
782
1138
  Raises
783
1139
  ------
784
1140
 
785
- InvalidParameterException
1141
+ PyegeriaInvalidParameterException
786
1142
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
787
- PropertyServerException
1143
+ PyegeriaAPIException
788
1144
  Raised by the server when an issue arises in processing a valid request
789
1145
  NotAuthorizedException
790
1146
  The principle specified by the user_id does not have authorization for the requested action
@@ -812,16 +1168,16 @@ class CollectionManager(Client2):
812
1168
 
813
1169
  response = await self._async_get_results_body_request(url, _type="Collection",
814
1170
  _gen_output=self._generate_collection_output,
815
- output_format=output_format, output_format_set=output_format_set,
1171
+ output_format=output_format, report_spec=report_spec,
816
1172
  body=body)
817
1173
 
818
1174
  return response
819
1175
 
820
1176
 
821
- def get_collection_members(self, collection_guid: str = None, collection_name: str = None,
822
- collection_qname: str = None, body: dict = None, start_from: int = 0,
1177
+ def get_collection_members(self, collection_guid: Optional[str] = None, collection_name: Optional[str] = None,
1178
+ collection_qname: Optional[str] = None, body: dict = None, start_from: int = 0,
823
1179
  page_size: int = 0,
824
- output_format: str = "JSON", output_format_set: str | dict = None) -> list | str:
1180
+ output_format: str = "JSON", report_spec: str | dict = None) -> list | str:
825
1181
  """Return a list of elements that are a member of a collection.
826
1182
  Parameters
827
1183
  ----------
@@ -843,7 +1199,7 @@ class CollectionManager(Client2):
843
1199
  the class instance.
844
1200
  output_format: str, default = "JSON"
845
1201
  - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
846
- output_format_set: str | dict , optional, default = None
1202
+ report_spec: str | dict , optional, default = None
847
1203
  The desired output columns/fields to include.
848
1204
 
849
1205
  Returns
@@ -855,9 +1211,9 @@ class CollectionManager(Client2):
855
1211
  Raises
856
1212
  ------
857
1213
 
858
- InvalidParameterException
1214
+ PyegeriaInvalidParameterException
859
1215
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
860
- PropertyServerException
1216
+ PyegeriaAPIException
861
1217
  Raised by the server when an issue arises in processing a valid request
862
1218
  NotAuthorizedException
863
1219
  The principle specified by the user_id does not have authorization for the requested action
@@ -878,15 +1234,15 @@ class CollectionManager(Client2):
878
1234
  loop = asyncio.get_event_loop()
879
1235
  resp = loop.run_until_complete(
880
1236
  self._async_get_collection_members(collection_guid, collection_name, collection_qname, body, start_from,
881
- page_size, output_format, output_format_set))
1237
+ page_size, output_format, report_spec))
882
1238
 
883
1239
  return resp
884
1240
 
885
1241
 
886
1242
  @dynamic_catch
887
- async def _async_get_collection_hierarchy(self, collection_guid: str, body: dict | ResultsRequestBody = None, start_from: int = 0,
1243
+ async def _async_get_collection_hierarchy(self, collection_guid: str, body: Optional[dict | ResultsRequestBody] = None, start_from: int = 0,
888
1244
  page_size: int = 0, output_format: str = "JSON",
889
- output_format_set: str | dict = None) -> list | str:
1245
+ report_spec: str | dict = None) -> list | str:
890
1246
  """ Return a hierarchy of nested collections. Request body is optional Async version.
891
1247
 
892
1248
  Parameters
@@ -903,7 +1259,7 @@ class CollectionManager(Client2):
903
1259
  the class instance.
904
1260
  output_format: str, default = "JSON"
905
1261
  - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
906
- output_format_set: dict , optional, default = None
1262
+ report_spec: dict , optional, default = None
907
1263
  The desired output columns/fields to include.
908
1264
 
909
1265
  Returns
@@ -915,9 +1271,9 @@ class CollectionManager(Client2):
915
1271
  Raises
916
1272
  ------
917
1273
 
918
- InvalidParameterException
1274
+ PyegeriaInvalidParameterException
919
1275
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
920
- PropertyServerException
1276
+ PyegeriaAPIException
921
1277
  Raised by the server when an issue arises in processing a valid request
922
1278
  NotAuthorizedException
923
1279
  The principle specified by the user_id does not have authorization for the requested action
@@ -942,14 +1298,14 @@ class CollectionManager(Client2):
942
1298
  _gen_output=self._generate_collection_output,
943
1299
  start_from=start_from, page_size=page_size,
944
1300
  output_format=output_format,
945
- output_format_set=output_format_set,
1301
+ report_spec=report_spec,
946
1302
  body=body)
947
1303
 
948
1304
  return response
949
1305
 
950
- def get_collection_hierarchy(self, collection_guid: str = None, body: dict| ResultsRequestBody = None, start_from: int = 0,
1306
+ def get_collection_hierarchy(self, collection_guid: Optional[str] = None, body: dict| ResultsRequestBody = None, start_from: int = 0,
951
1307
  page_size: int = 0, output_format: str = "JSON",
952
- output_format_set: str | dict = None) -> list | str:
1308
+ report_spec: str | dict = None) -> list | str:
953
1309
  """ Return a graph of elements that are the nested members of a collection along
954
1310
  with elements immediately connected to the starting collection. The result
955
1311
  includes a mermaid graph of the returned elements.
@@ -968,7 +1324,7 @@ class CollectionManager(Client2):
968
1324
  the class instance.
969
1325
  output_format: str, default = "JSON"
970
1326
  - one of "MD", "LIST", "FORM", "REPORT", "DICT", "MERMAID" or "JSON"
971
- output_format_set: str | dict , optional, default = None
1327
+ report_spec: str | dict , optional, default = None
972
1328
  The desired output columns/fields to include.
973
1329
 
974
1330
  Returns
@@ -980,9 +1336,9 @@ class CollectionManager(Client2):
980
1336
  Raises
981
1337
  ------
982
1338
 
983
- InvalidParameterException
1339
+ PyegeriaInvalidParameterException
984
1340
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
985
- PropertyServerException
1341
+ PyegeriaAPIException
986
1342
  Raised by the server when an issue arises in processing a valid request
987
1343
  NotAuthorizedException
988
1344
  The principle specified by the user_id does not have authorization for the requested action
@@ -1001,13 +1357,13 @@ class CollectionManager(Client2):
1001
1357
  """
1002
1358
  return asyncio.get_event_loop().run_until_complete(
1003
1359
  self._async_get_collection_hierarchy(collection_guid, body, start_from, page_size,
1004
- output_format, output_format_set))
1360
+ output_format, report_spec))
1005
1361
 
1006
1362
 
1007
1363
  @dynamic_catch
1008
- async def _async_create_collection(self, display_name: str = None, description: str = None,
1009
- category: str = None, initial_classifications: list[str] = None,
1010
- body: dict | NewElementRequestBody = None) -> str:
1364
+ async def _async_create_collection(self, display_name: Optional[str] = None, description: Optional[str] = None,
1365
+ category: Optional[str] = None, initial_classifications: Optional[list[str]] = None, prop: list[str] = ["Collection"],
1366
+ body: Optional[dict | NewElementRequestBody] = None) -> str:
1011
1367
  """ Create a new generic collection. If the body is not present, the display_name, description, category
1012
1368
  and classification will be used to create a simple, self-anchored collection.
1013
1369
  Collections: https://egeria-project.org/concepts/collection
@@ -1025,7 +1381,8 @@ class CollectionManager(Client2):
1025
1381
  initial_classifications: list[str], optional
1026
1382
  An initial list of classifications for the collection. This can be used to distinguish, for instance, Folders
1027
1383
  from Root Collections.
1028
-
1384
+ prop: list[str], optional
1385
+ The kind of collection property to use.
1029
1386
  body: dict | NewElementRequestBody, optional
1030
1387
  A dict or NewElementRequestBody representing the details of the collection to create. If supplied, this
1031
1388
  information will be used to create the collection and the other attributes will be ignored. The body is
@@ -1054,7 +1411,7 @@ class CollectionManager(Client2):
1054
1411
  "properties": {
1055
1412
  "class": "CollectionProperties",
1056
1413
  "qualifiedName": "Must provide a unique name here",
1057
- "name": "Add display name here",
1414
+ "displayName": "Add display name here",
1058
1415
  "description": "Add description of the collection here",
1059
1416
  "category": "Add appropriate valid value for type"
1060
1417
  }
@@ -1072,7 +1429,7 @@ class CollectionManager(Client2):
1072
1429
  "properties": {
1073
1430
  "class": "CollectionProperties",
1074
1431
  "qualifiedName": "Must provide a unique name here",
1075
- "name": "Add display name here",
1432
+ "displayName": "Add display name here",
1076
1433
  "description": "Add description of the collection here",
1077
1434
  "category": "Add appropriate valid value for type"
1078
1435
  },
@@ -1098,7 +1455,7 @@ class CollectionManager(Client2):
1098
1455
  "properties": {
1099
1456
  "class": "CollectionProperties",
1100
1457
  "qualifiedName": "Must provide a unique name here",
1101
- "name": "Add display name here",
1458
+ "displayName": "Add display name here",
1102
1459
  "description": "Add description of the collection here",
1103
1460
  "category": "Add appropriate valid value for type"
1104
1461
  },
@@ -1113,7 +1470,11 @@ class CollectionManager(Client2):
1113
1470
  if body:
1114
1471
  validated_body = self.validate_new_element_request(body,"CollectionProperties")
1115
1472
  elif (body is None) and (display_name is not None):
1116
- pre = initial_classifications[0] if initial_classifications is not None else "Collection"
1473
+ if initial_classifications:
1474
+ pre = initial_classifications[0]
1475
+ else:
1476
+ pre = prop[0]
1477
+
1117
1478
  qualified_name = self.__create_qualified_name__(pre, display_name, EGERIA_LOCAL_QUALIFIER)
1118
1479
  if initial_classifications:
1119
1480
  initial_classifications_dict = {}
@@ -1127,7 +1488,8 @@ class CollectionManager(Client2):
1127
1488
  qualified_name = qualified_name,
1128
1489
  display_name = display_name,
1129
1490
  description = description,
1130
- category = category
1491
+ category = category,
1492
+ typeName = prop[0]
1131
1493
  )
1132
1494
  body = {
1133
1495
  "class" :"NewElementRequestBody",
@@ -1140,16 +1502,23 @@ class CollectionManager(Client2):
1140
1502
  raise PyegeriaInvalidParameterException(additional_info={"reason": "Invalid input parameters"})
1141
1503
 
1142
1504
  url = f"{self.collection_command_root}"
1143
- json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1144
- logger.info(json_body)
1145
- resp = await self._async_make_request("POST", url, json_body, is_json=True)
1146
- logger.info(f"Create collection with GUID: {resp.json().get('guid')}")
1147
- return resp.json().get("guid", NO_GUID_RETURNED)
1148
1505
 
1506
+ prop = validated_body.properties['class']
1507
+ prop = prop.replace('Properties','')
1508
+
1509
+ # json_body = validated_body.model_dump_json(indent=2, exclude_none=True)
1510
+ #
1511
+ # logger.info(json_body)
1512
+ # resp = await self._async_make_request("POST", url, json_body, is_json=True)
1513
+ # logger.info(f"Create collection with GUID: {resp.json().get('guid')}")
1514
+ # return resp.json().get("guid", NO_GUID_RETURNED)
1515
+ response = await self._async_create_element_body_request(url, [prop], validated_body)
1516
+ return response
1149
1517
 
1150
- def create_collection(self, display_name: str = None, description: str = None,
1151
- category: str = None, initial_classifications: list[str] = None,
1152
- body: dict | NewElementRequestBody = None) -> str:
1518
+
1519
+ def create_collection(self, display_name: Optional[str] = None, description: Optional[str] = None,
1520
+ category: Optional[str] = None, initial_classifications: Optional[list[str]] = None, prop:list[str]=["Collection"],
1521
+ body: Optional[dict | NewElementRequestBody] = None) -> str:
1153
1522
  """ Create a new generic collection. If the body is not present, the display_name, description, category
1154
1523
  and classification will be used to create a simple, self-anchored collection.
1155
1524
  Collections: https://egeria-project.org/concepts/collection
@@ -1166,7 +1535,8 @@ class CollectionManager(Client2):
1166
1535
  initial_classifications: str, optional
1167
1536
  An initial classification for the collection. This can be used to distinguish, for instance, Folders
1168
1537
  from Root Collections.
1169
-
1538
+ prop: str, optional
1539
+ The types of the collection.
1170
1540
  body: dict | NewElementRequestBody, optional
1171
1541
  A dict or NewElementRequestBody representing the details of the collection to create. If supplied, this
1172
1542
  information will be used to create the collection and the other attributes will be ignored. The body is
@@ -1195,7 +1565,7 @@ class CollectionManager(Client2):
1195
1565
  "properties": {
1196
1566
  "class": "CollectionProperties",
1197
1567
  "qualifiedName": "Must provide a unique name here",
1198
- "name": "Add display name here",
1568
+ "displayName": "Add display name here",
1199
1569
  "description": "Add description of the collection here",
1200
1570
  "category": "Add appropriate valid value for type"
1201
1571
  }
@@ -1213,7 +1583,7 @@ class CollectionManager(Client2):
1213
1583
  "properties": {
1214
1584
  "class": "CollectionProperties",
1215
1585
  "qualifiedName": "Must provide a unique name here",
1216
- "name": "Add display name here",
1586
+ "displayName": "Add display name here",
1217
1587
  "description": "Add description of the collection here",
1218
1588
  "category": "Add appropriate valid value for type"
1219
1589
  },
@@ -1239,7 +1609,7 @@ class CollectionManager(Client2):
1239
1609
  "properties": {
1240
1610
  "class": "CollectionProperties",
1241
1611
  "qualifiedName": "Must provide a unique name here",
1242
- "name": "Add display name here",
1612
+ "displayName": "Add display name here",
1243
1613
  "description": "Add description of the collection here",
1244
1614
  "category": "Add appropriate valid value for type"
1245
1615
  },
@@ -1255,12 +1625,12 @@ class CollectionManager(Client2):
1255
1625
 
1256
1626
  return asyncio.get_event_loop().run_until_complete(
1257
1627
  self._async_create_collection(display_name, description,category,
1258
- initial_classifications, body))
1628
+ initial_classifications, prop, body))
1259
1629
 
1260
1630
 
1261
1631
  @dynamic_catch
1262
- def create_root_collection(self, display_name: str = None, description: str = None,
1263
- category: str = None, body: dict | NewElementRequestBody = None) -> str:
1632
+ def create_root_collection(self, display_name: Optional[str] = None, description: Optional[str] = None,
1633
+ category: Optional[str] = None, body: Optional[dict | NewElementRequestBody] = None) -> str:
1264
1634
  """ Create a new collection with the RootCollection classification. Used to identify the top of a
1265
1635
  collection hierarchy.
1266
1636
  Create Collections: https://egeria-project.org/concepts/collection
@@ -1291,15 +1661,15 @@ class CollectionManager(Client2):
1291
1661
  The principle specified by the user_id does not have authorization for the requested action
1292
1662
 
1293
1663
  """
1664
+ prop = "RootCollection"
1294
1665
 
1295
1666
  return asyncio.get_event_loop().run_until_complete(
1296
1667
  self._async_create_collection(display_name=display_name, description=description, category=category,
1297
- initial_classifications = ["RootCollection"], body=body))
1298
-
1668
+ initial_classifications = [], prop = [prop], body=body))
1299
1669
 
1300
1670
  @dynamic_catch
1301
- def create_folder_collection(self, display_name: str = None, description: str = None,
1302
- category: str = None, body: dict | NewElementRequestBody = None) -> str:
1671
+ def create_folder_collection(self, display_name: Optional[str] = None, description: Optional[str] = None,
1672
+ category: Optional[str] = None, body: Optional[dict | NewElementRequestBody] = None) -> str:
1303
1673
  """ Create a new collection with the RootCollection classification. Used to identify the top of a
1304
1674
  collection hierarchy.
1305
1675
  Create Collections: https://egeria-project.org/concepts/collection
@@ -1330,17 +1700,15 @@ class CollectionManager(Client2):
1330
1700
  The principle specified by the user_id does not have authorization for the requested action
1331
1701
 
1332
1702
  """
1703
+ prop = "CollectionFolder"
1333
1704
 
1334
1705
  return asyncio.get_event_loop().run_until_complete(
1335
- self._async_create_collection(display_name, description, category,
1336
- ["Folder"], body))
1337
-
1338
-
1706
+ self._async_create_collection(display_name=display_name, description=description, category=category,
1707
+ initial_classifications=[], prop=[prop], body=body))
1339
1708
 
1340
- return resp
1341
1709
  @dynamic_catch
1342
- def create_reference_list_collection(self, display_name: str = None, description: str = None,
1343
- category: str = None, body: dict | NewElementRequestBody = None) -> str:
1710
+ def create_reference_list_collection(self, display_name: Optional[str] = None, description: Optional[str] = None,
1711
+ category: Optional[str] = None, body: Optional[dict | NewElementRequestBody] = None) -> str:
1344
1712
  """ Create a new collection with the RootCollection classification. Used to identify the top of a
1345
1713
  collection hierarchy.
1346
1714
  Create Collections: https://egeria-project.org/concepts/collection
@@ -1377,8 +1745,8 @@ class CollectionManager(Client2):
1377
1745
  ["ReferenceList"], body))
1378
1746
 
1379
1747
  @dynamic_catch
1380
- def create_context_event_collection(self, display_name: str = None, description: str = None,
1381
- category: str = None, body: dict | NewElementRequestBody = None) -> str:
1748
+ def create_context_event_collection(self, display_name: Optional[str] = None, description: Optional[str] = None,
1749
+ category: Optional[str] = None, body: Optional[dict | NewElementRequestBody] = None) -> str:
1382
1750
  """ Create a new collection with the RootCollection classification. Used to identify the top of a
1383
1751
  collection hierarchy.
1384
1752
  Create Collections: https://egeria-project.org/concepts/collection
@@ -1415,8 +1783,8 @@ class CollectionManager(Client2):
1415
1783
  ["ContextEvent"], body))
1416
1784
 
1417
1785
  # @dynamic_catch
1418
- # def create_glossary(self, display_name: str, description: str = None, language: str = "English", usage: str = None,
1419
- # category: str = None, body: dict | NewElementRequestBody = None) -> str:
1786
+ # def create_glossary(self, display_name: str, description: Optional[str] = None, language: str = "English", usage: Optional[str] = None,
1787
+ # category: Optional[str] = None, body: Optional[dict | NewElementRequestBody] = None) -> str:
1420
1788
  # """Create a new glossary with optional classification. """
1421
1789
  # if body is None:
1422
1790
  #
@@ -1438,9 +1806,9 @@ class CollectionManager(Client2):
1438
1806
  # return response
1439
1807
 
1440
1808
  @dynamic_catch
1441
- async def _async_create_data_spec_collection(self, display_name: str = None, description: str = None,
1442
- category: str = None, classification_name: str = None,
1443
- body: dict | NewElementRequestBody = None) -> str:
1809
+ async def _async_create_data_spec_collection(self, display_name: Optional[str] = None, description: Optional[str] = None,
1810
+ category: Optional[str] = None, classification_name: Optional[str] = None,
1811
+ body: Optional[dict | NewElementRequestBody] = None) -> str:
1444
1812
  """ Create a new generic collection. If the body is not present, the display_name, description, category
1445
1813
  and classification will be used to create a simple, self-anchored collection.
1446
1814
  Collections: https://egeria-project.org/concepts/collection
@@ -1487,7 +1855,7 @@ class CollectionManager(Client2):
1487
1855
  "properties": {
1488
1856
  "class": "CollectionProperties",
1489
1857
  "qualifiedName": "Must provide a unique name here",
1490
- "name": "Add display name here",
1858
+ "displayName": "Add display name here",
1491
1859
  "description": "Add description of the collection here",
1492
1860
  "category": "Add appropriate valid value for type"
1493
1861
  }
@@ -1505,7 +1873,7 @@ class CollectionManager(Client2):
1505
1873
  "properties": {
1506
1874
  "class": "CollectionProperties",
1507
1875
  "qualifiedName": "Must provide a unique name here",
1508
- "name": "Add display name here",
1876
+ "displayName": "Add display name here",
1509
1877
  "description": "Add description of the collection here",
1510
1878
  "category": "Add appropriate valid value for type"
1511
1879
  },
@@ -1531,7 +1899,7 @@ class CollectionManager(Client2):
1531
1899
  "properties": {
1532
1900
  "class": "CollectionProperties",
1533
1901
  "qualifiedName": "Must provide a unique name here",
1534
- "name": "Add display name here",
1902
+ "displayName": "Add display name here",
1535
1903
  "description": "Add description of the collection here",
1536
1904
  "category": "Add appropriate valid value for type"
1537
1905
  },
@@ -1583,9 +1951,9 @@ class CollectionManager(Client2):
1583
1951
  return resp.json().get("guid", NO_GUID_RETURNED)
1584
1952
 
1585
1953
  @dynamic_catch
1586
- def create_data_spec_collection(self, display_name: str = None, description: str = None,
1587
- category: str = None, classification_name: str = None,
1588
- body: dict | NewElementRequestBody = None) -> str:
1954
+ def create_data_spec_collection(self, display_name: Optional[str] = None, description: Optional[str] = None,
1955
+ category: Optional[str] = None, classification_name: Optional[str] = None,
1956
+ body: Optional[dict | NewElementRequestBody] = None) -> str:
1589
1957
  """ Create a new generic collection. If the body is not present, the display_name, description, category
1590
1958
  and classification will be used to create a simple, self-anchored collection.
1591
1959
  Collections: https://egeria-project.org/concepts/collection
@@ -1631,7 +1999,7 @@ class CollectionManager(Client2):
1631
1999
  "properties": {
1632
2000
  "class": "CollectionProperties",
1633
2001
  "qualifiedName": "Must provide a unique name here",
1634
- "name": "Add display name here",
2002
+ "displayName": "Add display name here",
1635
2003
  "description": "Add description of the collection here",
1636
2004
  "category": "Add appropriate valid value for type"
1637
2005
  }
@@ -1649,7 +2017,7 @@ class CollectionManager(Client2):
1649
2017
  "properties": {
1650
2018
  "class": "CollectionProperties",
1651
2019
  "qualifiedName": "Must provide a unique name here",
1652
- "name": "Add display name here",
2020
+ "displayName": "Add display name here",
1653
2021
  "description": "Add description of the collection here",
1654
2022
  "category": "Add appropriate valid value for type"
1655
2023
  },
@@ -1675,7 +2043,7 @@ class CollectionManager(Client2):
1675
2043
  "properties": {
1676
2044
  "class": "CollectionProperties",
1677
2045
  "qualifiedName": "Must provide a unique name here",
1678
- "name": "Add display name here",
2046
+ "displayName": "Add display name here",
1679
2047
  "description": "Add description of the collection here",
1680
2048
  "category": "Add appropriate valid value for type"
1681
2049
  },
@@ -1695,9 +2063,9 @@ class CollectionManager(Client2):
1695
2063
 
1696
2064
 
1697
2065
  @dynamic_catch
1698
- async def _async_create_data_dictionary_collection(self, display_name: str = None, description: str = None,
1699
- category: str = None, classification_name: str = None,
1700
- body: dict | NewElementRequestBody = None) -> str:
2066
+ async def _async_create_data_dictionary_collection(self, display_name: Optional[str] = None, description: Optional[str] = None,
2067
+ category: Optional[str] = None, classification_name: Optional[str] = None,
2068
+ body: Optional[dict | NewElementRequestBody] = None) -> str:
1701
2069
  """ Create a new generic collection. If the body is not present, the display_name, description, category
1702
2070
  and classification will be used to create a simple, self-anchored collection.
1703
2071
  Collections: https://egeria-project.org/concepts/collection
@@ -1744,7 +2112,7 @@ class CollectionManager(Client2):
1744
2112
  "properties": {
1745
2113
  "class": "CollectionProperties",
1746
2114
  "qualifiedName": "Must provide a unique name here",
1747
- "name": "Add display name here",
2115
+ "displayName": "Add display name here",
1748
2116
  "description": "Add description of the collection here",
1749
2117
  "category": "Add appropriate valid value for type"
1750
2118
  }
@@ -1762,7 +2130,7 @@ class CollectionManager(Client2):
1762
2130
  "properties": {
1763
2131
  "class": "CollectionProperties",
1764
2132
  "qualifiedName": "Must provide a unique name here",
1765
- "name": "Add display name here",
2133
+ "displayName": "Add display name here",
1766
2134
  "description": "Add description of the collection here",
1767
2135
  "category": "Add appropriate valid value for type"
1768
2136
  },
@@ -1788,7 +2156,7 @@ class CollectionManager(Client2):
1788
2156
  "properties": {
1789
2157
  "class": "CollectionProperties",
1790
2158
  "qualifiedName": "Must provide a unique name here",
1791
- "name": "Add display name here",
2159
+ "displayName": "Add display name here",
1792
2160
  "description": "Add description of the collection here",
1793
2161
  "category": "Add appropriate valid value for type"
1794
2162
  },
@@ -1838,9 +2206,9 @@ class CollectionManager(Client2):
1838
2206
  return resp.json().get("guid", NO_GUID_RETURNED)
1839
2207
 
1840
2208
  @dynamic_catch
1841
- def create_data_dictionary_collection(self, display_name: str = None, description: str = None,
1842
- category: str = None, classification_name: str = None,
1843
- body: dict | NewElementRequestBody = None) -> str:
2209
+ def create_data_dictionary_collection(self, display_name: Optional[str] = None, description: Optional[str] = None,
2210
+ category: Optional[str] = None, classification_name: Optional[str] = None,
2211
+ body: Optional[dict | NewElementRequestBody] = None) -> str:
1844
2212
  """ Create a new generic collection. If the body is not present, the display_name, description, category
1845
2213
  and classification will be used to create a simple, self-anchored collection.
1846
2214
  Collections: https://egeria-project.org/concepts/collection
@@ -1886,7 +2254,7 @@ class CollectionManager(Client2):
1886
2254
  "properties": {
1887
2255
  "class": "CollectionProperties",
1888
2256
  "qualifiedName": "Must provide a unique name here",
1889
- "name": "Add display name here",
2257
+ "displayName": "Add display name here",
1890
2258
  "description": "Add description of the collection here",
1891
2259
  "category": "Add appropriate valid value for type"
1892
2260
  }
@@ -1904,7 +2272,7 @@ class CollectionManager(Client2):
1904
2272
  "properties": {
1905
2273
  "class": "CollectionProperties",
1906
2274
  "qualifiedName": "Must provide a unique name here",
1907
- "name": "Add display name here",
2275
+ "displayName": "Add display name here",
1908
2276
  "description": "Add description of the collection here",
1909
2277
  "category": "Add appropriate valid value for type"
1910
2278
  },
@@ -1930,7 +2298,7 @@ class CollectionManager(Client2):
1930
2298
  "properties": {
1931
2299
  "class": "CollectionProperties",
1932
2300
  "qualifiedName": "Must provide a unique name here",
1933
- "name": "Add display name here",
2301
+ "displayName": "Add display name here",
1934
2302
  "description": "Add description of the collection here",
1935
2303
  "category": "Add appropriate valid value for type"
1936
2304
  },
@@ -1957,7 +2325,7 @@ class CollectionManager(Client2):
1957
2325
 
1958
2326
 
1959
2327
  @dynamic_catch
1960
- async def _async_create_collection_from_template(self, body: TemplateRequestBody | dict) -> str:
2328
+ async def _async_create_collection_from_template(self, body: Optional[dict | TemplateRequestBody] = None) -> str:
1961
2329
  """Create a new metadata element to represent a collection using an existing metadata element as a template.
1962
2330
  The template defines additional classifications and relationships that are added to the new collection.
1963
2331
  Async version.
@@ -1974,12 +2342,13 @@ class CollectionManager(Client2):
1974
2342
 
1975
2343
  Raises
1976
2344
  ------
1977
- InvalidParameterException
1978
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
1979
- PropertyServerException
1980
- Raised by the server when an issue arises in processing a valid request
1981
- NotAuthorizedException
1982
- The principle specified by the user_id does not have authorization for the requested action
2345
+ PyegeriaException
2346
+ One of the pyegeria exceptions will be raised if there are issues in communications, message format, or
2347
+ Egeria errors.
2348
+ ValidationError
2349
+ Pydantic validation errors are raised if the body does not conform to the DeleteElementRequestBody.
2350
+ PyegeriaNotAuthorizedException
2351
+ The principle specified by the user_id does not have authorization for the requested action
1983
2352
 
1984
2353
  Notes
1985
2354
  -----
@@ -2030,7 +2399,7 @@ class CollectionManager(Client2):
2030
2399
  return resp.json().get("guid", NO_GUID_RETURNED)
2031
2400
 
2032
2401
 
2033
- def create_collection_from_template(self, body: dict) -> str:
2402
+ def create_collection_from_template(self, body: Optional[dict | TemplateRequestBody] = None) -> str:
2034
2403
  """Create a new metadata element to represent a collection using an existing metadata element as a template.
2035
2404
  The template defines additional classifications and relationships that are added to the new collection.
2036
2405
 
@@ -2045,9 +2414,9 @@ class CollectionManager(Client2):
2045
2414
 
2046
2415
  Raises
2047
2416
  ------
2048
- InvalidParameterException
2417
+ PyegeriaInvalidParameterException
2049
2418
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2050
- PropertyServerException
2419
+ PyegeriaAPIException
2051
2420
  Raised by the server when an issue arises in processing a valid request
2052
2421
  NotAuthorizedException
2053
2422
  The principle specified by the user_id does not have authorization for the requested action
@@ -2107,9 +2476,7 @@ class CollectionManager(Client2):
2107
2476
  A dict or NewElementRequestBody representing the details of the collection to create. If supplied, this
2108
2477
  information will be used to create the collection and the other attributes will be ignored. The body is
2109
2478
  validated before being used.
2110
- merge_update: bool, optional, default = True
2111
- If true then property changes will be overlaid on top of existing properties. If false, existing
2112
- properties will all be replaced by the set provided in the update request.
2479
+
2113
2480
 
2114
2481
  Returns
2115
2482
  -------
@@ -2132,8 +2499,9 @@ class CollectionManager(Client2):
2132
2499
  "class" : "UpdateElementRequestBody",
2133
2500
  "properties": {
2134
2501
  "class" : "CollectionProperties",
2502
+ "contentStatus": "Add appropriate valid value for type",
2135
2503
  "qualifiedName": "Must provide a unique name here",
2136
- "name" : "Add display name here",
2504
+ "displayName" : "Add display name here",
2137
2505
  "description" : "Add description of the collection here",
2138
2506
  "category": "Add appropriate valid value for type"
2139
2507
  },
@@ -2151,10 +2519,6 @@ class CollectionManager(Client2):
2151
2519
  await self._async_update_element_body_request(url, COLLECTION_PROPERTIES_LIST,body)
2152
2520
 
2153
2521
 
2154
-
2155
-
2156
-
2157
-
2158
2522
  @dynamic_catch
2159
2523
  def update_collection(self, collection_guid: str, body: dict | NewElementRequestBody) -> None:
2160
2524
  """ Update the properties of a collection. Use the correct properties object (CollectionProperties,
@@ -2170,9 +2534,7 @@ class CollectionManager(Client2):
2170
2534
  A dict or NewElementRequestBody representing the details of the collection to create. If supplied, this
2171
2535
  information will be used to create the collection and the other attributes will be ignored. The body is
2172
2536
  validated before being used.
2173
- merge_update: bool, optional, default = True
2174
- If true then property changes will be overlaid on top of existing properties. If false, existing
2175
- properties will all be replaced by the set provided in the update request.
2537
+
2176
2538
 
2177
2539
  Returns
2178
2540
  -------
@@ -2196,8 +2558,9 @@ class CollectionManager(Client2):
2196
2558
  "properties": {
2197
2559
  "class" : "CollectionProperties",
2198
2560
  "qualifiedName": "Must provide a unique name here",
2199
- "name" : "Add display name here",
2561
+ "displayName" : "Add display name here",
2200
2562
  "description" : "Add description of the collection here",
2563
+ "contentStatus": "Add appropriate valid value for type",
2201
2564
  "category": "Add appropriate valid value for type"
2202
2565
  },
2203
2566
  "externalSourceGUID": "add guid here",
@@ -2251,7 +2614,7 @@ class CollectionManager(Client2):
2251
2614
  "properties": {
2252
2615
  "class" : "DigitalProductProperties",
2253
2616
  "qualifiedName": "DigitalProduct::Add product name here",
2254
- "name" : "Product contents",
2617
+ "displayName" : "Product contents",
2255
2618
  "description" : "Add description of product and its expected usage here",
2256
2619
  "identifier" : "Add product identifier here",
2257
2620
  "productName" : "Add product name here",
@@ -2281,11 +2644,11 @@ class CollectionManager(Client2):
2281
2644
  default to ACTIVE.
2282
2645
  """
2283
2646
  url = f"{self.collection_command_root}"
2284
- return await self._async_create_element_body_request(url, "DigitalProductProperties", body)
2647
+ return await self._async_create_element_body_request(url, ["DigitalProductProperties"], body)
2285
2648
 
2286
2649
 
2287
2650
  @dynamic_catch
2288
- def create_digital_product(self, body: dict | NewElementRequestBody = None) -> str:
2651
+ def create_digital_product(self, body: Optional[dict | NewElementRequestBody] = None) -> str:
2289
2652
  """ Create a new collection that represents a digital product.
2290
2653
 
2291
2654
  Parameters
@@ -2322,7 +2685,7 @@ class CollectionManager(Client2):
2322
2685
  "properties": {
2323
2686
  "class" : "DigitalProductProperties",
2324
2687
  "qualifiedName": "DigitalProduct::Add product name here",
2325
- "name" : "Product contents",
2688
+ "displayName" : "Product contents",
2326
2689
  "description" : "Add description of product and its expected usage here",
2327
2690
  "identifier" : "Add product identifier here",
2328
2691
  "productName" : "Add product name here",
@@ -2343,10 +2706,9 @@ class CollectionManager(Client2):
2343
2706
  "effectiveTime" : "{{$isoTimestamp}}",
2344
2707
  "forLineage" : false,
2345
2708
  "forDuplicateProcessing" : false,
2346
- "initialStatus" : "ACTIVE"
2347
2709
  }
2348
2710
 
2349
- The valid values for initialStatus are: DRAFT, PREPARED, PROPOSED, APPROVED, REJECTED, APPROVED_CONCEPT,
2711
+ The valid values for Status are: DRAFT, PREPARED, PROPOSED, APPROVED, REJECTED, APPROVED_CONCEPT,
2350
2712
  UNDER_DEVELOPMENT, DEVELOPMENT_COMPLETE, APPROVED_FOR_DEPLOYMENT, ACTIVE, DISABLED, DEPRECATED,
2351
2713
  OTHER. If using OTHER, set the userDefinedStatus with the status value you want. If not specified, will
2352
2714
  default to ACTIVE.
@@ -2356,6 +2718,108 @@ class CollectionManager(Client2):
2356
2718
  self._async_create_digital_product(body))
2357
2719
 
2358
2720
 
2721
+ @dynamic_catch
2722
+ async def _async_create_digital_product_catalog(self, body: dict | NewElementRequestBody) -> str:
2723
+ """ Create a new collection that represents a digital product.
2724
+ Async version.
2725
+
2726
+ Parameters
2727
+ ----------
2728
+ body: dict | NewElementRequestBody
2729
+ A structure representing the details of the digital product to create.
2730
+
2731
+ Returns
2732
+ -------
2733
+ str - the guid of the created collection
2734
+
2735
+ Raises
2736
+ ------
2737
+ PyegeriaException
2738
+ If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2739
+ ValidationError
2740
+ Raised by the pydantic validator if the body does not conform to the NewElementRequestBody.
2741
+ NotAuthorizedException
2742
+ The principle specified by the user_id does not have authorization for the requested action
2743
+
2744
+ Notes
2745
+ -----
2746
+ Note: the three dates: introductionDate, nextVersionDate and withdrawDate must
2747
+ be valid dates if specified, otherwise you will get a 400 error response.
2748
+
2749
+ simple body version:
2750
+ {
2751
+ "class": "NewElementRequestBody",
2752
+ "isOwnAnchor": true,
2753
+ "properties": {
2754
+ "class": "DigitalProductCatalogProperties",
2755
+ "qualifiedName": "Must provide a unique name here",
2756
+ "displayName": "Add display name here",
2757
+ "description": "Add description of the collection here",
2758
+ "category": "Add appropriate valid value for type"
2759
+ }
2760
+ }
2761
+
2762
+ The valid values for initialStatus are: DRAFT, PREPARED, PROPOSED, APPROVED, REJECTED, APPROVED_CONCEPT,
2763
+ UNDER_DEVELOPMENT, DEVELOPMENT_COMPLETE, APPROVED_FOR_DEPLOYMENT, ACTIVE, DISABLED, DEPRECATED,
2764
+ OTHER. If using OTHER, set the userDefinedStatus with the status value you want. If not specified, will
2765
+ default to ACTIVE.
2766
+ """
2767
+ url = f"{self.collection_command_root}"
2768
+ return await self._async_create_element_body_request(url, "DigitalProductCatalogProperties", body)
2769
+
2770
+
2771
+ @dynamic_catch
2772
+ def create_digital_product_catalog(self, body: Optional[dict | NewElementRequestBody] = None) -> str:
2773
+ """ Create a new collection that represents a digital product.
2774
+
2775
+ Parameters
2776
+ ----------
2777
+ body: dict | NewElementRequestBody
2778
+ A structure representing the details of the digital product to create.
2779
+
2780
+ Returns
2781
+ -------
2782
+ str - the guid of the created collection
2783
+
2784
+ Raises
2785
+ ------
2786
+ PyegeriaException
2787
+ If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2788
+ ValidationError
2789
+ Raised by the pydantic validator if the body does not conform to the NewElementRequestBody.
2790
+ NotAuthorizedException
2791
+ The principle specified by the user_id does not have authorization for the requested action
2792
+
2793
+ Notes
2794
+ -----
2795
+ Note: the three dates: introductionDate, nextVersionDate and withdrawDate must
2796
+ be valid dates if specified, otherwise you will get a 400 error response.
2797
+
2798
+ simple body version:
2799
+ {
2800
+ "class": "NewElementRequestBody",
2801
+ "isOwnAnchor": true,
2802
+ "properties": {
2803
+ "class": "DigitalProductCatalogProperties",
2804
+ "qualifiedName": "Must provide a unique name here",
2805
+ "displayName": "Add display name here",
2806
+ "description": "Add description of the collection here",
2807
+ "category": "Add appropriate valid value for type"
2808
+ }
2809
+ }
2810
+
2811
+ The valid values for initialStatus are: DRAFT, PREPARED, PROPOSED, APPROVED, REJECTED, APPROVED_CONCEPT,
2812
+ UNDER_DEVELOPMENT, DEVELOPMENT_COMPLETE, APPROVED_FOR_DEPLOYMENT, ACTIVE, DISABLED, DEPRECATED,
2813
+ OTHER. If using OTHER, set the userDefinedStatus with the status value you want. If not specified, will
2814
+ default to ACTIVE.
2815
+ """
2816
+
2817
+ return asyncio.get_event_loop().run_until_complete(
2818
+ self._async_create_digital_product_catalog(body))
2819
+
2820
+
2821
+
2822
+
2359
2823
  @dynamic_catch
2360
2824
  async def _async_update_digital_product(self, collection_guid: str, body: dict | UpdateElementRequestBody) -> None:
2361
2825
  """ Update the properties of a digital product.
@@ -2371,9 +2835,7 @@ class CollectionManager(Client2):
2371
2835
  A dict or NewElementRequestBody representing the details of the collection to create. If supplied, this
2372
2836
  information will be used to create the collection and the other attributes will be ignored. The body is
2373
2837
  validated before being used.
2374
- merge_update: bool, optional, default = True
2375
- If true then property changes will be overlaid on top of existing properties. If false, existing
2376
- properties will all be replaced by the set provided in the update request.
2838
+
2377
2839
 
2378
2840
  Returns
2379
2841
  -------
@@ -2396,7 +2858,7 @@ class CollectionManager(Client2):
2396
2858
  "properties": {
2397
2859
  "class" : "DigitalProductProperties",
2398
2860
  "qualifiedName": "DigitalProduct::Add product name here",
2399
- "name" : "Product contents",
2861
+ "displayName" : "Product contents",
2400
2862
  "description" : "Add description of product and its expected usage here",
2401
2863
  "userDefinedStatus" : "OBSOLETE",
2402
2864
  "identifier" : "Add product identifier here",
@@ -2439,9 +2901,7 @@ class CollectionManager(Client2):
2439
2901
  A dict or NewElementRequestBody representing the details of the collection to create. If supplied, this
2440
2902
  information will be used to create the collection and the other attributes will be ignored. The body is
2441
2903
  validated before being used.
2442
- merge_update: bool, optional, default = True
2443
- If true then property changes will be overlaid on top of existing properties. If false, existing
2444
- properties will all be replaced by the set provided in the update request.
2904
+
2445
2905
 
2446
2906
  Returns
2447
2907
  -------
@@ -2464,7 +2924,7 @@ class CollectionManager(Client2):
2464
2924
  "properties": {
2465
2925
  "class" : "DigitalProductProperties",
2466
2926
  "qualifiedName": "DigitalProduct::Add product name here",
2467
- "name" : "Product contents",
2927
+ "displayName" : "Product contents",
2468
2928
  "description" : "Add description of product and its expected usage here",
2469
2929
  "userDefinedStatus" : "OBSOLETE",
2470
2930
  "identifier" : "Add product identifier here",
@@ -2493,545 +2953,410 @@ class CollectionManager(Client2):
2493
2953
  self._async_update_digital_product(collection_guid, body))
2494
2954
 
2495
2955
 
2496
- @dynamic_catch
2497
- async def _async_update_collection_status(self, collection_guid: str, status: str = None,
2498
- body: dict | UpdateStatusRequestBody = None):
2499
- """Update the status of a collection. Async version.
2500
-
2501
- Parameters
2502
- ----------
2503
- collection_guid: str
2504
- The guid of the collection to update.
2505
- status: str, optional
2506
- The new lifecycle status for the collection. Ignored, if the body is provided.
2507
- body: dict | UpdateStatusRequestBody, optional
2508
- A structure representing the details of the collection to create. If supplied, these details
2509
- supersede the status parameter provided.
2510
-
2511
- Returns
2512
- -------
2513
- Nothing
2514
-
2515
- Raises
2516
- ------
2517
- InvalidParameterException
2518
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2519
- PropertyServerException
2520
- Raised by the server when an issue arises in processing a valid request
2521
- NotAuthorizedException
2522
- The principle specified by the user_id does not have authorization for the requested action
2523
-
2524
- Notes
2525
- -----
2526
- JSON Structure looks like:
2527
- {
2528
- "class": "UpdateStatusRequestBody",
2529
- "status": "APPROVED",
2530
- "externalSourceGUID": "add guid here",
2531
- "externalSourceName": "add qualified name here",
2532
- "effectiveTime": "{{$isoTimestamp}}",
2533
- "forLineage": false,
2534
- "forDuplicateProcessing": false
2535
- }
2536
- """
2537
-
2538
- url = f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/collection-manager/metadata-elements/{collection_guid}/update-status"
2539
- await self._async_update_status_request(url, status, body)
2540
-
2541
- @dynamic_catch
2542
- def update_collection_status(self, collection_guid: str, status: str = None,
2543
- body: dict | UpdateStatusRequestBody = None):
2544
- """Update the status of a DigitalProduct collection.
2545
-
2546
- Parameters
2547
- ----------
2548
- collection_guid: str
2549
- The guid of the collection to update.
2550
- status: str, optional
2551
- The new lifecycle status for the digital product. Ignored, if the body is provided.
2552
- body: dict | UpdateStatusRequestBody, optional
2553
- A structure representing the details of the collection to create. If supplied, these details
2554
- supersede the status parameter provided.
2555
-
2556
- Returns
2557
- -------
2558
- Nothing
2559
-
2560
- Raises
2561
- ------
2562
- InvalidParameterException
2563
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2564
- PropertyServerException
2565
- Raised by the server when an issue arises in processing a valid request
2566
- NotAuthorizedException
2567
- The principle specified by the user_id does not have authorization for the requested action
2568
-
2569
- Notes
2570
- -----
2571
- JSON Structure looks like:
2572
- {
2573
- "class": "UpdateStatusRequestBody",
2574
- "status": "APPROVED",
2575
- "externalSourceGUID": "add guid here",
2576
- "externalSourceName": "add qualified name here",
2577
- "effectiveTime": "{{$isoTimestamp}}",
2578
- "forLineage": false,
2579
- "forDuplicateProcessing": false
2580
- }
2581
- """
2582
- loop = asyncio.get_event_loop()
2583
- loop.run_until_complete(self._async_update_collection_status(collection_guid, status, body))
2584
-
2585
-
2586
- @dynamic_catch
2587
- def update_digital_product_status(self, digital_product_guid: str, status: str = None,
2588
- body: dict | UpdateStatusRequestBody = None):
2589
- """Update the status of a DigitalProduct collection.
2590
-
2591
- Parameters
2592
- ----------
2593
- digital_product_guid: str
2594
- The guid of the collection to update.
2595
- status: str, optional
2596
- The new lifecycle status for the digital product. Ignored, if the body is provided.
2597
- body: dict | UpdateStatusRequestBody, optional
2598
- A structure representing the details of the collection to create. If supplied, these details
2599
- supersede the status parameter provided.
2600
-
2601
- Returns
2602
- -------
2603
- Nothing
2604
-
2605
- Raises
2606
- ------
2607
- InvalidParameterException
2608
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2609
- PropertyServerException
2610
- Raised by the server when an issue arises in processing a valid request
2611
- NotAuthorizedException
2612
- The principle specified by the user_id does not have authorization for the requested action
2613
-
2614
- Notes
2615
- -----
2616
- JSON Structure looks like:
2617
- {
2618
- "class": "UpdateStatusRequestBody",
2619
- "status": "APPROVED",
2620
- "externalSourceGUID": "add guid here",
2621
- "externalSourceName": "add qualified name here",
2622
- "effectiveTime": "{{$isoTimestamp}}",
2623
- "forLineage": false,
2624
- "forDuplicateProcessing": false
2625
- }
2626
- """
2627
- loop = asyncio.get_event_loop()
2628
- loop.run_until_complete(self._async_update_collection_status(digital_product_guid, status, body))
2629
-
2630
-
2631
- @dynamic_catch
2632
- async def _async_link_digital_product_dependency(self, upstream_digital_prod_guid: str,
2633
- downstream_digital_prod_guid: str,
2634
- body: dict | NewRelationshipRequestBody = None):
2635
- """ Link two dependent digital products. The linked elements are of type DigitalProduct.
2636
- Request body is optional. Async version.
2637
-
2638
- Parameters
2639
- ----------
2640
- upstream_digital_prod_guid: str
2641
- The guid of the first digital product
2642
- downstream_digital_prod_guid: str
2643
- The guid of the downstream digital product
2644
- body: dict | NewRelationshipRequestBody, optional, default = None
2645
- A dict representing the details of the relationship.
2646
-
2647
- Returns
2648
- -------
2649
- Nothing
2650
-
2651
- Raises
2652
- ------
2653
- InvalidParameterException
2654
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2655
- PropertyServerException
2656
- Raised by the server when an issue arises in processing a valid request
2657
- NotAuthorizedException
2658
- The principle specified by the user_id does not have authorization for the requested action
2659
-
2660
- Notes
2661
- -----
2662
- JSON Structure looks like:
2663
- {
2664
- "class" : "NewRelationshipRequestBody",
2665
- "externalSourceGUID": "add guid here",
2666
- "externalSourceName": "add qualified name here",
2667
- "effectiveTime" : "{{$isoTimestamp}}",
2668
- "forLineage" : false,
2669
- "forDuplicateProcessing" : false,
2670
- "properties": {
2671
- "class": "InformationSupplyChainLinkProperties",
2672
- "label": "add label here",
2673
- "description": "add description here",
2674
- "effectiveFrom": "{{$isoTimestamp}}",
2675
- "effectiveTo": "{{$isoTimestamp}}"
2676
- }
2677
- }
2678
- """
2679
- url = (
2680
- f"{self.platform_url}/servers/"
2681
- f"{self.view_server}/api/open-metadata/collection-manager/collections/digital-products/"
2682
- f"{upstream_digital_prod_guid}/product-dependencies/{downstream_digital_prod_guid}/attach")
2683
- await self._async_new_relationship_request(url, "InformationSupplyChainLinkProperties", body)
2684
- logger.info(f"Linked {upstream_digital_prod_guid} -> {downstream_digital_prod_guid}")
2685
-
2686
-
2687
- def link_digital_product_dependency(self, upstream_digital_prod_guid: str, downstream_digital_prod_guid: str,
2688
- body: dict | NewRelationshipRequestBody= None):
2689
- """ Link two dependent digital products. The linked elements are of type DigitalProduct.
2690
- Request body is optional.
2691
-
2692
- Parameters
2693
- ----------
2694
- upstream_digital_prod_guid: str
2695
- The guid of the first digital product
2696
- downstream_digital_prod_guid: str
2697
- The guid of the downstream digital product
2698
- body: dict | NewRelationshipRequestBody, optional, default = None
2699
- A structure representing the details of the relationship.
2700
-
2701
- Returns
2702
- -------
2703
- Nothing
2704
-
2705
- Raises
2706
- ------
2707
- InvalidParameterException
2708
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2709
- PropertyServerException
2710
- Raised by the server when an issue arises in processing a valid request
2711
- NotAuthorizedException
2712
- The principle specified by the user_id does not have authorization for the requested action
2713
-
2714
- Notes
2715
- -----
2716
- JSON Structure looks like:
2717
- JSON Structure looks like:
2718
- {
2719
- "class" : "NewRelationshipRequestBody",
2720
- "externalSourceGUID": "add guid here",
2721
- "externalSourceName": "add qualified name here",
2722
- "effectiveTime" : "{{$isoTimestamp}}",
2723
- "forLineage" : false,
2724
- "forDuplicateProcessing" : false,
2725
- "properties": {
2726
- "class": "InformationSupplyChainLinkProperties",
2727
- "label": "add label here",
2728
- "description": "add description here",
2729
- "effectiveFrom": "{{$isoTimestamp}}",
2730
- "effectiveTo": "{{$isoTimestamp}}"
2731
- }
2732
- }
2733
- """
2734
- loop = asyncio.get_event_loop()
2735
- loop.run_until_complete(
2736
- self._async_link_digital_product_dependency(upstream_digital_prod_guid, downstream_digital_prod_guid,
2737
- body))
2738
-
2739
-
2740
- @dynamic_catch
2741
- async def _async_detach_digital_product_dependency(self, upstream_digital_prod_guid: str,
2742
- downstream_digital_prod_guid: str,
2743
- body: dict | DeleteRequestBody = None)-> None:
2744
- """ Unlink two dependent digital products. The linked elements are of type DigitalProduct.
2745
- Request body is optional. Async version.
2746
-
2747
- Parameters
2748
- ----------
2749
- upstream_digital_prod_guid: str
2750
- The guid of the first digital product
2751
- downstream_digital_prod_guid: str
2752
- The guid of the downstream digital product
2753
- body: dict | DeleteRequestBody, optional, default = None
2754
- A structure representing the details of the relationship.
2755
-
2756
- Returns
2757
- -------
2758
- Nothing
2759
-
2760
- Raises
2761
- ------
2762
- InvalidParameterException
2763
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2764
- PropertyServerException
2765
- Raised by the server when an issue arises in processing a valid request
2766
- NotAuthorizedException
2767
- The principle specified by the user_id does not have authorization for the requested action
2768
-
2769
- Notes
2770
- -----
2771
- JSON Structure looks like:
2772
- {
2773
- "class": "DeleteRequestBody",
2774
- "externalSourceGUID": "add guid here",
2775
- "externalSourceName": "add qualified name here",
2776
- "effectiveTime": "{{$isoTimestamp}}",
2777
- "forLineage": false,
2778
- "forDuplicateProcessing": false
2779
- }
2780
-
2781
- """
2782
-
2783
- url = (
2784
- f"{self.platform_url}/servers/"
2785
- f"{self.view_server}/api/open-metadata/collection-manager/collections/digital-products/"
2786
- f"{upstream_digital_prod_guid}/product-dependencies/{downstream_digital_prod_guid}/detach")
2787
- await self._async_delete_request(url, body)
2788
- logger.info(f"Detached digital product dependency {upstream_digital_prod_guid} -> {downstream_digital_prod_guid}")
2789
-
2790
-
2791
- def detach_digital_product_dependency(self, upstream_digital_prod_guid: str, downstream_digital_prod_guid: str,
2792
- body: dict | DeleteRequestBody= None):
2793
- """ Unlink two dependent digital products. The linked elements are of type DigitalProduct.
2794
- Request body is optional.
2795
-
2796
- Parameters
2797
- ----------
2798
- upstream_digital_prod_guid: str
2799
- The guid of the first digital product
2800
- downstream_digital_prod_guid: str
2801
- The guid of the downstream digital product
2802
- body: dict | DeleteRequestBody, optional, default = None
2803
- A structure representing the details of the relationship.
2804
-
2805
- Returns
2806
- -------
2807
- Nothing
2808
-
2809
- Raises
2810
- ------
2811
- InvalidParameterException
2812
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2813
- PropertyServerException
2814
- Raised by the server when an issue arises in processing a valid request
2815
- NotAuthorizedException
2816
- The principle specified by the user_id does not have authorization for the requested action
2817
-
2818
- Notes
2819
- -----
2820
- JSON Structure looks like:
2821
- {
2822
- "class": "DeleteRequestBody",
2823
- "externalSourceGUID": "add guid here",
2824
- "externalSourceName": "add qualified name here",
2825
- "effectiveTime": "{{$isoTimestamp}}",
2826
- "forLineage": false,
2827
- "forDuplicateProcessing": false
2828
- }
2829
- """
2830
- loop = asyncio.get_event_loop()
2831
- loop.run_until_complete(
2832
- self._async_detach_digital_product_dependency(upstream_digital_prod_guid, downstream_digital_prod_guid,
2833
- body))
2834
-
2835
-
2836
-
2837
-
2838
-
2839
- @dynamic_catch
2840
- async def _async_link_product_manager(self, digital_prod_guid: str, digital_prod_manager_guid: str,
2841
- body: dict | NewRelationshipRequestBody = None) -> None:
2842
- """ Attach a product manager to a digital product. Request body is optional.
2843
- Request body is optional. Async version.
2844
-
2845
- Parameters
2846
- ----------
2847
- digital_prod_guid: str
2848
- The guid of the digital product
2849
- digital_prod_manager_guid: str
2850
- The guid of the digital_product_manager
2851
- body: dict | NewRelationshipRequestBody, optional, default = None
2852
- A structure representing the details of the relationship.
2853
-
2854
- Returns
2855
- -------
2856
- Nothing
2857
-
2858
- Raises
2859
- ------
2860
- InvalidParameterException
2861
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2862
- PropertyServerException
2863
- Raised by the server when an issue arises in processing a valid request
2864
- NotAuthorizedException
2865
- The principle specified by the user_id does not have authorization for the requested action
2866
-
2867
- Notes
2868
- -----
2869
- JSON Structure looks like:
2870
- {
2871
- "class": "NewRelationshipRequestBody",
2872
- "properties": {
2873
- "assignmentType": "Add type here",
2874
- "description": "Add assignment description here"
2875
- },
2876
- "externalSourceGUID": "add guid here",
2877
- "externalSourceName": "add qualified name here",
2878
- "effectiveTime": "{{$isoTimestamp}}",
2879
- "forLineage": false,
2880
- "forDuplicateProcessing": false
2881
- }
2882
-
2883
- """
2884
- url = (
2885
- f"{self.platform_url}/servers/"
2886
- f"{self.view_server}/api/open-metadata/collection-manager/collections/digital"
2887
- f"-products/"
2888
- f"{digital_prod_guid}/product-managers/{digital_prod_manager_guid}/attach")
2889
- await self._async_new_relationship_request(url, "AssignmentScopeProperties",body)
2890
- logger.info(f"Attached digital product manager {digital_prod_guid} -> {digital_prod_manager_guid}")
2891
-
2892
-
2893
- def link_product_manager(self, digital_prod_guid: str, digital_prod_manager_guid: str, body: dict | NewRelationshipRequestBody = None):
2894
- """ Attach a product manager to a digital product. Request body is optional.
2895
- Request body is optional.
2896
-
2897
- Parameters
2898
- ----------
2899
- digital_prod_guid: str
2900
- The guid of the digital product
2901
- digital_prod_manager_guid: str
2902
- The guid of the digital_product_manager
2903
- body: dict | NewRelationshipRequestBody, optional, default = None
2904
- A structure representing the details of the relationship.
2905
-
2906
- Returns
2907
- -------
2908
- Nothing
2909
-
2910
- Raises
2911
- ------
2912
- InvalidParameterException
2913
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2914
- PropertyServerException
2915
- Raised by the server when an issue arises in processing a valid request
2916
- NotAuthorizedException
2917
- The principle specified by the user_id does not have authorization for the requested action
2918
-
2919
- Notes
2920
- -----
2921
- JSON Structure looks like:
2922
- {
2923
- "class": "NewRelationshipRequestBody",
2924
- "properties": {
2925
- "assignmentType": "Add type here",
2926
- "description": "Add assignment description here"
2927
- },
2928
- "externalSourceGUID": "add guid here",
2929
- "externalSourceName": "add qualified name here",
2930
- "effectiveTime": "{{$isoTimestamp}}",
2931
- "forLineage": false,
2932
- "forDuplicateProcessing": false
2933
- }
2934
-
2935
- """
2936
- loop = asyncio.get_event_loop()
2937
- loop.run_until_complete(
2938
- self._async_link_product_manager(digital_prod_guid, digital_prod_manager_guid, body))
2939
-
2940
-
2941
- @dynamic_catch
2942
- async def _async_detach_product_manager(self, digital_prod_guid: str,
2943
- digital_prod_manager_guid: str,
2944
- body: dict | DeleteRequestBody = None)-> None:
2945
- """ Detach a digital product manager from a digital product.
2946
- Request body is optional. Async version.
2947
-
2948
- Parameters
2949
- ----------
2950
- digital_prod_guid: str
2951
- The guid of the digital product.
2952
- prod_manager: str
2953
- The guid of the digital product manager.
2954
- body: dict | DeleteRequestBody, optional, default = None
2955
- A structure representing the details of the relationship.
2956
-
2957
- Returns
2958
- -------
2959
- Nothing
2960
-
2961
- Raises
2962
- ------
2963
- InvalidParameterException
2964
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2965
- PropertyServerException
2966
- Raised by the server when an issue arises in processing a valid request
2967
- NotAuthorizedException
2968
- The principle specified by the user_id does not have authorization for the requested action
2969
-
2970
- Notes
2971
- -----
2972
- JSON Structure looks like:
2973
- {
2974
- "class": "DeleteRequestBody",
2975
- "externalSourceGUID": "add guid here",
2976
- "externalSourceName": "add qualified name here",
2977
- "effectiveTime": "{{$isoTimestamp}}",
2978
- "forLineage": false,
2979
- "forDuplicateProcessing": false
2980
- }
2981
-
2982
- """
2983
- url = (
2984
- f"{self.platform_url}/servers/"
2985
- f"{self.view_server}/api/open-metadata/collection-manager/collections/digital-products/"
2986
- f"{digital_prod_guid}/product-dependencies/{digital_prod_manager_guid}/detach")
2987
- await self._async_delete_request(url, body)
2988
- logger.info(f"Detached digital product manager {digital_prod_guid} -> {digital_prod_manager_guid}")
2989
-
2990
- @dynamic_catch
2991
- def detach_product_manager(self, digital_prod_guid: str, digital_prod_manager_guid: str,
2992
- body: dict | DeleteRequestBody= None):
2993
- """ Detach a digital product manager from a digital product.
2994
- Request body is optional. Async version.
2995
-
2996
- Parameters
2997
- ----------
2998
- digital_prod_guid: str
2999
- The guid of the digital product.
3000
- digital_prod_manager_guid: str
3001
- The guid of the digital product manager.
3002
- body: dict | DeleteRequestBody, optional, default = None
3003
- A structure representing the details of the relationship.
3004
-
3005
- Returns
3006
- -------
3007
- Nothing
2956
+ # @dynamic_catch
2957
+ # async def _async_link_digital_product_dependency(self, upstream_digital_prod_guid: str,
2958
+ # downstream_digital_prod_guid: str,
2959
+ # body: Optional[dict | NewRelationshipRequestBody] = None):
2960
+ # """ Link two dependent digital products. The linked elements are of type DigitalProduct.
2961
+ # Request body is optional. Async version.
2962
+ #
2963
+ # Parameters
2964
+ # ----------
2965
+ # upstream_digital_prod_guid: str
2966
+ # The guid of the first digital product
2967
+ # downstream_digital_prod_guid: str
2968
+ # The guid of the downstream digital product
2969
+ # body: dict | NewRelationshipRequestBody, optional, default = None
2970
+ # A dict representing the details of the relationship.
2971
+ #
2972
+ # Returns
2973
+ # -------
2974
+ # Nothing
2975
+ #
2976
+ # Raises
2977
+ # ------
2978
+ # PyegeriaInvalidParameterException
2979
+ # If the client passes incorrect parameters on the request - such as bad URLs or invalid values
2980
+ # PyegeriaAPIException
2981
+ # Raised by the server when an issue arises in processing a valid request
2982
+ # NotAuthorizedException
2983
+ # The principle specified by the user_id does not have authorization for the requested action
2984
+ #
2985
+ # Notes
2986
+ # -----
2987
+ # JSON Structure looks like:
2988
+ # {
2989
+ # "class" : "NewRelationshipRequestBody",
2990
+ # "externalSourceGUID": "add guid here",
2991
+ # "externalSourceName": "add qualified name here",
2992
+ # "effectiveTime" : "{{$isoTimestamp}}",
2993
+ # "forLineage" : false,
2994
+ # "forDuplicateProcessing" : false,
2995
+ # "properties": {
2996
+ # "class": "DigitalProductDependencyProperties",
2997
+ # "label": "add label here",
2998
+ # "description": "add description here",
2999
+ # "effectiveFrom": "{{$isoTimestamp}}",
3000
+ # "effectiveTo": "{{$isoTimestamp}}"
3001
+ # }
3002
+ # }
3003
+ # """
3004
+ # url = (
3005
+ # f"{self.platform_url}/servers/"
3006
+ # f"{self.view_server}/api/open-metadata/collection-manager/collections/digital-products/"
3007
+ # f"{upstream_digital_prod_guid}/product-dependencies/{downstream_digital_prod_guid}/attach")
3008
+ # await self._async_new_relationship_request(url, ["InformationSupplyChainLinkProperties"], body)
3009
+ # logger.info(f"Linked {upstream_digital_prod_guid} -> {downstream_digital_prod_guid}")
3010
+ #
3011
+ #
3012
+ # def link_digital_product_dependency(self, upstream_digital_prod_guid: str, downstream_digital_prod_guid: str,
3013
+ # body: dict | NewRelationshipRequestBody= None):
3014
+ # """ Link two dependent digital products. The linked elements are of type DigitalProduct.
3015
+ # Request body is optional.
3016
+ #
3017
+ # Parameters
3018
+ # ----------
3019
+ # upstream_digital_prod_guid: str
3020
+ # The guid of the first digital product
3021
+ # downstream_digital_prod_guid: str
3022
+ # The guid of the downstream digital product
3023
+ # body: dict | NewRelationshipRequestBody, optional, default = None
3024
+ # A structure representing the details of the relationship.
3025
+ #
3026
+ # Returns
3027
+ # -------
3028
+ # Nothing
3029
+ #
3030
+ # Raises
3031
+ # ------
3032
+ # PyegeriaInvalidParameterException
3033
+ # If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3034
+ # PyegeriaAPIException
3035
+ # Raised by the server when an issue arises in processing a valid request
3036
+ # NotAuthorizedException
3037
+ # The principle specified by the user_id does not have authorization for the requested action
3038
+ #
3039
+ # Notes
3040
+ # -----
3041
+ # JSON Structure looks like:
3042
+ # JSON Structure looks like:
3043
+ # {
3044
+ # "class" : "NewRelationshipRequestBody",
3045
+ # "externalSourceGUID": "add guid here",
3046
+ # "externalSourceName": "add qualified name here",
3047
+ # "effectiveTime" : "{{$isoTimestamp}}",
3048
+ # "forLineage" : false,
3049
+ # "forDuplicateProcessing" : false,
3050
+ # "properties": {
3051
+ # "class": "InformationSupplyChainLinkProperties",
3052
+ # "label": "add label here",
3053
+ # "description": "add description here",
3054
+ # "effectiveFrom": "{{$isoTimestamp}}",
3055
+ # "effectiveTo": "{{$isoTimestamp}}"
3056
+ # }
3057
+ # }
3058
+ # """
3059
+ # loop = asyncio.get_event_loop()
3060
+ # loop.run_until_complete(
3061
+ # self._async_link_digital_product_dependency(upstream_digital_prod_guid, downstream_digital_prod_guid,
3062
+ # body))
3063
+ #
3064
+ #
3065
+ # @dynamic_catch
3066
+ # async def _async_detach_digital_product_dependency(self, upstream_digital_prod_guid: str,
3067
+ # downstream_digital_prod_guid: str,
3068
+ # body: Optional[dict | DeleteRelationshipRequestBody] = None)-> None:
3069
+ # """ Unlink two dependent digital products. The linked elements are of type DigitalProduct.
3070
+ # Request body is optional. Async version.
3071
+ #
3072
+ # Parameters
3073
+ # ----------
3074
+ # upstream_digital_prod_guid: str
3075
+ # The guid of the first digital product
3076
+ # downstream_digital_prod_guid: str
3077
+ # The guid of the downstream digital product
3078
+ # body: dict | DeleteRelationshipRequestBody, optional, default = None
3079
+ # A structure representing the details of the relationship.
3080
+ #
3081
+ # Returns
3082
+ # -------
3083
+ # Nothing
3084
+ #
3085
+ # Raises
3086
+ # ------
3087
+ # PyegeriaInvalidParameterException
3088
+ # If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3089
+ # PyegeriaAPIException
3090
+ # Raised by the server when an issue arises in processing a valid request
3091
+ # NotAuthorizedException
3092
+ # The principle specified by the user_id does not have authorization for the requested action
3093
+ #
3094
+ # Notes
3095
+ # -----
3096
+ # JSON Structure looks like:
3097
+ # {
3098
+ # "class": "DeleteRelationshipRequestBody",
3099
+ # "externalSourceGUID": "add guid here",
3100
+ # "externalSourceName": "add qualified name here",
3101
+ # "effectiveTime": "{{$isoTimestamp}}",
3102
+ # "forLineage": false,
3103
+ # "forDuplicateProcessing": false
3104
+ # }
3105
+ #
3106
+ # """
3107
+ #
3108
+ # url = (
3109
+ # f"{self.platform_url}/servers/"
3110
+ # f"{self.view_server}/api/open-metadata/collection-manager/collections/digital-products/"
3111
+ # f"{upstream_digital_prod_guid}/product-dependencies/{downstream_digital_prod_guid}/detach")
3112
+ # await self._async_delete_relationship_request(url, body)
3113
+ # logger.info(f"Detached digital product dependency {upstream_digital_prod_guid} -> {downstream_digital_prod_guid}")
3114
+ #
3115
+ #
3116
+ # def detach_digital_product_dependency(self, upstream_digital_prod_guid: str, downstream_digital_prod_guid: str,
3117
+ # body: dict | DeleteRelationshipRequestBody= None):
3118
+ # """ Unlink two dependent digital products. The linked elements are of type DigitalProduct.
3119
+ # Request body is optional.
3120
+ #
3121
+ # Parameters
3122
+ # ----------
3123
+ # upstream_digital_prod_guid: str
3124
+ # The guid of the first digital product
3125
+ # downstream_digital_prod_guid: str
3126
+ # The guid of the downstream digital product
3127
+ # body: dict | DeleteRelationshipRequestBody, optional, default = None
3128
+ # A structure representing the details of the relationship.
3129
+ #
3130
+ # Returns
3131
+ # -------
3132
+ # Nothing
3133
+ #
3134
+ # Raises
3135
+ # ------
3136
+ # PyegeriaInvalidParameterException
3137
+ # If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3138
+ # PyegeriaAPIException
3139
+ # Raised by the server when an issue arises in processing a valid request
3140
+ # NotAuthorizedException
3141
+ # The principle specified by the user_id does not have authorization for the requested action
3142
+ #
3143
+ # Notes
3144
+ # -----
3145
+ # JSON Structure looks like:
3146
+ # {
3147
+ # "class": "DeleteRelationshipRequestBody",
3148
+ # "externalSourceGUID": "add guid here",
3149
+ # "externalSourceName": "add qualified name here",
3150
+ # "effectiveTime": "{{$isoTimestamp}}",
3151
+ # "forLineage": false,
3152
+ # "forDuplicateProcessing": false
3153
+ # }
3154
+ # """
3155
+ # loop = asyncio.get_event_loop()
3156
+ # loop.run_until_complete(
3157
+ # self._async_detach_digital_product_dependency(upstream_digital_prod_guid, downstream_digital_prod_guid,
3158
+ # body))
3159
+ #
3160
+ #
3008
3161
 
3009
- Raises
3010
- ------
3011
- InvalidParameterException
3012
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3013
- PropertyServerException
3014
- Raised by the server when an issue arises in processing a valid request
3015
- NotAuthorizedException
3016
- The principle specified by the user_id does not have authorization for the requested action
3017
3162
 
3018
- Notes
3019
- -----
3020
- JSON Structure looks like:
3021
- {
3022
- "class": "DeleteRequestBody",
3023
- "externalSourceGUID": "add guid here",
3024
- "externalSourceName": "add qualified name here",
3025
- "effectiveTime": "{{$isoTimestamp}}",
3026
- "forLineage": false,
3027
- "forDuplicateProcessing": false
3028
- }
3029
3163
 
3030
- """
3031
- loop = asyncio.get_event_loop()
3032
- loop.run_until_complete(
3033
- self._async_detach_product_manager(digital_prod_guid, digital_prod_manager_guid,
3034
- body))
3164
+ # @dynamic_catch
3165
+ # async def _async_link_product_manager(self, digital_prod_guid: str, digital_prod_manager_guid: str,
3166
+ # body: Optional[dict | NewRelationshipRequestBody] = None) -> None:
3167
+ # """ Attach a product manager to a digital product. Request body is optional.
3168
+ # Request body is optional. Async version.
3169
+ #
3170
+ # Parameters
3171
+ # ----------
3172
+ # digital_prod_guid: str
3173
+ # The guid of the digital product
3174
+ # digital_prod_manager_guid: str
3175
+ # The guid of the digital_product_manager
3176
+ # body: dict | NewRelationshipRequestBody, optional, default = None
3177
+ # A structure representing the details of the relationship.
3178
+ #
3179
+ # Returns
3180
+ # -------
3181
+ # Nothing
3182
+ #
3183
+ # Raises
3184
+ # ------
3185
+ # PyegeriaInvalidParameterException
3186
+ # If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3187
+ # PyegeriaAPIException
3188
+ # Raised by the server when an issue arises in processing a valid request
3189
+ # NotAuthorizedException
3190
+ # The principle specified by the user_id does not have authorization for the requested action
3191
+ #
3192
+ # Notes
3193
+ # -----
3194
+ # JSON Structure looks like:
3195
+ # {
3196
+ # "class": "NewRelationshipRequestBody",
3197
+ # "properties": {
3198
+ # "assignmentType": "Add type here",
3199
+ # "description": "Add assignment description here"
3200
+ # },
3201
+ # "externalSourceGUID": "add guid here",
3202
+ # "externalSourceName": "add qualified name here",
3203
+ # "effectiveTime": "{{$isoTimestamp}}",
3204
+ # "forLineage": false,
3205
+ # "forDuplicateProcessing": false
3206
+ # }
3207
+ #
3208
+ # """
3209
+ # url = (
3210
+ # f"{self.platform_url}/servers/"
3211
+ # f"{self.view_server}/api/open-metadata/collection-manager/collections/digital"
3212
+ # f"-products/"
3213
+ # f"{digital_prod_guid}/product-managers/{digital_prod_manager_guid}/attach")
3214
+ # await self._async_new_relationship_request(url, "AssignmentScopeProperties",body)
3215
+ # logger.info(f"Attached digital product manager {digital_prod_guid} -> {digital_prod_manager_guid}")
3216
+ #
3217
+ #
3218
+ # def link_product_manager(self, digital_prod_guid: str, digital_prod_manager_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None):
3219
+ # """ Attach a product manager to a digital product. Request body is optional.
3220
+ # Request body is optional.
3221
+ #
3222
+ # Parameters
3223
+ # ----------
3224
+ # digital_prod_guid: str
3225
+ # The guid of the digital product
3226
+ # digital_prod_manager_guid: str
3227
+ # The guid of the digital_product_manager
3228
+ # body: dict | NewRelationshipRequestBody, optional, default = None
3229
+ # A structure representing the details of the relationship.
3230
+ #
3231
+ # Returns
3232
+ # -------
3233
+ # Nothing
3234
+ #
3235
+ # Raises
3236
+ # ------
3237
+ # PyegeriaInvalidParameterException
3238
+ # If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3239
+ # PyegeriaAPIException
3240
+ # Raised by the server when an issue arises in processing a valid request
3241
+ # NotAuthorizedException
3242
+ # The principle specified by the user_id does not have authorization for the requested action
3243
+ #
3244
+ # Notes
3245
+ # -----
3246
+ # JSON Structure looks like:
3247
+ # {
3248
+ # "class": "NewRelationshipRequestBody",
3249
+ # "properties": {
3250
+ # "assignmentType": "Add type here",
3251
+ # "description": "Add assignment description here"
3252
+ # },
3253
+ # "externalSourceGUID": "add guid here",
3254
+ # "externalSourceName": "add qualified name here",
3255
+ # "effectiveTime": "{{$isoTimestamp}}",
3256
+ # "forLineage": false,
3257
+ # "forDuplicateProcessing": false
3258
+ # }
3259
+ #
3260
+ # """
3261
+ # loop = asyncio.get_event_loop()
3262
+ # loop.run_until_complete(
3263
+ # self._async_link_product_manager(digital_prod_guid, digital_prod_manager_guid, body))
3264
+ #
3265
+ #
3266
+ # @dynamic_catch
3267
+ # async def _async_detach_product_manager(self, digital_prod_guid: str,
3268
+ # digital_prod_manager_guid: str,
3269
+ # body: Optional[dict | DeleteRelationshipRequestBody] = None)-> None:
3270
+ # """ Detach a digital product manager from a digital product.
3271
+ # Request body is optional. Async version.
3272
+ #
3273
+ # Parameters
3274
+ # ----------
3275
+ # digital_prod_guid: str
3276
+ # The guid of the digital product.
3277
+ # prod_manager: str
3278
+ # The guid of the digital product manager.
3279
+ # body: dict | DeleteRelationshipRequestBody, optional, default = None
3280
+ # A structure representing the details of the relationship.
3281
+ #
3282
+ # Returns
3283
+ # -------
3284
+ # Nothing
3285
+ #
3286
+ # Raises
3287
+ # ------
3288
+ # PyegeriaInvalidParameterException
3289
+ # If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3290
+ # PyegeriaAPIException
3291
+ # Raised by the server when an issue arises in processing a valid request
3292
+ # NotAuthorizedException
3293
+ # The principle specified by the user_id does not have authorization for the requested action
3294
+ #
3295
+ # Notes
3296
+ # -----
3297
+ # JSON Structure looks like:
3298
+ # {
3299
+ # "class": "DeleteRelationshipRequestBody",
3300
+ # "externalSourceGUID": "add guid here",
3301
+ # "externalSourceName": "add qualified name here",
3302
+ # "effectiveTime": "{{$isoTimestamp}}",
3303
+ # "forLineage": false,
3304
+ # "forDuplicateProcessing": false
3305
+ # }
3306
+ #
3307
+ # """
3308
+ # url = (
3309
+ # f"{self.platform_url}/servers/"
3310
+ # f"{self.view_server}/api/open-metadata/collection-manager/collections/digital-products/"
3311
+ # f"{digital_prod_guid}/product-dependencies/{digital_prod_manager_guid}/detach")
3312
+ # await self._async_delete_relationship_request(url, body)
3313
+ # logger.info(f"Detached digital product manager {digital_prod_guid} -> {digital_prod_manager_guid}")
3314
+ #
3315
+ # @dynamic_catch
3316
+ # def detach_product_manager(self, digital_prod_guid: str, digital_prod_manager_guid: str,
3317
+ # body: dict | DeleteRelationshipRequestBody= None):
3318
+ # """ Detach a digital product manager from a digital product.
3319
+ # Request body is optional. Async version.
3320
+ #
3321
+ # Parameters
3322
+ # ----------
3323
+ # digital_prod_guid: str
3324
+ # The guid of the digital product.
3325
+ # digital_prod_manager_guid: str
3326
+ # The guid of the digital product manager.
3327
+ # body: dict | DeleteRelationshipRequestBody, optional, default = None
3328
+ # A structure representing the details of the relationship.
3329
+ #
3330
+ # Returns
3331
+ # -------
3332
+ # Nothing
3333
+ #
3334
+ # Raises
3335
+ # ------
3336
+ # PyegeriaInvalidParameterException
3337
+ # If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3338
+ # PyegeriaAPIException
3339
+ # Raised by the server when an issue arises in processing a valid request
3340
+ # NotAuthorizedException
3341
+ # The principle specified by the user_id does not have authorization for the requested action
3342
+ #
3343
+ # Notes
3344
+ # -----
3345
+ # JSON Structure looks like:
3346
+ # {
3347
+ # "class": "DeleteRelationshipRequestBody",
3348
+ # "externalSourceGUID": "add guid here",
3349
+ # "externalSourceName": "add qualified name here",
3350
+ # "effectiveTime": "{{$isoTimestamp}}",
3351
+ # "forLineage": false,
3352
+ # "forDuplicateProcessing": false
3353
+ # }
3354
+ #
3355
+ # """
3356
+ # loop = asyncio.get_event_loop()
3357
+ # loop.run_until_complete(
3358
+ # self._async_detach_product_manager(digital_prod_guid, digital_prod_manager_guid,
3359
+ # body))
3035
3360
 
3036
3361
 
3037
3362
  #
@@ -3075,7 +3400,7 @@ class CollectionManager(Client2):
3075
3400
  "properties": {
3076
3401
  "class" : "AgreementProperties",
3077
3402
  "qualifiedName": "Agreement::Add agreement name here",
3078
- "name" : "display name",
3403
+ "displayName" : "display name",
3079
3404
  "description" : "Add description of the agreement here",
3080
3405
  "identifier" : "Add agreement identifier here",
3081
3406
  "additionalProperties": {
@@ -3100,7 +3425,7 @@ class CollectionManager(Client2):
3100
3425
  return await self._async_create_element_body_request(url, "AgreementProperties", body)
3101
3426
 
3102
3427
  @dynamic_catch
3103
- def create_agreement(self, body: dict | NewElementRequestBody = None) -> str:
3428
+ def create_agreement(self, body: Optional[dict | NewElementRequestBody] = None) -> str:
3104
3429
  """ Create a new collection that represents an agreement..
3105
3430
 
3106
3431
  Parameters
@@ -3137,7 +3462,7 @@ class CollectionManager(Client2):
3137
3462
  "properties": {
3138
3463
  "class" : "AgreementProperties",
3139
3464
  "qualifiedName": "Agreement::Add agreement name here",
3140
- "name" : "display name",
3465
+ "displayName" : "display name",
3141
3466
  "description" : "Add description of the agreement here",
3142
3467
  "identifier" : "Add agreement identifier here",
3143
3468
  "additionalProperties": {
@@ -3202,7 +3527,7 @@ class CollectionManager(Client2):
3202
3527
  # "properties": {
3203
3528
  # "class" : "AgreementProperties",
3204
3529
  # "qualifiedName": "Agreement::Add agreement name here",
3205
- # "name" : "display name",
3530
+ # "displayName" : "display name",
3206
3531
  # "description" : "Add description of the agreement here",
3207
3532
  # "userDefinedStatus" : "NEW",
3208
3533
  # "identifier" : "Add agreement identifier here",
@@ -3229,7 +3554,7 @@ class CollectionManager(Client2):
3229
3554
  # return await self._async_create_element_body_request(url, "AgreementProperties", body)
3230
3555
  #
3231
3556
  # @dynamic_catch
3232
- # def create_data_sharing_agreement(self, body: dict | NewElementRequestBody = None) -> str:
3557
+ # def create_data_sharing_agreement(self, body: Optional[dict | NewElementRequestBody] = None) -> str:
3233
3558
  # """ Create a new collection that represents a digital product.
3234
3559
  #
3235
3560
  # Parameters
@@ -3266,7 +3591,7 @@ class CollectionManager(Client2):
3266
3591
  # "properties": {
3267
3592
  # "class" : "DigitalProductProperties",
3268
3593
  # "qualifiedName": "DigitalProduct::Add product name here",
3269
- # "name" : "Product contents",
3594
+ # "displayName" : "Product contents",
3270
3595
  # "description" : "Add description of product and its expected usage here",
3271
3596
  # "identifier" : "Add product identifier here",
3272
3597
  # "productName" : "Add product name here",
@@ -3313,9 +3638,7 @@ class CollectionManager(Client2):
3313
3638
 
3314
3639
  body: dict | NewElementRequestBody, optional
3315
3640
  A dict or NewElementRequestBody representing the details of the agreement to create.
3316
- merge_update: bool, optional, default = True
3317
- If true then property changes will be overlaid on top of existing properties. If false, existing
3318
- properties will all be replaced by the set provided in the update request.
3641
+
3319
3642
 
3320
3643
  Returns
3321
3644
  -------
@@ -3338,7 +3661,7 @@ class CollectionManager(Client2):
3338
3661
  "properties": {
3339
3662
  "class" : "AgreementProperties",
3340
3663
  "qualifiedName": "Agreement::Add agreement name here",
3341
- "name" : "display name",
3664
+ "displayName" : "display name",
3342
3665
  "description" : "Add description of the agreement here",
3343
3666
  "userDefinedStatus" : "OBSOLETE",
3344
3667
  "identifier" : "Add agreement identifier here",
@@ -3369,9 +3692,7 @@ class CollectionManager(Client2):
3369
3692
 
3370
3693
  body: dict | NewElementRequestBody, optional
3371
3694
  A dict or NewElementRequestBody representing the details of the agreement to create.
3372
- merge_update: bool, optional, default = True
3373
- If true then property changes will be overlaid on top of existing properties. If false, existing
3374
- properties will all be replaced by the set provided in the update request.
3695
+
3375
3696
 
3376
3697
  Returns
3377
3698
  -------
@@ -3394,7 +3715,7 @@ class CollectionManager(Client2):
3394
3715
  "properties": {
3395
3716
  "class" : "AgreementProperties",
3396
3717
  "qualifiedName": "Agreement::Add agreement name here",
3397
- "name" : "display name",
3718
+ "displayName" : "display name",
3398
3719
  "description" : "Add description of the agreement here",
3399
3720
  "userDefinedStatus" : "OBSOLETE",
3400
3721
  "identifier" : "Add agreement identifier here",
@@ -3415,54 +3736,9 @@ class CollectionManager(Client2):
3415
3736
  self._async_update_agreement(agreement_guid, body))
3416
3737
 
3417
3738
 
3418
-
3419
- @dynamic_catch
3420
- def update_agreement_status(self, agreement_guid: str, status: str = None,
3421
- body: dict | UpdateStatusRequestBody = None):
3422
- """Update the status of an agreement.
3423
- Parameters
3424
- ----------
3425
- agreement_guid: str
3426
- The guid of the collection to update.
3427
- status: str, optional
3428
- The new lifecycle status for the collection. Ignored, if the body is provided.
3429
- body: dict | UpdateStatusRequestBody
3430
- A structure representing the details of the collection to create.
3431
-
3432
- Returns
3433
- -------
3434
- Nothing
3435
-
3436
- Raises
3437
- ------
3438
- InvalidParameterException
3439
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3440
- PropertyServerException
3441
- Raised by the server when an issue arises in processing a valid request
3442
- NotAuthorizedException
3443
- The principle specified by the user_id does not have authorization for the requested action
3444
-
3445
- Notes
3446
- -----
3447
- JSON Structure looks like:
3448
- {
3449
- "class": "UpdateStatusRequestBody",
3450
- "status": "APPROVED",
3451
- "externalSourceGUID": "add guid here",
3452
- "externalSourceName": "add qualified name here",
3453
- "effectiveTime": "{{$isoTimestamp}}",
3454
- "forLineage": false,
3455
- "forDuplicateProcessing": false
3456
- }
3457
- """
3458
- loop = asyncio.get_event_loop()
3459
- loop.run_until_complete(self._async_update_collection_status(agreement_guid, status,body))
3460
-
3461
-
3462
-
3463
3739
  @dynamic_catch
3464
3740
  async def _async_link_agreement_actor(self, agreement_guid: str, actor_guid: str,
3465
- body: dict | NewRelationshipRequestBody = None) -> None:
3741
+ body: Optional[dict | NewRelationshipRequestBody] = None) -> None:
3466
3742
  """ Attach an actor to an agreement. The actor element may be an actor profile (person, team or IT profile);
3467
3743
  actor role (person role, team role or IT profile role); or user identity. Request body is optional.
3468
3744
  Request body is optional. Async version.
@@ -3482,9 +3758,9 @@ class CollectionManager(Client2):
3482
3758
 
3483
3759
  Raises
3484
3760
  ------
3485
- InvalidParameterException
3761
+ PyegeriaInvalidParameterException
3486
3762
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3487
- PropertyServerException
3763
+ PyegeriaAPIException
3488
3764
  Raised by the server when an issue arises in processing a valid request
3489
3765
  NotAuthorizedException
3490
3766
  The principle specified by the user_id does not have authorization for the requested action
@@ -3517,7 +3793,7 @@ class CollectionManager(Client2):
3517
3793
  logger.info(f"Attached digital product manager {agreement_guid} -> {actor_guid}")
3518
3794
 
3519
3795
 
3520
- def link_agreement_actor(self, agreement_guid: str, actor_guid: str, body: dict | NewRelationshipRequestBody = None):
3796
+ def link_agreement_actor(self, agreement_guid: str, actor_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None):
3521
3797
  """ Attach an actor to an agreement. The actor element may be an actor profile (person, team or IT profile);
3522
3798
  actor role (person role, team role or IT profile role); or user identity. Request body is optional.
3523
3799
  Async version.
@@ -3537,9 +3813,9 @@ class CollectionManager(Client2):
3537
3813
 
3538
3814
  Raises
3539
3815
  ------
3540
- InvalidParameterException
3816
+ PyegeriaInvalidParameterException
3541
3817
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3542
- PropertyServerException
3818
+ PyegeriaAPIException
3543
3819
  Raised by the server when an issue arises in processing a valid request
3544
3820
  NotAuthorizedException
3545
3821
  The principle specified by the user_id does not have authorization for the requested action
@@ -3572,7 +3848,7 @@ class CollectionManager(Client2):
3572
3848
  @dynamic_catch
3573
3849
  async def _async_detach_agreement_actor(self, agreement_guid: str,
3574
3850
  actor_guid: str,
3575
- body: dict | DeleteRequestBody = None)-> None:
3851
+ body: Optional[dict | DeleteRelationshipRequestBody] = None)-> None:
3576
3852
  """ Detach an actor from an agreement.
3577
3853
  Request body is optional. Async Version.
3578
3854
 
@@ -3582,7 +3858,7 @@ class CollectionManager(Client2):
3582
3858
  The guid of the agreement.
3583
3859
  actor_guid: str
3584
3860
  The guid of the actor.
3585
- body: dict | DeleteRequestBody, optional, default = None
3861
+ body: dict | DeleteRelationshipRequestBody, optional, default = None
3586
3862
  A structure representing the details of the relationship.
3587
3863
 
3588
3864
  Returns
@@ -3591,9 +3867,9 @@ class CollectionManager(Client2):
3591
3867
 
3592
3868
  Raises
3593
3869
  ------
3594
- InvalidParameterException
3870
+ PyegeriaInvalidParameterException
3595
3871
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3596
- PropertyServerException
3872
+ PyegeriaAPIException
3597
3873
  Raised by the server when an issue arises in processing a valid request
3598
3874
  NotAuthorizedException
3599
3875
  The principle specified by the user_id does not have authorization for the requested action
@@ -3602,7 +3878,7 @@ class CollectionManager(Client2):
3602
3878
  -----
3603
3879
  JSON Structure looks like:
3604
3880
  {
3605
- "class": "DeleteRequestBody",
3881
+ "class": "DeleteRelationshipRequestBody",
3606
3882
  "externalSourceGUID": "add guid here",
3607
3883
  "externalSourceName": "add qualified name here",
3608
3884
  "effectiveTime": "{{$isoTimestamp}}",
@@ -3616,12 +3892,12 @@ class CollectionManager(Client2):
3616
3892
  f"{self.platform_url}/servers/"
3617
3893
  f"{self.view_server}/api/open-metadata/collection-manager/collections/agreements/"
3618
3894
  f"{agreement_guid}/agreement-actors/{actor_guid}/detach")
3619
- self._async_delete_request(url, body)
3895
+ self._async_delete_relationship_request(url, body)
3620
3896
  logger.info(f"Detached digital product manager {agreement_guid} -> {actor_guid}")
3621
3897
 
3622
3898
 
3623
3899
  def detach_agreement_actor(self, agreement_guid: str, actor_guid: str,
3624
- body: dict | DeleteRequestBody= None):
3900
+ body: dict | DeleteRelationshipRequestBody= None):
3625
3901
  """ Detach an actor from an agreement.
3626
3902
  Request body is optional.
3627
3903
 
@@ -3631,7 +3907,7 @@ class CollectionManager(Client2):
3631
3907
  The guid of the agreement.
3632
3908
  actor_guid: str
3633
3909
  The guid of the actor.
3634
- body: dict | DeleteRequestBody, optional, default = None
3910
+ body: dict | DeleteRelationshipRequestBody, optional, default = None
3635
3911
  A structure representing the details of the relationship.
3636
3912
 
3637
3913
  Returns
@@ -3640,9 +3916,9 @@ class CollectionManager(Client2):
3640
3916
 
3641
3917
  Raises
3642
3918
  ------
3643
- InvalidParameterException
3919
+ PyegeriaInvalidParameterException
3644
3920
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3645
- PropertyServerException
3921
+ PyegeriaAPIException
3646
3922
  Raised by the server when an issue arises in processing a valid request
3647
3923
  NotAuthorizedException
3648
3924
  The principle specified by the user_id does not have authorization for the requested action
@@ -3651,7 +3927,7 @@ class CollectionManager(Client2):
3651
3927
  -----
3652
3928
  JSON Structure looks like:
3653
3929
  {
3654
- "class": "DeleteRequestBody",
3930
+ "class": "DeleteRelationshipRequestBody",
3655
3931
  "externalSourceGUID": "add guid here",
3656
3932
  "externalSourceName": "add qualified name here",
3657
3933
  "effectiveTime": "{{$isoTimestamp}}",
@@ -3690,9 +3966,9 @@ class CollectionManager(Client2):
3690
3966
 
3691
3967
  Raises
3692
3968
  ------
3693
- InvalidParameterException
3969
+ PyegeriaInvalidParameterException
3694
3970
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3695
- PropertyServerException
3971
+ PyegeriaAPIException
3696
3972
  Raised by the server when an issue arises in processing a valid request
3697
3973
  NotAuthorizedException
3698
3974
  The principle specified by the user_id does not have authorization for the requested action
@@ -3759,9 +4035,9 @@ class CollectionManager(Client2):
3759
4035
 
3760
4036
  Raises
3761
4037
  ------
3762
- InvalidParameterException
4038
+ PyegeriaInvalidParameterException
3763
4039
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3764
- PropertyServerException
4040
+ PyegeriaAPIException
3765
4041
  Raised by the server when an issue arises in processing a valid request
3766
4042
  NotAuthorizedException
3767
4043
  The principle specified by the user_id does not have authorization for the requested action
@@ -3805,7 +4081,7 @@ class CollectionManager(Client2):
3805
4081
 
3806
4082
  @dynamic_catch
3807
4083
  async def _async_detach_agreement_item(self, agreement_guid: str, agreement_item_guid: str,
3808
- body: dict | DeleteRequestBody = None) -> None:
4084
+ body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None:
3809
4085
  """Detach an agreement item from an agreement. Request body is optional. Async version.
3810
4086
 
3811
4087
  Parameters
@@ -3814,7 +4090,7 @@ class CollectionManager(Client2):
3814
4090
  The guid of the agreement to link.
3815
4091
  agreement_item_guid: str
3816
4092
  The guid of the element to attach.
3817
- body: dict | DeleteRequestBody, optional, default = None
4093
+ body: dict | DeleteRelationshipRequestBody, optional, default = None
3818
4094
  A structure representing the details of the relationship.
3819
4095
 
3820
4096
  Returns
@@ -3823,9 +4099,9 @@ class CollectionManager(Client2):
3823
4099
 
3824
4100
  Raises
3825
4101
  ------
3826
- InvalidParameterException
4102
+ PyegeriaInvalidParameterException
3827
4103
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3828
- PropertyServerException
4104
+ PyegeriaAPIException
3829
4105
  Raised by the server when an issue arises in processing a valid request
3830
4106
  NotAuthorizedException
3831
4107
  The principle specified by the user_id does not have authorization for the requested action
@@ -3833,7 +4109,7 @@ class CollectionManager(Client2):
3833
4109
  Notes
3834
4110
  _____
3835
4111
  {
3836
- "class": "DeleteRequestBody",
4112
+ "class": "DeleteRelationshipRequestBody",
3837
4113
  "externalSourceGUID": "add guid here",
3838
4114
  "externalSourceName": "add qualified name here",
3839
4115
  "effectiveTime": "{{$isoTimestamp}}",
@@ -3846,7 +4122,7 @@ class CollectionManager(Client2):
3846
4122
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/collection-manager/collections"
3847
4123
  f"/agreements"
3848
4124
  f"{agreement_guid}/agreement-items/{agreement_item_guid}/detach")
3849
- await self._async_delete_request(url, body)
4125
+ await self._async_delete_relationship_request(url, body)
3850
4126
  logger.info(f"Detached agreement item {agreement_item_guid} from {agreement_guid}")
3851
4127
 
3852
4128
 
@@ -3868,9 +4144,9 @@ class CollectionManager(Client2):
3868
4144
 
3869
4145
  Raises
3870
4146
  ------
3871
- InvalidParameterException
4147
+ PyegeriaInvalidParameterException
3872
4148
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3873
- PropertyServerException
4149
+ PyegeriaAPIException
3874
4150
  Raised by the server when an issue arises in processing a valid request
3875
4151
  NotAuthorizedException
3876
4152
  The principle specified by the user_id does not have authorization for the requested action
@@ -3892,8 +4168,8 @@ class CollectionManager(Client2):
3892
4168
 
3893
4169
 
3894
4170
  @dynamic_catch
3895
- async def _async_link_contract(self, agreement_guid: str, external_ref_guid: str,
3896
- body: dict | NewRelationshipRequestBody = None) -> None:
4171
+ async def _async_link_contract(self, agreement_guid: str, external_ref_guid: str,
4172
+ body: Optional[dict | NewRelationshipRequestBody] = None) -> None:
3897
4173
  """ Attach an agreement to an external reference element that describes the location of the contract
3898
4174
  documents.
3899
4175
  Request body is optional. Async version.
@@ -3913,9 +4189,9 @@ class CollectionManager(Client2):
3913
4189
 
3914
4190
  Raises
3915
4191
  ------
3916
- InvalidParameterException
4192
+ PyegeriaInvalidParameterException
3917
4193
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3918
- PropertyServerException
4194
+ PyegeriaAPIException
3919
4195
  Raised by the server when an issue arises in processing a valid request
3920
4196
  NotAuthorizedException
3921
4197
  The principle specified by the user_id does not have authorization for the requested action
@@ -3968,9 +4244,9 @@ class CollectionManager(Client2):
3968
4244
 
3969
4245
  Raises
3970
4246
  ------
3971
- InvalidParameterException
4247
+ PyegeriaInvalidParameterException
3972
4248
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
3973
- PropertyServerException
4249
+ PyegeriaAPIException
3974
4250
  Raised by the server when an issue arises in processing a valid request
3975
4251
  NotAuthorizedException
3976
4252
  The principle specified by the user_id does not have authorization for the requested action
@@ -4020,9 +4296,9 @@ class CollectionManager(Client2):
4020
4296
 
4021
4297
  Raises
4022
4298
  ------
4023
- InvalidParameterException
4299
+ PyegeriaInvalidParameterException
4024
4300
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4025
- PropertyServerException
4301
+ PyegeriaAPIException
4026
4302
  Raised by the server when an issue arises in processing a valid request
4027
4303
  NotAuthorizedException
4028
4304
  The principle specified by the user_id does not have authorization for the requested action
@@ -4043,7 +4319,7 @@ class CollectionManager(Client2):
4043
4319
  url = (
4044
4320
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/collection-manager/collections"
4045
4321
  f"/agreements/{agreement_guid}/contract-links/{external_ref_guid}/detach")
4046
- await self._async_delete_request(url, body)
4322
+ await self._async_delete_relationship_request(url, body)
4047
4323
  logger.info(f"Detached contract: {external_ref_guid} from {agreement_guid}")
4048
4324
 
4049
4325
  @dynamic_catch
@@ -4065,9 +4341,9 @@ class CollectionManager(Client2):
4065
4341
 
4066
4342
  Raises
4067
4343
  ------
4068
- InvalidParameterException
4344
+ PyegeriaInvalidParameterException
4069
4345
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4070
- PropertyServerException
4346
+ PyegeriaAPIException
4071
4347
  Raised by the server when an issue arises in processing a valid request
4072
4348
  NotAuthorizedException
4073
4349
  The principle specified by the user_id does not have authorization for the requested action
@@ -4107,9 +4383,9 @@ class CollectionManager(Client2):
4107
4383
 
4108
4384
  Raises
4109
4385
  ------
4110
- InvalidParameterException
4386
+ PyegeriaInvalidParameterException
4111
4387
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4112
- PropertyServerException
4388
+ PyegeriaAPIException
4113
4389
  Raised by the server when an issue arises in processing a valid request
4114
4390
  NotAuthorizedException
4115
4391
  The principle specified by the user_id does not have authorization for the requested action
@@ -4130,7 +4406,7 @@ class CollectionManager(Client2):
4130
4406
  "properties": {
4131
4407
  "class" : "DigitalSubscriptionProperties",
4132
4408
  "qualifiedName": "DigitalSubscription::Add subscription name here",
4133
- "name" : "display name",
4409
+ "displayName" : "display name",
4134
4410
  "description" : "Add description of the subscription here",
4135
4411
  "userDefinedStatus" : "OBSOLETE",
4136
4412
  "identifier" : "Add subscription identifier here",
@@ -4169,7 +4445,7 @@ class CollectionManager(Client2):
4169
4445
  "properties": {
4170
4446
  "class" : "DigitalSubscriptionProperties",
4171
4447
  "qualifiedName": "DigitalSubscription::Add subscription name here",
4172
- "name" : "display name",
4448
+ "displayName" : "display name",
4173
4449
  "description" : "Add description of the subscription here",
4174
4450
  "userDefinedStatus" : "OBSOLETE",
4175
4451
  "identifier" : "Add subscription identifier here",
@@ -4209,9 +4485,9 @@ class CollectionManager(Client2):
4209
4485
 
4210
4486
  Raises
4211
4487
  ------
4212
- InvalidParameterException
4488
+ PyegeriaInvalidParameterException
4213
4489
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4214
- PropertyServerException
4490
+ PyegeriaAPIException
4215
4491
  Raised by the server when an issue arises in processing a valid request
4216
4492
  NotAuthorizedException
4217
4493
  The principle specified by the user_id does not have authorization for the requested action
@@ -4240,7 +4516,7 @@ class CollectionManager(Client2):
4240
4516
  "properties": {
4241
4517
  "class" : "DigitalSubscriptionProperties",
4242
4518
  "qualifiedName": "DigitalSubscription::Add subscription name here",
4243
- "name" : "display name",
4519
+ "displayName" : "display name",
4244
4520
  "description" : "Add description of the subscription here",
4245
4521
  "userDefinedStatus" : "OBSOLETE",
4246
4522
  "identifier" : "Add subscription identifier here",
@@ -4285,9 +4561,9 @@ class CollectionManager(Client2):
4285
4561
 
4286
4562
  Raises
4287
4563
  ------
4288
- InvalidParameterException
4564
+ PyegeriaInvalidParameterException
4289
4565
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4290
- PropertyServerException
4566
+ PyegeriaAPIException
4291
4567
  Raised by the server when an issue arises in processing a valid request
4292
4568
  NotAuthorizedException
4293
4569
  The principle specified by the user_id does not have authorization for the requested action
@@ -4300,7 +4576,7 @@ class CollectionManager(Client2):
4300
4576
  "properties": {
4301
4577
  "class" : "DigitalSubscriptionProperties",
4302
4578
  "qualifiedName": "DigitalSubscription::Add subscription name here",
4303
- "name" : "display name",
4579
+ "displayName" : "display name",
4304
4580
  "description" : "Add description of the subscription here",
4305
4581
  "userDefinedStatus" : "OBSOLETE",
4306
4582
  "identifier" : "Add subscription identifier here",
@@ -4336,8 +4612,6 @@ class CollectionManager(Client2):
4336
4612
  The guid of the digital_subscription to update.
4337
4613
  body: dict
4338
4614
  A dict representing the details of the collection to create.
4339
- replace_all_props: bool, optional, defaults to False
4340
- Whether to replace all properties in the collection.
4341
4615
 
4342
4616
 
4343
4617
  Returns
@@ -4346,9 +4620,9 @@ class CollectionManager(Client2):
4346
4620
 
4347
4621
  Raises
4348
4622
  ------
4349
- InvalidParameterException
4623
+ PyegeriaInvalidParameterException
4350
4624
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4351
- PropertyServerException
4625
+ PyegeriaAPIException
4352
4626
  Raised by the server when an issue arises in processing a valid request
4353
4627
  NotAuthorizedException
4354
4628
  The principle specified by the user_id does not have authorization for the requested action
@@ -4361,7 +4635,7 @@ class CollectionManager(Client2):
4361
4635
  "properties": {
4362
4636
  "class" : "AgreementProperties",
4363
4637
  "qualifiedName": "Agreement::Add digital_subscription name here",
4364
- "name" : "display name",
4638
+ "displayName" : "display name",
4365
4639
  "description" : "Add description of the digital_subscription here",
4366
4640
  "userDefinedStatus" : "OBSOLETE",
4367
4641
  "identifier" : "Add digital_subscription identifier here",
@@ -4383,99 +4657,9 @@ class CollectionManager(Client2):
4383
4657
  self._async_update_digital_subscription(digital_subscription_guid, body))
4384
4658
 
4385
4659
 
4386
- @dynamic_catch
4387
- async def _async_update_digital_subscription_status(self, digital_subscription_guid: str, status: str = None,
4388
- body: dict | UpdateStatusRequestBody = None)-> None:
4389
- """Update the status of a digital_subscription collection. Async version.
4390
-
4391
- Parameters
4392
- ----------
4393
- digital_subscription_guid: str
4394
- The guid of the digital product collection to update.
4395
- status: str, optional
4396
- The new status of the digital_subscription collection. Will be used only if body is not provided.
4397
- body: dict | UpdateStatusRequestBody, optional, defaults to None
4398
- A structure representing the details of the collection to create.
4399
-
4400
- Returns
4401
- -------
4402
- Nothing
4403
-
4404
- Raises
4405
- ------
4406
- InvalidParameterException
4407
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4408
- PropertyServerException
4409
- Raised by the server when an issue arises in processing a valid request
4410
- NotAuthorizedException
4411
- The principle specified by the user_id does not have authorization for the requested action
4412
-
4413
- Notes
4414
- -----
4415
- JSON Structure looks like:
4416
- {
4417
- "class": "UpdateStatusRequestBody",
4418
- "status": "APPROVED",
4419
- "externalSourceGUID": "add guid here",
4420
- "externalSourceName": "add qualified name here",
4421
- "effectiveTime": "{{$isoTimestamp}}",
4422
- "forLineage": false,
4423
- "forDuplicateProcessing": false
4424
- }
4425
- """
4426
- url = (
4427
- f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/collection-manager/collections"
4428
- f"/agreements/"
4429
- f"{digital_subscription_guid}/update-status")
4430
- await self._async_update_status_request(url, status, body)
4431
- logger.info(f"Updated status for DigitalProduct {digital_subscription_guid}")
4432
-
4433
- @dynamic_catch
4434
- def update_digital_subscription_status(self, digital_subscription_guid: str,
4435
- body: dict | UpdateStatusRequestBody = None,):
4436
- """Update the status of an digital_subscription collection. Async version.
4437
-
4438
- Parameters
4439
- ----------
4440
- digital_subscription_guid: str
4441
- The guid of the digital product collection to update.
4442
- body: dict
4443
- A dict representing the details of the collection to create.
4444
-
4445
- Returns
4446
- -------
4447
- Nothing
4448
-
4449
- Raises
4450
- ------
4451
- InvalidParameterException
4452
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4453
- PropertyServerException
4454
- Raised by the server when an issue arises in processing a valid request
4455
- NotAuthorizedException
4456
- The principle specified by the user_id does not have authorization for the requested action
4457
-
4458
- Notes
4459
- -----
4460
- JSON Structure looks like:
4461
- {
4462
- "class": "AgreementStatusRequestBody",
4463
- "status": "APPROVED",
4464
- "externalSourceGUID": "add guid here",
4465
- "externalSourceName": "add qualified name here",
4466
- "effectiveTime": "{{$isoTimestamp}}",
4467
- "forLineage": false,
4468
- "forDuplicateProcessing": false
4469
- }
4470
-
4471
- """
4472
- loop = asyncio.get_event_loop()
4473
- loop.run_until_complete(self._async_update_digital_subscription_status(digital_subscription_guid, body))
4474
-
4475
-
4476
4660
  @dynamic_catch
4477
4661
  async def _async_link_subscriber(self, subscriber_guid: str, subscription_guid: str,
4478
- body: dict | NewRelationshipRequestBody = None)-> None:
4662
+ body: Optional[dict | NewRelationshipRequestBody] = None)-> None:
4479
4663
  """ Attach a subscriber to a subscription. The subscriber is of type 'Referenceable' to allow digital
4480
4664
  products, team or business capabilities to be the subscriber. The subscription is an element of type
4481
4665
  DigitalSubscription.
@@ -4496,9 +4680,9 @@ class CollectionManager(Client2):
4496
4680
 
4497
4681
  Raises
4498
4682
  ------
4499
- InvalidParameterException
4683
+ PyegeriaInvalidParameterException
4500
4684
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4501
- PropertyServerException
4685
+ PyegeriaAPIException
4502
4686
  Raised by the server when an issue arises in processing a valid request
4503
4687
  NotAuthorizedException
4504
4688
  The principle specified by the user_id does not have authorization for the requested action
@@ -4530,7 +4714,7 @@ class CollectionManager(Client2):
4530
4714
 
4531
4715
  @dynamic_catch
4532
4716
  def link_subscriber(self, subscriber_guid: str, subscription_guid: str,
4533
- body: dict | NewRelationshipRequestBody = None):
4717
+ body: Optional[dict | NewRelationshipRequestBody] = None):
4534
4718
  """ Attach a subscriber to a subscription. The subscriber is of type 'Referenceable' to allow digital
4535
4719
  products, team or business capabilities to be the subscriber. The subscription is an element of type
4536
4720
  DigitalSubscription.
@@ -4551,9 +4735,9 @@ class CollectionManager(Client2):
4551
4735
 
4552
4736
  Raises
4553
4737
  ------
4554
- InvalidParameterException
4738
+ PyegeriaInvalidParameterException
4555
4739
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4556
- PropertyServerException
4740
+ PyegeriaAPIException
4557
4741
  Raised by the server when an issue arises in processing a valid request
4558
4742
  NotAuthorizedException
4559
4743
  The principle specified by the user_id does not have authorization for the requested action
@@ -4582,7 +4766,7 @@ class CollectionManager(Client2):
4582
4766
 
4583
4767
  @dynamic_catch
4584
4768
  async def _async_detach_subscriber(self, subscriber_guid: str, subscription_guid: str,
4585
- body: dict | DeleteRequestBody = None) -> None:
4769
+ body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None:
4586
4770
  """ Detach a subscriber from a subscription Request body is optional. Async version.
4587
4771
 
4588
4772
  Parameters
@@ -4591,7 +4775,7 @@ class CollectionManager(Client2):
4591
4775
  The unique identifier of the subscriber.
4592
4776
  subscription_guid: str
4593
4777
  The unique identifier of the subscription.
4594
- body: dict | DeleteRequestBody, optional, default = None
4778
+ body: dict | DeleteRelationshipRequestBody, optional, default = None
4595
4779
  A structure representing the details of the relationship.
4596
4780
 
4597
4781
  Returns
@@ -4600,9 +4784,9 @@ class CollectionManager(Client2):
4600
4784
 
4601
4785
  Raises
4602
4786
  ------
4603
- InvalidParameterException
4787
+ PyegeriaInvalidParameterException
4604
4788
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4605
- PropertyServerException
4789
+ PyegeriaAPIException
4606
4790
  Raised by the server when an issue arises in processing a valid request
4607
4791
  NotAuthorizedException
4608
4792
  The principle specified by the user_id does not have authorization for the requested action
@@ -4623,11 +4807,11 @@ class CollectionManager(Client2):
4623
4807
  f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/collection-manager/collections"
4624
4808
  f"/agreements/"
4625
4809
  f"{subscriber_guid}/agreement-actors/{subscription_guid}/detach")
4626
- await self._async_delete_request(url, body)
4810
+ await self._async_delete_relationship_request(url, body)
4627
4811
  logger.info(f"Detached subscriber {subscriber_guid} from subscription {subscription_guid}")
4628
4812
 
4629
4813
 
4630
- def detach_subscriber(self, subscriber_guid: str, subscription_guid: str, body: dict | DeleteRequestBody= None):
4814
+ def detach_subscriber(self, subscriber_guid: str, subscription_guid: str, body: dict | DeleteRelationshipRequestBody= None):
4631
4815
  """ Detach a subscriber from a subscription. Request body is optional.
4632
4816
 
4633
4817
  Parameters
@@ -4645,9 +4829,9 @@ class CollectionManager(Client2):
4645
4829
 
4646
4830
  Raises
4647
4831
  ------
4648
- InvalidParameterException
4832
+ PyegeriaInvalidParameterException
4649
4833
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4650
- PropertyServerException
4834
+ PyegeriaAPIException
4651
4835
  Raised by the server when an issue arises in processing a valid request
4652
4836
  NotAuthorizedException
4653
4837
  The principle specified by the user_id does not have authorization for the requested action
@@ -4693,9 +4877,9 @@ class CollectionManager(Client2):
4693
4877
 
4694
4878
  Raises
4695
4879
  ------
4696
- InvalidParameterException
4880
+ PyegeriaInvalidParameterException
4697
4881
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4698
- PropertyServerException
4882
+ PyegeriaAPIException
4699
4883
  Raised by the server when an issue arises in processing a valid request
4700
4884
  NotAuthorizedException
4701
4885
  The principle specified by the user_id does not have authorization for the requested action
@@ -4734,7 +4918,7 @@ class CollectionManager(Client2):
4734
4918
 
4735
4919
  @dynamic_catch
4736
4920
  def attach_collection(self, parent_guid: str, collection_guid: str,
4737
- body: dict | NewRelationshipRequestBody = None):
4921
+ body: Optional[dict | NewRelationshipRequestBody] = None):
4738
4922
  """ Connect an existing collection to an element using the ResourceList relationship (0019).
4739
4923
 
4740
4924
  Parameters
@@ -4754,9 +4938,9 @@ class CollectionManager(Client2):
4754
4938
 
4755
4939
  Raises
4756
4940
  ------
4757
- InvalidParameterException
4941
+ PyegeriaInvalidParameterException
4758
4942
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4759
- PropertyServerException
4943
+ PyegeriaAPIException
4760
4944
  Raised by the server when an issue arises in processing a valid request
4761
4945
  NotAuthorizedException
4762
4946
  The principle specified by the user_id does not have authorization for the requested action
@@ -4790,7 +4974,7 @@ class CollectionManager(Client2):
4790
4974
 
4791
4975
  @dynamic_catch
4792
4976
  async def _async_detach_collection(self, parent_guid: str, collection_guid: str,
4793
- body: dict | DeleteRequestBody = None):
4977
+ body: Optional[dict | DeleteRelationshipRequestBody] = None):
4794
4978
  """ Detach an existing collection from an element. If the collection is anchored to the element,
4795
4979
  it is delete.
4796
4980
  Async version.
@@ -4801,7 +4985,7 @@ class CollectionManager(Client2):
4801
4985
  The unique identifier of the parent to detach from.
4802
4986
  collection_guid: str
4803
4987
  The identifier of the collection being detached.
4804
- body: dict | DeleteRequestBody, optional, default = None
4988
+ body: dict | DeleteRelationshipRequestBody, optional, default = None
4805
4989
  A structure representing the details of the relationship.
4806
4990
 
4807
4991
 
@@ -4811,9 +4995,9 @@ class CollectionManager(Client2):
4811
4995
 
4812
4996
  Raises
4813
4997
  ------
4814
- InvalidParameterException
4998
+ PyegeriaInvalidParameterException
4815
4999
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4816
- PropertyServerException
5000
+ PyegeriaAPIException
4817
5001
  Raised by the server when an issue arises in processing a valid request
4818
5002
  NotAuthorizedException
4819
5003
  The principle specified by the user_id does not have authorization for the requested action
@@ -4822,7 +5006,7 @@ class CollectionManager(Client2):
4822
5006
  -----
4823
5007
  JSON Structure looks like:
4824
5008
  {
4825
- "class": "DeleteRequestBody",
5009
+ "class": "DeleteRelationshipRequestBody",
4826
5010
  "externalSourceGUID": "add guid here",
4827
5011
  "externalSourceName": "add qualified name here",
4828
5012
  "effectiveTime": "{{$isoTimestamp}}",
@@ -4835,12 +5019,12 @@ class CollectionManager(Client2):
4835
5019
  f"{self.platform_url}/servers/"
4836
5020
  f"{self.view_server}/api/open-metadata/collection-manager/metadata-elements/"
4837
5021
  f"{parent_guid}/collections/{collection_guid}/detach")
4838
- await self._async_delete_request(url, body)
5022
+ await self._async_delete_relationship_request(url, body)
4839
5023
  logger.info(f"Detached collection {collection_guid} from {parent_guid}")
4840
5024
 
4841
5025
 
4842
5026
  def detach_collection(self, parent_guid: str, collection_guid: str,
4843
- body: dict | DeleteRequestBody = None):
5027
+ body: Optional[dict | DeleteRelationshipRequestBody] = None):
4844
5028
  """ Detach an existing collection from an element. If the collection is anchored to the element,
4845
5029
  it is delete.
4846
5030
 
@@ -4859,9 +5043,9 @@ class CollectionManager(Client2):
4859
5043
 
4860
5044
  Raises
4861
5045
  ------
4862
- InvalidParameterException
5046
+ PyegeriaInvalidParameterException
4863
5047
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4864
- PropertyServerException
5048
+ PyegeriaAPIException
4865
5049
  Raised by the server when an issue arises in processing a valid request
4866
5050
  NotAuthorizedException
4867
5051
  The principle specified by the user_id does not have authorization for the requested action
@@ -4883,7 +5067,7 @@ class CollectionManager(Client2):
4883
5067
 
4884
5068
 
4885
5069
  @dynamic_catch
4886
- async def _async_delete_collection(self, collection_guid: str, body: dict | DeleteRequestBody= None,
5070
+ async def _async_delete_collection(self, collection_guid: str, body: dict | DeleteElementRequestBody= None,
4887
5071
  cascade: bool = False) -> None:
4888
5072
  """Delete a collection. It is detected from all parent elements. If members are anchored to the collection
4889
5073
  then they are also deleted. Async version
@@ -4897,7 +5081,7 @@ class CollectionManager(Client2):
4897
5081
  cascade: bool, optional, defaults to True
4898
5082
  If true, a cascade delete is performed.
4899
5083
 
4900
- body: dict | DeleteRequestBody, optional, default = None
5084
+ body: dict | DeleteElementRequestBody, optional, default = None
4901
5085
  A structure representing the details of the relationship.
4902
5086
 
4903
5087
  Returns
@@ -4906,9 +5090,9 @@ class CollectionManager(Client2):
4906
5090
 
4907
5091
  Raises
4908
5092
  ------
4909
- InvalidParameterException
5093
+ PyegeriaInvalidParameterException
4910
5094
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4911
- PropertyServerException
5095
+ PyegeriaAPIException
4912
5096
  Raised by the server when an issue arises in processing a valid request
4913
5097
  NotAuthorizedException
4914
5098
  The principle specified by the user_id does not have authorization for the requested action
@@ -4917,7 +5101,7 @@ class CollectionManager(Client2):
4917
5101
  _____
4918
5102
  JSON Structure looks like:
4919
5103
  {
4920
- "class": "DeleteRequestBody",
5104
+ "class": "DeleteElementRequestBody",
4921
5105
  "externalSourceGUID": "add guid here",
4922
5106
  "externalSourceName": "add qualified name here",
4923
5107
  "effectiveTime": "{{$isoTimestamp}}",
@@ -4927,12 +5111,14 @@ class CollectionManager(Client2):
4927
5111
 
4928
5112
 
4929
5113
  """
5114
+ if body is None:
5115
+ body = {"class": "DeleteElementRequestBody"}
4930
5116
  url = f"{self.collection_command_root}/{collection_guid}/delete"
4931
- await self._async_delete_request(url, body, cascade)
5117
+ await self._async_delete_element_request(url, body, cascade)
4932
5118
  logger.info(f"Deleted collection {collection_guid} with cascade {cascade}")
4933
5119
 
4934
5120
 
4935
- def delete_collection(self, collection_guid: str, body: dict | DeleteRequestBody = None,
5121
+ def delete_collection(self, collection_guid: str, body: Optional[dict | DeleteElementRequestBody] = None,
4936
5122
  cascade: bool = False) -> None:
4937
5123
  """Delete a collection. It is deleted from all parent elements. If members are anchored to the collection
4938
5124
  then they are also deleted.
@@ -4945,7 +5131,7 @@ class CollectionManager(Client2):
4945
5131
  cascade: bool, optional, defaults to True
4946
5132
  If true, a cascade delete is performed.
4947
5133
 
4948
- body: dict DeleteRequestBodyt, optional, default = None
5134
+ body: dict | DeleteElementRequestBody, optional, default = None
4949
5135
  A dict representing the details of the relationship.
4950
5136
 
4951
5137
  Returns
@@ -4954,12 +5140,13 @@ class CollectionManager(Client2):
4954
5140
 
4955
5141
  Raises
4956
5142
  ------
4957
- InvalidParameterException
4958
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4959
- PropertyServerException
4960
- Raised by the server when an issue arises in processing a valid request
4961
- NotAuthorizedException
4962
- The principle specified by the user_id does not have authorization for the requested action
5143
+ PyegeriaException
5144
+ One of the pyegeria exceptions will be raised if there are issues in communications, message format, or
5145
+ Egeria errors.
5146
+ ValidationError
5147
+ Pydantic validation errors are raised if the body does not conform to the DeleteElementRequestBody.
5148
+ PyegeriaNotAuthorizedException
5149
+ The principle specified by the user_id does not have authorization for the requested action
4963
5150
 
4964
5151
  Notes
4965
5152
  _____
@@ -4974,7 +5161,7 @@ class CollectionManager(Client2):
4974
5161
 
4975
5162
  @dynamic_catch
4976
5163
  async def _async_add_to_collection(self, collection_guid: str, element_guid: str,
4977
- body: dict | NewRelationshipRequestBody = None, ) -> None:
5164
+ body: Optional[dict | NewRelationshipRequestBody] = None, ) -> None:
4978
5165
  """Add an element to a collection. The request body is optional. Async version.
4979
5166
 
4980
5167
  Parameters
@@ -4992,13 +5179,13 @@ class CollectionManager(Client2):
4992
5179
 
4993
5180
  Raises
4994
5181
  ------
4995
-
4996
- InvalidParameterException
4997
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
4998
- PropertyServerException
4999
- Raised by the server when an issue arises in processing a valid request
5000
- NotAuthorizedException
5001
- The principle specified by the user_id does not have authorization for the requested action
5182
+ PyegeriaException
5183
+ One of the pyegeria exceptions will be raised if there are issues in communications, message format, or
5184
+ Egeria errors.
5185
+ ValidationError
5186
+ Pydantic validation errors are raised if the body does not conform to the NewRelationshipRequestBody.
5187
+ PyegeriaNotAuthorizedException
5188
+ The principle specified by the user_id does not have authorization for the requested action
5002
5189
 
5003
5190
  Notes
5004
5191
  -----
@@ -5057,9 +5244,9 @@ class CollectionManager(Client2):
5057
5244
  Raises
5058
5245
  ------
5059
5246
 
5060
- InvalidParameterException
5247
+ PyegeriaInvalidParameterException
5061
5248
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
5062
- PropertyServerException
5249
+ PyegeriaAPIException
5063
5250
  Raised by the server when an issue arises in processing a valid request
5064
5251
  NotAuthorizedException
5065
5252
  The principle specified by the user_id does not have authorization for the requested action
@@ -5092,10 +5279,10 @@ class CollectionManager(Client2):
5092
5279
 
5093
5280
  """
5094
5281
  loop = asyncio.get_event_loop()
5095
- loop.run_until_complete(self._async_add_to_collection(collection_guid, element_guid, body))
5282
+ loop.run_until_complete(self._async_add_to_collection(element_guid, collection_guid, body))
5096
5283
 
5097
5284
  def add_term_to_folder(self, folder_guid: str, term_guid: str,
5098
- body: dict | NewRelationshipRequestBody = None) -> None:
5285
+ body: Optional[dict | NewRelationshipRequestBody] = None) -> None:
5099
5286
  """Add a term to a category. The request body is optional."""
5100
5287
  loop = asyncio.get_event_loop()
5101
5288
  loop.run_until_complete(self._async_add_to_collection(folder_guid, term_guid, body))
@@ -5114,10 +5301,7 @@ class CollectionManager(Client2):
5114
5301
  Effective time of the query. If not specified will default to any time.
5115
5302
  body: dict, optional, defaults to None
5116
5303
  The body of the request to add to the collection. See notes.
5117
- replace_all_props: bool, optional, defaults to False
5118
- Replace all properties or just update ones specified in body.
5119
5304
 
5120
- The name of the server to use.
5121
5305
 
5122
5306
 
5123
5307
  Returns
@@ -5127,9 +5311,9 @@ class CollectionManager(Client2):
5127
5311
  Raises
5128
5312
  ------
5129
5313
 
5130
- InvalidParameterException
5314
+ PyegeriaInvalidParameterException
5131
5315
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
5132
- PropertyServerException
5316
+ PyegeriaAPIException
5133
5317
  Raised by the server when an issue arises in processing a valid request
5134
5318
  NotAuthorizedException
5135
5319
  The principle specified by the user_id does not have authorization for the requested action
@@ -5180,10 +5364,7 @@ class CollectionManager(Client2):
5180
5364
  Effective time of the query. If not specified will default to any time.
5181
5365
  body: dict, optional, defaults to None
5182
5366
  The body of the request to add to the collection. See notes.
5183
- replace_all_props: bool, optional, defaults to False
5184
- Replace all properties or just update ones specified in body.
5185
5367
 
5186
- The name of the server to use.
5187
5368
 
5188
5369
 
5189
5370
  Returns
@@ -5193,9 +5374,9 @@ class CollectionManager(Client2):
5193
5374
  Raises
5194
5375
  ------
5195
5376
 
5196
- InvalidParameterException
5377
+ PyegeriaInvalidParameterException
5197
5378
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
5198
- PropertyServerException
5379
+ PyegeriaAPIException
5199
5380
  Raised by the server when an issue arises in processing a valid request
5200
5381
  NotAuthorizedException
5201
5382
  The principle specified by the user_id does not have authorization for the requested action
@@ -5233,7 +5414,7 @@ class CollectionManager(Client2):
5233
5414
 
5234
5415
  @dynamic_catch
5235
5416
  async def _async_remove_from_collection(self, collection_guid: str, element_guid: str,
5236
- body: dict | DeleteRequestBody = None) -> None:
5417
+ body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None:
5237
5418
  """Remove an element from a collection. Async version.
5238
5419
 
5239
5420
  Parameters
@@ -5242,7 +5423,7 @@ class CollectionManager(Client2):
5242
5423
  identity of the collection to return members for.
5243
5424
  element_guid: str
5244
5425
  Effective time of the query. If not specified will default to any time.
5245
- body: dict | DeleteRequestBody, optional, defaults to None
5426
+ body: dict | DeleteRelationshipRequestBody, optional, defaults to None
5246
5427
  The body of the request to add to the collection. See notes.
5247
5428
 
5248
5429
  Returns
@@ -5251,18 +5432,11 @@ class CollectionManager(Client2):
5251
5432
 
5252
5433
  Raises
5253
5434
  ------
5254
-
5255
- InvalidParameterException
5256
- If the client passes incorrect parameters on the request - such as bad URLs or invalid values
5257
- PropertyServerException
5258
- Raised by the server when an issue arises in processing a valid request
5259
- NotAuthorizedException
5260
- The principle specified by the user_id does not have authorization for the requested action
5261
-
5435
+ PyegeriaException
5262
5436
  Notes
5263
5437
  -----
5264
5438
  {
5265
- "class" : "DeleteRequestBody",
5439
+ "class" : "DeleteRelationshipRequestBody",
5266
5440
  "externalSourceGUID": "add guid here",
5267
5441
  "externalSourceName": "add qualified name here",
5268
5442
  "effectiveTime" : "{{$isoTimestamp}}",
@@ -5272,14 +5446,13 @@ class CollectionManager(Client2):
5272
5446
 
5273
5447
  """
5274
5448
 
5275
- url = (f"{self.collection_command_root}/{collection_guid}/members/"
5276
- f"{element_guid}/detach")
5277
- await self._async_delete_collection(url, body)
5449
+ url = f"{self.collection_command_root}/{collection_guid}/members/{element_guid}/detach"
5450
+ await self._async_delete_relationship_request(url, body)
5278
5451
  logger.info(f"Removed member {element_guid} from collection {collection_guid}")
5279
5452
 
5280
5453
 
5281
5454
  def remove_from_collection(self, collection_guid: str, element_guid: str,
5282
- body: dict | DeleteRequestBody= None) -> None:
5455
+ body: dict | DeleteRelationshipRequestBody= None) -> None:
5283
5456
  """Remove an element from a collection. Async version.
5284
5457
 
5285
5458
  Parameters
@@ -5298,9 +5471,9 @@ class CollectionManager(Client2):
5298
5471
  Raises
5299
5472
  ------
5300
5473
 
5301
- InvalidParameterException
5474
+ PyegeriaInvalidParameterException
5302
5475
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
5303
- PropertyServerException
5476
+ PyegeriaAPIException
5304
5477
  Raised by the server when an issue arises in processing a valid request
5305
5478
  NotAuthorizedException
5306
5479
  The principle specified by the user_id does not have authorization for the requested action
@@ -5326,7 +5499,7 @@ class CollectionManager(Client2):
5326
5499
 
5327
5500
 
5328
5501
  def remove_term_from_category(self, folder_guid: str, term_guid: str,
5329
- body: dict | DeleteRequestBody= None) -> None:
5502
+ body: dict | DeleteRelationshipRequestBody= None) -> None:
5330
5503
  """Remove a term from a category.
5331
5504
 
5332
5505
  Parameters
@@ -5345,9 +5518,9 @@ class CollectionManager(Client2):
5345
5518
  Raises
5346
5519
  ------
5347
5520
 
5348
- InvalidParameterException
5521
+ PyegeriaInvalidParameterException
5349
5522
  If the client passes incorrect parameters on the request - such as bad URLs or invalid values
5350
- PropertyServerException
5523
+ PyegeriaAPIException
5351
5524
  Raised by the server when an issue arises in processing a valid request
5352
5525
  NotAuthorizedException
5353
5526
  The principle specified by the user_id does not have authorization for the requested action
@@ -5365,8 +5538,8 @@ class CollectionManager(Client2):
5365
5538
 
5366
5539
 
5367
5540
  @dynamic_catch
5368
- async def _async_get_member_list(self, collection_guid: str = None, collection_name: str = None,
5369
- collection_qname: str = None, ) -> list | str:
5541
+ async def _async_get_member_list(self, collection_guid: Optional[str] = None, collection_name: Optional[str] = None,
5542
+ collection_qname: Optional[str] = None, ) -> list | str:
5370
5543
  """Get the member list for the collection - async version.
5371
5544
  Parameters
5372
5545
  ----------
@@ -5387,7 +5560,7 @@ class CollectionManager(Client2):
5387
5560
 
5388
5561
  Raises
5389
5562
  ------
5390
- InvalidParameterException
5563
+ PyegeriaInvalidParameterException
5391
5564
  If the root_collection_name does not have exactly one root collection.
5392
5565
 
5393
5566
  """
@@ -5403,10 +5576,11 @@ class CollectionManager(Client2):
5403
5576
  # finally, construct a list of member information
5404
5577
  for member_rel in members:
5405
5578
  member_guid = member_rel["elementHeader"]["guid"]
5406
- member = await self._async_get_element_by_guid_(member_guid)
5579
+ # member = await self._async_get_element_by_guid_(member_guid)
5580
+ member = member_rel
5407
5581
  if isinstance(member, dict):
5408
5582
  member_instance = {
5409
- "name": member["properties"].get('displayName', ''),
5583
+ "displayName": member["properties"].get('displayName', ''),
5410
5584
  "qualifiedName": member["properties"]["qualifiedName"], "guid": member["elementHeader"]["guid"],
5411
5585
  "description": member["properties"].get("description", ''),
5412
5586
  "type": member["elementHeader"]["type"]['typeName'],
@@ -5416,8 +5590,8 @@ class CollectionManager(Client2):
5416
5590
  return member_list if len(member_list) > 0 else "No members found"
5417
5591
 
5418
5592
 
5419
- def get_member_list(self, collection_guid: str = None, collection_name: str = None,
5420
- collection_qname: str = None, ) -> list | bool:
5593
+ def get_member_list(self, collection_guid: Optional[str] = None, collection_name: Optional[str] = None,
5594
+ collection_qname: Optional[str] = None, ) -> list | bool:
5421
5595
  """Get the member list for a collection - async version.
5422
5596
  Parameters
5423
5597
  ----------
@@ -5437,7 +5611,7 @@ class CollectionManager(Client2):
5437
5611
 
5438
5612
  Raises
5439
5613
  ------
5440
- InvalidParameterException
5614
+ PyegeriaInvalidParameterException
5441
5615
  If the root_collection_name does not have exactly one root collection.
5442
5616
 
5443
5617
  """
@@ -5448,7 +5622,12 @@ class CollectionManager(Client2):
5448
5622
 
5449
5623
  def _extract_digital_product_properties(self, element: dict, guid: str, output_format: str) -> dict:
5450
5624
  props = element["properties"]
5451
- digital_prod = DigitalProductProperties.model_validate(props)
5625
+ prop_class = props.get("class", "DigitalProductProperties")
5626
+ if prop_class == "DigitalProductFamilyProperties":
5627
+ digital_prod = DigitalProductFamilyProperties.model_validate(props)
5628
+ else:
5629
+ digital_prod = DigitalProductProperties.model_validate(props)
5630
+
5452
5631
  added_props = get_defined_field_values(digital_prod)
5453
5632
 
5454
5633
  used_by_digital_products = element.get("usedByDigitalProducts", "")
@@ -5465,6 +5644,40 @@ class CollectionManager(Client2):
5465
5644
  uses_digital_products_list += f"{prod["relatedElement"]["properties"]["qualifiedName"]}, "
5466
5645
  added_props["uses_digital_products"] = uses_digital_products_list[:-2]
5467
5646
 
5647
+ resources = element.get("resourceList", "")
5648
+ if isinstance(resources, (list | dict)):
5649
+ resource_list = ""
5650
+ for resource in resources:
5651
+ resource_list += f"{resource.get('properties',{}).get('qualifiedName', None)}, "
5652
+ added_props["resource_list"] = resource_list[:-2] if resource_list else ""
5653
+
5654
+ actors = element.get("assignedActors", "")
5655
+ if isinstance(actors, (list | dict)):
5656
+ actor_list = ""
5657
+ for actor in actors:
5658
+ actor_type = actor['relatedElement']['elementHeader']['type']['typeName']
5659
+ actor_qname = actor['relatedElement']['properties']['qualifiedName']
5660
+ actor_display_name = actor['relatedElement']['properties']['displayName']
5661
+ actor_list += actor_display_name
5662
+ added_props["actor_list"] = actor_list[:-2] if actor_list else ""
5663
+
5664
+ governed_by = element.get("governedBy", "")
5665
+ if isinstance(governed_by, (list | dict)):
5666
+ governed_by_list = ""
5667
+ for gov in governed_by:
5668
+ license_type = gov['relatedElement']['properties'].get('typeName',"")
5669
+ license_type_qname = gov['relatedElement']['properties'].get('qualifiedName','')
5670
+ governed_by_list += license_type_qname
5671
+ added_props["governed_list"] = governed_by_list[:-2] if governed_by_list else ""
5672
+
5673
+ solution_designs = element.get("solutionDesigns", "")
5674
+ if isinstance(solution_designs, (list | dict)):
5675
+ solution_design_list = ""
5676
+ for design in solution_designs:
5677
+ solution_design_qname = design['relatedElement']['properties'].get('qualifiedName', "")
5678
+ solution_design_list += solution_design_qname
5679
+ added_props["solution_design_list"] = solution_design_list[:-2] if solution_design_list else ""
5680
+
5468
5681
  return added_props
5469
5682
 
5470
5683
  def _extract_agreement_properties(self, element: dict, guid: str, output_format: str) -> dict:
@@ -5483,70 +5696,31 @@ class CollectionManager(Client2):
5483
5696
  return added_props
5484
5697
 
5485
5698
  def _extract_collection_properties(self, element: dict, columns_struct: dict) -> dict:
5486
- """
5487
- Extract common properties from a collection element and populate into the provided columns_struct.
5699
+ """Populate collection columns for output.
5488
5700
 
5489
- Args:
5490
- element (dict): The collection element
5491
- columns_struct (dict): The columns structure to populate
5701
+ Uses `populate_common_columns` to fill standard fields and derive requested relationships.
5492
5702
 
5493
- Returns:
5494
- dict: columns_struct with column 'value' fields populated
5495
- """
5496
- # First, populate from element.properties using the utility
5497
- col_data = populate_columns_from_properties(element, columns_struct)
5498
-
5499
- columns_list = col_data.get("formats", {}).get("columns", [])
5500
-
5501
- # Populate header-derived values
5502
- header_props = _extract_referenceable_properties(element)
5503
- for column in columns_list:
5504
- key = column.get('key')
5505
- if key in header_props:
5506
- column['value'] = header_props.get(key)
5507
- elif isinstance(key, str) and key.lower() == 'guid':
5508
- column['value'] = header_props.get('GUID')
5509
-
5510
- # Derived/computed fields
5511
- # collectionCategories are classifications
5512
- classification_names = ""
5513
- classifications = element.get('elementHeader', {}).get("collectionCategories", [])
5514
- for classification in classifications:
5515
- classification_names += f"{classification['classificationName']}, "
5516
- if classification_names:
5517
- for column in columns_list:
5518
- if column.get('key') == 'classifications':
5519
- column['value'] = classification_names[:-2]
5520
- break
5521
-
5522
- # Populate requested relationship-based columns generically from top-level keys
5523
- col_data = get_required_relationships(element, col_data)
5524
-
5525
- # Subject area classification
5526
- subject_area = element.get('elementHeader', {}).get("subjectArea", "") or ""
5527
- subj_val = ""
5528
- if isinstance(subject_area, dict):
5529
- subj_val = subject_area.get("classificationProperties", {}).get("subjectAreaName", "")
5530
- for column in columns_list:
5531
- if column.get('key') == 'subject_area':
5532
- column['value'] = subj_val
5533
- break
5534
-
5535
- # Mermaid graph
5536
- mermaid_val = element.get('mermaidGraph', "") or ""
5537
- for column in columns_list:
5538
- if column.get('key') == 'mermaid':
5539
- column['value'] = mermaid_val
5540
- break
5703
+ Parameters
5704
+ ----------
5705
+ element : dict
5706
+ Raw element from the OMVS.
5707
+ columns_struct : dict
5708
+ Format-set structure whose columns' `value` fields will be populated.
5541
5709
 
5710
+ Returns
5711
+ -------
5712
+ dict
5713
+ The same columns_struct with populated values.
5714
+ """
5715
+ # Use centralized common population
5716
+ col_data = populate_common_columns(element, columns_struct)
5542
5717
  logger.trace(f"Extracted/Populated columns: {col_data}")
5543
-
5544
5718
  return col_data
5545
5719
 
5546
5720
 
5547
- def _generate_collection_output(self, elements: dict|list[dict], filter: Optional[str],
5721
+ def _generate_collection_output(self, elements: dict|list[dict], filter_string: Optional[str],
5548
5722
  element_type_name: Optional[str], output_format: str = "DICT",
5549
- output_format_set: dict | str = None) -> str| list[dict]:
5723
+ report_spec: dict | str = None) -> str | list[dict]:
5550
5724
  """ Generate output for collections in the specified format.
5551
5725
 
5552
5726
  Args:
@@ -5554,7 +5728,7 @@ class CollectionManager(Client2):
5554
5728
  filter (Optional[str]): The search string used to find the elements
5555
5729
  element_type_name (Optional[str]): The type of collection
5556
5730
  output_format (str): The desired output format (MD, FORM, REPORT, LIST, DICT, MERMAID, HTML)
5557
- output_format_set (Optional[dict], optional): List of dictionaries containing column data. Defaults
5731
+ report_spec (Optional[dict], optional): List of dictionaries containing column data. Defaults
5558
5732
  to None.
5559
5733
 
5560
5734
  Returns:
@@ -5564,22 +5738,22 @@ class CollectionManager(Client2):
5564
5738
  entity_type = "Collections"
5565
5739
  else:
5566
5740
  entity_type = element_type_name
5567
- # First see if the user has specified an output_format_set - either a label or a dict
5741
+ # First see if the user has specified an report_spec - either a label or a dict
5568
5742
  get_additional_props_func = None
5569
- if output_format_set:
5570
- if isinstance(output_format_set, str):
5571
- output_formats = select_output_format_set(output_format_set, output_format)
5572
- elif isinstance(output_format_set, dict):
5573
- output_formats = get_output_format_type_match(output_format_set, output_format)
5743
+ if report_spec:
5744
+ if isinstance(report_spec, str):
5745
+ output_formats = select_report_spec(report_spec, output_format)
5746
+ elif isinstance(report_spec, dict):
5747
+ output_formats = get_report_spec_match(report_spec, output_format)
5574
5748
 
5575
5749
  # If no output_format was set, then use the element_type_name to lookup the output format
5576
5750
  elif element_type_name:
5577
- output_formats = select_output_format_set(element_type_name, output_format)
5751
+ output_formats = select_report_spec(element_type_name, output_format)
5578
5752
  else:
5579
5753
  # fallback to collections or entity type
5580
- output_formats = select_output_format_set(entity_type,output_format)
5754
+ output_formats = select_report_spec(entity_type,output_format)
5581
5755
  if output_formats is None:
5582
- output_formats = select_output_format_set("Default", output_format)
5756
+ output_formats = select_report_spec("Default", output_format)
5583
5757
 
5584
5758
  if output_formats:
5585
5759
  get_additional_props_name = output_formats.get("get_additional_props", {}).get("function", None)