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
pyegeria/config.py DELETED
@@ -1,523 +0,0 @@
1
- """
2
- SPDX-License-Identifier: Apache-2.0
3
- Copyright Contributors to the ODPi Egeria project.
4
-
5
- This module manages configuration information for pyegeria and pyegeria clients.
6
-
7
- The load_app_config() function loads configuration information:
8
- 1) Default configuration variables are specified in the Pydantic models below.
9
- 2) Environment variables are loaded from the .env file using pydantic-settings.
10
- - PYEGERIA_ROOT_PATH and PYEGERIA_CONFIG_FILE are loaded first to locate the config file
11
- - Additional environment variables are loaded from the operating system
12
- 3) We construct a path to an external configuration JSON file from the Environment Variables
13
- - PYEGERIA_ROOT_PATH
14
- - PYEGERIA_CONFIG_FILE
15
- 4) If a valid configuration file is found, the configuration will be loaded on top of the default configuration.
16
- 5) We then update the in-memory configuration from Environment Variables, if set.
17
-
18
- The result is that Environment Variable values take priority over configuration file values which override the defaults.
19
-
20
- The get_app_config() function is used by other modules to get configuration information from the configuration structure
21
- and makes it available as a Pydantic model.
22
-
23
- """
24
- import inspect
25
- import os
26
- import json
27
- from typing import List, Optional, Union, Dict, Any
28
-
29
- from loguru import logger
30
- from pydantic import BaseModel, Field, validator
31
- from pydantic_settings import BaseSettings, SettingsConfigDict
32
-
33
- from pyegeria._exceptions_new import PyegeriaInvalidParameterException, PyegeriaException
34
-
35
- logger.disable("pyegeria")
36
- # --- Pydantic Settings for Environment Variables ---
37
-
38
- class PyegeriaSettings(BaseSettings):
39
- """
40
- Settings loaded from environment variables using pydantic-settings.
41
- This class is used to load environment variables from the .env file.
42
-
43
- The .env file path can be specified when creating an instance of this class
44
- by passing the `_env_file` parameter. If not specified, it defaults to ".env"
45
- in the current directory.
46
- """
47
- # Core settings needed to locate the config file
48
- pyegeria_root_path: str = ""
49
- pyegeria_config_directory: str = ""
50
- pyegeria_config_file: str = "config.json"
51
-
52
- # Additional settings that can be loaded from .env
53
- pyegeria_console_width: int = 200
54
- pyegeria_user_format_sets_dir: str = "~/.pyegeria/format_sets"
55
- egeria_user_name: str = ""
56
- egeria_user_password: str = ""
57
-
58
- model_config = SettingsConfigDict(
59
- env_file=".env",
60
- env_file_encoding="utf-8",
61
- extra="ignore",
62
- case_sensitive=False
63
- )
64
-
65
- @classmethod
66
- def with_env_file(cls, env_file: str):
67
- """
68
- Create a PyegeriaSettings instance with a specific .env file.
69
-
70
- Args:
71
- env_file: Path to the .env file to load
72
-
73
- Returns:
74
- PyegeriaSettings: A new PyegeriaSettings instance
75
- """
76
- # Create a new class with a custom model_config that specifies the env_file
77
- class CustomSettings(cls):
78
- model_config = SettingsConfigDict(
79
- env_file=env_file,
80
- env_file_encoding="utf-8",
81
- extra="ignore",
82
- case_sensitive=False
83
- )
84
-
85
- # Create and return an instance of the custom class
86
- return CustomSettings()
87
-
88
-
89
- # --- Pydantic Models for Configuration ---
90
-
91
- class EnvironmentConfig(BaseModel):
92
- """Environment configuration settings"""
93
- console_width: int = Field(default=200, alias="Console Width")
94
- dr_egeria_inbox: str = Field(default="md_processing/dr-egeria-inbox", alias="Dr.Egeria Inbox")
95
- dr_egeria_outbox: str = Field(default="md_processing/dr-egeria-outbox", alias="Dr.Egeria Outbox")
96
- egeria_engine_host_url: str = Field(default="", alias="Egeria Engine Host URL")
97
- egeria_engine_host: str = Field(default="qs-engine-host", alias="Egeria Engine Host")
98
- egeria_glossary_path: str = Field(default="glossary", alias="Egeria Glossary Path")
99
- egeria_integration_daemon_url: str = Field(default="https://localhost:9443", alias="Egeria Integration Daemon URL")
100
- egeria_integration_daemon: str = Field(default="qs-integration-daemon", alias="Egeria Integration Daemon")
101
- egeria_jupyter: bool = Field(default=True, alias="Egeria Jupyter")
102
- egeria_kafka_endpoint: str = Field(default="localhost:9192", alias="Egeria Kafka Endpoint")
103
- egeria_mermaid_folder: str = Field(default="mermaid_graphs", alias="Egeria Mermaid Folder")
104
- egeria_metadata_store: str = Field(default="qs-metadata-store", alias="Egeria Metadata Store")
105
- egeria_platform_url: str = Field(default="https://localhost:9443", alias="Egeria Platform URL")
106
- egeria_view_server_url: str = Field(default="https://localhost:9443", alias="Egeria View Server URL")
107
- egeria_view_server: str = Field(default="qs-view-server", alias="Egeria View Server")
108
- pyegeria_root: str = Field(default="/Users/dwolfson/localGit/egeria-v5-3/egeria-python", alias="Pyegeria Root")
109
- pyegeria_config_directory: str = Field(default="", alias="Pyegeria Config Directory")
110
- pyegeria_config_file: str = Field(default="config.json", alias="Egeria Config File")
111
- pyegeria_publishing_root: str = Field(default="/dr-egeria-outbox", alias="Pyegeria Publishing Root")
112
- pyegeria_user_format_sets_dir: str = Field(default="~/.pyegeria/format_sets", alias="Pyegeria User Format Sets Dir")
113
-
114
- class Config:
115
- populate_by_name = True
116
- extra = "allow"
117
-
118
-
119
- class DebugConfig(BaseModel):
120
- """Debug configuration settings"""
121
- debug_mode: bool = False
122
- enable_logger_catch: bool = False
123
- timeout_seconds: int = 30
124
-
125
- class Config:
126
- populate_by_name = True
127
- extra = "allow"
128
-
129
-
130
- class LoggingConfig(BaseModel):
131
- """Logging configuration settings"""
132
- console_filter_levels: List[str] = ["ERROR"]
133
- console_logging_enabled: List[str] = ["_client_new", "_exceptions_new", "collections_manager_omvs", "tests"]
134
- console_logging_level: str = "INFO"
135
- enable_logging: bool = False
136
- file_logging_level: str = "INFO"
137
- log_directory: str = "logs"
138
- logging_console_format: str = " <green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level}</level> | <cyan>{name}</cyan>:<cyan>{line}</cyan> - <level>{message}</level> -{extra}"
139
- logging_file_format: str = " {time:YYYY-MM-DD HH:mm:ss} | {level} | {function}:{line} - {message }-{extra}"
140
-
141
- class Config:
142
- populate_by_name = True
143
- extra = "allow"
144
-
145
-
146
- class UserProfileConfig(BaseModel):
147
- """User profile configuration settings"""
148
- egeria_home_collection: str = Field(default="MyHome", alias="Egeria Home Collection")
149
- egeria_home_glossary_name: str = Field(default="Egeria-Markdown", alias="Egeria Home Glossary Name")
150
- egeria_local_qualifier: str = Field(default="PDR", alias="Egeria Local Qualifier")
151
- user_name: Optional[str] = "erinoverview"
152
- user_pwd: Optional[str] = "secret"
153
-
154
- @validator('user_name')
155
- def validate_user_name(cls, v):
156
- if not v:
157
- raise ValueError("Egeria user name is not found in the configuration")
158
- return v
159
-
160
- @validator('user_pwd')
161
- def validate_user_pwd(cls, v):
162
- if not v:
163
- raise ValueError("Egeria user password is not found in the configuration")
164
- return v
165
-
166
- class Config:
167
- populate_by_name = True
168
- extra = "allow"
169
-
170
-
171
- class AppConfig(BaseModel):
172
- """Main application configuration"""
173
- Environment: EnvironmentConfig
174
- Debug: DebugConfig
175
- Logging: LoggingConfig
176
- User_Profile: UserProfileConfig = Field(alias="User Profile")
177
- feature_x_enabled: bool = False
178
-
179
- def get(self, key, default=None):
180
- """
181
- Dictionary-like get method for backward compatibility.
182
-
183
- Args:
184
- key: The key to look up
185
- default: The default value to return if the key is not found
186
-
187
- Returns:
188
- The value for the key if found, otherwise the default value
189
- """
190
- # First check if the key is a direct attribute of this model
191
- if hasattr(self, key):
192
- return getattr(self, key)
193
-
194
- # Then check if it's in any of the nested models
195
- for section in [self.Environment, self.Debug, self.Logging, self.User_Profile]:
196
- if hasattr(section, key):
197
- return getattr(section, key)
198
- # Also check using the original field names (with aliases)
199
- for field_name, field in section.model_fields.items():
200
- # In Pydantic v2, the alias is stored in json_schema_extra
201
- alias = None
202
- if hasattr(field, 'alias'):
203
- alias = field.alias
204
- elif hasattr(field, 'json_schema_extra') and field.json_schema_extra:
205
- alias = field.json_schema_extra.get('alias')
206
-
207
- if alias == key:
208
- return getattr(section, field_name)
209
-
210
- # If not found, return the default
211
- return default
212
-
213
- class Config:
214
- populate_by_name = True
215
- extra = "allow"
216
-
217
-
218
- # --- Configuration Loading Logic ---
219
-
220
- # Private variable to hold the loaded configuration
221
- _app_config = None
222
-
223
- def load_app_config(env_file: str = None):
224
- """
225
- Loads application configuration from files and environment variables.
226
- This function should ideally be called only once at application startup.
227
-
228
- The function follows this precedence order for configuration settings:
229
- 1. If env_file is passed in, it uses that file to load environment variables
230
- 2. Otherwise, it first checks if OS environment variables are set for PYEGERIA_ROOT_PATH and PYEGERIA_CONFIG_FILE
231
- 3. If they are not set, it checks for a .env file in the current directory
232
- 4. It then loads the configuration from the config file if available
233
- 5. Finally, it updates the configuration with environment variables from the operating system,
234
- which take precedence over the config file values
235
-
236
- Args:
237
- env_file: Optional path to a specific .env file to load. If not specified,
238
- the function follows the precedence order described above.
239
-
240
- Returns:
241
- AppConfig: The loaded configuration as a Pydantic model
242
- """
243
- global _app_config # Declare intent to modify the global _app_config
244
-
245
- if _app_config is not None:
246
- # Configuration already loaded, return existing instance
247
- return _app_config
248
-
249
- # Start with default configuration from Pydantic models
250
- config_dict = {
251
- "Environment": {},
252
- "Debug": {},
253
- "Logging": {},
254
- "User Profile": {},
255
- "feature_x_enabled": False
256
- }
257
-
258
- # Initialize env_settings with default values
259
- env_settings = PyegeriaSettings()
260
-
261
- # First check if OS environment variables are set for PYEGERIA_CONFIG_DIRECTORY, PYEGERIA_ROOT_PATH and PYEGERIA_CONFIG_FILE
262
- config_directory = os.getenv("PYEGERIA_CONFIG_DIRECTORY")
263
- root_path = os.getenv("PYEGERIA_ROOT_PATH")
264
- config_file = os.getenv("PYEGERIA_CONFIG_FILE")
265
-
266
- logger.info(f"DEBUG: Initial config_directory from OS env: {config_directory}")
267
- logger.info(f"DEBUG: Initial root_path from OS env: {root_path}")
268
- logger.info(f"DEBUG: Initial config_file from OS env: {config_file}")
269
- logger.info(f"DEBUG: env_file parameter: {env_file}")
270
-
271
- # If env_file is specified, use it to load environment variables
272
- if env_file is not None:
273
- logger.trace(f"DEBUG: Loading environment variables from {env_file}")
274
- env_settings = PyegeriaSettings.with_env_file(env_file)
275
-
276
- # If env_file is specified, always use its values, regardless of OS environment variables
277
- config_directory = env_settings.pyegeria_config_directory
278
- root_path = env_settings.pyegeria_root_path
279
- config_file = env_settings.pyegeria_config_file
280
- # If config_file is set but config_directory and root_path are not, we'll try to load the config file first
281
- # and only check the .env file if we still don't have a config_directory or root_path after loading the config file
282
- elif config_file is not None and config_directory is None and root_path is None:
283
- # We'll check for a .env file later if needed
284
- pass
285
- # If any of config_directory, root_path, or config_file is not set, check for a .env file in the current directory
286
- elif (config_directory is None or root_path is None or config_file is None):
287
- if os.path.exists(".env"):
288
- logger.info("Found .env file")
289
- logger.debug(f"DEBUG: Loading environment variables from .env in current directory")
290
- env_settings = PyegeriaSettings()
291
- logger.debug(f"DEBUG: env_settings.pyegeria_config_directory: {env_settings.pyegeria_config_directory}")
292
- logger.debug(f"DEBUG: env_settings.pyegeria_root_path: {env_settings.pyegeria_root_path}")
293
- logger.debug(f"DEBUG: env_settings.pyegeria_config_file: {env_settings.pyegeria_config_file}")
294
- if config_directory is None:
295
- config_directory = env_settings.pyegeria_config_directory
296
- if root_path is None:
297
- root_path = env_settings.pyegeria_root_path
298
- if config_file is None:
299
- config_file = env_settings.pyegeria_config_file
300
- else:
301
- logger.error(f"The .env file at {env_file} wasn't found")
302
- else:
303
- logger.error(f"The .env file at {env_file} wasn't found-outer")
304
- # Use default values if still not set
305
- if config_directory is None:
306
- config_directory = ""
307
- if root_path is None:
308
- root_path = ""
309
- if config_file is None:
310
- config_file = "config.json"
311
-
312
- # Construct the config file path - prefer config_directory over root_path
313
- if config_directory:
314
- config_file_path = os.path.join(config_directory, config_file)
315
- else:
316
- config_file_path = os.path.join(root_path, config_file)
317
-
318
- if os.path.exists(config_file_path):
319
- logger.info("Found config file at {}".format(config_file_path))
320
- try:
321
- with open(config_file_path, 'r') as f:
322
- file_config = json.load(f)
323
- config_dict.update(file_config) # Merge/override defaults
324
-
325
- # If config_directory is not set from environment variables or .env file,
326
- # set it from the config file if available
327
- if not config_directory and "Environment" in file_config and "Pyegeria Config Directory" in file_config["Environment"]:
328
- config_directory = file_config["Environment"]["Pyegeria Config Directory"]
329
- logger.debug(f"DEBUG: Setting config_directory from config file: {config_directory}")
330
- # If config_directory is still not set and root_path is not set from environment variables or .env file,
331
- # set root_path from the config file if available
332
- if not config_directory and not root_path and "Environment" in file_config and "Pyegeria Root" in file_config["Environment"]:
333
- root_path = file_config["Environment"]["Pyegeria Root"]
334
- logger.debug(f"DEBUG: Setting root_path from config file: {root_path}")
335
- except json.JSONDecodeError:
336
- logger.warning(f"Warning: Could not parse {config_file_path}. Using defaults/env vars.")
337
- except Exception as e:
338
- logger.warning(f"Warning: Error reading {config_file_path}: {e}. Using defaults/env vars.")
339
- else:
340
- logger.warning(f"Warning: Could not find {config_file_path}. Using defaults/env vars.")
341
-
342
- # The root_path has already been set with the correct precedence order:
343
- # 1. If env_file is passed in, use that file to load environment variables
344
- # 2. Otherwise, first check OS environment variables
345
- # 3. If not set, check for a .env file in the current directory
346
- # 4. If still not set, use the default value
347
- # We don't need to set it again here, as that would override the precedence order
348
- env = config_dict.get("Environment", {})
349
-
350
- # Update configuration from environment variables
351
- # Debug section
352
- debug = config_dict["Debug"]
353
- debug['debug_mode'] = _parse_bool_env("PYEGERIA_DEBUG_MODE", debug.get("debug_mode", False))
354
- debug["enable_logger_catch"] = _parse_bool_env("PYEGERIA_ENABLE_LOGGER_CATCH", debug.get("enable_logger_catch", False))
355
- debug["timeout_seconds"] = int(os.getenv("PYEGERIA_TIMEOUT_SECONDS", debug.get("timeout_seconds", 30)))
356
-
357
- # Environment section
358
- env = config_dict["Environment"]
359
- # Use the settings from .env file, but allow OS environment variables to override them
360
- env["Console Width"] = int(os.getenv("PYEGERIA_CONSOLE_WIDTH", env.get("Console Width", env_settings.pyegeria_console_width)))
361
- env["Dr.Egeria Inbox"] = os.getenv("DR_EGERIA_INBOX_PATH", env.get("Dr.Egeria Inbox", "md_processing/dr-egeria-inbox"))
362
- env["Dr.Egeria Outbox"] = os.getenv("DR_EGERIA_OUTBOX_PATH", env.get("Dr.Egeria Outbox", "md_processing/dr-egeria-outbox"))
363
- env["Egeria Engine Host"] = os.getenv("EGERIA_ENGINE_HOST", env.get("Egeria Engine Host", "qs-engine-host"))
364
- env["Egeria Engine Host URL"] = os.getenv("EGERIA_ENGINE_HOST_URL", env.get("Egeria Engine Host URL", "https://localhost:9443"))
365
- env["Egeria Glossary Path"] = os.getenv("EGERIA_GLOSSARY_PATH", env.get("Egeria Glossary Path", "glossary"))
366
- env["Egeria Integration Daemon"] = os.getenv("EGERIA_INTEGRATION_DAEMON", env.get("Egeria Integration Daemon", "qs-integration-daemon"))
367
- env["Egeria Integration Daemon URL"] = os.getenv("EGERIA_INTEGRATION_DAEMON_URL", env.get("Egeria Integration Daemon URL", "https://localhost:9443"))
368
- env["Egeria Jupyter"] = _parse_bool_env("EGERIA_JUPYTER", env.get("Egeria Jupyter", True))
369
- env["Egeria Kafka Endpoint"] = os.getenv("EGERIA_KAFKA", env.get("Egeria Kafka Endpoint", "localhost:9192"))
370
- env["Egeria Mermaid Folder"] = os.getenv("EGERIA_MERMAID_FOLDER", env.get("Egeria Mermaid Folder", "mermaid_graphs"))
371
- env["Egeria Metadata Store"] = os.getenv("EGERIA_METADATA_STORE", env.get("Egeria Metadata Store", "qs-metadata-store"))
372
- env["Egeria Platform URL"] = os.getenv("EGERIA_PLATFORM_URL", env.get("Egeria Platform URL", "https://localhost:9443"))
373
- env["Egeria View Server"] = os.getenv("EGERIA_VIEW_SERVER", env.get("Egeria View Server", "qs-view-server"))
374
- env["Egeria View Server URL"] = os.getenv("EGERIA_VIEW_SERVER_URL", env.get("Egeria View Server URL", "https://localhost:9443"))
375
- env['Pyegeria Publishing Root'] = os.getenv("PYEGERIA_PUBLISHING_ROOT", env.get("Pyegeria Publishing Root", "/dr-egeria-outbox"))
376
- env['Pyegeria User Format Sets Dir'] = os.getenv("PYEGERIA_USER_FORMAT_SETS_DIR", env.get("Pyegeria User Format Sets Dir", "~/.pyegeria/format_sets"))
377
- # Set Pyegeria Config Directory to the config_directory value we've already determined with the correct precedence order
378
- env["Pyegeria Config Directory"] = config_directory
379
- # Set Pyegeria Root to the root_path value we've already determined with the correct precedence order
380
- env["Pyegeria Root"] = root_path
381
-
382
- # Logging section
383
- log = config_dict["Logging"]
384
- log["console_filter_levels"] = _parse_list_env("PYEGERIA_CONSOLE_FILTER_LEVELS", log.get("console_filter_levels", ["ERROR","WARNING","INFO","SUCCESS"]))
385
- log["console_logging_enabled"] = _parse_list_env("PYEGERIA_CONSOLE_LOGGING_ENABLED", log.get("console_logging_enabled", ["pyegeria"]))
386
- log["console_logging_level"] = os.getenv("PYEGERIA_CONSOLE_LOG_LVL", log.get("console_logging_level", "INFO"))
387
- log["enable_logging"] = _parse_bool_env("PYEGERIA_ENABLE_LOGGING", log.get("enable_logging", False))
388
- log["file_logging_level"] = os.getenv("PYEGERIA_FILE_LOG_LVL", log.get("file_logging_level", "INFO"))
389
- log["log_directory"] = os.getenv("PYEGERIA_LOG_DIRECTORY", log.get("log_directory", 'logs'))
390
- log["logging_console_format"] = os.getenv("PYEGERIA_LOGGING_CONSOLE_FORMAT", log.get("logging_console_format",
391
- "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level}</level> | "
392
- "<cyan>{name}</cyan>:<cyan>{line}</cyan> - "
393
- "<level>{message}</level> -{extra}"))
394
- log["logging_file_format"] = os.getenv("PYEGERIA_LOGGING_FILE_FORMAT", log.get("logging_file_format",
395
- "{time:YYYY-MM-DD HH:mm:ss} | {level} | {function}:{line} "
396
- "- {message}-{extra}"))
397
-
398
- # User Profile section
399
- user = config_dict["User Profile"]
400
- user["Egeria Home Collection"] = os.getenv("EGERIA_HOME_COLLECTION", user.get("Egeria Home Collection", "myHome"))
401
- user["Egeria Home Glossary Name"] = os.getenv("EGERIA_HOME_GLOSSARY_NAME", user.get("Egeria Home Glossary Name", "Egeria-Markdown"))
402
- user["Egeria Local Qualifier"] = os.getenv("EGERIA_LOCAL_QUALIFIER", user.get("Egeria Local Qualifier", "myLocal"))
403
-
404
- # Load user credentials with proper precedence
405
- # 1. Check OS environment variables
406
- user_name = os.getenv("EGERIA_USER")
407
- user_pwd = os.getenv("EGERIA_USER_PASSWORD")
408
-
409
- # 2. If not set, check config file
410
- if user_name is None:
411
- user_name = user.get("user_name")
412
- if user_pwd is None:
413
- user_pwd = user.get("user_pwd")
414
-
415
- # 3. If still not set and we have env_settings, check .env file
416
- if (user_name is None or user_pwd is None) and 'env_settings' in locals():
417
- if user_name is None:
418
- user_name = env_settings.egeria_user_name
419
- if user_pwd is None:
420
- user_pwd = env_settings.egeria_user_password
421
-
422
- # Set the values in the config dictionary
423
- user["user_name"] = user_name
424
- user["user_pwd"] = user_pwd
425
-
426
- # Feature flags
427
- # Ensure feature_x_enabled is a boolean, regardless of what's in the config file
428
- feature_x = config_dict.get("feature_x_enabled", False)
429
- feature_x = _parse_bool_value(feature_x)
430
- # Check if the environment variable is set, which would override the config value
431
- if "FEATURE_X_ENABLED" in os.environ:
432
- feature_x = _parse_bool_value(os.getenv("FEATURE_X_ENABLED"))
433
- config_dict["feature_x_enabled"] = feature_x
434
-
435
- try:
436
- # Create Pydantic model from the configuration dictionary
437
- _app_config = AppConfig(**config_dict)
438
- except ValueError as e:
439
- # Handle validation errors from Pydantic
440
- context = {"caller method": inspect.currentframe().f_back.f_code.co_name}
441
- additional_info = {"reason": str(e)}
442
- raise PyegeriaInvalidParameterException(None, context, additional_info)
443
-
444
- return _app_config
445
-
446
-
447
- def get_app_config(env_file: str = None)-> AppConfig:
448
- """
449
- Provides access to the loaded application configuration.
450
- Ensures config is loaded if not already (useful for testing or simple scripts).
451
- For structured apps, load_app_config() should be called explicitly once at startup.
452
-
453
- Args:
454
- env_file: Optional path to a specific .env file to load. If not specified,
455
- the default .env file in the current directory is used.
456
-
457
- Returns:
458
- AppConfig: The loaded configuration as a Pydantic model
459
- """
460
- if _app_config is None:
461
- # If get_app_config is called before load_app_config, load it now.
462
- # This can be convenient but explicit loading is generally better.
463
- logger.info(f"The env_file {env_file} is being passed in")
464
- return load_app_config(env_file)
465
- return _app_config
466
-
467
-
468
-
469
-
470
- def _parse_bool_env(env_var: str, default: bool) -> bool:
471
- """
472
- Parse a boolean environment variable.
473
-
474
- Args:
475
- env_var: The name of the environment variable
476
- default: The default value if the environment variable is not set
477
-
478
- Returns:
479
- bool: The parsed boolean value
480
- """
481
- if env_var in os.environ:
482
- value = os.getenv(env_var).lower()
483
- return value in ('true', '1', 't', 'y', 'yes', 'on')
484
- return default
485
-
486
- def _parse_bool_value(value: Any) -> bool:
487
- """
488
- Parse a boolean value from any type.
489
-
490
- Args:
491
- value: The value to parse
492
-
493
- Returns:
494
- bool: The parsed boolean value
495
- """
496
- if isinstance(value, bool):
497
- return value
498
- if isinstance(value, str):
499
- return value.lower() in ('true', '1', 't', 'y', 'yes', 'on')
500
- if isinstance(value, (int, float)):
501
- return bool(value)
502
- return False
503
-
504
-
505
- def _parse_list_env(env_var: str, default: List[str]) -> List[str]:
506
- """
507
- Parse a list environment variable (comma-separated).
508
-
509
- Args:
510
- env_var: The name of the environment variable
511
- default: The default value if the environment variable is not set
512
-
513
- Returns:
514
- List[str]: The parsed list value
515
- """
516
- if env_var in os.environ:
517
- value = os.getenv(env_var)
518
- if value:
519
- return [item.strip() for item in value.split(',')]
520
- return default
521
-
522
-
523
- settings = get_app_config()
@@ -1,91 +0,0 @@
1
- """
2
- SPDX-License-Identifier: Apache-2.0
3
- Copyright Contributors to the ODPi Egeria project.
4
-
5
- Runtime manager is a view service that supports user interaction with the running platforms.
6
-
7
- """
8
- from pyegeria.feedback_manager_omvs import FeedbackManager
9
- from pyegeria.my_profile_omvs import MyProfile
10
- from pyegeria.utils import body_slimmer
11
-
12
- from pyegeria._exceptions import InvalidParameterException
13
-
14
-
15
- class EgeriaMy:
16
- """
17
- Client to issue Runtime status requests using composition of MyProfile and FeedbackManager.
18
-
19
- Attributes:
20
- view_server: str
21
- Name of the view server to use.
22
- platform_url : str
23
- URL of the server platform to connect to
24
- user_id : str
25
- The identity of the user calling the method - this sets a default optionally used by the methods
26
- when the user doesn't pass the user_id on a method call.
27
- user_pwd: str
28
- The password associated with the user_id. Defaults to None
29
- token: str, optional
30
- Bearer token used for authentication.
31
-
32
- Methods:
33
- Methods are provided by composed sub-clients (MyProfile, FeedbackManager) via delegation.
34
- """
35
-
36
- def __init__(
37
- self,
38
- view_server: str,
39
- platform_url: str,
40
- user_id: str,
41
- user_pwd: str = None,
42
- token: str = None,
43
- ):
44
- self.view_server = view_server
45
- self.platform_url = platform_url
46
- self.user_id = user_id
47
- self.user_pwd = user_pwd
48
-
49
- # Compose sub-clients
50
- self._my_profile = MyProfile(view_server, platform_url, user_id, user_pwd, token)
51
- self._feedback = FeedbackManager(view_server, platform_url, user_id, user_pwd, token)
52
- # Keep an ordered list for delegation lookups and bulk operations
53
- self._subclients = [self._my_profile, self._feedback]
54
-
55
- # Delegation: route unknown attributes to first sub-client that has it
56
- def __getattr__(self, name):
57
- for sub in self._subclients:
58
- if hasattr(sub, name):
59
- return getattr(sub, name)
60
- raise AttributeError(f"{self.__class__.__name__!s} object has no attribute {name!r}")
61
-
62
- # Token management across subclients
63
- def create_egeria_bearer_token(self, user_id: str = None, user_pwd: str = None):
64
- token_val = None
65
- for sub in self._subclients:
66
- token_val = sub.create_egeria_bearer_token(user_id, user_pwd)
67
- return token_val
68
-
69
- def set_bearer_token(self, token: str) -> None:
70
- for sub in self._subclients:
71
- sub.set_bearer_token(token)
72
-
73
- def get_token(self) -> str:
74
- # Return token from the first sub-client that provides it
75
- for sub in self._subclients:
76
- if hasattr(sub, "get_token"):
77
- return sub.get_token()
78
- return None
79
-
80
- def close_session(self) -> None:
81
- for sub in self._subclients:
82
- if hasattr(sub, "close_session"):
83
- try:
84
- sub.close_session()
85
- except Exception:
86
- # Best-effort close; ignore individual errors
87
- pass
88
-
89
-
90
- if __name__ == "__main__":
91
- print("Main-Egeria My Client")