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
|
@@ -6,7 +6,6 @@ import random
|
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from rich import pretty
|
|
8
8
|
from rich.console import Console
|
|
9
|
-
from typing import Optional
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
def print_header():
|
|
@@ -26,8 +25,9 @@ def print_header():
|
|
|
26
25
|
table.add_row("Virtual Environment", os.getenv('VIRTUAL_ENV', 'None'))
|
|
27
26
|
table.add_row("Running @", str(Path.cwd()))
|
|
28
27
|
|
|
28
|
+
from machineconfig.utils.installer_utils.installer_runner import get_machineconfig_version
|
|
29
29
|
|
|
30
|
-
console.print(Panel(table, title="[bold blue]✨ 🐊
|
|
30
|
+
console.print(Panel(table, title=f"[bold blue]✨ 🐊 Machineconfig Shell {get_machineconfig_version()} ✨ Made with 🐍 | Built with ❤️[/bold blue]", border_style="blue"))
|
|
31
31
|
def print_logo(logo: str):
|
|
32
32
|
from machineconfig.utils.files.ascii_art import font_box_color, character_color, character_or_box_color
|
|
33
33
|
if platform.system() == "Windows":
|
|
@@ -38,26 +38,23 @@ def print_logo(logo: str):
|
|
|
38
38
|
if random.choice([True, True, False]): font_box_color(logo)
|
|
39
39
|
else: character_color(logo)
|
|
40
40
|
else:
|
|
41
|
-
print("\n" + "🚫 " + "-" * 70 + " 🚫")
|
|
42
|
-
print("🔍 Missing ASCII art dependencies. Install with: iwr bit.ly/cfgasciiartwindows | iex")
|
|
43
|
-
print("🚫 " + "-" * 70 + " 🚫\n")
|
|
41
|
+
# print("\n" + "🚫 " + "-" * 70 + " 🚫")
|
|
42
|
+
# print("🔍 Missing ASCII art dependencies. Install with: iwr bit.ly/cfgasciiartwindows | iex")
|
|
43
|
+
# print("🚫 " + "-" * 70 + " 🚫\n")
|
|
44
44
|
_default_art = Path(random.choice(glob.glob(str(Path(__file__).parent.joinpath("art", "*")))))
|
|
45
45
|
print(_default_art.read_text())
|
|
46
46
|
elif platform.system() in ["Linux", "Darwin"]: # Explicitly handle both Linux and macOS
|
|
47
|
-
|
|
48
|
-
path_dirs = os.environ['PATH'].split(os.pathsep)
|
|
49
|
-
for path_dir in path_dirs:
|
|
50
|
-
path_to_executable = os.path.join(path_dir, executable_name)
|
|
51
|
-
if os.path.isfile(path_to_executable) and os.access(path_to_executable, os.X_OK): return path_to_executable
|
|
52
|
-
return None
|
|
47
|
+
from machineconfig.utils.installer_utils.installer_locator_utils import is_executable_in_path
|
|
53
48
|
avail_cowsay = is_executable_in_path("cowsay")
|
|
54
49
|
avail_lolcat = is_executable_in_path("lolcat")
|
|
55
50
|
avail_boxes = is_executable_in_path("boxes")
|
|
56
51
|
avail_figlet = is_executable_in_path("figlet")
|
|
57
52
|
if avail_cowsay and avail_lolcat and avail_boxes and avail_figlet:
|
|
58
|
-
_dynamic_art = random.choice([True, True, True, True, False])
|
|
59
|
-
if _dynamic_art: character_or_box_color(logo=logo)
|
|
60
|
-
else:
|
|
53
|
+
# _dynamic_art = random.choice([True, True, True, True, False])
|
|
54
|
+
# if _dynamic_art: character_or_box_color(logo=logo)
|
|
55
|
+
# else:
|
|
56
|
+
# print(Path(random.choice(glob.glob(str(Path(__file__).parent.joinpath("art", "*"))))).read_text())
|
|
57
|
+
character_or_box_color(logo=logo)
|
|
61
58
|
else:
|
|
62
59
|
print("\n" + "🚫 " + "-" * 70 + " 🚫")
|
|
63
60
|
install_cmd = "devops install --group TerminalEyeCandy" if platform.system() == "Linux" else "brew install cowsay lolcat boxes figlet"
|
|
File without changes
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from zipfile import ZipFile, BadZipFile
|
|
5
|
+
from typing import Union
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def decompress_and_remove_zip(zip_path: Union[str, Path]) -> None:
|
|
9
|
+
"""
|
|
10
|
+
Decompress a ZIP file and remove it after extraction.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
zip_path (Union[str, Path]): Path to the ZIP file.
|
|
14
|
+
|
|
15
|
+
Raises:
|
|
16
|
+
FileNotFoundError: If the zip file does not exist.
|
|
17
|
+
BadZipFile: If the file is not a valid ZIP archive.
|
|
18
|
+
PermissionError: If the file cannot be deleted due to permission issues.
|
|
19
|
+
Exception: For other unexpected errors.
|
|
20
|
+
"""
|
|
21
|
+
zip_path = Path(zip_path)
|
|
22
|
+
|
|
23
|
+
if not zip_path.exists():
|
|
24
|
+
raise FileNotFoundError(f"The file '{zip_path}' does not exist.")
|
|
25
|
+
|
|
26
|
+
if not zip_path.is_file():
|
|
27
|
+
raise FileNotFoundError(f"The path '{zip_path}' is not a file.")
|
|
28
|
+
|
|
29
|
+
extract_dir = zip_path.parent
|
|
30
|
+
|
|
31
|
+
try:
|
|
32
|
+
with ZipFile(zip_path, 'r') as zip_ref:
|
|
33
|
+
zip_ref.extractall(extract_dir)
|
|
34
|
+
except BadZipFile as e:
|
|
35
|
+
raise BadZipFile(f"The file '{zip_path}' is not a valid zip archive.") from e
|
|
36
|
+
except Exception as e:
|
|
37
|
+
raise Exception(f"Failed to extract '{zip_path}': {e}") from e
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
zip_path.unlink()
|
|
41
|
+
except PermissionError as e:
|
|
42
|
+
raise PermissionError(f"Permission denied when deleting '{zip_path}'.") from e
|
|
43
|
+
except Exception as e:
|
|
44
|
+
raise Exception(f"Failed to delete '{zip_path}': {e}") from e
|
|
45
|
+
|
|
@@ -12,18 +12,16 @@ class Read:
|
|
|
12
12
|
suffix = Path(path).suffix[1:]
|
|
13
13
|
if suffix == "": raise ValueError(f"File type could not be inferred from suffix. Suffix is empty. Path: {path}")
|
|
14
14
|
if suffix in ("sqlite", "sqlite3", "db", "duckdb"):
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
# return res
|
|
20
|
-
raise NotImplementedError("Reading database files is not implemented yet. Use `crocodile.database.DBMS` to connect to the database file.")
|
|
15
|
+
from machineconfig.utils.files.dbms import DBMS
|
|
16
|
+
res = DBMS.from_local_db(path=path)
|
|
17
|
+
print(res.describe_db())
|
|
18
|
+
return res
|
|
21
19
|
try: return getattr(Read, suffix)(str(path), **kwargs)
|
|
22
20
|
except AttributeError as err:
|
|
23
21
|
if "type object 'Read' has no attribute" not in str(err): raise AttributeError(err) from err
|
|
24
22
|
if suffix in ('eps', 'jpg', 'jpeg', 'pdf', 'pgf', 'png', 'ps', 'raw', 'rgba', 'svg', 'svgz', 'tif', 'tiff'):
|
|
25
23
|
import matplotlib.pyplot as pyplot
|
|
26
|
-
return pyplot.imread(path, **kwargs) # from: plt.gcf().canvas.get_supported_filetypes().keys():
|
|
24
|
+
return pyplot.imread(str(path), **kwargs) # from: plt.gcf().canvas.get_supported_filetypes().keys():
|
|
27
25
|
if suffix == "parquet":
|
|
28
26
|
import polars as pl
|
|
29
27
|
return pl.read_parquet(path, **kwargs)
|
|
@@ -39,17 +37,11 @@ class Read:
|
|
|
39
37
|
raise ImportError(err) from err2
|
|
40
38
|
@staticmethod
|
|
41
39
|
def json(path: 'Path', r: bool = False, **kwargs: Any) -> Any: # return could be list or dict etc
|
|
42
|
-
import
|
|
43
|
-
|
|
44
|
-
mydict = json.loads(Path(path).read_text(encoding='utf-8'), **kwargs)
|
|
45
|
-
except Exception:
|
|
46
|
-
import pyjson5
|
|
47
|
-
mydict = pyjson5.loads(Path(path).read_text(encoding='utf-8'), **kwargs) # file has C-style comments.
|
|
48
|
-
_ = r
|
|
49
|
-
return mydict
|
|
40
|
+
from machineconfig.utils.io import read_json
|
|
41
|
+
return read_json(path, r=r, **kwargs)
|
|
50
42
|
@staticmethod
|
|
51
43
|
def yaml(path: 'Path', r: bool = False) -> Any: # return could be list or dict etc
|
|
52
|
-
import yaml
|
|
44
|
+
import yaml
|
|
53
45
|
with open(str(path), "r", encoding="utf-8") as file:
|
|
54
46
|
mydict = yaml.load(file, Loader=yaml.FullLoader)
|
|
55
47
|
_ = r
|
|
@@ -63,8 +55,8 @@ class Read:
|
|
|
63
55
|
return res
|
|
64
56
|
@staticmethod
|
|
65
57
|
def toml(path: 'Path'):
|
|
66
|
-
import
|
|
67
|
-
return
|
|
58
|
+
import tomllib
|
|
59
|
+
return tomllib.loads(Path(path).read_text(encoding='utf-8'))
|
|
68
60
|
@staticmethod
|
|
69
61
|
def npy(path: 'Path', **kwargs: Any):
|
|
70
62
|
import numpy as np
|
|
@@ -5,13 +5,40 @@ Extracts GitHub repository URLs and fetches latest release data with rate limiti
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import json
|
|
8
|
-
import
|
|
9
|
-
import subprocess
|
|
8
|
+
import requests
|
|
10
9
|
from pathlib import Path
|
|
11
|
-
from typing import Any, Dict, Optional, Set
|
|
10
|
+
from typing import Any, Dict, Optional, Set, TypedDict
|
|
12
11
|
from urllib.parse import urlparse
|
|
13
12
|
|
|
14
13
|
|
|
14
|
+
class AssetInfo(TypedDict):
|
|
15
|
+
"""Type definition for GitHub release asset information."""
|
|
16
|
+
name: str
|
|
17
|
+
size: int
|
|
18
|
+
download_count: int
|
|
19
|
+
content_type: str
|
|
20
|
+
created_at: str
|
|
21
|
+
updated_at: str
|
|
22
|
+
browser_download_url: str
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ReleaseInfo(TypedDict):
|
|
26
|
+
"""Type definition for GitHub release information."""
|
|
27
|
+
tag_name: str
|
|
28
|
+
name: str
|
|
29
|
+
published_at: str
|
|
30
|
+
assets: list[AssetInfo]
|
|
31
|
+
assets_count: int
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class OutputData(TypedDict):
|
|
35
|
+
"""Type definition for the output JSON data structure."""
|
|
36
|
+
generated_at: str
|
|
37
|
+
total_repositories: int
|
|
38
|
+
successful_fetches: int
|
|
39
|
+
releases: Dict[str, Optional[ReleaseInfo]]
|
|
40
|
+
|
|
41
|
+
|
|
15
42
|
def is_github_repo(url: str) -> bool:
|
|
16
43
|
"""Check if URL is a GitHub repository URL."""
|
|
17
44
|
try:
|
|
@@ -19,170 +46,180 @@ def is_github_repo(url: str) -> bool:
|
|
|
19
46
|
return parsed.netloc == "github.com" and len(parsed.path.split("/")) >= 3
|
|
20
47
|
except Exception:
|
|
21
48
|
return False
|
|
22
|
-
|
|
23
|
-
|
|
24
49
|
def extract_github_repos_from_json(json_file_path: Path) -> Set[str]:
|
|
25
50
|
"""Extract GitHub repository URLs from installer JSON file."""
|
|
26
51
|
github_repos: Set[str] = set()
|
|
27
|
-
|
|
28
52
|
try:
|
|
29
53
|
with open(json_file_path, 'r', encoding='utf-8') as file:
|
|
30
54
|
data = json.load(file)
|
|
31
|
-
|
|
32
55
|
for installer in data.get("installers", []):
|
|
33
56
|
repo_url = installer.get("repoURL", "")
|
|
34
57
|
if is_github_repo(repo_url):
|
|
35
58
|
github_repos.add(repo_url)
|
|
36
|
-
|
|
37
59
|
except (json.JSONDecodeError, FileNotFoundError) as e:
|
|
38
60
|
print(f"Error reading {json_file_path}: {e}")
|
|
39
|
-
|
|
40
61
|
return github_repos
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def get_repo_name_from_url(repo_url: str) -> str:
|
|
44
|
-
"""Extract owner/repo from GitHub URL."""
|
|
62
|
+
def get_repo_name_from_url(repo_url: str) -> Optional[tuple[str, str]]:
|
|
63
|
+
"""Extract owner/repo from GitHub URL as a tuple (username, repo_name)."""
|
|
45
64
|
try:
|
|
46
65
|
parsed = urlparse(repo_url)
|
|
47
66
|
path_parts = parsed.path.strip("/").split("/")
|
|
48
|
-
return
|
|
67
|
+
return (path_parts[0], path_parts[1])
|
|
49
68
|
except (IndexError, AttributeError):
|
|
50
|
-
return
|
|
69
|
+
return None
|
|
70
|
+
|
|
51
71
|
|
|
72
|
+
def fetch_github_release_data(
|
|
73
|
+
username: str,
|
|
74
|
+
repo_name: str,
|
|
75
|
+
version: Optional[str] = None,
|
|
76
|
+
) -> Optional[Dict[str, Any]]:
|
|
77
|
+
"""Fetch GitHub release data for the latest or a specific tag."""
|
|
52
78
|
|
|
53
|
-
def fetch_github_release_data(repo_name: str) -> Optional[Dict[str, Any]]:
|
|
54
|
-
"""Fetch latest release data from GitHub API using curl."""
|
|
55
79
|
try:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
f"https://api.github.com/repos/{repo_name}/releases/
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
timeout=30
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
if result.returncode != 0:
|
|
69
|
-
print(f"❌ Failed to fetch data for {repo_name}: {result.stderr}")
|
|
80
|
+
requested_version = (version or "").strip()
|
|
81
|
+
if requested_version and requested_version.lower() != "latest":
|
|
82
|
+
url = f"https://api.github.com/repos/{username}/{repo_name}/releases/tags/{requested_version}"
|
|
83
|
+
else:
|
|
84
|
+
url = f"https://api.github.com/repos/{username}/{repo_name}/releases/latest"
|
|
85
|
+
|
|
86
|
+
response = requests.get(url, timeout=30)
|
|
87
|
+
if response.status_code != 200:
|
|
88
|
+
print(f"❌ Failed to fetch data for {username}/{repo_name}: HTTP {response.status_code}")
|
|
70
89
|
return None
|
|
71
|
-
|
|
72
|
-
response_data = json
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
print(f"🚫 Rate limit exceeded for {repo_name}")
|
|
90
|
+
|
|
91
|
+
response_data = response.json()
|
|
92
|
+
message = response_data.get("message")
|
|
93
|
+
if isinstance(message, str):
|
|
94
|
+
if "API rate limit exceeded" in message:
|
|
95
|
+
print(f"🚫 Rate limit exceeded for {username}/{repo_name}")
|
|
78
96
|
return None
|
|
79
|
-
|
|
80
|
-
print(f"🔍 No releases found for {repo_name}")
|
|
97
|
+
if "Not Found" in message:
|
|
98
|
+
print(f"🔍 No releases found for {username}/{repo_name}")
|
|
81
99
|
return None
|
|
82
|
-
|
|
100
|
+
|
|
83
101
|
return response_data
|
|
84
|
-
|
|
85
|
-
except (
|
|
86
|
-
print(f"❌ Error fetching {repo_name}: {
|
|
102
|
+
|
|
103
|
+
except (requests.RequestException, requests.Timeout, json.JSONDecodeError) as error:
|
|
104
|
+
print(f"❌ Error fetching {username}/{repo_name}: {error}")
|
|
87
105
|
return None
|
|
88
106
|
|
|
89
107
|
|
|
90
|
-
def
|
|
108
|
+
def get_release_info(
|
|
109
|
+
username: str,
|
|
110
|
+
repo_name: str,
|
|
111
|
+
version: Optional[str] = None,
|
|
112
|
+
) -> Optional[ReleaseInfo]:
|
|
113
|
+
"""Return sanitized release information for the requested repository."""
|
|
114
|
+
release_data = fetch_github_release_data(username, repo_name, version)
|
|
115
|
+
if not release_data:
|
|
116
|
+
return None
|
|
117
|
+
return extract_release_info(release_data)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def extract_release_info(release_data: Dict[str, Any]) -> Optional[ReleaseInfo]:
|
|
91
121
|
"""Extract relevant information from GitHub release data."""
|
|
92
122
|
if not release_data:
|
|
93
|
-
return
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
123
|
+
return None
|
|
124
|
+
assets: list[AssetInfo] = []
|
|
125
|
+
for asset in release_data.get("assets", []):
|
|
126
|
+
asset_info: AssetInfo = {
|
|
127
|
+
"name": asset.get("name", ""),
|
|
128
|
+
"size": asset.get("size", 0),
|
|
129
|
+
"download_count": asset.get("download_count", 0),
|
|
130
|
+
"content_type": asset.get("content_type", ""),
|
|
131
|
+
"created_at": asset.get("created_at", ""),
|
|
132
|
+
"updated_at": asset.get("updated_at", ""),
|
|
133
|
+
"browser_download_url": asset.get("browser_download_url", "")
|
|
134
|
+
}
|
|
135
|
+
assets.append(asset_info)
|
|
97
136
|
return {
|
|
98
137
|
"tag_name": release_data.get("tag_name", ""),
|
|
99
138
|
"name": release_data.get("name", ""),
|
|
100
139
|
"published_at": release_data.get("published_at", ""),
|
|
101
|
-
"assets":
|
|
102
|
-
"assets_count": len(
|
|
140
|
+
"assets": assets,
|
|
141
|
+
"assets_count": len(assets)
|
|
103
142
|
}
|
|
104
143
|
|
|
105
144
|
|
|
106
|
-
def main() -> None:
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
145
|
+
# def main() -> None:
|
|
146
|
+
# """Main function to process installer JSON files and fetch GitHub release data."""
|
|
147
|
+
# # Define paths
|
|
148
|
+
# current_dir = Path(__file__).parent
|
|
149
|
+
# installer_dir = current_dir.parent.parent / "jobs" / "installer"
|
|
111
150
|
|
|
112
|
-
|
|
113
|
-
|
|
151
|
+
# standard_json = installer_dir / "installer_data.json"
|
|
152
|
+
# output_json = current_dir / "github_releases.json"
|
|
114
153
|
|
|
115
|
-
|
|
116
|
-
|
|
154
|
+
# print("🔍 Starting GitHub release data extraction...")
|
|
155
|
+
# print(f"📁 Processing files from: {installer_dir}")
|
|
117
156
|
|
|
118
|
-
|
|
119
|
-
|
|
157
|
+
# # Extract GitHub repositories from both files
|
|
158
|
+
# all_github_repos: Set[str] = set()
|
|
120
159
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
160
|
+
# if standard_json.exists():
|
|
161
|
+
# print(f"📄 Reading {standard_json.name}...")
|
|
162
|
+
# repos = extract_github_repos_from_json(standard_json)
|
|
163
|
+
# all_github_repos.update(repos)
|
|
164
|
+
# print(f" Found {len(repos)} GitHub repos")
|
|
165
|
+
# else:
|
|
166
|
+
# print(f"⚠️ File not found: {standard_json}")
|
|
167
|
+
# print(f"🎯 Total unique GitHub repositories found: {len(all_github_repos)}")
|
|
129
168
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
169
|
+
# if not all_github_repos:
|
|
170
|
+
# print("❌ No GitHub repositories found. Exiting.")
|
|
171
|
+
# return
|
|
133
172
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
173
|
+
# # Fetch release data with rate limiting
|
|
174
|
+
# release_mapping: Dict[str, Optional[ReleaseInfo]] = {}
|
|
175
|
+
# total_repos = len(all_github_repos)
|
|
137
176
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
177
|
+
# print(f"\n🚀 Fetching release data for {total_repos} repositories...")
|
|
178
|
+
# print("⏰ Rate limiting: 5 seconds between requests")
|
|
179
|
+
# print("-" * 60)
|
|
141
180
|
|
|
142
|
-
|
|
143
|
-
|
|
181
|
+
# for i, repo_url in enumerate(sorted(all_github_repos), 1):
|
|
182
|
+
# repo_info = get_repo_name_from_url(repo_url)
|
|
144
183
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
print(f"📡 [{i:3d}/{total_repos}] Fetching: {repo_name}", end=" ... ")
|
|
184
|
+
# if not repo_info:
|
|
185
|
+
# print(f"⚠️ [{i:3d}/{total_repos}] Invalid repo URL: {repo_url}")
|
|
186
|
+
# continue
|
|
150
187
|
|
|
151
|
-
|
|
188
|
+
# username, repo_name = repo_info
|
|
189
|
+
# repo_full_name = f"{username}/{repo_name}"
|
|
190
|
+
|
|
191
|
+
# print(f"📡 [{i:3d}/{total_repos}] Fetching: {repo_full_name}", end=" ... ")
|
|
152
192
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
193
|
+
# release_info = get_release_info(username, repo_name)
|
|
194
|
+
|
|
195
|
+
# if release_info:
|
|
196
|
+
# release_mapping[repo_url] = release_info
|
|
197
|
+
# assets_count = release_info["assets_count"]
|
|
198
|
+
# tag = release_info["tag_name"]
|
|
199
|
+
# print(f"✅ {tag} ({assets_count} assets)")
|
|
200
|
+
# else:
|
|
201
|
+
# release_mapping[repo_url] = None
|
|
202
|
+
# print("❌ No data")
|
|
162
203
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
204
|
+
# # Rate limiting - wait 5 seconds between requests (except for the last one)
|
|
205
|
+
# if i < total_repos:
|
|
206
|
+
# time.sleep(5)
|
|
166
207
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
208
|
+
# # Save results
|
|
209
|
+
# output_data: OutputData = {
|
|
210
|
+
# "generated_at": time.strftime("%Y-%m-%d %H:%M:%S UTC", time.gmtime()),
|
|
211
|
+
# "total_repositories": len(all_github_repos),
|
|
212
|
+
# "successful_fetches": len([v for v in release_mapping.values() if v]),
|
|
213
|
+
# "releases": release_mapping
|
|
214
|
+
# }
|
|
174
215
|
|
|
175
|
-
|
|
176
|
-
|
|
216
|
+
# with open(output_json, 'w', encoding='utf-8') as f:
|
|
217
|
+
# json.dump(output_data, f, indent=2, ensure_ascii=False)
|
|
177
218
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if __name__ == "__main__":
|
|
188
|
-
main()
|
|
219
|
+
# successful = len([v for v in release_mapping.values() if v])
|
|
220
|
+
# print("\n📊 Summary:")
|
|
221
|
+
# print(f" Total repositories processed: {len(all_github_repos)}")
|
|
222
|
+
# print(f" Successful fetches: {successful}")
|
|
223
|
+
# print(f" Failed fetches: {len(all_github_repos) - successful}")
|
|
224
|
+
# print(f" Output saved to: {output_json}")
|
|
225
|
+
# print("✅ Done!")
|