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.
- meltygui/__init__.py +107 -0
- meltygui/accounts/__init__.py +0 -0
- meltygui/accounts/internet_accounts.py +1355 -0
- meltygui/chat/__init__.py +91 -0
- meltygui/chat/activity.py +75 -0
- meltygui/chat/backends.py +36 -0
- meltygui/chat/chat_interface.py +732 -0
- meltygui/chat/chat_proxy.py +352 -0
- meltygui/chat/codex_proxy.py +592 -0
- meltygui/chat/codex_settings.py +100 -0
- meltygui/chat/codex_transport.py +60 -0
- meltygui/chat/command_parser.py +204 -0
- meltygui/chat/images.py +227 -0
- meltygui/chat/messages.py +417 -0
- meltygui/chat/metadata.py +139 -0
- meltygui/chat/writer_locks.py +64 -0
- meltygui/code/__init__.py +0 -0
- meltygui/code/basic_converters.py +533 -0
- meltygui/code/chain_converters.py +2111 -0
- meltygui/code/code_checks.py +2209 -0
- meltygui/code/core_syntax.py +1430 -0
- meltygui/code/file_converters.py +1933 -0
- meltygui/code/fileref.py +702 -0
- meltygui/code/hotswap_guard.py +144 -0
- meltygui/code/libcst_conversion.py +9724 -0
- meltygui/code/live_instrument.py +392 -0
- meltygui/code/live_view.py +2490 -0
- meltygui/code/melty_scan.py +2684 -0
- meltygui/code/new_codecs.py +1255 -0
- meltygui/code/new_converters.py +3017 -0
- meltygui/code/project_code.py +278 -0
- meltygui/code/source_context.py +63 -0
- meltygui/code/symbol_roster.py +1588 -0
- meltygui/code/syntax_check.py +34 -0
- meltygui/code/syntax_check_worker.py +114 -0
- meltygui/completion/__init__.py +0 -0
- meltygui/completion/fim.py +1232 -0
- meltygui/completion/fim_context.py +481 -0
- meltygui/completion/providers/__init__.py +0 -0
- meltygui/completion/providers/anthropic_oauth.py +446 -0
- meltygui/completion/providers/anthropic_requests.py +69 -0
- meltygui/completion/providers/claude.py +203 -0
- meltygui/completion/providers/claude_usage.py +499 -0
- meltygui/completion/providers/codex_accounts.py +180 -0
- meltygui/completion/providers/copilot.py +617 -0
- meltygui/completion/providers/oauth_popup.py +220 -0
- meltygui/completion/providers/ollama.py +320 -0
- meltygui/completion/providers/profiles.py +23 -0
- meltygui/core/README.md +88 -0
- meltygui/core/__init__.py +1 -0
- meltygui/core/automation/__init__.py +1 -0
- meltygui/core/automation/action_core.py +153 -0
- meltygui/core/automation/collection_action.py +45 -0
- meltygui/core/automation/mcp_eval.py +167 -0
- meltygui/core/automation/mcp_hotswap.py +107 -0
- meltygui/core/automation/mcp_query.py +552 -0
- meltygui/core/automation/mcp_server.py +657 -0
- meltygui/core/automation/orchestration_core.py +2636 -0
- meltygui/core/automation/query_core.py +124 -0
- meltygui/core/automation/search_core.py +26 -0
- meltygui/core/automation/selector_core.py +340 -0
- meltygui/core/automation/value_core.py +1752 -0
- meltygui/core/cache/__init__.py +1 -0
- meltygui/core/cache/cache_diagnostics.py +0 -0
- meltygui/core/cache/invalidation_decoration.py +153 -0
- meltygui/core/cache/invalidation_tracker.py +43 -0
- meltygui/core/cache/tile_cache.py +5968 -0
- meltygui/core/conversion/__init__.py +1 -0
- meltygui/core/conversion/bubbling.py +599 -0
- meltygui/core/conversion/cache_tree.py +188 -0
- meltygui/core/conversion/chain.py +113 -0
- meltygui/core/conversion/converter_register.py +145 -0
- meltygui/core/conversion/data_decoration.py +67 -0
- meltygui/core/conversion/dict_conversion.py +1815 -0
- meltygui/core/conversion/dict_conversion_util.py +177 -0
- meltygui/core/conversion/dynamic_obj.py +89 -0
- meltygui/core/conversion/graph_compare.py +183 -0
- meltygui/core/conversion/load_save_v2.py +1032 -0
- meltygui/core/conversion/missing_saved_class.py +39 -0
- meltygui/core/conversion/path_finder.py +606 -0
- meltygui/core/conversion/render_host.py +1083 -0
- meltygui/core/core_render.py +6537 -0
- meltygui/core/definition_hotswap.py +231 -0
- meltygui/core/diagnostics/__init__.py +1 -0
- meltygui/core/diagnostics/attribute_churn.py +38 -0
- meltygui/core/diagnostics/fps_counter.py +39 -0
- meltygui/core/diagnostics/gpu_frame_timer.py +103 -0
- meltygui/core/diagnostics/inspection_core.py +169 -0
- meltygui/core/diagnostics/monitor_core.py +105 -0
- meltygui/core/diagnostics/notifications.py +706 -0
- meltygui/core/diagnostics/perf_trace.py +281 -0
- meltygui/core/diagnostics/profile_decoration.py +88 -0
- meltygui/core/diagnostics/resize_trace.py +62 -0
- meltygui/core/diagnostics/screenshot_core.py +247 -0
- meltygui/core/diagnostics/session_status.py +98 -0
- meltygui/core/diagnostics/trace_core.py +445 -0
- meltygui/core/files/__init__.py +1 -0
- meltygui/core/files/file_core.py +208 -0
- meltygui/core/files/file_explorer_core.py +104 -0
- meltygui/core/files/file_tree_core.py +198 -0
- meltygui/core/files/file_watch_core.py +43 -0
- meltygui/core/files/import_graph_core.py +43 -0
- meltygui/core/files/metadata_core.py +51 -0
- meltygui/core/graphics/__init__.py +1 -0
- meltygui/core/graphics/cuda_context_core.py +166 -0
- meltygui/core/graphics/cuda_interop_core.py +136 -0
- meltygui/core/graphics/cuda_kernel_core.py +91 -0
- meltygui/core/graphics/framebuffer_recorder.py +337 -0
- meltygui/core/graphics/gl_state.py +658 -0
- meltygui/core/graphics/lut_core.py +52 -0
- meltygui/core/graphics/overlay_renderer.py +984 -0
- meltygui/core/graphics/scene_target.py +180 -0
- meltygui/core/graphics/screenshot.py +439 -0
- meltygui/core/graphics/shader_func.py +478 -0
- meltygui/core/graphics/tensor_core.py +45 -0
- meltygui/core/graphics/text_texture.py +329 -0
- meltygui/core/graphics/wayland_color.py +635 -0
- meltygui/core/input/__init__.py +1 -0
- meltygui/core/input/collision.py +165 -0
- meltygui/core/input/drag_drop_core.py +1525 -0
- meltygui/core/input/hypr_left_drag.py +323 -0
- meltygui/core/input/input_core.py +245 -0
- meltygui/core/input/input_handler.py +1101 -0
- meltygui/core/input/mouse_cursor.py +355 -0
- meltygui/core/input/pynput_backend.py +1054 -0
- meltygui/core/input/space_mouse.py +338 -0
- meltygui/core/input/touchpad_backend.py +393 -0
- meltygui/core/input/view_selection.py +177 -0
- meltygui/core/layout/__init__.py +1 -0
- meltygui/core/layout/column_core.py +2153 -0
- meltygui/core/layout/cursor_core.py +161 -0
- meltygui/core/layout/dropdown_core.py +278 -0
- meltygui/core/layout/edge_constraints.py +155 -0
- meltygui/core/layout/grid_core.py +117 -0
- meltygui/core/layout/header_core.py +23 -0
- meltygui/core/layout/header_runtime.py +67 -0
- meltygui/core/layout/layout_core.py +87 -0
- meltygui/core/layout/tile_manager_core.py +591 -0
- meltygui/core/melty.py +6726 -0
- meltygui/core/module_map.json +896 -0
- meltygui/core/module_names.py +19 -0
- meltygui/core/rendering/__init__.py +1 -0
- meltygui/core/rendering/core_decoration.py +431 -0
- meltygui/core/rendering/core_render_helpers.py +328 -0
- meltygui/core/rendering/func_metadata.py +398 -0
- meltygui/core/rendering/mode.py +818 -0
- meltygui/core/rendering/mode_defaults.py +41 -0
- meltygui/core/rendering/modes.py +136 -0
- meltygui/core/rendering/parameter_core.py +1665 -0
- meltygui/core/rendering/render_dispatch.py +1891 -0
- meltygui/core/rendering/render_funcs.py +273 -0
- meltygui/core/rendering/shaped.py +312 -0
- meltygui/core/rendering/window_decoration.py +25 -0
- meltygui/core/runtime/__init__.py +1 -0
- meltygui/core/runtime/app.py +735 -0
- meltygui/core/runtime/app_session.py +140 -0
- meltygui/core/runtime/background.py +564 -0
- meltygui/core/runtime/extensions.py +53 -0
- meltygui/core/runtime/gc_manager.py +1163 -0
- meltygui/core/runtime/lifecycle.py +21 -0
- meltygui/core/runtime/paths.py +27 -0
- meltygui/core/runtime/settings.py +14 -0
- meltygui/core/runtime/singleton.py +16 -0
- meltygui/core/runtime/thread_safe_bool.py +24 -0
- meltygui/core/runtime/thread_signal.py +30 -0
- meltygui/core/runtime/toggles.py +3115 -0
- meltygui/core/services/__init__.py +1 -0
- meltygui/core/services/account_core.py +10 -0
- meltygui/core/services/chat_core.py +19 -0
- meltygui/core/services/claude_terminal_core.py +346 -0
- meltygui/core/services/terminal_core.py +458 -0
- meltygui/core/services/terminal_runtime.py +78 -0
- meltygui/core/styling/__init__.py +1 -0
- meltygui/core/styling/color_core.py +46 -0
- meltygui/core/styling/fonts.py +639 -0
- meltygui/core/styling/global_style.py +338 -0
- meltygui/core/styling/style.py +198 -0
- meltygui/core/styling/style_core.py +522 -0
- meltygui/core/styling/warm_start.py +149 -0
- meltygui/core/windowing/__init__.py +1 -0
- meltygui/core/windowing/backends/PYIMGUI_LICENSE +28 -0
- meltygui/core/windowing/backends/__init__.py +1 -0
- meltygui/core/windowing/backends/imgui_renderer.py +138 -0
- meltygui/core/windowing/backends/native_wayland.py +850 -0
- meltygui/core/windowing/backends/protocols/xdg-decoration-unstable-v1.xml +156 -0
- meltygui/core/windowing/backends/protocols/xdg-shell.xml +1420 -0
- meltygui/core/windowing/backends/wayland_protocol.py +101 -0
- meltygui/core/windowing/dock_core.py +182 -0
- meltygui/core/windowing/frame_geometry.py +42 -0
- meltygui/core/windowing/geometry_feed.py +864 -0
- meltygui/core/windowing/glfw_utils.py +1343 -0
- meltygui/core/windowing/os_frame.py +1552 -0
- meltygui/core/windowing/surface.py +643 -0
- meltygui/core/windowing/titlebar.py +1560 -0
- meltygui/core/windowing/titlebar_buttons.py +281 -0
- meltygui/core/windowing/wayland_move.py +932 -0
- meltygui/core/windowing/window_api.py +62 -0
- meltygui/core/windowing/window_constants.py +339 -0
- meltygui/core/windowing/window_visibility.py +162 -0
- meltygui/debug/__init__.py +0 -0
- meltygui/debug/app_view_utils.py +9 -0
- meltygui/editor/__init__.py +0 -0
- meltygui/editor/bash_syntax.py +30 -0
- meltygui/editor/code_line_fast.py +152 -0
- meltygui/editor/diff.py +139 -0
- meltygui/editor/external_changes.py +159 -0
- meltygui/editor/file_header.py +41 -0
- meltygui/editor/live_usage.py +169 -0
- meltygui/editor/live_view_views.py +1803 -0
- meltygui/editor/pending_save.py +1351 -0
- meltygui/editor/roster_tints.py +547 -0
- meltygui/editor/source_preview.py +16 -0
- meltygui/editor/source_tools.py +10 -0
- meltygui/editor/source_ui.py +70 -0
- meltygui/editor/spell_check.py +77 -0
- meltygui/editor/text_editor.py +9076 -0
- meltygui/editor/usage_picker.py +538 -0
- meltygui/events/__init__.py +0 -0
- meltygui/events/example.py +118 -0
- meltygui/examples/__init__.py +0 -0
- meltygui/examples/columns_demo.py +33 -0
- meltygui/examples/columns_window_demo.py +60 -0
- meltygui/examples/context_menu_demo.py +24 -0
- meltygui/examples/context_menu_window_demo.py +49 -0
- meltygui/examples/gui_playground.py +127 -0
- meltygui/examples/live_view_playground.py +256 -0
- meltygui/examples/lora.py +43 -0
- meltygui/examples/lora_data.py +59 -0
- meltygui/examples/lora_policies.py +67 -0
- meltygui/examples/mode_demo.py +49 -0
- meltygui/examples/modifies_demo.py +119 -0
- meltygui/examples/scalar_policies.py +60 -0
- meltygui/examples/style_layouts.py +149 -0
- meltygui/examples/tile_manager_demo.py +74 -0
- meltygui/examples/tint_demo.py +160 -0
- meltygui/examples/tint_functions.py +56 -0
- meltygui/examples/trace_demo.py +88 -0
- meltygui/examples/two_windows.py +36 -0
- meltygui/files/__init__.py +0 -0
- meltygui/files/fast_file_explorer.py +439 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/extension.js +237 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/lsd-window-geometry@latent-descent.iml +9 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/metadata.json +7 -0
- meltygui/graphics/__init__.py +6 -0
- meltygui/graphics/base.py +85 -0
- meltygui/graphics/examples.py +507 -0
- meltygui/graphics/executor.py +520 -0
- meltygui/graphics/filter.py +667 -0
- meltygui/graphics/filter.pyi +856 -0
- meltygui/graphics/generate_stubs.py +22 -0
- meltygui/graphics/registry.py +203 -0
- meltygui/graphics/shader_compiler.py +155 -0
- meltygui/graphics/shaders.py +1302 -0
- meltygui/graphics/stub_generator.py +250 -0
- meltygui/graphics/texture_manager.py +170 -0
- meltygui/graphics/texture_min_max.py +295 -0
- meltygui/hdr_color.py +757 -0
- meltygui/image_load.py +308 -0
- meltygui/model/__init__.py +1 -0
- meltygui/model/account_model.py +142 -0
- meltygui/model/camera_model.py +159 -0
- meltygui/model/chat_model.py +86 -0
- meltygui/model/code_model.py +62 -0
- meltygui/model/code_proxy_model.py +876 -0
- meltygui/model/collection_model.py +41 -0
- meltygui/model/color_model.py +127 -0
- meltygui/model/cuda_tensor_model.py +36 -0
- meltygui/model/cuda_texture_model.py +149 -0
- meltygui/model/dropdown_model.py +137 -0
- meltygui/model/file_metadata_model.py +73 -0
- meltygui/model/file_model.py +289 -0
- meltygui/model/format_model.py +390 -0
- meltygui/model/graph_model.py +98 -0
- meltygui/model/icon_model.py +1024 -0
- meltygui/model/import_graph_model.py +468 -0
- meltygui/model/layout_model.py +15 -0
- meltygui/model/lut_model.py +266 -0
- meltygui/model/search_model.py +173 -0
- meltygui/model/tensor_model.py +402 -0
- meltygui/model/terminal_model.py +329 -0
- meltygui/model/texture_model.py +146 -0
- meltygui/model/tile_model.py +24 -0
- meltygui/model/trace_model.py +198 -0
- meltygui/model/trace_report_model.py +146 -0
- meltygui/models/__init__.py +0 -0
- meltygui/models/file_meta.py +613 -0
- meltygui/models/function_console.py +184 -0
- meltygui/models/orchestration.py +48 -0
- meltygui/pbr.py +1576 -0
- meltygui/png_unfilter.c +49 -0
- meltygui/resources/JetBrainsMono-Regular.ttf +0 -0
- meltygui/resources/THIRD_PARTY_NOTICES.md +21 -0
- meltygui/resources/dejavu/DejaVuSans-Bold.ttf +0 -0
- meltygui/resources/dejavu/DejaVuSans-ExtraLight.ttf +0 -0
- meltygui/resources/dejavu/DejaVuSans.ttf +0 -0
- meltygui/resources/dejavu/LICENSE.txt +78 -0
- meltygui/resources/fontawesome-LICENSE.txt +121 -0
- meltygui/resources/fontawesome-webfont.ttf +0 -0
- meltygui/resources/hdri/studio_small_09_1k.hdr +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Bold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraBold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraLight.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Light.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Medium.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-SemiBold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Thin.ttf +0 -0
- meltygui/resources/jetbrains-weights/OFL.txt +93 -0
- meltygui/resources/jetbrains-weights/README.md +2 -0
- meltygui/state/__init__.py +0 -0
- meltygui/state/account_state.py +22 -0
- meltygui/state/animation_state.py +97 -0
- meltygui/state/annotation_state.py +22 -0
- meltygui/state/chat_state.py +36 -0
- meltygui/state/code_state.py +10 -0
- meltygui/state/core_enums.py +59 -0
- meltygui/state/core_markers.py +115 -0
- meltygui/state/core_undo.py +1075 -0
- meltygui/state/file_state.py +75 -0
- meltygui/state/graph_state.py +26 -0
- meltygui/state/inspection_state.py +47 -0
- meltygui/state/menu_state.py +10 -0
- meltygui/state/model_enums.py +11 -0
- meltygui/state/new_core_model.py +2394 -0
- meltygui/state/orchestration_state.py +14 -0
- meltygui/state/query_state.py +24 -0
- meltygui/state/tensor_state.py +10 -0
- meltygui/state/terminal_state.py +23 -0
- meltygui/state/trace_state.py +32 -0
- meltygui/state/voxel_state.py +12 -0
- meltygui/text_index.py +816 -0
- meltygui/utils/__init__.py +0 -0
- meltygui/utils/jump_to_code.py +344 -0
- meltygui/utils/pkl_inspect.py +90 -0
- meltygui/utils/render_utils.py +1419 -0
- meltygui/view/__init__.py +1 -0
- meltygui/view/account_view.py +524 -0
- meltygui/view/action_view.py +73 -0
- meltygui/view/chat_decoration_view.py +112 -0
- meltygui/view/chat_view.py +1703 -0
- meltygui/view/code_view.py +2677 -0
- meltygui/view/collection_view.py +1185 -0
- meltygui/view/color_view.py +824 -0
- meltygui/view/control_view.py +559 -0
- meltygui/view/decoration_view.py +439 -0
- meltygui/view/diagnostic_view.py +177 -0
- meltygui/view/dropdown_view.py +1082 -0
- meltygui/view/file_view.py +1599 -0
- meltygui/view/graph_cuda_view.py +105 -0
- meltygui/view/graph_view.py +882 -0
- meltygui/view/header_view.py +848 -0
- meltygui/view/input_view.py +238 -0
- meltygui/view/inspection_view.py +1783 -0
- meltygui/view/layout_view.py +596 -0
- meltygui/view/lut_view.py +45 -0
- meltygui/view/menu_view.py +212 -0
- meltygui/view/orchestration_view.py +658 -0
- meltygui/view/query_view.py +118 -0
- meltygui/view/search_view.py +342 -0
- meltygui/view/tab_view.py +258 -0
- meltygui/view/tensor_view.py +430 -0
- meltygui/view/terminal_view.py +355 -0
- meltygui/view/text_view.py +8031 -0
- meltygui/view/texture_view.py +480 -0
- meltygui/view/tile_view.py +38 -0
- meltygui/view/trace_view.py +923 -0
- meltygui/view/voxel_cuda_view.py +824 -0
- meltygui/view/voxel_view.py +1860 -0
- meltygui/view/window_view.py +111 -0
- meltygui-0.1.0.dist-info/METADATA +143 -0
- meltygui-0.1.0.dist-info/RECORD +372 -0
- meltygui-0.1.0.dist-info/WHEEL +4 -0
- 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()
|