pyegeria 5.3.9.9.3__py3-none-any.whl → 5.5.3.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pyegeria might be problematic. Click here for more details.

Files changed (272) hide show
  1. commands/__init__.py +24 -0
  2. commands/cat/Dr-Egeria_md-orig.py +2 -2
  3. commands/cat/__init__.py +1 -17
  4. commands/cat/collection_actions.py +197 -0
  5. commands/cat/dr_egeria_command_help.py +372 -0
  6. commands/cat/dr_egeria_jupyter.py +7 -7
  7. commands/cat/dr_egeria_md.py +27 -182
  8. commands/cat/exp_list_glossaries.py +11 -14
  9. commands/cat/get_asset_graph.py +37 -267
  10. commands/cat/{get_collection.py → get_collection_tree.py} +10 -18
  11. commands/cat/get_project_dependencies.py +14 -14
  12. commands/cat/get_project_structure.py +15 -14
  13. commands/cat/get_tech_type_elements.py +16 -116
  14. commands/cat/glossary_actions.py +145 -298
  15. commands/cat/list_assets.py +3 -11
  16. commands/cat/list_cert_types.py +17 -63
  17. commands/cat/list_collections.py +46 -138
  18. commands/cat/list_deployed_catalogs.py +15 -27
  19. commands/cat/list_deployed_database_schemas.py +27 -43
  20. commands/cat/list_deployed_databases.py +16 -31
  21. commands/cat/list_deployed_servers.py +35 -54
  22. commands/cat/list_glossaries.py +18 -17
  23. commands/cat/list_projects.py +10 -12
  24. commands/cat/list_tech_type_elements.py +21 -37
  25. commands/cat/list_tech_types.py +13 -25
  26. commands/cat/list_terms.py +38 -79
  27. commands/cat/list_todos.py +4 -11
  28. commands/cat/list_user_ids.py +3 -10
  29. commands/cat/my_reports.py +559 -0
  30. commands/cat/run_report.py +394 -0
  31. commands/cat/run_report_orig.py +528 -0
  32. commands/cli/egeria.py +222 -247
  33. commands/cli/egeria_cat.py +68 -81
  34. commands/cli/egeria_my.py +13 -0
  35. commands/cli/egeria_ops.py +69 -74
  36. commands/cli/egeria_tech.py +17 -93
  37. commands/cli/ops_config.py +3 -6
  38. commands/{cat/list_categories.py → deprecated/list_data_designer.py} +53 -64
  39. commands/{cat/list_data_structures.py → deprecated/list_data_structures_full.py} +3 -6
  40. commands/deprecated/old_get_asset_graph.py +315 -0
  41. commands/my/__init__.py +0 -2
  42. commands/my/list_my_profile.py +27 -34
  43. commands/my/list_my_roles.py +1 -7
  44. commands/my/monitor_my_todos.py +1 -7
  45. commands/my/monitor_open_todos.py +6 -7
  46. commands/my/todo_actions.py +4 -5
  47. commands/ops/__init__.py +0 -2
  48. commands/ops/gov_server_actions.py +17 -21
  49. commands/ops/list_archives.py +17 -38
  50. commands/ops/list_catalog_targets.py +33 -40
  51. commands/ops/load_archive.py +35 -26
  52. commands/ops/{monitor_engine_activity_c.py → monitor_active_engine_activity.py} +51 -82
  53. commands/ops/{monitor_integ_daemon_status.py → monitor_daemon_status.py} +35 -55
  54. commands/ops/monitor_engine_activity.py +79 -77
  55. commands/ops/{monitor_gov_eng_status.py → monitor_engine_status.py} +10 -7
  56. commands/ops/monitor_platform_status.py +38 -50
  57. commands/ops/monitor_server_startup.py +6 -11
  58. commands/ops/monitor_server_status.py +7 -11
  59. commands/ops/orig_monitor_server_list.py +8 -8
  60. commands/ops/orig_monitor_server_status.py +1 -5
  61. commands/ops/refresh_integration_daemon.py +5 -5
  62. commands/ops/restart_integration_daemon.py +5 -5
  63. commands/ops/table_integ_daemon_status.py +6 -6
  64. commands/ops/x_engine_actions.py +7 -7
  65. commands/tech/__init__.py +0 -2
  66. commands/tech/{generic_actions.py → element_actions.py} +6 -11
  67. commands/tech/get_element_info.py +20 -29
  68. commands/tech/get_guid_info.py +23 -42
  69. commands/tech/get_tech_details.py +20 -35
  70. commands/tech/get_tech_type_template.py +28 -39
  71. commands/tech/list_all_om_type_elements.py +24 -30
  72. commands/tech/list_all_om_type_elements_x.py +22 -28
  73. commands/tech/list_all_related_elements.py +19 -28
  74. commands/tech/list_anchored_elements.py +22 -30
  75. commands/tech/list_asset_types.py +19 -24
  76. commands/tech/list_elements_by_classification_by_property_value.py +26 -32
  77. commands/tech/list_elements_by_property_value.py +19 -25
  78. commands/tech/list_elements_by_property_value_x.py +20 -28
  79. commands/tech/list_elements_for_classification.py +28 -41
  80. commands/tech/list_gov_action_processes.py +16 -27
  81. commands/tech/list_information_supply_chains.py +22 -30
  82. commands/tech/list_registered_services.py +14 -26
  83. commands/tech/list_related_elements_with_prop_value.py +15 -25
  84. commands/tech/list_related_specification.py +1 -4
  85. commands/tech/list_relationship_types.py +15 -25
  86. commands/tech/list_relationships.py +20 -36
  87. commands/tech/list_solution_blueprints.py +28 -33
  88. commands/tech/list_solution_components.py +23 -29
  89. commands/tech/list_solution_roles.py +21 -32
  90. commands/tech/list_tech_templates.py +51 -54
  91. commands/tech/list_valid_metadata_values.py +5 -9
  92. commands/tech/table_tech_templates.py +2 -6
  93. commands/tech/x_list_related_elements.py +1 -4
  94. examples/GeoSpatial Products Example.py +524 -0
  95. examples/Jupyter Notebooks/P-egeria-server-config.ipynb +2137 -0
  96. examples/Jupyter Notebooks/README.md +2 -0
  97. examples/Jupyter Notebooks/common/P-environment-check.ipynb +115 -0
  98. examples/Jupyter Notebooks/common/__init__.py +14 -0
  99. examples/Jupyter Notebooks/common/common-functions.ipynb +4694 -0
  100. examples/Jupyter Notebooks/common/environment-check.ipynb +52 -0
  101. examples/Jupyter Notebooks/common/globals.ipynb +184 -0
  102. examples/Jupyter Notebooks/common/globals.py +154 -0
  103. examples/Jupyter Notebooks/common/orig_globals.py +152 -0
  104. examples/format_sets/all_format_sets.json +910 -0
  105. examples/format_sets/custom_format_sets.json +268 -0
  106. examples/format_sets/subset_format_sets.json +187 -0
  107. examples/format_sets_save_load_example.py +291 -0
  108. examples/jacquard_data_sets.py +129 -0
  109. examples/output_formats_example.py +193 -0
  110. examples/test_jacquard_data_sets.py +54 -0
  111. examples/test_jacquard_data_sets_scenarios.py +94 -0
  112. md_processing/__init__.py +90 -0
  113. md_processing/command_dispatcher.py +33 -0
  114. md_processing/command_mapping.py +221 -0
  115. md_processing/data/commands/commands_data_designer.json +537 -0
  116. md_processing/data/commands/commands_external_reference.json +733 -0
  117. md_processing/data/commands/commands_feedback.json +155 -0
  118. md_processing/data/commands/commands_general.json +204 -0
  119. md_processing/data/commands/commands_glossary.json +218 -0
  120. md_processing/data/commands/commands_governance.json +3678 -0
  121. md_processing/data/commands/commands_product_manager.json +865 -0
  122. md_processing/data/commands/commands_project.json +642 -0
  123. md_processing/data/commands/commands_solution_architect.json +366 -0
  124. md_processing/data/commands.json +17568 -0
  125. md_processing/data/commands_working.json +30641 -0
  126. md_processing/data/gened_report_specs.py +6584 -0
  127. md_processing/data/generated_format_sets.json +6533 -0
  128. md_processing/data/generated_format_sets_old.json +4137 -0
  129. md_processing/data/generated_format_sets_old.py +45 -0
  130. md_processing/dr_egeria.py +182 -0
  131. md_processing/md_commands/__init__.py +3 -0
  132. md_processing/md_commands/data_designer_commands.py +1276 -0
  133. md_processing/md_commands/ext_ref_commands.py +530 -0
  134. md_processing/md_commands/feedback_commands.py +726 -0
  135. md_processing/md_commands/glossary_commands.py +684 -0
  136. md_processing/md_commands/governance_officer_commands.py +600 -0
  137. md_processing/md_commands/product_manager_commands.py +1266 -0
  138. md_processing/md_commands/project_commands.py +383 -0
  139. md_processing/md_commands/solution_architect_commands.py +1184 -0
  140. md_processing/md_commands/view_commands.py +295 -0
  141. md_processing/md_processing_utils/__init__.py +4 -0
  142. md_processing/md_processing_utils/common_md_proc_utils.py +1249 -0
  143. md_processing/md_processing_utils/common_md_utils.py +578 -0
  144. md_processing/md_processing_utils/determine_width.py +103 -0
  145. md_processing/md_processing_utils/extraction_utils.py +547 -0
  146. md_processing/md_processing_utils/gen_report_specs.py +643 -0
  147. md_processing/md_processing_utils/generate_dr_help.py +193 -0
  148. md_processing/md_processing_utils/generate_md_cmd_templates.py +144 -0
  149. md_processing/md_processing_utils/generate_md_templates.py +83 -0
  150. md_processing/md_processing_utils/md_processing_constants.py +1228 -0
  151. md_processing/md_processing_utils/message_constants.py +19 -0
  152. pyegeria/__init__.py +201 -443
  153. pyegeria/core/__init__.py +40 -0
  154. pyegeria/core/_base_platform_client.py +574 -0
  155. pyegeria/core/_base_server_client.py +573 -0
  156. pyegeria/core/_exceptions.py +457 -0
  157. pyegeria/core/_globals.py +60 -0
  158. pyegeria/core/_server_client.py +6073 -0
  159. pyegeria/core/_validators.py +257 -0
  160. pyegeria/core/config.py +654 -0
  161. pyegeria/{create_tech_guid_lists.py → core/create_tech_guid_lists.py} +0 -1
  162. pyegeria/core/load_config.py +37 -0
  163. pyegeria/core/logging_configuration.py +207 -0
  164. pyegeria/core/mcp_adapter.py +144 -0
  165. pyegeria/core/mcp_server.py +212 -0
  166. pyegeria/core/utils.py +405 -0
  167. pyegeria/deprecated/__init__.py +0 -0
  168. pyegeria/{_client.py → deprecated/_client.py} +62 -24
  169. pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
  170. pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1988 -1878
  171. pyegeria/deprecated/output_formatter_with_machine_keys.py +1127 -0
  172. pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +216 -229
  173. pyegeria/{valid_metadata_omvs.py → deprecated/valid_metadata_omvs.py} +93 -93
  174. pyegeria/{x_action_author_omvs.py → deprecated/x_action_author_omvs.py} +2 -3
  175. pyegeria/egeria_cat_client.py +25 -51
  176. pyegeria/egeria_client.py +140 -98
  177. pyegeria/egeria_config_client.py +48 -24
  178. pyegeria/egeria_tech_client.py +170 -83
  179. pyegeria/models/__init__.py +150 -0
  180. pyegeria/models/collection_models.py +168 -0
  181. pyegeria/models/models.py +654 -0
  182. pyegeria/omvs/__init__.py +84 -0
  183. pyegeria/omvs/action_author.py +342 -0
  184. pyegeria/omvs/actor_manager.py +5980 -0
  185. pyegeria/omvs/asset_catalog.py +842 -0
  186. pyegeria/omvs/asset_maker.py +2736 -0
  187. pyegeria/omvs/automated_curation.py +4403 -0
  188. pyegeria/omvs/classification_manager.py +11213 -0
  189. pyegeria/omvs/collection_manager.py +5780 -0
  190. pyegeria/omvs/community_matters_omvs.py +468 -0
  191. pyegeria/{core_omag_server_config.py → omvs/core_omag_server_config.py} +157 -157
  192. pyegeria/{data_designer_omvs.py → omvs/data_designer.py} +1991 -1691
  193. pyegeria/omvs/data_discovery.py +869 -0
  194. pyegeria/omvs/data_engineer.py +372 -0
  195. pyegeria/omvs/digital_business.py +1133 -0
  196. pyegeria/omvs/external_links.py +1752 -0
  197. pyegeria/omvs/feedback_manager.py +834 -0
  198. pyegeria/{full_omag_server_config.py → omvs/full_omag_server_config.py} +73 -69
  199. pyegeria/omvs/glossary_manager.py +3231 -0
  200. pyegeria/omvs/governance_officer.py +3009 -0
  201. pyegeria/omvs/lineage_linker.py +314 -0
  202. pyegeria/omvs/location_arena.py +1525 -0
  203. pyegeria/omvs/metadata_expert.py +668 -0
  204. pyegeria/omvs/metadata_explorer_omvs.py +2943 -0
  205. pyegeria/omvs/my_profile.py +1042 -0
  206. pyegeria/omvs/notification_manager.py +358 -0
  207. pyegeria/omvs/people_organizer.py +394 -0
  208. pyegeria/{platform_services.py → omvs/platform_services.py} +113 -193
  209. pyegeria/omvs/product_manager.py +1825 -0
  210. pyegeria/omvs/project_manager.py +1907 -0
  211. pyegeria/omvs/reference_data.py +1140 -0
  212. pyegeria/omvs/registered_info.py +334 -0
  213. pyegeria/omvs/runtime_manager.py +2817 -0
  214. pyegeria/omvs/schema_maker.py +446 -0
  215. pyegeria/{server_operations.py → omvs/server_operations.py} +27 -26
  216. pyegeria/omvs/solution_architect.py +6490 -0
  217. pyegeria/omvs/specification_properties.py +37 -0
  218. pyegeria/omvs/subject_area.py +1042 -0
  219. pyegeria/omvs/template_manager_omvs.py +236 -0
  220. pyegeria/omvs/time_keeper.py +1761 -0
  221. pyegeria/omvs/valid_metadata.py +3221 -0
  222. pyegeria/omvs/valid_metadata_lists.py +37 -0
  223. pyegeria/omvs/valid_type_lists.py +37 -0
  224. pyegeria/view/__init__.py +28 -0
  225. pyegeria/view/_output_format_models.py +514 -0
  226. pyegeria/view/_output_formats.py +14 -0
  227. pyegeria/view/base_report_formats.py +2719 -0
  228. pyegeria/view/dr_egeria_reports.py +56 -0
  229. pyegeria/view/format_set_executor.py +397 -0
  230. pyegeria/{md_processing_utils.py → view/md_processing_utils.py} +5 -5
  231. pyegeria/{mermaid_utilities.py → view/mermaid_utilities.py} +2 -154
  232. pyegeria/view/output_formatter.py +1297 -0
  233. pyegeria-5.5.3.3.dist-info/METADATA +218 -0
  234. pyegeria-5.5.3.3.dist-info/RECORD +241 -0
  235. {pyegeria-5.3.9.9.3.dist-info → pyegeria-5.5.3.3.dist-info}/WHEEL +2 -1
  236. pyegeria-5.5.3.3.dist-info/entry_points.txt +103 -0
  237. pyegeria-5.5.3.3.dist-info/top_level.txt +4 -0
  238. commands/cat/.DS_Store +0 -0
  239. commands/cat/README.md +0 -16
  240. commands/cli/txt_custom_v2.tcss +0 -19
  241. commands/my/README.md +0 -17
  242. commands/ops/README.md +0 -24
  243. commands/ops/monitor_asset_events.py +0 -108
  244. commands/tech/README.md +0 -24
  245. pyegeria/.DS_Store +0 -0
  246. pyegeria/README.md +0 -35
  247. pyegeria/_globals.py +0 -47
  248. pyegeria/_validators.py +0 -385
  249. pyegeria/asset_catalog_omvs.py +0 -864
  250. pyegeria/automated_curation_omvs.py +0 -3765
  251. pyegeria/collection_manager_omvs.py +0 -2744
  252. pyegeria/dr.egeria spec.md +0 -9
  253. pyegeria/egeria_my_client.py +0 -56
  254. pyegeria/feedback_manager_omvs.py +0 -4573
  255. pyegeria/glossary_browser_omvs.py +0 -3728
  256. pyegeria/glossary_manager_omvs.py +0 -2440
  257. pyegeria/m_test.py +0 -118
  258. pyegeria/md_processing_helpers.py +0 -58
  259. pyegeria/md_processing_utils_orig.py +0 -1103
  260. pyegeria/metadata_explorer_omvs.py +0 -2326
  261. pyegeria/my_profile_omvs.py +0 -1022
  262. pyegeria/output_formatter.py +0 -389
  263. pyegeria/project_manager_omvs.py +0 -1933
  264. pyegeria/registered_info.py +0 -167
  265. pyegeria/solution_architect_omvs.py +0 -2156
  266. pyegeria/template_manager_omvs.py +0 -1414
  267. pyegeria/utils.py +0 -197
  268. pyegeria-5.3.9.9.3.dist-info/METADATA +0 -72
  269. pyegeria-5.3.9.9.3.dist-info/RECORD +0 -143
  270. pyegeria-5.3.9.9.3.dist-info/entry_points.txt +0 -99
  271. /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
  272. {pyegeria-5.3.9.9.3.dist-info → pyegeria-5.5.3.3.dist-info/licenses}/LICENSE +0 -0
@@ -1,389 +0,0 @@
1
- from datetime import datetime
2
- from typing import Any, Callable, Dict, List, Optional, Tuple, Union
3
- from rich.console import Console
4
-
5
- console = Console(width= 250)
6
- # Constants
7
- MD_SEPARATOR = "\n---\n\n"
8
-
9
- def make_preamble(obj_type: str, search_string: str, output_format: str = 'MD') -> Tuple[str, Optional[str]]:
10
- """
11
- Creates a preamble string and an elements action based on the given object type, search string,
12
- and output format.
13
-
14
- Args:
15
- obj_type: The type of object being updated or reported on (e.g., "Product", "Category").
16
- search_string: The search string used to filter objects. Defaults to "All Elements" if None.
17
- output_format: A format identifier determining the output structure.
18
- JSON - output standard json
19
- MD - output standard markdown with no preamble
20
- FORM - output markdown with a preamble for a form
21
- REPORT - output markdown with a preamble for a report
22
-
23
- Returns:
24
- tuple: A tuple containing:
25
- - A string representing the formatted update or report preamble.
26
- - A string or None indicating the action description for the elements,
27
- depending on the output format.
28
- """
29
- search_string = search_string if search_string else "All Elements"
30
- elements_action = "Update " + obj_type
31
- if output_format == "FORM":
32
- preamble = (f"\n# Update {obj_type} Form - created at {datetime.now().strftime('%Y-%m-%d %H:%M')}\n"
33
- f"\t {obj_type} found from the search string: `{search_string}`\n\n")
34
- return preamble, elements_action
35
- elif output_format == "REPORT":
36
- elements_md = (f"# {obj_type} Report - created at {datetime.now().strftime('%Y-%m-%d %H:%M')}\n"
37
- f"\t{obj_type} found from the search string: `{search_string}`\n\n")
38
- elements_action = None
39
- return elements_md, elements_action
40
- else:
41
- return "\n", elements_action
42
-
43
- def make_md_attribute(attribute_name: str, attribute_value: str, output_type: str) -> Optional[str]:
44
- """
45
- Create a markdown attribute line for a given attribute name and value.
46
-
47
- Args:
48
- attribute_name: The name of the attribute
49
- attribute_value: The value of the attribute
50
- output_type: The output format (FORM, MD, REPORT)
51
-
52
- Returns:
53
- str: Formatted markdown for the attribute
54
- """
55
- output = ""
56
- attribute_value = attribute_value.strip() if attribute_value else ""
57
- attribute_title = attribute_name.title() if attribute_name else ""
58
- if output_type in ["FORM", "MD"]:
59
- output = f"## {attribute_title}\n{attribute_value}\n\n"
60
- elif output_type == "REPORT":
61
- if attribute_value:
62
- output = f"## {attribute_title}\n{attribute_value}\n\n"
63
- return output
64
-
65
- def format_for_markdown_table(text: str) -> str:
66
- """
67
- Format text for markdown tables by replacing newlines with spaces and escaping pipe characters.
68
- No truncation is applied to allow full-length text display regardless of console width.
69
-
70
- Args:
71
- text (str): The text to format
72
-
73
- Returns:
74
- str: Formatted text safe for markdown tables
75
- """
76
- if not text:
77
- return ""
78
- # Replace newlines with spaces and escape pipe characters
79
- return text.replace("\n", " ").replace("|", "\\|")
80
-
81
- def generate_entity_md(elements: List[Dict],
82
- elements_action: str,
83
- output_format: str,
84
- entity_type: str,
85
- extract_properties_func: Callable,
86
- get_additional_props_func: Optional[Callable] = None) -> str:
87
- """
88
- Generic method to generate markdown for entities.
89
-
90
- Args:
91
- elements (list): List of entity elements
92
- elements_action (str): Action description for elements
93
- output_format (str): Output format
94
- entity_type (str): Type of entity (Glossary, Term, Category, etc.)
95
- extract_properties_func: Function to extract properties from an element
96
- get_additional_props_func: Optional function to get additional properties
97
-
98
- Returns:
99
- str: Markdown representation
100
- """
101
- elements_md = ""
102
-
103
- for element in elements:
104
- props = extract_properties_func(element)
105
-
106
- # Get additional properties if function is provided
107
- additional_props = {}
108
- if get_additional_props_func:
109
- additional_props = get_additional_props_func(element, props['guid'], output_format)
110
-
111
- # Format header based on output format
112
- if output_format in ['FORM', 'MD']:
113
- elements_md += f"# {elements_action}\n\n"
114
- elements_md += f"## {entity_type} Name \n\n{props['display_name']}\n\n"
115
- elif output_format == 'REPORT':
116
- elements_md += f"# {entity_type} Name: {props['display_name']}\n\n"
117
- else:
118
- elements_md += f"## {entity_type} Name \n\n{props['display_name']}\n\n"
119
-
120
- # Add common attributes
121
- for key, value in props.items():
122
- if key not in ['guid', 'properties', 'display_name']:
123
- elements_md += make_md_attribute(key.replace('_', ' '), value, output_format)
124
-
125
- # Add additional properties
126
- for key, value in additional_props.items():
127
- elements_md += make_md_attribute(key.replace('_', ' '), value, output_format)
128
-
129
- # Add GUID
130
- elements_md += make_md_attribute("GUID", props['guid'], output_format)
131
-
132
- # Add separator if not the last element
133
- if element != elements[-1]:
134
- elements_md += MD_SEPARATOR
135
-
136
- return elements_md
137
-
138
- def generate_entity_md_table(elements: List[Dict],
139
- search_string: str,
140
- entity_type: str,
141
- extract_properties_func: Callable,
142
- columns: List[Dict],
143
- get_additional_props_func: Optional[Callable] = None,
144
- output_format: str = 'LIST') -> str:
145
- """
146
- Generic method to generate a markdown table for entities.
147
-
148
- Args:
149
- elements (list): List of entity elements
150
- search_string (str): The search string used
151
- entity_type (str): Type of entity (Glossary, Term, Category, etc.)
152
- extract_properties_func: Function to extract properties from an element
153
- columns: List of column definitions, each containing 'name', 'key', and 'format' (optional)
154
- get_additional_props_func: Optional function to get additional properties
155
- output_format (str): Output format (FORM, REPORT, LIST, etc.)
156
-
157
- Returns:
158
- str: Markdown table
159
- """
160
- # Handle pluralization - if entity_type ends with 'y', use 'ies' instead of 's'
161
- entity_type_plural = f"{entity_type[:-1]}ies" if entity_type.endswith('y') else f"{entity_type}s"
162
-
163
- elements_md = f"# {entity_type_plural} Table\n\n"
164
- elements_md += f"{entity_type_plural} found from the search string: `{search_string}`\n\n"
165
-
166
- # Add column headers
167
- header_row = "| "
168
- separator_row = "|"
169
- for column in columns:
170
- header_row += f"{column['name']} | "
171
- separator_row += "-------------|"
172
-
173
- elements_md += header_row + "\n"
174
- elements_md += separator_row + "\n"
175
-
176
- # Add rows
177
- for element in elements:
178
- props = extract_properties_func(element)
179
-
180
- # Get additional properties if function is provided
181
- additional_props = {}
182
- if get_additional_props_func:
183
- additional_props = get_additional_props_func(element, props['guid'], output_format)
184
-
185
- # Build row
186
- row = "| "
187
- for column in columns:
188
- key = column['key']
189
- value = ""
190
-
191
- # Check if the key is in props or additional_props
192
- if key in props:
193
- value = props[key]
194
- elif key in additional_props:
195
- value = additional_props[key]
196
-
197
- # Format the value if needed
198
- if 'format' in column and column['format']:
199
- value = format_for_markdown_table(value)
200
-
201
- row += f"{value} | "
202
-
203
- elements_md += row + "\n"
204
-
205
- return elements_md
206
-
207
- def generate_entity_dict(elements: List[Dict],
208
- extract_properties_func: Callable,
209
- get_additional_props_func: Optional[Callable] = None,
210
- include_keys: Optional[List[str]] = None,
211
- exclude_keys: Optional[List[str]] = None,
212
- output_format: str = 'DICT') -> List[Dict]:
213
- """
214
- Generic method to generate a dictionary representation of entities.
215
-
216
- Args:
217
- elements (list): List of entity elements
218
- extract_properties_func: Function to extract properties from an element
219
- get_additional_props_func: Optional function to get additional properties
220
- include_keys: Optional list of keys to include in the result (if None, include all)
221
- exclude_keys: Optional list of keys to exclude from the result (if None, exclude none)
222
- output_format (str): Output format (FORM, REPORT, DICT, etc.)
223
-
224
- Returns:
225
- list: List of entity dictionaries
226
- """
227
- result = []
228
-
229
- for element in elements:
230
- props = extract_properties_func(element)
231
-
232
- # Get additional properties if function is provided
233
- additional_props = {}
234
- if get_additional_props_func:
235
- additional_props = get_additional_props_func(element, props['guid'], output_format)
236
-
237
- # Create entity dictionary
238
- entity_dict = {}
239
-
240
- # Add properties based on include/exclude lists
241
- for key, value in props.items():
242
- if key != 'properties': # Skip the raw properties object
243
- if (include_keys is None or key in include_keys) and (
244
- exclude_keys is None or key not in exclude_keys):
245
- entity_dict[key] = value
246
-
247
- # Add additional properties
248
- for key, value in additional_props.items():
249
- if (include_keys is None or key in include_keys) and (exclude_keys is None or key not in exclude_keys):
250
- entity_dict[key] = value
251
-
252
- result.append(entity_dict)
253
-
254
- return result
255
-
256
- def extract_mermaid_only(elements: Union[Dict, List[Dict]]) -> Union[str, List[str]]:
257
- """
258
- Extract mermaid graph data from elements.
259
-
260
- Args:
261
- elements: Dictionary or list of dictionaries containing element data
262
-
263
- Returns:
264
- String or list of strings containing mermaid graph data
265
- """
266
- if isinstance(elements, dict):
267
- return elements.get('mermaidGraph', '___')
268
-
269
- result = []
270
- for element in elements:
271
- result.append(element.get('mermaidGraph', '___'))
272
- return result
273
-
274
- def extract_basic_dict(elements: Union[Dict, List[Dict]]) -> Union[Dict, List[Dict]]:
275
- """
276
- Extract basic dictionary data from elements.
277
-
278
- Args:
279
- elements: Dictionary or list of dictionaries containing element data
280
-
281
- Returns:
282
- Dictionary or list of dictionaries with extracted data
283
- """
284
- if isinstance(elements, dict):
285
- body = {'guid': elements['elementHeader']['guid']}
286
- for key in elements['properties']:
287
- body[key] = elements['properties'][key]
288
-
289
- # Add classifications if present
290
- classifications = elements['elementHeader'].get('classifications', [])
291
- if classifications:
292
- classification_names = ""
293
- for classification in classifications:
294
- classification_names += f"* {classification['classificationName']}\n"
295
- body['classification_names'] = classification_names
296
-
297
- return body
298
-
299
- result = []
300
- for element in elements:
301
- body = {'guid': element['elementHeader']['guid']}
302
- for key in element['properties']:
303
- body[key] = element['properties'][key]
304
-
305
- # Add classifications if present
306
- classifications = element['elementHeader'].get('classifications', [])
307
- if classifications:
308
- classification_names = ""
309
- for classification in classifications:
310
- classification_names += f"* {classification['classificationName']}\n"
311
- body['classifications'] = classification_names
312
-
313
- result.append(body)
314
- return result
315
-
316
- def generate_output(elements: Union[Dict, List[Dict]],
317
- search_string: str,
318
- entity_type: str,
319
- output_format: str,
320
- extract_properties_func: Callable,
321
- get_additional_props_func: Optional[Callable] = None,
322
- columns: Optional[List[Dict]] = None) -> Union[str, List[Dict]]:
323
- """
324
- Generate output in the specified format for the given elements.
325
-
326
- Args:
327
- elements: Dictionary or list of dictionaries containing element data
328
- search_string: The search string used to find the elements
329
- entity_type: The type of entity (e.g., "Glossary", "Term", "Category")
330
- output_format: The desired output format (MD, FORM, REPORT, LIST, DICT, MERMAID)
331
- extract_properties_func: Function to extract properties from an element
332
- get_additional_props_func: Optional function to get additional properties
333
- columns: Optional list of column definitions for table output
334
-
335
- Returns:
336
- Formatted output as string or list of dictionaries
337
- """
338
- # Ensure elements is a list
339
- if isinstance(elements, dict):
340
- elements = [elements]
341
-
342
- # Handle empty search string
343
- if search_string is None or search_string == '':
344
- search_string = "All"
345
-
346
- # Generate output based on format
347
- if output_format == 'MERMAID':
348
- return extract_mermaid_only(elements)
349
-
350
- elif output_format == 'DICT':
351
- return generate_entity_dict(
352
- elements=elements,
353
- extract_properties_func=extract_properties_func,
354
- get_additional_props_func=get_additional_props_func,
355
- exclude_keys=['properties'],
356
- output_format=output_format
357
- )
358
-
359
- elif output_format == 'LIST':
360
- if columns is None:
361
- raise ValueError("Columns must be provided for LIST output format")
362
-
363
- return generate_entity_md_table(
364
- elements=elements,
365
- search_string=search_string,
366
- entity_type=entity_type,
367
- extract_properties_func=extract_properties_func,
368
- columns=columns,
369
- get_additional_props_func=get_additional_props_func,
370
- output_format=output_format
371
- )
372
-
373
- else: # MD, FORM, REPORT
374
- elements_md, elements_action = make_preamble(
375
- obj_type=entity_type,
376
- search_string=search_string,
377
- output_format=output_format
378
- )
379
-
380
- elements_md += generate_entity_md(
381
- elements=elements,
382
- elements_action=elements_action,
383
- output_format=output_format,
384
- entity_type=entity_type,
385
- extract_properties_func=extract_properties_func,
386
- get_additional_props_func=get_additional_props_func
387
- )
388
-
389
- return elements_md