meltygui 0.1.0__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.
Files changed (372) hide show
  1. meltygui/__init__.py +107 -0
  2. meltygui/accounts/__init__.py +0 -0
  3. meltygui/accounts/internet_accounts.py +1355 -0
  4. meltygui/chat/__init__.py +91 -0
  5. meltygui/chat/activity.py +75 -0
  6. meltygui/chat/backends.py +36 -0
  7. meltygui/chat/chat_interface.py +732 -0
  8. meltygui/chat/chat_proxy.py +352 -0
  9. meltygui/chat/codex_proxy.py +592 -0
  10. meltygui/chat/codex_settings.py +100 -0
  11. meltygui/chat/codex_transport.py +60 -0
  12. meltygui/chat/command_parser.py +204 -0
  13. meltygui/chat/images.py +227 -0
  14. meltygui/chat/messages.py +417 -0
  15. meltygui/chat/metadata.py +139 -0
  16. meltygui/chat/writer_locks.py +64 -0
  17. meltygui/code/__init__.py +0 -0
  18. meltygui/code/basic_converters.py +533 -0
  19. meltygui/code/chain_converters.py +2111 -0
  20. meltygui/code/code_checks.py +2209 -0
  21. meltygui/code/core_syntax.py +1430 -0
  22. meltygui/code/file_converters.py +1933 -0
  23. meltygui/code/fileref.py +702 -0
  24. meltygui/code/hotswap_guard.py +144 -0
  25. meltygui/code/libcst_conversion.py +9724 -0
  26. meltygui/code/live_instrument.py +392 -0
  27. meltygui/code/live_view.py +2490 -0
  28. meltygui/code/melty_scan.py +2684 -0
  29. meltygui/code/new_codecs.py +1255 -0
  30. meltygui/code/new_converters.py +3017 -0
  31. meltygui/code/project_code.py +278 -0
  32. meltygui/code/source_context.py +63 -0
  33. meltygui/code/symbol_roster.py +1588 -0
  34. meltygui/code/syntax_check.py +34 -0
  35. meltygui/code/syntax_check_worker.py +114 -0
  36. meltygui/completion/__init__.py +0 -0
  37. meltygui/completion/fim.py +1232 -0
  38. meltygui/completion/fim_context.py +481 -0
  39. meltygui/completion/providers/__init__.py +0 -0
  40. meltygui/completion/providers/anthropic_oauth.py +446 -0
  41. meltygui/completion/providers/anthropic_requests.py +69 -0
  42. meltygui/completion/providers/claude.py +203 -0
  43. meltygui/completion/providers/claude_usage.py +499 -0
  44. meltygui/completion/providers/codex_accounts.py +180 -0
  45. meltygui/completion/providers/copilot.py +617 -0
  46. meltygui/completion/providers/oauth_popup.py +220 -0
  47. meltygui/completion/providers/ollama.py +320 -0
  48. meltygui/completion/providers/profiles.py +23 -0
  49. meltygui/core/README.md +88 -0
  50. meltygui/core/__init__.py +1 -0
  51. meltygui/core/automation/__init__.py +1 -0
  52. meltygui/core/automation/action_core.py +153 -0
  53. meltygui/core/automation/collection_action.py +45 -0
  54. meltygui/core/automation/mcp_eval.py +167 -0
  55. meltygui/core/automation/mcp_hotswap.py +107 -0
  56. meltygui/core/automation/mcp_query.py +552 -0
  57. meltygui/core/automation/mcp_server.py +657 -0
  58. meltygui/core/automation/orchestration_core.py +2636 -0
  59. meltygui/core/automation/query_core.py +124 -0
  60. meltygui/core/automation/search_core.py +26 -0
  61. meltygui/core/automation/selector_core.py +340 -0
  62. meltygui/core/automation/value_core.py +1752 -0
  63. meltygui/core/cache/__init__.py +1 -0
  64. meltygui/core/cache/cache_diagnostics.py +0 -0
  65. meltygui/core/cache/invalidation_decoration.py +153 -0
  66. meltygui/core/cache/invalidation_tracker.py +43 -0
  67. meltygui/core/cache/tile_cache.py +5968 -0
  68. meltygui/core/conversion/__init__.py +1 -0
  69. meltygui/core/conversion/bubbling.py +599 -0
  70. meltygui/core/conversion/cache_tree.py +188 -0
  71. meltygui/core/conversion/chain.py +113 -0
  72. meltygui/core/conversion/converter_register.py +145 -0
  73. meltygui/core/conversion/data_decoration.py +67 -0
  74. meltygui/core/conversion/dict_conversion.py +1815 -0
  75. meltygui/core/conversion/dict_conversion_util.py +177 -0
  76. meltygui/core/conversion/dynamic_obj.py +89 -0
  77. meltygui/core/conversion/graph_compare.py +183 -0
  78. meltygui/core/conversion/load_save_v2.py +1032 -0
  79. meltygui/core/conversion/missing_saved_class.py +39 -0
  80. meltygui/core/conversion/path_finder.py +606 -0
  81. meltygui/core/conversion/render_host.py +1083 -0
  82. meltygui/core/core_render.py +6537 -0
  83. meltygui/core/definition_hotswap.py +231 -0
  84. meltygui/core/diagnostics/__init__.py +1 -0
  85. meltygui/core/diagnostics/attribute_churn.py +38 -0
  86. meltygui/core/diagnostics/fps_counter.py +39 -0
  87. meltygui/core/diagnostics/gpu_frame_timer.py +103 -0
  88. meltygui/core/diagnostics/inspection_core.py +169 -0
  89. meltygui/core/diagnostics/monitor_core.py +105 -0
  90. meltygui/core/diagnostics/notifications.py +706 -0
  91. meltygui/core/diagnostics/perf_trace.py +281 -0
  92. meltygui/core/diagnostics/profile_decoration.py +88 -0
  93. meltygui/core/diagnostics/resize_trace.py +62 -0
  94. meltygui/core/diagnostics/screenshot_core.py +247 -0
  95. meltygui/core/diagnostics/session_status.py +98 -0
  96. meltygui/core/diagnostics/trace_core.py +445 -0
  97. meltygui/core/files/__init__.py +1 -0
  98. meltygui/core/files/file_core.py +208 -0
  99. meltygui/core/files/file_explorer_core.py +104 -0
  100. meltygui/core/files/file_tree_core.py +198 -0
  101. meltygui/core/files/file_watch_core.py +43 -0
  102. meltygui/core/files/import_graph_core.py +43 -0
  103. meltygui/core/files/metadata_core.py +51 -0
  104. meltygui/core/graphics/__init__.py +1 -0
  105. meltygui/core/graphics/cuda_context_core.py +166 -0
  106. meltygui/core/graphics/cuda_interop_core.py +136 -0
  107. meltygui/core/graphics/cuda_kernel_core.py +91 -0
  108. meltygui/core/graphics/framebuffer_recorder.py +337 -0
  109. meltygui/core/graphics/gl_state.py +658 -0
  110. meltygui/core/graphics/lut_core.py +52 -0
  111. meltygui/core/graphics/overlay_renderer.py +984 -0
  112. meltygui/core/graphics/scene_target.py +180 -0
  113. meltygui/core/graphics/screenshot.py +439 -0
  114. meltygui/core/graphics/shader_func.py +478 -0
  115. meltygui/core/graphics/tensor_core.py +45 -0
  116. meltygui/core/graphics/text_texture.py +329 -0
  117. meltygui/core/graphics/wayland_color.py +635 -0
  118. meltygui/core/input/__init__.py +1 -0
  119. meltygui/core/input/collision.py +165 -0
  120. meltygui/core/input/drag_drop_core.py +1525 -0
  121. meltygui/core/input/hypr_left_drag.py +323 -0
  122. meltygui/core/input/input_core.py +245 -0
  123. meltygui/core/input/input_handler.py +1101 -0
  124. meltygui/core/input/mouse_cursor.py +355 -0
  125. meltygui/core/input/pynput_backend.py +1054 -0
  126. meltygui/core/input/space_mouse.py +338 -0
  127. meltygui/core/input/touchpad_backend.py +393 -0
  128. meltygui/core/input/view_selection.py +177 -0
  129. meltygui/core/layout/__init__.py +1 -0
  130. meltygui/core/layout/column_core.py +2153 -0
  131. meltygui/core/layout/cursor_core.py +161 -0
  132. meltygui/core/layout/dropdown_core.py +278 -0
  133. meltygui/core/layout/edge_constraints.py +155 -0
  134. meltygui/core/layout/grid_core.py +117 -0
  135. meltygui/core/layout/header_core.py +23 -0
  136. meltygui/core/layout/header_runtime.py +67 -0
  137. meltygui/core/layout/layout_core.py +87 -0
  138. meltygui/core/layout/tile_manager_core.py +591 -0
  139. meltygui/core/melty.py +6726 -0
  140. meltygui/core/module_map.json +896 -0
  141. meltygui/core/module_names.py +19 -0
  142. meltygui/core/rendering/__init__.py +1 -0
  143. meltygui/core/rendering/core_decoration.py +431 -0
  144. meltygui/core/rendering/core_render_helpers.py +328 -0
  145. meltygui/core/rendering/func_metadata.py +398 -0
  146. meltygui/core/rendering/mode.py +818 -0
  147. meltygui/core/rendering/mode_defaults.py +41 -0
  148. meltygui/core/rendering/modes.py +136 -0
  149. meltygui/core/rendering/parameter_core.py +1665 -0
  150. meltygui/core/rendering/render_dispatch.py +1891 -0
  151. meltygui/core/rendering/render_funcs.py +273 -0
  152. meltygui/core/rendering/shaped.py +312 -0
  153. meltygui/core/rendering/window_decoration.py +25 -0
  154. meltygui/core/runtime/__init__.py +1 -0
  155. meltygui/core/runtime/app.py +735 -0
  156. meltygui/core/runtime/app_session.py +140 -0
  157. meltygui/core/runtime/background.py +564 -0
  158. meltygui/core/runtime/extensions.py +53 -0
  159. meltygui/core/runtime/gc_manager.py +1163 -0
  160. meltygui/core/runtime/lifecycle.py +21 -0
  161. meltygui/core/runtime/paths.py +27 -0
  162. meltygui/core/runtime/settings.py +14 -0
  163. meltygui/core/runtime/singleton.py +16 -0
  164. meltygui/core/runtime/thread_safe_bool.py +24 -0
  165. meltygui/core/runtime/thread_signal.py +30 -0
  166. meltygui/core/runtime/toggles.py +3115 -0
  167. meltygui/core/services/__init__.py +1 -0
  168. meltygui/core/services/account_core.py +10 -0
  169. meltygui/core/services/chat_core.py +19 -0
  170. meltygui/core/services/claude_terminal_core.py +346 -0
  171. meltygui/core/services/terminal_core.py +458 -0
  172. meltygui/core/services/terminal_runtime.py +78 -0
  173. meltygui/core/styling/__init__.py +1 -0
  174. meltygui/core/styling/color_core.py +46 -0
  175. meltygui/core/styling/fonts.py +639 -0
  176. meltygui/core/styling/global_style.py +338 -0
  177. meltygui/core/styling/style.py +198 -0
  178. meltygui/core/styling/style_core.py +522 -0
  179. meltygui/core/styling/warm_start.py +149 -0
  180. meltygui/core/windowing/__init__.py +1 -0
  181. meltygui/core/windowing/backends/PYIMGUI_LICENSE +28 -0
  182. meltygui/core/windowing/backends/__init__.py +1 -0
  183. meltygui/core/windowing/backends/imgui_renderer.py +138 -0
  184. meltygui/core/windowing/backends/native_wayland.py +850 -0
  185. meltygui/core/windowing/backends/protocols/xdg-decoration-unstable-v1.xml +156 -0
  186. meltygui/core/windowing/backends/protocols/xdg-shell.xml +1420 -0
  187. meltygui/core/windowing/backends/wayland_protocol.py +101 -0
  188. meltygui/core/windowing/dock_core.py +182 -0
  189. meltygui/core/windowing/frame_geometry.py +42 -0
  190. meltygui/core/windowing/geometry_feed.py +864 -0
  191. meltygui/core/windowing/glfw_utils.py +1343 -0
  192. meltygui/core/windowing/os_frame.py +1552 -0
  193. meltygui/core/windowing/surface.py +643 -0
  194. meltygui/core/windowing/titlebar.py +1560 -0
  195. meltygui/core/windowing/titlebar_buttons.py +281 -0
  196. meltygui/core/windowing/wayland_move.py +932 -0
  197. meltygui/core/windowing/window_api.py +62 -0
  198. meltygui/core/windowing/window_constants.py +339 -0
  199. meltygui/core/windowing/window_visibility.py +162 -0
  200. meltygui/debug/__init__.py +0 -0
  201. meltygui/debug/app_view_utils.py +9 -0
  202. meltygui/editor/__init__.py +0 -0
  203. meltygui/editor/bash_syntax.py +30 -0
  204. meltygui/editor/code_line_fast.py +152 -0
  205. meltygui/editor/diff.py +139 -0
  206. meltygui/editor/external_changes.py +159 -0
  207. meltygui/editor/file_header.py +41 -0
  208. meltygui/editor/live_usage.py +169 -0
  209. meltygui/editor/live_view_views.py +1803 -0
  210. meltygui/editor/pending_save.py +1351 -0
  211. meltygui/editor/roster_tints.py +547 -0
  212. meltygui/editor/source_preview.py +16 -0
  213. meltygui/editor/source_tools.py +10 -0
  214. meltygui/editor/source_ui.py +70 -0
  215. meltygui/editor/spell_check.py +77 -0
  216. meltygui/editor/text_editor.py +9076 -0
  217. meltygui/editor/usage_picker.py +538 -0
  218. meltygui/events/__init__.py +0 -0
  219. meltygui/events/example.py +118 -0
  220. meltygui/examples/__init__.py +0 -0
  221. meltygui/examples/columns_demo.py +33 -0
  222. meltygui/examples/columns_window_demo.py +60 -0
  223. meltygui/examples/context_menu_demo.py +24 -0
  224. meltygui/examples/context_menu_window_demo.py +49 -0
  225. meltygui/examples/gui_playground.py +127 -0
  226. meltygui/examples/live_view_playground.py +256 -0
  227. meltygui/examples/lora.py +43 -0
  228. meltygui/examples/lora_data.py +59 -0
  229. meltygui/examples/lora_policies.py +67 -0
  230. meltygui/examples/mode_demo.py +49 -0
  231. meltygui/examples/modifies_demo.py +119 -0
  232. meltygui/examples/scalar_policies.py +60 -0
  233. meltygui/examples/style_layouts.py +149 -0
  234. meltygui/examples/tile_manager_demo.py +74 -0
  235. meltygui/examples/tint_demo.py +160 -0
  236. meltygui/examples/tint_functions.py +56 -0
  237. meltygui/examples/trace_demo.py +88 -0
  238. meltygui/examples/two_windows.py +36 -0
  239. meltygui/files/__init__.py +0 -0
  240. meltygui/files/fast_file_explorer.py +439 -0
  241. meltygui/gnome_extension/lsd-window-geometry@latent-descent/extension.js +237 -0
  242. meltygui/gnome_extension/lsd-window-geometry@latent-descent/lsd-window-geometry@latent-descent.iml +9 -0
  243. meltygui/gnome_extension/lsd-window-geometry@latent-descent/metadata.json +7 -0
  244. meltygui/graphics/__init__.py +6 -0
  245. meltygui/graphics/base.py +85 -0
  246. meltygui/graphics/examples.py +507 -0
  247. meltygui/graphics/executor.py +520 -0
  248. meltygui/graphics/filter.py +667 -0
  249. meltygui/graphics/filter.pyi +856 -0
  250. meltygui/graphics/generate_stubs.py +22 -0
  251. meltygui/graphics/registry.py +203 -0
  252. meltygui/graphics/shader_compiler.py +155 -0
  253. meltygui/graphics/shaders.py +1302 -0
  254. meltygui/graphics/stub_generator.py +250 -0
  255. meltygui/graphics/texture_manager.py +170 -0
  256. meltygui/graphics/texture_min_max.py +295 -0
  257. meltygui/hdr_color.py +757 -0
  258. meltygui/image_load.py +308 -0
  259. meltygui/model/__init__.py +1 -0
  260. meltygui/model/account_model.py +142 -0
  261. meltygui/model/camera_model.py +159 -0
  262. meltygui/model/chat_model.py +86 -0
  263. meltygui/model/code_model.py +62 -0
  264. meltygui/model/code_proxy_model.py +876 -0
  265. meltygui/model/collection_model.py +41 -0
  266. meltygui/model/color_model.py +127 -0
  267. meltygui/model/cuda_tensor_model.py +36 -0
  268. meltygui/model/cuda_texture_model.py +149 -0
  269. meltygui/model/dropdown_model.py +137 -0
  270. meltygui/model/file_metadata_model.py +73 -0
  271. meltygui/model/file_model.py +289 -0
  272. meltygui/model/format_model.py +390 -0
  273. meltygui/model/graph_model.py +98 -0
  274. meltygui/model/icon_model.py +1024 -0
  275. meltygui/model/import_graph_model.py +468 -0
  276. meltygui/model/layout_model.py +15 -0
  277. meltygui/model/lut_model.py +266 -0
  278. meltygui/model/search_model.py +173 -0
  279. meltygui/model/tensor_model.py +402 -0
  280. meltygui/model/terminal_model.py +329 -0
  281. meltygui/model/texture_model.py +146 -0
  282. meltygui/model/tile_model.py +24 -0
  283. meltygui/model/trace_model.py +198 -0
  284. meltygui/model/trace_report_model.py +146 -0
  285. meltygui/models/__init__.py +0 -0
  286. meltygui/models/file_meta.py +613 -0
  287. meltygui/models/function_console.py +184 -0
  288. meltygui/models/orchestration.py +48 -0
  289. meltygui/pbr.py +1576 -0
  290. meltygui/png_unfilter.c +49 -0
  291. meltygui/resources/JetBrainsMono-Regular.ttf +0 -0
  292. meltygui/resources/THIRD_PARTY_NOTICES.md +21 -0
  293. meltygui/resources/dejavu/DejaVuSans-Bold.ttf +0 -0
  294. meltygui/resources/dejavu/DejaVuSans-ExtraLight.ttf +0 -0
  295. meltygui/resources/dejavu/DejaVuSans.ttf +0 -0
  296. meltygui/resources/dejavu/LICENSE.txt +78 -0
  297. meltygui/resources/fontawesome-LICENSE.txt +121 -0
  298. meltygui/resources/fontawesome-webfont.ttf +0 -0
  299. meltygui/resources/hdri/studio_small_09_1k.hdr +0 -0
  300. meltygui/resources/jetbrains-weights/JetBrainsMono-Bold.ttf +0 -0
  301. meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraBold.ttf +0 -0
  302. meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraLight.ttf +0 -0
  303. meltygui/resources/jetbrains-weights/JetBrainsMono-Light.ttf +0 -0
  304. meltygui/resources/jetbrains-weights/JetBrainsMono-Medium.ttf +0 -0
  305. meltygui/resources/jetbrains-weights/JetBrainsMono-SemiBold.ttf +0 -0
  306. meltygui/resources/jetbrains-weights/JetBrainsMono-Thin.ttf +0 -0
  307. meltygui/resources/jetbrains-weights/OFL.txt +93 -0
  308. meltygui/resources/jetbrains-weights/README.md +2 -0
  309. meltygui/state/__init__.py +0 -0
  310. meltygui/state/account_state.py +22 -0
  311. meltygui/state/animation_state.py +97 -0
  312. meltygui/state/annotation_state.py +22 -0
  313. meltygui/state/chat_state.py +36 -0
  314. meltygui/state/code_state.py +10 -0
  315. meltygui/state/core_enums.py +59 -0
  316. meltygui/state/core_markers.py +115 -0
  317. meltygui/state/core_undo.py +1075 -0
  318. meltygui/state/file_state.py +75 -0
  319. meltygui/state/graph_state.py +26 -0
  320. meltygui/state/inspection_state.py +47 -0
  321. meltygui/state/menu_state.py +10 -0
  322. meltygui/state/model_enums.py +11 -0
  323. meltygui/state/new_core_model.py +2394 -0
  324. meltygui/state/orchestration_state.py +14 -0
  325. meltygui/state/query_state.py +24 -0
  326. meltygui/state/tensor_state.py +10 -0
  327. meltygui/state/terminal_state.py +23 -0
  328. meltygui/state/trace_state.py +32 -0
  329. meltygui/state/voxel_state.py +12 -0
  330. meltygui/text_index.py +816 -0
  331. meltygui/utils/__init__.py +0 -0
  332. meltygui/utils/jump_to_code.py +344 -0
  333. meltygui/utils/pkl_inspect.py +90 -0
  334. meltygui/utils/render_utils.py +1419 -0
  335. meltygui/view/__init__.py +1 -0
  336. meltygui/view/account_view.py +524 -0
  337. meltygui/view/action_view.py +73 -0
  338. meltygui/view/chat_decoration_view.py +112 -0
  339. meltygui/view/chat_view.py +1703 -0
  340. meltygui/view/code_view.py +2677 -0
  341. meltygui/view/collection_view.py +1185 -0
  342. meltygui/view/color_view.py +824 -0
  343. meltygui/view/control_view.py +559 -0
  344. meltygui/view/decoration_view.py +439 -0
  345. meltygui/view/diagnostic_view.py +177 -0
  346. meltygui/view/dropdown_view.py +1082 -0
  347. meltygui/view/file_view.py +1599 -0
  348. meltygui/view/graph_cuda_view.py +105 -0
  349. meltygui/view/graph_view.py +882 -0
  350. meltygui/view/header_view.py +848 -0
  351. meltygui/view/input_view.py +238 -0
  352. meltygui/view/inspection_view.py +1783 -0
  353. meltygui/view/layout_view.py +596 -0
  354. meltygui/view/lut_view.py +45 -0
  355. meltygui/view/menu_view.py +212 -0
  356. meltygui/view/orchestration_view.py +658 -0
  357. meltygui/view/query_view.py +118 -0
  358. meltygui/view/search_view.py +342 -0
  359. meltygui/view/tab_view.py +258 -0
  360. meltygui/view/tensor_view.py +430 -0
  361. meltygui/view/terminal_view.py +355 -0
  362. meltygui/view/text_view.py +8031 -0
  363. meltygui/view/texture_view.py +480 -0
  364. meltygui/view/tile_view.py +38 -0
  365. meltygui/view/trace_view.py +923 -0
  366. meltygui/view/voxel_cuda_view.py +824 -0
  367. meltygui/view/voxel_view.py +1860 -0
  368. meltygui/view/window_view.py +111 -0
  369. meltygui-0.1.0.dist-info/METADATA +143 -0
  370. meltygui-0.1.0.dist-info/RECORD +372 -0
  371. meltygui-0.1.0.dist-info/WHEEL +4 -0
  372. meltygui-0.1.0.dist-info/licenses/LICENSE +202 -0
File without changes
@@ -0,0 +1,344 @@
1
+ import os
2
+ import subprocess
3
+ import inspect
4
+ import ast
5
+ import sys
6
+ from pathlib import Path
7
+ from typing import Optional, Dict, Any, Callable, Union
8
+ import importlib
9
+
10
+
11
+ def find_function_line(file_path: str, function_name: str) -> Optional[int]:
12
+ """
13
+ Find the line number where a function is defined in a Python file.
14
+
15
+ Args:
16
+ file_path: Path to the Python file
17
+ function_name: Name of the function to find
18
+
19
+ Returns:
20
+ Line number where the function is defined, or None if not found
21
+ """
22
+ try:
23
+ with open(file_path, 'r', encoding='utf-8') as f:
24
+ content = f.read()
25
+
26
+ # Parse the AST to find function definitions
27
+ tree = ast.parse(content)
28
+
29
+ for node in ast.walk(tree):
30
+ if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) and node.name == function_name:
31
+ return node.lineno
32
+
33
+ except Exception as e:
34
+ print(f"Error parsing file: {e}")
35
+
36
+ return None
37
+
38
+
39
+ def find_class_line(file_path: str, class_name: str) -> Optional[int]:
40
+ """
41
+ Find the line number where a class is defined in a Python file.
42
+
43
+ Args:
44
+ file_path: Path to the Python file
45
+ class_name: Name of the class to find
46
+
47
+ Returns:
48
+ Line number where the class is defined, or None if not found
49
+ """
50
+ try:
51
+ with open(file_path, 'r', encoding='utf-8') as f:
52
+ content = f.read()
53
+
54
+ # Parse the AST to find class definitions
55
+ tree = ast.parse(content)
56
+
57
+ for node in ast.walk(tree):
58
+ if isinstance(node, ast.ClassDef) and node.name == class_name:
59
+ return node.lineno
60
+
61
+ except Exception as e:
62
+ print(f"Error parsing file: {e}")
63
+
64
+ return None
65
+
66
+
67
+ def find_intellij_executable() -> Optional[str]:
68
+ """
69
+ Find IntelliJ executable, handling version-specific installations.
70
+
71
+ Returns:
72
+ Path to IntelliJ executable, or None if not found
73
+ """
74
+ import glob
75
+
76
+ # Common installation patterns
77
+ search_patterns = []
78
+
79
+ if os.name == 'nt': # Windows
80
+ search_patterns = [
81
+ r'C:\Program Files\JetBrains\IntelliJ IDEA*\bin\idea64.exe',
82
+ r'C:\Program Files (x86)\JetBrains\IntelliJ IDEA*\bin\idea.exe',
83
+ r'C:\Program Files\JetBrains\IntelliJ IDEA Community Edition*\bin\idea64.exe',
84
+ ]
85
+ elif os.name == 'posix': # Linux/macOS
86
+ search_patterns = [
87
+ # Linux patterns
88
+ '/opt/idea-*/bin/idea.sh',
89
+ '/opt/intellij-idea-*/bin/idea.sh',
90
+ '/usr/local/idea-*/bin/idea.sh',
91
+ '/home/*/idea-*/bin/idea.sh',
92
+ '/home/*/.local/share/JetBrains/Toolbox/apps/IDEA-U/ch-*/*/bin/idea.sh',
93
+ '/home/*/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-*/*/bin/idea.sh',
94
+ # Snap installations
95
+ '/snap/intellij-idea-ultimate/current/bin/idea.sh',
96
+ '/snap/intellij-idea-community/current/bin/idea.sh',
97
+ ]
98
+
99
+ if os.uname().sysname == 'Darwin': # macOS
100
+ search_patterns.extend([
101
+ '/Applications/IntelliJ IDEA.app/Contents/MacOS/idea',
102
+ '/Applications/IntelliJ IDEA CE.app/Contents/MacOS/idea',
103
+ '/Users/*/Applications/IntelliJ IDEA.app/Contents/MacOS/idea',
104
+ '/Applications/JetBrains Toolbox/IntelliJ IDEA.app/Contents/MacOS/idea',
105
+ ])
106
+
107
+ # PATH first: the version the desktop actually uses (`idea.sh`), which
108
+ # beats guessing among sibling installs (`/opt/idea-*_old` sorts LAST
109
+ # and won the "newest" pick below).
110
+ import shutil
111
+ for name in ('idea.sh', 'idea'):
112
+ found = shutil.which(name)
113
+ if found:
114
+ return found
115
+
116
+ # Search for IntelliJ in common locations
117
+ for pattern in search_patterns:
118
+ matches = [m for m in glob.glob(pattern) if not m.split('/bin/')[0].endswith('_old')]
119
+ if matches:
120
+ # Return the latest version if multiple found
121
+ return max(matches)
122
+
123
+ # Check environment variable
124
+ intellij_home = os.environ.get('INTELLIJ_HOME')
125
+ if intellij_home:
126
+ idea_path = os.path.join(intellij_home, 'bin', 'idea.sh' if os.name == 'posix' else 'idea64.exe')
127
+ if os.path.exists(idea_path):
128
+ return idea_path
129
+
130
+ return None
131
+
132
+
133
+ def open_in_intellij(file_path, line_number=None):
134
+ # Use absolute path
135
+
136
+ idea_path = find_intellij_executable()
137
+
138
+ # Check if file exists
139
+ if not os.path.exists(file_path):
140
+ print(f"File not found: {file_path}")
141
+ return
142
+
143
+ from meltygui.core.runtime.paths import application_root
144
+ project_root = str(application_root())
145
+
146
+ if line_number:
147
+ # Open project, then file with line number
148
+ cmd = [f'{idea_path}', project_root, '--line', str(line_number), file_path]
149
+ else:
150
+ cmd = [f'{idea_path}', project_root, file_path]
151
+
152
+ if idea_path is None:
153
+ print("IntelliJ executable not found (set INTELLIJ_HOME)")
154
+ return
155
+ # Full-path executable + close_fds=False keeps this on posix_spawn - a
156
+ # fork() of the studio deadlocks (see CL-MDE.md, "never fork the studio").
157
+ subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
158
+ close_fds=False)
159
+
160
+ def build_function_map(module) -> Dict[str, Dict[str, Any]]:
161
+ """
162
+ Build a function map from a module with function metadata.
163
+
164
+ Args:
165
+ module: The module to inspect
166
+
167
+ Returns:
168
+ Dictionary mapping function names to their metadata
169
+ """
170
+ # Get all functions from the module
171
+ functions = inspect.getmembers(module, inspect.isfunction)
172
+
173
+ # Filter to only functions defined in this module
174
+ functions = [(name, obj) for name, obj in functions
175
+ if obj.__module__ == module.__name__]
176
+
177
+ function_map = {}
178
+
179
+ for name, func in functions:
180
+ # Get the source file
181
+ try:
182
+ source_file = inspect.getsourcefile(func)
183
+ source_lines, start_line = inspect.getsourcelines(func)
184
+
185
+ function_map[name] = {
186
+ 'function': func,
187
+ 'file': source_file,
188
+ 'line': start_line,
189
+ 'module': module.__name__,
190
+ 'docstring': inspect.getdoc(func),
191
+ 'signature': str(inspect.signature(func))
192
+ }
193
+ except Exception as e:
194
+ print(f"Error processing function {name}: {e}")
195
+
196
+ return function_map
197
+
198
+
199
+ def build_class_map(module) -> Dict[str, Dict[str, Any]]:
200
+ """
201
+ Build a class map from a module with class metadata.
202
+
203
+ Args:
204
+ module: The module to inspect
205
+
206
+ Returns:
207
+ Dictionary mapping class names to their metadata
208
+ """
209
+ # Get all classes from the module
210
+ classes = inspect.getmembers(module, inspect.isclass)
211
+
212
+ # Filter to only classes defined in this module
213
+ classes = [(name, obj) for name, obj in classes
214
+ if obj.__module__ == module.__name__]
215
+
216
+ class_map = {}
217
+
218
+ for name, cls in classes:
219
+ # Get the source file
220
+ try:
221
+ source_file = inspect.getsourcefile(cls)
222
+ source_lines, start_line = inspect.getsourcelines(cls)
223
+
224
+ class_map[name] = {
225
+ 'class': cls,
226
+ 'file': source_file,
227
+ 'line': start_line,
228
+ 'module': module.__name__,
229
+ 'docstring': inspect.getdoc(cls),
230
+ 'bases': [base.__name__ for base in cls.__bases__],
231
+ 'methods': [method for method in dir(cls) if not method.startswith('_')]
232
+ }
233
+ except Exception as e:
234
+ print(f"Error processing class {name}: {e}")
235
+
236
+ return class_map
237
+
238
+
239
+ def build_combined_map(module) -> Dict[str, Dict[str, Any]]:
240
+ """
241
+ Build a combined map of functions and classes from a module.
242
+
243
+ Args:
244
+ module: The module to inspect
245
+
246
+ Returns:
247
+ Dictionary mapping names to their metadata (functions and classes)
248
+ """
249
+ combined_map = {}
250
+
251
+ # Add functions
252
+ function_map = build_function_map(module)
253
+ for name, info in function_map.items():
254
+ info['type'] = 'function'
255
+ combined_map[name] = info
256
+
257
+ # Add classes
258
+ class_map = build_class_map(module)
259
+ for name, info in class_map.items():
260
+ info['type'] = 'class'
261
+ combined_map[name] = info
262
+
263
+ return combined_map
264
+
265
+
266
+ def jump_to_function(root, function_name: str) -> bool:
267
+ """
268
+ Jump to a function in IntelliJ using the root's jump map.
269
+
270
+ Args:
271
+ root: The root object containing the _jump_to_map
272
+ function_name: Name of the function to jump to
273
+
274
+ Returns:
275
+ True if successful, False otherwise
276
+ """
277
+ a_function_map = root.view_functions._jump_to_map
278
+ return jump_to_item_by_map(a_function_map, function_name)
279
+
280
+
281
+ def jump_to_class(root, class_name: str) -> bool:
282
+ """
283
+ Jump to a class in IntelliJ using the root's jump map.
284
+
285
+ Args:
286
+ root: The root object containing the _jump_to_map
287
+ class_name: Name of the class to jump to
288
+
289
+ Returns:
290
+ True if successful, False otherwise
291
+ """
292
+ a_class_map = root.datatypes._jump_to_map
293
+ return jump_to_item_by_map(a_class_map, class_name)
294
+
295
+
296
+ def jump_to_item(root, item_name: str) -> bool:
297
+ """
298
+ Jump to a function or class in IntelliJ using the root's jump map.
299
+
300
+ Args:
301
+ root: The root object containing the _jump_to_map
302
+ item_name: Name of the function or class to jump to
303
+
304
+ Returns:
305
+ True if successful, False otherwise
306
+ """
307
+ jump_map = root.view_functions._jump_to_map
308
+ return jump_to_item_by_map(jump_map, item_name)
309
+
310
+
311
+ def jump_to_function_by_map(function_map: Dict[str, Dict[str, Any]], function_name: str) -> bool:
312
+ """
313
+ Jump to a function in IntelliJ using the function map.
314
+ (Deprecated: Use jump_to_item_by_map instead)
315
+
316
+ Args:
317
+ function_map: Dictionary mapping function names to metadata
318
+ function_name: Name of the function to jump to
319
+
320
+ Returns:
321
+ True if successful, False otherwise
322
+ """
323
+ return jump_to_item_by_map(function_map, function_name)
324
+
325
+
326
+ def jump_to_item_by_map(item_map: Dict[str, Dict[str, Any]], item_name: str) -> bool:
327
+ """
328
+ Jump to a function or class in IntelliJ using the item map.
329
+
330
+ Args:
331
+ item_map: Dictionary mapping item names to metadata
332
+ item_name: Name of the function or class to jump to
333
+
334
+ Returns:
335
+ True if successful, False otherwise
336
+ """
337
+ if item_name not in item_map:
338
+ return False
339
+
340
+ item_info = item_map[item_name]
341
+ file_path = item_info['file']
342
+ line_number = item_info['line']
343
+
344
+ return open_in_intellij(file_path, line_number=line_number)
@@ -0,0 +1,90 @@
1
+ """
2
+ pkl_inspect — make a binary load_save_v2 .pkl debuggable.
3
+
4
+ python -m meltygui.utils.pkl_inspect [path/to/custom.pkl] [--depth N]
5
+
6
+ Loads the pkl and prints the object tree with, per field, the SERIALIZED size
7
+ (re-pickling just that subtree) and node count — sorted biggest-first, so you can
8
+ see exactly what dominates the file and spot anything that's growing.
9
+ """
10
+ import sys
11
+ from enum import Enum
12
+
13
+ from meltygui.core.conversion.dict_conversion import DictConversion
14
+ from meltygui.core.conversion.dict_conversion_util import ClassUtility
15
+ import meltygui.core.conversion.load_save_v2 as v2
16
+ import meltygui.core.conversion.graph_compare as gc
17
+
18
+ _PRIM = (int, float, bool, str, bytes, type(None))
19
+
20
+
21
+ def _size(v):
22
+ try:
23
+ return len(v2.dumps(v, excluded=list(v2.STUDIO_SAVE_EXCLUDED)))
24
+ except Exception:
25
+ return -1
26
+
27
+
28
+ def _children(o):
29
+ """(label, value) pairs one level down — public fields / dict items / seq items."""
30
+ if isinstance(o, dict):
31
+ return [(f"[{k!r}]", val) for k, val in o.items()]
32
+ if isinstance(o, (list, tuple)):
33
+ return [(f"[{i}]", val) for i, val in enumerate(o)]
34
+ if isinstance(o, DictConversion) or hasattr(o, "__dict__"):
35
+ return [(f".{k}", getattr(o, k, None)) for k in gc._public_keys(o)]
36
+ return []
37
+
38
+
39
+ def _kind(o):
40
+ if isinstance(o, Enum):
41
+ return f"{type(o).__name__}.{o.name}"
42
+ if isinstance(o, _PRIM):
43
+ return type(o).__name__
44
+ n = ""
45
+ if isinstance(o, dict):
46
+ n = f"({len(o)})"
47
+ elif isinstance(o, (list, tuple, set)):
48
+ n = f"({len(o)})"
49
+ return f"{type(o).__name__}{n}"
50
+
51
+
52
+ def dump_tree(o, depth=2, label="root", indent=0, min_kb=0.0):
53
+ sz = _size(o)
54
+ nodes = gc.count_nodes(o) if not isinstance(o, _PRIM) else 0
55
+ pad = " " * indent
56
+ szs = f"{sz/1024:8.1f} KB" if sz >= 0 else " (n/a)"
57
+ print(f"{szs} {nodes:>7} nodes {pad}{label}: {_kind(o)}")
58
+ if indent >= depth or isinstance(o, _PRIM) or isinstance(o, Enum):
59
+ return
60
+ kids = _children(o)
61
+ # sort children by serialized size, biggest first; skip tiny ones past depth 0
62
+ sized = sorted(((_size(v), lbl, v) for lbl, v in kids), key=lambda t: -t[0])
63
+ for s, lbl, v in sized:
64
+ if s / 1024.0 < min_kb:
65
+ continue
66
+ dump_tree(v, depth, lbl, indent + 1, min_kb)
67
+
68
+
69
+ def main():
70
+ args = [a for a in sys.argv[1:] if not a.startswith("--")]
71
+ if not args:
72
+ raise SystemExit("Usage: python -m meltygui.utils.pkl_inspect SESSION.pkl [--depth=N]")
73
+ path = args[0]
74
+ depth = 2
75
+ for a in sys.argv[1:]:
76
+ if a.startswith("--depth"):
77
+ depth = int(a.split("=")[-1]) if "=" in a else int(sys.argv[sys.argv.index(a) + 1])
78
+ ClassUtility().initialize_class_names("meltygui")
79
+ sys.setrecursionlimit(1_000_000)
80
+ import os
81
+ print(f"file: {path} ({os.path.getsize(path)/1024/1024:.2f} MB on disk)\n")
82
+ root = v2.load(path, run_on_load=False)
83
+ print(f"{'serialized':>11} {'graph':>7} field: type\n{'-'*70}")
84
+ dump_tree(root, depth=depth, min_kb=1.0)
85
+ print("\n(sizes are each subtree re-pickled in isolation; shared objects counted "
86
+ "under each referrer, so children can sum to more than the parent)")
87
+
88
+
89
+ if __name__ == "__main__":
90
+ main()