machineconfig 5.15__py3-none-any.whl → 7.98__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.
- machineconfig/__init__.py +0 -28
- machineconfig/cluster/remote/cloud_manager.py +1 -1
- machineconfig/cluster/remote/distribute.py +0 -1
- machineconfig/cluster/remote/file_manager.py +0 -2
- machineconfig/cluster/remote/script_execution.py +0 -1
- machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
- machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
- machineconfig/cluster/sessions_managers/wt_local.py +114 -289
- machineconfig/cluster/sessions_managers/wt_local_manager.py +70 -210
- machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +52 -198
- machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
- machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
- machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
- machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
- machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
- machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
- machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +25 -170
- machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +16 -12
- machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
- machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
- machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
- machineconfig/jobs/{python → installer}/check_installations.py +2 -3
- machineconfig/jobs/installer/custom/boxes.py +61 -0
- machineconfig/jobs/installer/custom/hx.py +76 -19
- machineconfig/jobs/installer/custom/yazi.py +119 -0
- machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
- machineconfig/jobs/installer/custom_dev/brave.py +5 -9
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +4 -1
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
- machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +33 -28
- machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
- machineconfig/jobs/installer/custom_dev/winget.py +10 -14
- machineconfig/jobs/installer/installer_data.json +1487 -229
- machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
- machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
- machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
- machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/q.sh +10 -6
- machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
- machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
- machineconfig/jobs/installer/package_groups.py +106 -177
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/logger.py +0 -1
- machineconfig/profile/backup.toml +49 -0
- machineconfig/profile/bash_shell_profiles.md +11 -0
- machineconfig/profile/create_helper.py +62 -0
- machineconfig/profile/create_links.py +288 -0
- machineconfig/profile/create_links_export.py +100 -0
- machineconfig/profile/create_shell_profile.py +147 -0
- machineconfig/profile/mapper.toml +263 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
- machineconfig/scripts/linux/wrap_mcfg +46 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +123 -117
- machineconfig/scripts/python/ai/initai.py +3 -28
- machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
- machineconfig/scripts/python/ai/scripts/command_runner.sh +9 -0
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
- machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
- machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +5 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/generic.py +28 -5
- machineconfig/scripts/python/ai/utils/generate_files.py +348 -0
- machineconfig/scripts/python/ai/utils/vscode_tasks.py +37 -0
- machineconfig/scripts/python/cloud.py +29 -0
- machineconfig/scripts/python/croshell.py +137 -113
- machineconfig/scripts/python/devops.py +61 -101
- machineconfig/scripts/python/devops_navigator.py +6 -0
- machineconfig/scripts/python/env_manager/__init__.py +1 -0
- machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
- machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
- machineconfig/scripts/python/fire_jobs.py +110 -150
- machineconfig/scripts/python/ftpx.py +51 -24
- machineconfig/scripts/python/helpers/ast_search.py +74 -0
- machineconfig/scripts/python/helpers/qr_code.py +166 -0
- machineconfig/scripts/python/helpers/repo_rag.py +325 -0
- machineconfig/scripts/python/helpers/run_py_script.py +79 -0
- machineconfig/scripts/python/helpers/symantic_search.py +25 -0
- machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +126 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
- machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
- machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
- machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +29 -35
- machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
- machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +8 -9
- machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
- machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
- machineconfig/scripts/python/helpers_devops/cli_nw.py +214 -0
- machineconfig/scripts/python/helpers_devops/cli_repos.py +215 -0
- machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
- machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_share_terminal.py} +45 -35
- machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
- machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
- machineconfig/scripts/python/helpers_devops/devops_status.py +499 -0
- machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
- machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
- machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +3 -3
- machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
- machineconfig/scripts/python/helpers_fire_command/f.py +0 -0
- machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
- machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +121 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
- machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
- machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
- machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
- machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
- machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
- machineconfig/scripts/python/helpers_navigator/command_tree.py +620 -0
- machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
- machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
- machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
- machineconfig/scripts/python/helpers_network/__init__.py +0 -0
- machineconfig/scripts/python/helpers_network/address.py +132 -0
- machineconfig/scripts/python/{devops_add_identity.py → helpers_network/devops_add_identity.py} +0 -2
- machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +153 -0
- machineconfig/scripts/{linux → python/helpers_network}/mount_nfs +0 -1
- machineconfig/scripts/python/{mount_nfs.py → helpers_network/mount_nfs.py} +3 -3
- machineconfig/scripts/{linux → python/helpers_network}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → helpers_network/mount_ssh.py} +3 -3
- machineconfig/scripts/python/{onetimeshare.py → helpers_network/onetimeshare.py} +0 -1
- machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +391 -0
- machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +338 -0
- machineconfig/scripts/python/{wifi_conn.py → helpers_network/wifi_conn.py} +1 -53
- machineconfig/scripts/python/{wsl_windows_transfer.py → helpers_network/wsl_windows_transfer.py} +5 -4
- machineconfig/scripts/python/helpers_repos/action.py +209 -0
- machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
- machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
- machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
- machineconfig/scripts/python/helpers_repos/grource.py +340 -0
- machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
- machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/{count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
- machineconfig/scripts/python/helpers_repos/sync.py +66 -0
- machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
- machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
- machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +65 -0
- machineconfig/scripts/python/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers_utils/path.py +185 -0
- machineconfig/scripts/python/interactive.py +64 -84
- machineconfig/scripts/python/mcfg_entry.py +58 -0
- machineconfig/scripts/python/msearch.py +71 -0
- machineconfig/scripts/python/sessions.py +119 -45
- machineconfig/scripts/python/terminal.py +133 -0
- machineconfig/scripts/python/utils.py +64 -0
- machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
- machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
- machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
- machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
- machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
- machineconfig/settings/broot/br.sh +0 -4
- machineconfig/settings/broot/conf.toml +1 -1
- machineconfig/settings/helix/config.toml +16 -0
- machineconfig/settings/helix/languages.toml +13 -4
- machineconfig/settings/helix/yazi-picker.sh +12 -0
- machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
- machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
- machineconfig/settings/lf/linux/lfrc +10 -12
- machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
- machineconfig/settings/lf/windows/lfrc +18 -38
- machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
- machineconfig/settings/linters/.ruff.toml +1 -1
- machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
- machineconfig/settings/marimo/marimo.toml +80 -0
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/pistol/pistol.conf +1 -1
- machineconfig/settings/shells/bash/init.sh +82 -31
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
- machineconfig/settings/shells/nushell/config.nu +2 -35
- machineconfig/settings/shells/nushell/env.nu +45 -6
- machineconfig/settings/shells/nushell/init.nu +314 -0
- machineconfig/settings/shells/pwsh/init.ps1 +61 -43
- machineconfig/settings/shells/starship/starship.toml +16 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
- machineconfig/settings/shells/wt/settings.json +32 -17
- machineconfig/settings/shells/zsh/init.sh +89 -0
- machineconfig/settings/svim/linux/init.toml +0 -4
- machineconfig/settings/svim/windows/init.toml +0 -3
- machineconfig/settings/television/cable_unix/alias.toml +8 -0
- machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
- machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
- machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
- machineconfig/settings/television/cable_unix/channels.toml +19 -0
- machineconfig/settings/television/cable_unix/dirs.toml +13 -0
- machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
- machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
- machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_unix/env.toml +17 -0
- machineconfig/settings/television/cable_unix/files.toml +11 -0
- machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
- machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
- machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
- machineconfig/settings/television/cable_unix/git-log.toml +12 -0
- machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
- machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
- machineconfig/settings/television/cable_unix/guix.toml +20 -0
- machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
- machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
- machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
- machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
- machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
- machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
- machineconfig/settings/television/cable_unix/procs.toml +20 -0
- machineconfig/settings/television/cable_unix/text.toml +17 -0
- machineconfig/settings/television/cable_unix/tldr.toml +18 -0
- machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
- machineconfig/settings/television/cable_windows/alias.toml +7 -0
- machineconfig/settings/television/cable_windows/dirs.toml +13 -0
- machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
- machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_windows/env.toml +17 -0
- machineconfig/settings/television/cable_windows/files.toml +14 -0
- machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
- machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
- machineconfig/settings/television/cable_windows/git-log.toml +11 -0
- machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
- machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
- machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
- machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
- machineconfig/settings/television/cable_windows/text.toml +17 -0
- machineconfig/settings/yazi/init.lua +61 -0
- machineconfig/settings/yazi/keymap_linux.toml +94 -0
- machineconfig/settings/yazi/keymap_windows.toml +78 -0
- machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
- machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
- machineconfig/settings/yazi/theme.toml +4 -0
- machineconfig/settings/yazi/yazi_linux.toml +84 -0
- machineconfig/settings/yazi/yazi_windows.toml +58 -0
- machineconfig/setup_linux/__init__.py +11 -0
- machineconfig/setup_linux/apps_desktop.sh +89 -0
- machineconfig/setup_linux/apps_gui.sh +64 -0
- machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
- machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
- machineconfig/setup_linux/uv.sh +15 -0
- machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
- machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
- machineconfig/setup_mac/__init__.py +16 -0
- machineconfig/setup_mac/apps_gui.sh +248 -0
- machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
- machineconfig/setup_mac/uv.sh +36 -0
- machineconfig/setup_windows/__init__.py +11 -0
- machineconfig/setup_windows/others/power_options.ps1 +7 -0
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
- machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
- machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
- machineconfig/setup_windows/uv.ps1 +17 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
- machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
- machineconfig/utils/accessories.py +7 -5
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +155 -105
- machineconfig/utils/files/art/fat_croco.txt +10 -0
- machineconfig/utils/files/art/halfwit_croco.txt +9 -0
- machineconfig/utils/files/art/happy_croco.txt +22 -0
- machineconfig/utils/files/art/water_croco.txt +11 -0
- machineconfig/utils/files/ascii_art.py +1 -1
- machineconfig/utils/files/dbms.py +257 -0
- machineconfig/utils/files/headers.py +11 -14
- machineconfig/utils/files/ouch/__init__.py +0 -0
- machineconfig/utils/files/ouch/decompress.py +45 -0
- machineconfig/utils/files/read.py +10 -18
- machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
- machineconfig/utils/installer_utils/install_from_url.py +183 -0
- machineconfig/utils/installer_utils/installer_class.py +64 -181
- machineconfig/utils/installer_utils/installer_cli.py +175 -0
- machineconfig/utils/installer_utils/installer_helper.py +129 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +66 -97
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +49 -82
- machineconfig/utils/io.py +77 -23
- machineconfig/utils/links.py +254 -162
- machineconfig/utils/meta.py +256 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +46 -18
- machineconfig/utils/options_tv.py +119 -0
- machineconfig/utils/path_extended.py +48 -101
- machineconfig/utils/path_helper.py +76 -23
- machineconfig/utils/procs.py +50 -70
- machineconfig/utils/scheduler.py +88 -124
- machineconfig/utils/scheduling.py +0 -3
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/schemas/layouts/layout_types.py +1 -1
- machineconfig/utils/source_of_truth.py +3 -6
- machineconfig/utils/ssh.py +263 -274
- machineconfig/utils/ssh_utils/abc.py +5 -0
- machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
- machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
- machineconfig/utils/ssh_utils/utils.py +142 -0
- machineconfig/utils/ssh_utils/wsl.py +210 -0
- machineconfig/utils/terminal.py +3 -113
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +114 -28
- machineconfig/utils/ve.py +12 -4
- machineconfig-7.98.dist-info/METADATA +132 -0
- machineconfig-7.98.dist-info/RECORD +504 -0
- machineconfig-7.98.dist-info/entry_points.txt +13 -0
- machineconfig/cluster/sessions_managers/ffile.py +0 -4
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
- machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
- machineconfig/jobs/python/python_ve_symlink.py +0 -37
- machineconfig/jobs/python/vscode/api.py +0 -57
- machineconfig/jobs/python/vscode/sync_code.py +0 -73
- machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
- machineconfig/jobs/windows/start_terminal.ps1 +0 -6
- machineconfig/jobs/windows/startup_file.cmd +0 -2
- machineconfig/profile/create.py +0 -303
- machineconfig/profile/shell.py +0 -176
- machineconfig/scripts/cloud/init.sh +0 -119
- machineconfig/scripts/linux/agents +0 -2
- machineconfig/scripts/linux/choose_wezterm_theme +0 -3
- machineconfig/scripts/linux/cloud_copy +0 -2
- machineconfig/scripts/linux/cloud_mount +0 -2
- machineconfig/scripts/linux/cloud_repo_sync +0 -2
- machineconfig/scripts/linux/cloud_sync +0 -2
- machineconfig/scripts/linux/croshell +0 -3
- machineconfig/scripts/linux/devops +0 -2
- machineconfig/scripts/linux/fire +0 -2
- machineconfig/scripts/linux/ftpx +0 -2
- machineconfig/scripts/linux/fzf2g +0 -21
- machineconfig/scripts/linux/fzfag +0 -17
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/fzfrga +0 -21
- machineconfig/scripts/linux/gh_models +0 -2
- machineconfig/scripts/linux/initai +0 -2
- machineconfig/scripts/linux/kill_process +0 -2
- machineconfig/scripts/linux/scheduler +0 -2
- machineconfig/scripts/linux/sessions +0 -2
- machineconfig/scripts/linux/share_smb +0 -1
- machineconfig/scripts/linux/skrg +0 -4
- machineconfig/scripts/linux/start_slidev +0 -2
- machineconfig/scripts/linux/start_terminals +0 -3
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/wifi_conn +0 -2
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/generate_files.py +0 -83
- machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
- machineconfig/scripts/python/cloud_repo_sync.py +0 -190
- machineconfig/scripts/python/count_lines_frontend.py +0 -16
- machineconfig/scripts/python/devops_add_ssh_key.py +0 -120
- machineconfig/scripts/python/dotfile.py +0 -78
- machineconfig/scripts/python/fire_agents_help_launch.py +0 -120
- machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
- machineconfig/scripts/python/fire_jobs_route_helper.py +0 -65
- machineconfig/scripts/python/get_zellij_cmd.py +0 -15
- machineconfig/scripts/python/gh_models.py +0 -104
- machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
- machineconfig/scripts/python/repos.py +0 -132
- machineconfig/scripts/python/repos_helper_action.py +0 -378
- machineconfig/scripts/python/snapshot.py +0 -25
- machineconfig/scripts/python/start_terminals.py +0 -121
- machineconfig/scripts/python/t4.py +0 -17
- machineconfig/scripts/windows/agents.ps1 +0 -1
- machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
- machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
- machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
- machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
- machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
- machineconfig/scripts/windows/croshell.ps1 +0 -1
- machineconfig/scripts/windows/devops.ps1 +0 -1
- machineconfig/scripts/windows/dotfile.ps1 +0 -1
- machineconfig/scripts/windows/fire.ps1 +0 -1
- machineconfig/scripts/windows/ftpx.ps1 +0 -1
- machineconfig/scripts/windows/fzfb.ps1 +0 -3
- machineconfig/scripts/windows/fzfg.ps1 +0 -2
- machineconfig/scripts/windows/fzfrga.bat +0 -20
- machineconfig/scripts/windows/gpt.ps1 +0 -1
- machineconfig/scripts/windows/grep.ps1 +0 -2
- machineconfig/scripts/windows/initai.ps1 +0 -1
- machineconfig/scripts/windows/kill_process.ps1 +0 -1
- machineconfig/scripts/windows/nano.ps1 +0 -3
- machineconfig/scripts/windows/pomodoro.ps1 +0 -1
- machineconfig/scripts/windows/reload_path.ps1 +0 -3
- machineconfig/scripts/windows/scheduler.ps1 +0 -1
- machineconfig/scripts/windows/sessions.ps1 +0 -1
- machineconfig/scripts/windows/snapshot.ps1 +0 -1
- machineconfig/scripts/windows/start_slidev.ps1 +0 -1
- machineconfig/scripts/windows/start_terminals.ps1 +0 -1
- machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
- machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
- machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
- machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
- machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
- machineconfig/settings/lf/windows/tst.ps1 +0 -1
- machineconfig/settings/yazi/yazi.toml +0 -4
- machineconfig/setup_linux/nix/cli_installation.sh +0 -157
- machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
- machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
- machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
- machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
- machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
- machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
- machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
- machineconfig/utils/ai/generate_file_checklist.py +0 -68
- machineconfig/utils/installer_utils/installer.py +0 -189
- machineconfig-5.15.dist-info/METADATA +0 -188
- machineconfig-5.15.dist-info/RECORD +0 -415
- machineconfig-5.15.dist-info/entry_points.txt +0 -18
- machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
- machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
- machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
- machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
- machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers → helpers_agents}/__init__.py +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_agents/agentic_frameworks/__init__.py} +0 -0
- machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
- machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_cloud/__init__.py} +0 -0
- machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
- /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
- /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_croshell/__init__.py} +0 -0
- /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
- /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
- /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
- /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
- /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/__init__.py} +0 -0
- /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_devops/themes/__init__.py} +0 -0
- /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
- /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
- /machineconfig/scripts/{linux → python/helpers_network}/mount_drive +0 -0
- /machineconfig/scripts/python/{mount_nw_drive.py → helpers_network/mount_nw_drive.py} +0 -0
- /machineconfig/scripts/{linux → python/helpers_network}/mount_smb +0 -0
- /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
- /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
- /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
- /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
- /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
- {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
- {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
|
@@ -7,138 +7,103 @@ fire
|
|
|
7
7
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
from machineconfig.scripts.python.fire_jobs_route_helper import get_command_streamlit
|
|
11
|
-
from machineconfig.scripts.python.helpers.helpers4 import search_for_files_of_interest
|
|
12
|
-
from machineconfig.scripts.python.helpers.helpers4 import parse_pyfile
|
|
13
|
-
from machineconfig.scripts.python.helpers.helpers4 import get_import_module_code
|
|
14
|
-
from machineconfig.utils.ve import get_ve_activate_line, get_ve_path_and_ipython_profile
|
|
15
|
-
from machineconfig.utils.options import choose_from_options
|
|
16
|
-
from machineconfig.utils.path_helper import match_file_name, sanitize_path
|
|
17
|
-
|
|
18
|
-
from machineconfig.utils.path_extended import PathExtended
|
|
19
|
-
from machineconfig.utils.accessories import get_repo_root, randstr
|
|
20
|
-
from machineconfig.scripts.python.fire_jobs_args_helper import FireJobArgs, extract_kwargs, parse_fire_args_from_context
|
|
21
|
-
import platform
|
|
22
10
|
from typing import Optional, Annotated
|
|
23
|
-
from pathlib import Path
|
|
24
11
|
import typer
|
|
25
12
|
|
|
26
13
|
|
|
27
|
-
def route(args: FireJobArgs, fire_args: str = "") -> None:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
|
|
34
|
-
files = search_for_files_of_interest(path_obj)
|
|
35
|
-
print(f"🔍 Got #{len(files)} results.")
|
|
36
|
-
choice_file = choose_from_options(multi=False, options=files, fzf=True, msg="Choose one option")
|
|
37
|
-
choice_file = PathExtended(choice_file)
|
|
38
|
-
else:
|
|
39
|
-
choice_file = path_obj
|
|
40
|
-
repo_root = get_repo_root(Path(choice_file))
|
|
14
|
+
def route(args: "FireJobArgs", fire_args: str = "") -> None:
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from machineconfig.utils.path_helper import get_choice_file
|
|
17
|
+
from machineconfig.utils.accessories import get_repo_root, randstr
|
|
18
|
+
choice_file = get_choice_file(args.path, suffixes=None)
|
|
19
|
+
repo_root = get_repo_root(choice_file)
|
|
41
20
|
print(f"💾 Selected file: {choice_file}.\nRepo root: {repo_root}")
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
21
|
+
if args.marimo:
|
|
22
|
+
print(f"🧽 Preparing to launch Marimo notebook for `{choice_file}`...")
|
|
23
|
+
tmp_dir = Path.home().joinpath(f"tmp_results/tmp_scripts/marimo/{choice_file.stem}_{randstr()}")
|
|
24
|
+
tmp_dir.mkdir(parents=True, exist_ok=True)
|
|
25
|
+
script = f"""
|
|
26
|
+
cd {tmp_dir}
|
|
27
|
+
uv run --python 3.14 --with marimo marimo convert {choice_file} -o marimo_nb.py
|
|
28
|
+
uv run --project {repo_root} --with marimo marimo edit --host 0.0.0.0 marimo_nb.py
|
|
29
|
+
"""
|
|
30
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
31
|
+
print(f"🚀 Launching Marimo notebook for `{choice_file}`...")
|
|
32
|
+
exit_then_run_shell_script(script)
|
|
33
|
+
return
|
|
45
34
|
|
|
35
|
+
# ========================= preparing kwargs_dict
|
|
46
36
|
if choice_file.suffix == ".py":
|
|
37
|
+
from machineconfig.scripts.python.helpers_fire_command.fire_jobs_args_helper import extract_kwargs
|
|
47
38
|
kwargs_dict = extract_kwargs(args) # This now returns empty dict, but kept for compatibility
|
|
48
|
-
activate_ve_line = get_ve_activate_line(ve_root=args.ve or ve_root_from_file or "$HOME/code/machineconfig/.venv")
|
|
49
39
|
else:
|
|
50
|
-
activate_ve_line = ""
|
|
51
40
|
kwargs_dict = {}
|
|
52
41
|
|
|
53
42
|
# ========================= choosing function to run
|
|
54
43
|
choice_function: Optional[str] = None # Initialize to avoid unbound variable
|
|
55
|
-
if args.choose_function
|
|
56
|
-
|
|
57
|
-
options, func_args = parse_pyfile(file_path=str(choice_file))
|
|
58
|
-
choice_function_tmp = choose_from_options(msg="Choose a function to run", options=options, fzf=True, multi=False)
|
|
59
|
-
assert isinstance(choice_function_tmp, str), f"choice_function must be a string. Got {type(choice_function_tmp)}"
|
|
60
|
-
choice_index = options.index(choice_function_tmp)
|
|
61
|
-
choice_function = choice_function_tmp.split(" -- ")[0]
|
|
62
|
-
choice_function_args = func_args[choice_index]
|
|
44
|
+
if args.choose_function:
|
|
45
|
+
from machineconfig.scripts.python.helpers_fire_command.fire_jobs_route_helper import choose_function_or_lines
|
|
63
46
|
|
|
64
|
-
|
|
65
|
-
choice_function = None
|
|
66
|
-
if len(choice_function_args) > 0 and len(kwargs_dict) == 0:
|
|
67
|
-
for item in choice_function_args:
|
|
68
|
-
kwargs_dict[item.name] = input(f"Please enter a value for argument `{item.name}` (type = {item.type}) (default = {item.default}) : ") or item.default
|
|
69
|
-
elif choice_file.suffix == ".sh": # in this case, we choos lines.
|
|
70
|
-
options = []
|
|
71
|
-
for line in choice_file.read_text(encoding="utf-8").splitlines():
|
|
72
|
-
if line.startswith("#"):
|
|
73
|
-
continue
|
|
74
|
-
if line == "":
|
|
75
|
-
continue
|
|
76
|
-
if line.startswith("echo"):
|
|
77
|
-
continue
|
|
78
|
-
options.append(line)
|
|
79
|
-
chosen_lines = choose_from_options(msg="Choose a line to run", options=options, fzf=True, multi=True)
|
|
80
|
-
choice_file = PathExtended.tmpfile(suffix=".sh")
|
|
81
|
-
choice_file.parent.mkdir(parents=True, exist_ok=True)
|
|
82
|
-
choice_file.write_text("\n".join(chosen_lines), encoding="utf-8")
|
|
83
|
-
choice_function = None
|
|
47
|
+
choice_function, choice_file, kwargs_dict = choose_function_or_lines(choice_file, kwargs_dict)
|
|
84
48
|
else:
|
|
85
49
|
choice_function = args.function
|
|
86
50
|
|
|
87
51
|
if choice_file.suffix == ".py":
|
|
88
|
-
if
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
52
|
+
with_project = f"--project {repo_root} " if repo_root is not None else ""
|
|
53
|
+
if args.streamlit:
|
|
54
|
+
from machineconfig.scripts.python.helpers_fire_command.fire_jobs_route_helper import get_command_streamlit
|
|
55
|
+
exe = get_command_streamlit(choice_file=choice_file, environment=args.environment, repo_root=repo_root)
|
|
56
|
+
exe = f"uv run {with_project} {exe} "
|
|
57
|
+
elif args.jupyter:
|
|
58
|
+
exe = f"uv run {with_project} jupyter-lab"
|
|
59
|
+
else:
|
|
60
|
+
if args.interactive:
|
|
61
|
+
from machineconfig.utils.ve import get_ve_path_and_ipython_profile
|
|
62
|
+
_ve_root_from_file, ipy_profile = get_ve_path_and_ipython_profile(init_path=choice_file)
|
|
63
|
+
if ipy_profile is None:
|
|
64
|
+
ipy_profile = "default"
|
|
65
|
+
exe = f"uv run {with_project} ipython -i --no-banner --profile {ipy_profile} "
|
|
66
|
+
else:
|
|
67
|
+
exe = f"uv run {with_project} python "
|
|
68
|
+
elif choice_file.suffix == ".ps1" or choice_file.suffix == ".sh":
|
|
69
|
+
exe = "."
|
|
70
|
+
elif choice_file.suffix == "":
|
|
71
|
+
exe = ""
|
|
72
|
+
else:
|
|
73
|
+
raise NotImplementedError(f"File type {choice_file.suffix} not supported, in the sense that I don't know how to fire it.")
|
|
95
74
|
|
|
96
|
-
if args.module or (args.debug and args.choose_function):
|
|
75
|
+
if args.module or (args.debug and args.choose_function):
|
|
76
|
+
# because debugging tools do not support choosing functions and don't interplay with fire module. So the only way to have debugging and choose function options is to import the file as a module into a new script and run the function of interest there and debug the new script.
|
|
97
77
|
assert choice_file.suffix == ".py", f"File must be a python file to be imported as a module. Got {choice_file}"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
else:
|
|
102
|
-
repo_root_add = ""
|
|
103
|
-
txt: str = f"""
|
|
104
|
-
try:
|
|
105
|
-
{import_line}
|
|
106
|
-
except (ImportError, ModuleNotFoundError) as ex:
|
|
107
|
-
print(fr"❌ Failed to import `{choice_file}` as a module: {{ex}} ")
|
|
108
|
-
print(fr"⚠️ Attempting import with ad-hoc `$PATH` manipulation. DO NOT pickle any objects in this session as correct deserialization cannot be guaranteed.")
|
|
109
|
-
import sys
|
|
110
|
-
sys.path.append(r'{PathExtended(choice_file).parent}')
|
|
111
|
-
{repo_root_add}
|
|
112
|
-
from {PathExtended(choice_file).stem} import *
|
|
113
|
-
print(fr"✅ Successfully imported `{choice_file}`")
|
|
114
|
-
"""
|
|
115
|
-
if choice_function is not None:
|
|
116
|
-
txt = (
|
|
117
|
-
txt
|
|
118
|
-
+ f"""
|
|
119
|
-
res = {choice_function}({("**" + str(kwargs_dict)) if kwargs_dict else ""})
|
|
120
|
-
"""
|
|
121
|
-
)
|
|
78
|
+
from machineconfig.scripts.python.helpers_fire_command.file_wrangler import get_import_module_code, wrap_import_in_try_except
|
|
79
|
+
from machineconfig.utils.meta import lambda_to_python_script
|
|
80
|
+
from machineconfig.utils.code import print_code
|
|
122
81
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
"""
|
|
134
|
-
|
|
82
|
+
import_code = get_import_module_code(str(choice_file))
|
|
83
|
+
import_code_robust = lambda_to_python_script(
|
|
84
|
+
lambda: wrap_import_in_try_except(
|
|
85
|
+
import_line=import_code, pyfile=str(choice_file), repo_root=str(repo_root) if repo_root is not None else None
|
|
86
|
+
),
|
|
87
|
+
in_global=True,
|
|
88
|
+
import_module=False,
|
|
89
|
+
)
|
|
90
|
+
# print(f"🧩 Preparing import code for module import:\n{import_code}")
|
|
91
|
+
code_printing = lambda_to_python_script(
|
|
92
|
+
lambda: print_code(code=import_code_robust, lexer="python", desc="import as module code"),
|
|
93
|
+
in_global=True, import_module=False
|
|
135
94
|
)
|
|
136
|
-
|
|
95
|
+
print(f"🧩 Preparing import code for module import:\n{import_code}")
|
|
96
|
+
if choice_function is not None:
|
|
97
|
+
calling = f"""res = {choice_function}({("**" + str(kwargs_dict)) if kwargs_dict else ""})"""
|
|
98
|
+
else:
|
|
99
|
+
calling = """# No function selected to call. You can add your code here."""
|
|
100
|
+
choice_file = Path.home().joinpath(f"tmp_results/tmp_scripts/python/{Path(choice_file).parent.name}_{Path(choice_file).stem}_{randstr()}.py")
|
|
137
101
|
choice_file.parent.mkdir(parents=True, exist_ok=True)
|
|
138
|
-
choice_file.write_text(
|
|
102
|
+
choice_file.write_text(import_code_robust + "\n" + code_printing + "\n" + calling, encoding="utf-8")
|
|
139
103
|
|
|
140
104
|
# ========================= determining basic command structure: putting together exe & choice_file & choice_function & pdb
|
|
141
105
|
if args.debug:
|
|
106
|
+
import platform
|
|
142
107
|
if platform.system() == "Windows":
|
|
143
108
|
command = f"{exe} -m ipdb {choice_file} " # pudb is not available on windows machines, use poor man's debugger instead.
|
|
144
109
|
elif platform.system() in ["Linux", "Darwin"]:
|
|
@@ -148,84 +113,76 @@ except ImportError as _ex:
|
|
|
148
113
|
elif args.module:
|
|
149
114
|
# both selected function and kwargs are mentioned in the made up script, therefore no need for fire module.
|
|
150
115
|
command = f"{exe} {choice_file} "
|
|
151
|
-
elif choice_function is not None:
|
|
116
|
+
elif choice_function is not None and choice_file.suffix == ".py":
|
|
152
117
|
command = f"{exe} -m fire {choice_file} {choice_function} {fire_args}"
|
|
153
118
|
elif args.streamlit:
|
|
154
119
|
# for .streamlit config to work, it needs to be in the current directory.
|
|
155
120
|
if args.holdDirectory:
|
|
156
121
|
command = f"{exe} {choice_file}"
|
|
157
122
|
else:
|
|
158
|
-
command = f"cd {choice_file.parent}\n{exe} {choice_file.name}\ncd {
|
|
159
|
-
|
|
123
|
+
command = f"cd {choice_file.parent}\n{exe} {choice_file.name}\ncd {Path.cwd()}"
|
|
160
124
|
elif args.cmd:
|
|
161
125
|
command = rf""" cd /d {choice_file.parent} & {exe} {choice_file.name} """
|
|
162
126
|
else:
|
|
163
127
|
if choice_file.suffix == "":
|
|
164
128
|
command = f"{exe} {choice_file} {fire_args}"
|
|
165
129
|
else:
|
|
166
|
-
# command = f"cd {choice_file.parent}\n{exe} {choice_file.name}\ncd {PathExtended.cwd()}"
|
|
167
130
|
command = f"{exe} {choice_file} "
|
|
168
|
-
|
|
131
|
+
|
|
132
|
+
if not args.cmd:
|
|
133
|
+
pass
|
|
169
134
|
else:
|
|
170
135
|
new_line = "\n"
|
|
171
|
-
command = rf"""start cmd -Argument "/k {
|
|
136
|
+
command = rf"""start cmd -Argument "/k {command.replace(new_line, " & ")} " """ # this works from powershell
|
|
172
137
|
if args.submit_to_cloud:
|
|
173
|
-
command = f"""
|
|
174
|
-
{activate_ve_line}
|
|
175
|
-
python -m machineconfig.cluster.templates.cli_click --file {choice_file} """
|
|
138
|
+
command = f"""uv run python -m machineconfig.cluster.templates.cli_click --file {choice_file} """
|
|
176
139
|
if choice_function is not None:
|
|
177
140
|
command += f"--function {choice_function} "
|
|
178
141
|
|
|
179
|
-
if args.Nprocess > 1:
|
|
180
|
-
from machineconfig.cluster.sessions_managers.zellij_local import run_zellij_layout
|
|
181
|
-
from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
|
|
182
|
-
layout: LayoutConfig = {"layoutName": "fireNprocess", "layoutTabs": []}
|
|
183
|
-
for an_arg in range(args.Nprocess):
|
|
184
|
-
layout["layoutTabs"].append({"tabName": f"tab{an_arg}", "startDir": str(PathExtended.cwd()), "command": f"uv run -m fire {choice_file} {choice_function} --idx={an_arg} --idx_max={args.Nprocess}"})
|
|
185
|
-
run_zellij_layout(layout_config=layout)
|
|
186
|
-
return None
|
|
187
142
|
if args.optimized:
|
|
188
143
|
command = command.replace("python ", "python -OO ")
|
|
144
|
+
|
|
189
145
|
from rich.panel import Panel
|
|
190
146
|
from rich.console import Console
|
|
191
147
|
from rich.syntax import Syntax
|
|
148
|
+
|
|
192
149
|
console = Console()
|
|
193
150
|
if args.zellij_tab is not None:
|
|
194
|
-
comman_path__ =
|
|
151
|
+
comman_path__ = Path.home().joinpath(f"tmp_results/tmp_scripts/zellij_commands/{choice_file.stem}_{randstr()}.sh")
|
|
195
152
|
comman_path__.parent.mkdir(parents=True, exist_ok=True)
|
|
196
153
|
comman_path__.write_text(command, encoding="utf-8")
|
|
197
154
|
console.print(Panel(Syntax(command, lexer="shell"), title=f"🔥 fire command @ {comman_path__}: "), style="bold red")
|
|
198
155
|
import subprocess
|
|
156
|
+
|
|
199
157
|
existing_tab_names = subprocess.run(["zellij", "action", "query-tab-names"], capture_output=True, text=True, check=True).stdout.splitlines()
|
|
200
158
|
if args.zellij_tab in existing_tab_names:
|
|
201
159
|
print(f"⚠️ Tab name `{args.zellij_tab}` already exists. Please choose a different name.")
|
|
202
160
|
args.zellij_tab += f"_{randstr(3)}"
|
|
203
161
|
from machineconfig.cluster.sessions_managers.zellij_local import run_command_in_zellij_tab
|
|
162
|
+
|
|
204
163
|
command = run_command_in_zellij_tab(command=str(comman_path__), tab_name=args.zellij_tab, cwd=None)
|
|
205
164
|
if args.watch:
|
|
206
165
|
command = "watchexec --restart --exts py,sh,ps1 " + command
|
|
207
166
|
if args.git_pull:
|
|
208
167
|
command = f"\ngit -C {choice_file.parent} pull\n" + command
|
|
209
168
|
if args.PathExport:
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
export_line = f"""$env:PYTHONPATH="{repo_root}""" + """:$env:PYTHONPATH" """
|
|
214
|
-
else:
|
|
215
|
-
raise NotImplementedError(f"Platform {platform.system()} not supported.")
|
|
169
|
+
from machineconfig.scripts.python.helpers_fire_command.file_wrangler import add_to_path
|
|
170
|
+
|
|
171
|
+
export_line = add_to_path(path_variable="PYTHONPATH", directory=str(repo_root))
|
|
216
172
|
command = export_line + "\n" + command
|
|
217
173
|
if args.loop:
|
|
174
|
+
import platform
|
|
218
175
|
if platform.system() in ["Linux", "Darwin"]:
|
|
219
176
|
command = command + "\nsleep 0.5"
|
|
220
177
|
elif platform.system() == "Windows":
|
|
221
178
|
command = "$ErrorActionPreference = 'SilentlyContinue';\n" + command + "\nStart-Sleep -Seconds 0.5"
|
|
222
179
|
else:
|
|
223
180
|
raise NotImplementedError(f"Platform {platform.system()} not supported.")
|
|
224
|
-
from machineconfig.utils.code import
|
|
225
|
-
|
|
181
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
182
|
+
exit_then_run_shell_script(script=command, strict=False)
|
|
226
183
|
|
|
227
184
|
|
|
228
|
-
def
|
|
185
|
+
def fire(
|
|
229
186
|
ctx: typer.Context,
|
|
230
187
|
path: Annotated[str, typer.Argument(help="Path to the Python file to run")] = ".",
|
|
231
188
|
function: Annotated[Optional[str], typer.Argument(help="Function to run")] = None,
|
|
@@ -233,25 +190,28 @@ def main(
|
|
|
233
190
|
cmd: Annotated[bool, typer.Option("--cmd", "-B", help="Create a cmd fire command to launch the job asynchronously")] = False,
|
|
234
191
|
interactive: Annotated[bool, typer.Option("--interactive", "-i", help="Whether to run the job interactively using IPython")] = False,
|
|
235
192
|
debug: Annotated[bool, typer.Option("--debug", "-d", help="Enable debug mode")] = False,
|
|
236
|
-
choose_function: Annotated[bool, typer.Option("--
|
|
193
|
+
choose_function: Annotated[bool, typer.Option("--choose-function", "-c", help="Choose function interactively")] = False,
|
|
237
194
|
loop: Annotated[bool, typer.Option("--loop", "-l", help="Infinite recursion (runs again after completion/interruption)")] = False,
|
|
238
195
|
jupyter: Annotated[bool, typer.Option("--jupyter", "-j", help="Open in a jupyter notebook")] = False,
|
|
239
|
-
|
|
240
|
-
remote: Annotated[bool, typer.Option("--remote", "-r", help="Launch on a remote machine")] = False,
|
|
196
|
+
marimo: Annotated[bool, typer.Option("--marimo", "-M", help="Open in a marimo notebook")] = False,
|
|
241
197
|
module: Annotated[bool, typer.Option("--module", "-m", help="Launch the main file")] = False,
|
|
198
|
+
optimized: Annotated[bool, typer.Option("--optimized", "-O", help="Run the optimized version of the function")] = False,
|
|
199
|
+
zellij_tab: Annotated[Optional[str], typer.Option("--zellij-tab", "-z", help="Open in a new zellij tab")] = None,
|
|
200
|
+
submit_to_cloud: Annotated[bool, typer.Option("--submit-to-cloud", "-C", help="Submit to cloud compute")] = False,
|
|
201
|
+
remote: Annotated[bool, typer.Option("--remote", "-r", help="Launch on a remote machine")] = False,
|
|
242
202
|
streamlit: Annotated[bool, typer.Option("--streamlit", "-S", help="Run as streamlit app")] = False,
|
|
243
203
|
environment: Annotated[str, typer.Option("--environment", "-E", help="Choose ip, localhost, hostname or arbitrary url")] = "",
|
|
244
|
-
holdDirectory: Annotated[
|
|
204
|
+
holdDirectory: Annotated[
|
|
205
|
+
bool, typer.Option("--holdDirectory", "-D", help="Hold current directory and avoid cd'ing to the script directory")
|
|
206
|
+
] = False,
|
|
245
207
|
PathExport: Annotated[bool, typer.Option("--PathExport", "-P", help="Augment the PYTHONPATH with repo root")] = False,
|
|
246
|
-
git_pull: Annotated[bool, typer.Option("--
|
|
247
|
-
optimized: Annotated[bool, typer.Option("--optimized", "-O", help="Run the optimized version of the function")] = False,
|
|
248
|
-
Nprocess: Annotated[int, typer.Option("--Nprocess", "-p", help="Number of processes to use")] = 1,
|
|
249
|
-
zellij_tab: Annotated[Optional[str], typer.Option("--zellij_tab", "-z", help="Open in a new zellij tab")] = None,
|
|
208
|
+
git_pull: Annotated[bool, typer.Option("--git-pull", "-g", help="Start by pulling the git repo")] = False,
|
|
250
209
|
watch: Annotated[bool, typer.Option("--watch", "-w", help="Watch the file for changes")] = False,
|
|
251
210
|
) -> None:
|
|
252
211
|
"""Main function to process fire jobs arguments."""
|
|
253
212
|
|
|
254
213
|
# Get Fire arguments from context
|
|
214
|
+
from machineconfig.scripts.python.helpers_fire_command.fire_jobs_args_helper import FireJobArgs, parse_fire_args_from_context
|
|
255
215
|
fire_args = parse_fire_args_from_context(ctx)
|
|
256
216
|
|
|
257
217
|
args = FireJobArgs(
|
|
@@ -264,6 +224,7 @@ def main(
|
|
|
264
224
|
choose_function=choose_function,
|
|
265
225
|
loop=loop,
|
|
266
226
|
jupyter=jupyter,
|
|
227
|
+
marimo=marimo,
|
|
267
228
|
submit_to_cloud=submit_to_cloud,
|
|
268
229
|
remote=remote,
|
|
269
230
|
module=module,
|
|
@@ -273,7 +234,6 @@ def main(
|
|
|
273
234
|
PathExport=PathExport,
|
|
274
235
|
git_pull=git_pull,
|
|
275
236
|
optimized=optimized,
|
|
276
|
-
Nprocess=Nprocess,
|
|
277
237
|
zellij_tab=zellij_tab,
|
|
278
238
|
watch=watch,
|
|
279
239
|
)
|
|
@@ -290,18 +250,18 @@ def main(
|
|
|
290
250
|
sys.exit(1)
|
|
291
251
|
|
|
292
252
|
|
|
293
|
-
def
|
|
294
|
-
# from trogon.typer import init_tui
|
|
295
|
-
# from trogon.typer import init_tui
|
|
253
|
+
def get_app():
|
|
296
254
|
from typer import Typer
|
|
297
255
|
|
|
298
256
|
app = Typer(add_completion=False)
|
|
299
|
-
app.command(context_settings={"allow_extra_args": True, "allow_interspersed_args": False})(
|
|
300
|
-
|
|
301
|
-
|
|
257
|
+
app.command(context_settings={"allow_extra_args": True, "allow_interspersed_args": False})(fire)
|
|
258
|
+
return app
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def main():
|
|
262
|
+
app = get_app()
|
|
302
263
|
app()
|
|
303
264
|
|
|
304
265
|
|
|
305
266
|
if __name__ == "__main__":
|
|
306
|
-
|
|
307
|
-
main_from_parser()
|
|
267
|
+
from machineconfig.scripts.python.helpers_fire_command.fire_jobs_args_helper import FireJobArgs
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env -S uv run --no-dev --project /home/alex/code/machineconfig --script
|
|
2
1
|
"""Sx & Rx
|
|
3
2
|
|
|
4
3
|
TODO: add support for cases in which source or target has non 22 default port number and is defineda as user@host:port:path which makes 2 colons in the string.
|
|
@@ -7,26 +6,50 @@ Currently, the only way to work around this is to predifine the host in ~/.ssh/c
|
|
|
7
6
|
"""
|
|
8
7
|
|
|
9
8
|
import typer
|
|
10
|
-
from
|
|
11
|
-
from rich.console import Console
|
|
12
|
-
from rich.panel import Panel
|
|
9
|
+
from typing import Annotated
|
|
13
10
|
|
|
14
|
-
from machineconfig.utils.ssh import SSH
|
|
15
|
-
from machineconfig.utils.path_extended import PathExtended
|
|
16
|
-
from machineconfig.scripts.python.helpers.helpers2 import ES
|
|
17
|
-
from machineconfig.utils.accessories import pprint
|
|
18
11
|
|
|
19
|
-
|
|
20
|
-
console = Console()
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def main(
|
|
12
|
+
def ftpx(
|
|
24
13
|
source: Annotated[str, typer.Argument(help="Source path (machine:path)")],
|
|
25
14
|
target: Annotated[str, typer.Argument(help="Target path (machine:path)")],
|
|
26
15
|
recursive: Annotated[bool, typer.Option("--recursive", "-r", help="Send recursively.")] = False,
|
|
27
16
|
zipFirst: Annotated[bool, typer.Option("--zipFirst", "-z", help="Zip before sending.")] = False,
|
|
28
17
|
cloud: Annotated[bool, typer.Option("--cloud", "-c", help="Transfer through the cloud.")] = False,
|
|
18
|
+
overwrite_existing: Annotated[bool, typer.Option("--overwrite-existing", "-o", help="Overwrite existing files on remote when sending from local to remote.")] = False,
|
|
29
19
|
) -> None:
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
if target == "wsl" or source == "wsl":
|
|
22
|
+
from machineconfig.utils.ssh_utils.wsl import copy_when_inside_windows
|
|
23
|
+
if target == "wsl":
|
|
24
|
+
target_obj = Path(source).expanduser().absolute().relative_to(Path.home())
|
|
25
|
+
source_obj = target_obj
|
|
26
|
+
else:
|
|
27
|
+
source_obj = Path(target).expanduser().absolute().relative_to(Path.home())
|
|
28
|
+
target_obj = source_obj
|
|
29
|
+
copy_when_inside_windows(source_obj, target_obj, overwrite_existing)
|
|
30
|
+
return
|
|
31
|
+
elif source == "win" or target == "win":
|
|
32
|
+
if source == "win":
|
|
33
|
+
source_obj = Path(target).expanduser().absolute().relative_to(Path.home())
|
|
34
|
+
target_obj = source_obj
|
|
35
|
+
else:
|
|
36
|
+
target_obj = Path(source).expanduser().absolute().relative_to(Path.home())
|
|
37
|
+
source_obj = target_obj
|
|
38
|
+
from machineconfig.utils.ssh_utils.wsl import copy_when_inside_wsl
|
|
39
|
+
copy_when_inside_wsl(source_obj, target_obj, overwrite_existing)
|
|
40
|
+
return
|
|
41
|
+
|
|
42
|
+
from rich.console import Console
|
|
43
|
+
from rich.panel import Panel
|
|
44
|
+
|
|
45
|
+
from machineconfig.utils.ssh import SSH
|
|
46
|
+
from machineconfig.utils.path_extended import PathExtended
|
|
47
|
+
from machineconfig.scripts.python.helpers_cloud.helpers2 import ES
|
|
48
|
+
from machineconfig.utils.accessories import pprint
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
console = Console()
|
|
52
|
+
|
|
30
53
|
console.print(
|
|
31
54
|
Panel(
|
|
32
55
|
"\n".join(
|
|
@@ -106,7 +129,7 @@ def main(
|
|
|
106
129
|
from paramiko.ssh_exception import AuthenticationException # type: ignore
|
|
107
130
|
|
|
108
131
|
try:
|
|
109
|
-
ssh = SSH(rf"{machine}")
|
|
132
|
+
ssh = SSH(host=rf"{machine}", username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=True)
|
|
110
133
|
except AuthenticationException:
|
|
111
134
|
console.print(
|
|
112
135
|
Panel(
|
|
@@ -124,7 +147,7 @@ def main(
|
|
|
124
147
|
import getpass
|
|
125
148
|
|
|
126
149
|
pwd = getpass.getpass()
|
|
127
|
-
ssh = SSH(rf"{machine}", pwd=
|
|
150
|
+
ssh = SSH(host=rf"{machine}", username=None, hostname=None, ssh_key_path=None, password=pwd, port=22, enable_compression=True)
|
|
128
151
|
|
|
129
152
|
if cloud:
|
|
130
153
|
console.print(
|
|
@@ -134,7 +157,7 @@ def main(
|
|
|
134
157
|
border_style="cyan",
|
|
135
158
|
)
|
|
136
159
|
)
|
|
137
|
-
ssh.
|
|
160
|
+
ssh.run_shell_cmd_on_remote(command=f"cloud_copy {resolved_source} :^", verbose_output=True, description="Uploading from remote to the cloud.", strict_stderr=False, strict_return_code=False)
|
|
138
161
|
console.print(
|
|
139
162
|
Panel.fit(
|
|
140
163
|
"⬇️ Cloud transfer mode — downloading from cloud to local...",
|
|
@@ -142,12 +165,14 @@ def main(
|
|
|
142
165
|
border_style="cyan",
|
|
143
166
|
)
|
|
144
167
|
)
|
|
145
|
-
ssh.
|
|
168
|
+
ssh.run_shell_cmd_on_local(command=f"cloud_copy :^ {resolved_target}")
|
|
146
169
|
received_file = PathExtended(resolved_target) # type: ignore
|
|
147
170
|
else:
|
|
148
171
|
if source_is_remote:
|
|
149
|
-
|
|
150
|
-
❌ Path Error: Source must be a remote path (machine:path)"""
|
|
172
|
+
if resolved_source is None:
|
|
173
|
+
typer.echo("""❌ Path Error: Source must be a remote path (machine:path)""")
|
|
174
|
+
typer.Exit(code=1)
|
|
175
|
+
return
|
|
151
176
|
target_display = resolved_target or "<auto>"
|
|
152
177
|
console.print(
|
|
153
178
|
Panel(
|
|
@@ -164,7 +189,7 @@ def main(
|
|
|
164
189
|
padding=(1, 2),
|
|
165
190
|
)
|
|
166
191
|
)
|
|
167
|
-
received_file = ssh.copy_to_here(source=resolved_source, target=resolved_target,
|
|
192
|
+
received_file = ssh.copy_to_here(source=resolved_source, target=resolved_target, compress_with_zip=zipFirst, recursive=recursive)
|
|
168
193
|
else:
|
|
169
194
|
assert resolved_source is not None, """
|
|
170
195
|
❌ Path Error: Target must be a remote path (machine:path)"""
|
|
@@ -184,7 +209,7 @@ def main(
|
|
|
184
209
|
padding=(1, 2),
|
|
185
210
|
)
|
|
186
211
|
)
|
|
187
|
-
received_file = ssh.copy_from_here(
|
|
212
|
+
received_file = ssh.copy_from_here(source_path=resolved_source, target_rel2home=resolved_target, compress_with_zip=zipFirst, recursive=recursive, overwrite_existing=overwrite_existing)
|
|
188
213
|
|
|
189
214
|
if source_is_remote and isinstance(received_file, PathExtended):
|
|
190
215
|
console.print(
|
|
@@ -211,10 +236,12 @@ def main(
|
|
|
211
236
|
)
|
|
212
237
|
|
|
213
238
|
|
|
214
|
-
def
|
|
239
|
+
def main() -> None:
|
|
215
240
|
"""Entry point function that uses typer to parse arguments and call main."""
|
|
216
|
-
typer.
|
|
241
|
+
app = typer.Typer()
|
|
242
|
+
app.command(no_args_is_help=True, help="File transfer utility though SSH.")(ftpx)
|
|
243
|
+
app()
|
|
217
244
|
|
|
218
245
|
|
|
219
246
|
if __name__ == "__main__":
|
|
220
|
-
|
|
247
|
+
main()
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
|
|
2
|
+
import ast
|
|
3
|
+
import os
|
|
4
|
+
from typing import TypedDict
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SymbolInfo(TypedDict):
|
|
8
|
+
"""Represents a symbol (module, class, or function) in the repository."""
|
|
9
|
+
type: str
|
|
10
|
+
name: str
|
|
11
|
+
path: str
|
|
12
|
+
# line: int | None
|
|
13
|
+
# column: int | None
|
|
14
|
+
docstring: str
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _get_docstring(node: ast.AsyncFunctionDef | ast.FunctionDef | ast.ClassDef | ast.Module) -> str:
|
|
18
|
+
"""Extract docstring from an AST node."""
|
|
19
|
+
return ast.get_docstring(node) or ""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _extract_symbols(tree: ast.AST, module_path: str, source: str) -> list[SymbolInfo]:
|
|
23
|
+
"""Extract symbols from an AST tree."""
|
|
24
|
+
symbols: list[SymbolInfo] = []
|
|
25
|
+
|
|
26
|
+
for node in ast.walk(tree):
|
|
27
|
+
if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef):
|
|
28
|
+
symbol: SymbolInfo = {
|
|
29
|
+
"type": "function",
|
|
30
|
+
"name": node.name,
|
|
31
|
+
"path": f"{module_path}.{node.name}",
|
|
32
|
+
"docstring": _get_docstring(node),
|
|
33
|
+
}
|
|
34
|
+
symbols.append(symbol)
|
|
35
|
+
elif isinstance(node, ast.ClassDef):
|
|
36
|
+
symbol: SymbolInfo = {
|
|
37
|
+
"type": "class",
|
|
38
|
+
"name": node.name,
|
|
39
|
+
"path": f"{module_path}.{node.name}",
|
|
40
|
+
"docstring": _get_docstring(node),
|
|
41
|
+
}
|
|
42
|
+
symbols.append(symbol)
|
|
43
|
+
|
|
44
|
+
return symbols
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_repo_symbols(repo_path: str) -> list[SymbolInfo]:
|
|
48
|
+
skip_dirs = {'.venv', 'venv', '__pycache__', '.mypy_cache', '.pytest_cache', '.git'}
|
|
49
|
+
results: list[SymbolInfo] = []
|
|
50
|
+
counter: int = 0
|
|
51
|
+
for root, dirs, files in os.walk(repo_path):
|
|
52
|
+
dirs[:] = [d for d in dirs if d not in skip_dirs and not d.startswith('.')]
|
|
53
|
+
for file in files:
|
|
54
|
+
if not file.endswith(".py"):
|
|
55
|
+
continue
|
|
56
|
+
file_path = os.path.join(root, file)
|
|
57
|
+
module_path = (
|
|
58
|
+
os.path.relpath(file_path, repo_path)
|
|
59
|
+
.replace(os.sep, ".")
|
|
60
|
+
.removesuffix(".py")
|
|
61
|
+
)
|
|
62
|
+
try:
|
|
63
|
+
if counter % 100 == 0: print(f"🔍 Parsing {counter}: {file_path}...")
|
|
64
|
+
with open(file_path, encoding="utf-8") as f:
|
|
65
|
+
source = f.read()
|
|
66
|
+
tree = ast.parse(source, filename=file_path)
|
|
67
|
+
symbols = _extract_symbols(tree, module_path, source)
|
|
68
|
+
results.extend(symbols)
|
|
69
|
+
except Exception as e:
|
|
70
|
+
print(f"⚠️ Error parsing {file_path}: {e}")
|
|
71
|
+
continue
|
|
72
|
+
counter += 1
|
|
73
|
+
|
|
74
|
+
return results
|