machineconfig 5.15__py3-none-any.whl → 7.66__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of machineconfig might be problematic. Click here for more details.
- machineconfig/__init__.py +0 -28
- 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 +50 -193
- machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
- 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 +22 -169
- machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
- 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_dev/alacritty.py +4 -4
- machineconfig/jobs/installer/custom_dev/brave.py +1 -7
- 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/nerfont_windows_helper.py +9 -18
- machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
- machineconfig/jobs/installer/installer_data.json +1101 -115
- 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 +1 -0
- 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 +108 -180
- machineconfig/logger.py +0 -1
- machineconfig/profile/backup.toml +49 -0
- machineconfig/profile/bash_shell_profiles.md +11 -0
- machineconfig/profile/create_helper.py +74 -0
- machineconfig/profile/create_links.py +288 -0
- machineconfig/profile/create_links_export.py +100 -0
- machineconfig/profile/create_shell_profile.py +136 -0
- machineconfig/profile/mapper.toml +258 -0
- machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
- machineconfig/scripts/linux/wrap_mcfg +47 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +92 -103
- machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
- machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
- machineconfig/scripts/python/ai/generate_files.py +307 -42
- machineconfig/scripts/python/ai/initai.py +3 -28
- 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/instructions/python/dev.instructions.md +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/generic.py +27 -4
- machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
- machineconfig/scripts/python/cloud.py +29 -0
- machineconfig/scripts/python/croshell.py +111 -114
- machineconfig/scripts/python/define.py +31 -0
- machineconfig/scripts/python/devops.py +44 -103
- machineconfig/scripts/python/devops_navigator.py +10 -0
- machineconfig/scripts/python/env_manager/__init__.py +1 -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/explore.py +49 -0
- machineconfig/scripts/python/fire_jobs.py +115 -152
- machineconfig/scripts/python/ftpx.py +29 -24
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/{fire_agents_help_launch.py → helpers_agents/fire_agents_help_launch.py} +34 -44
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
- machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -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} +10 -18
- 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} +2 -2
- machineconfig/scripts/python/helpers_devops/cli_config.py +95 -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 +134 -0
- machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
- machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
- machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_terminal.py} +35 -23
- 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 +511 -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} +2 -2
- machineconfig/scripts/python/helpers_fire_command/__init__.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/{fire_jobs_route_helper.py → helpers_fire_command/fire_jobs_route_helper.py} +47 -2
- 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}/fzfag +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
- 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 +588 -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_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/{count_lines.py → helpers_repos/count_lines.py} +10 -10
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -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/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 +58 -0
- machineconfig/scripts/python/helpers_utils/download.py +152 -0
- machineconfig/scripts/python/helpers_utils/path.py +108 -0
- machineconfig/scripts/python/interactive.py +64 -84
- machineconfig/scripts/python/machineconfig.py +63 -0
- machineconfig/scripts/python/msearch.py +21 -0
- machineconfig/scripts/python/nw/__init__.py +0 -0
- machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +0 -2
- machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +73 -43
- machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
- machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +3 -3
- machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +3 -3
- machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
- machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
- machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
- machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
- machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +5 -4
- machineconfig/scripts/python/sessions.py +64 -44
- machineconfig/scripts/python/terminal.py +127 -0
- machineconfig/scripts/python/utils.py +66 -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 +60 -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/fzf_edit.ps1 +2 -2
- 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 +55 -31
- machineconfig/settings/shells/nushell/config.nu +1 -34
- machineconfig/settings/shells/nushell/init.nu +127 -0
- machineconfig/settings/shells/pwsh/init.ps1 +60 -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/yazi/init.lua +57 -0
- machineconfig/settings/yazi/keymap_linux.toml +79 -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/yazi.toml +13 -0
- machineconfig/setup_linux/__init__.py +10 -0
- machineconfig/setup_linux/apps_desktop.sh +89 -0
- machineconfig/setup_linux/apps_gui.sh +64 -0
- machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
- 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_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 +8 -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 +10 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
- machineconfig/utils/accessories.py +7 -5
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +133 -106
- 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/installer_class.py +68 -126
- machineconfig/utils/installer_utils/{installer.py → installer_cli.py} +109 -117
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +31 -81
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +44 -74
- machineconfig/utils/io.py +77 -23
- machineconfig/utils/links.py +254 -162
- machineconfig/utils/meta.py +255 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +13 -3
- machineconfig/utils/path_extended.py +46 -100
- machineconfig/utils/path_helper.py +75 -22
- machineconfig/utils/procs.py +50 -70
- machineconfig/utils/scheduler.py +94 -97
- 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 +742 -264
- machineconfig/utils/ssh_utils/utils.py +0 -0
- machineconfig/utils/terminal.py +2 -113
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +109 -28
- machineconfig/utils/ve.py +11 -4
- machineconfig-7.66.dist-info/METADATA +124 -0
- machineconfig-7.66.dist-info/RECORD +451 -0
- machineconfig-7.66.dist-info/entry_points.txt +15 -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/fzffg +0 -25
- 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/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/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/dotfile.py +0 -78
- machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
- 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/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/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-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/helpers_agents}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers → 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.bat → 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/{jobs/windows/msc/cli_agents.ps1 → scripts/python/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/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
- /machineconfig/scripts/{windows/share_nfs.ps1 → 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_msearch/scripts_linux}/skrg +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
- /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
- /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
- /machineconfig/scripts/{linux → python/nw}/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.66.dist-info}/WHEEL +0 -0
- {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
machineconfig/utils/code.py
CHANGED
|
@@ -1,105 +1,81 @@
|
|
|
1
|
-
import platform
|
|
2
|
-
from typing import Optional
|
|
3
|
-
import subprocess
|
|
4
|
-
from rich.console import Console
|
|
5
|
-
from rich.panel import Panel
|
|
6
|
-
from rich.syntax import Syntax
|
|
7
1
|
|
|
2
|
+
from typing import Any, Optional, Callable
|
|
8
3
|
from machineconfig.utils.accessories import randstr
|
|
9
|
-
from machineconfig.utils.
|
|
10
|
-
from
|
|
4
|
+
from machineconfig.utils.meta import lambda_to_python_script
|
|
5
|
+
from pathlib import Path
|
|
11
6
|
|
|
12
7
|
|
|
13
|
-
def
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
""
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
8
|
+
def print_code(code: str, lexer: str, desc: str, subtitle: str = ""):
|
|
9
|
+
import platform
|
|
10
|
+
try:
|
|
11
|
+
from rich.console import Console
|
|
12
|
+
from rich.panel import Panel
|
|
13
|
+
from rich.syntax import Syntax
|
|
14
|
+
if lexer == "shell":
|
|
15
|
+
if platform.system() == "Windows":
|
|
16
|
+
lexer = "powershell"
|
|
17
|
+
elif platform.system() in ["Linux", "Darwin"]:
|
|
18
|
+
lexer = "sh"
|
|
19
|
+
else:
|
|
20
|
+
raise NotImplementedError(f"Platform {platform.system()} not supported for lexer {lexer}")
|
|
21
|
+
console = Console()
|
|
22
|
+
console.print(Panel(Syntax(code=code, lexer=lexer), title=f"📄 {desc}", subtitle=subtitle), style="bold red")
|
|
23
|
+
except ImportError:
|
|
24
|
+
print(f"--- {desc} ---")
|
|
25
|
+
print(code)
|
|
26
|
+
print(f"--- End of {desc} ---")
|
|
32
27
|
|
|
33
28
|
|
|
34
|
-
def
|
|
35
|
-
|
|
36
|
-
python_script = f"""
|
|
37
|
-
code = r'''{python_script}'''
|
|
38
|
-
try:
|
|
39
|
-
from machineconfig.utils.utils import print_code
|
|
40
|
-
print_code(code=code, lexer="python", desc="Python Script")
|
|
41
|
-
except ImportError:
|
|
42
|
-
from rich.console import Console
|
|
43
|
-
from rich.panel import Panel
|
|
44
|
-
console = Console()
|
|
45
|
-
console.print(Panel(f'''📜 PYTHON SCRIPT:\n\n{{code}}''', title="Python Script", expand=False))
|
|
46
|
-
""" + python_script
|
|
47
|
-
python_file = PathExtended.tmp().joinpath("tmp_scripts", "python", randstr() + ".py")
|
|
29
|
+
def get_uv_command_executing_python_script(python_script: str, uv_with: Optional[list[str]], uv_project_dir: Optional[str]) -> tuple[str, Path]:
|
|
30
|
+
python_file = Path.home().joinpath("tmp_results", "tmp_scripts", "python", randstr() + ".py")
|
|
48
31
|
python_file.parent.mkdir(parents=True, exist_ok=True)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return shell_file
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def write_shell_script_to_file(shell_script: str):
|
|
56
|
-
if platform.system() in ["Linux", "Darwin"]:
|
|
57
|
-
suffix = ".sh"
|
|
58
|
-
elif platform.system() == "Windows":
|
|
59
|
-
suffix = ".ps1"
|
|
32
|
+
if uv_with is not None and len(uv_with) > 0:
|
|
33
|
+
uv_with.append("rich")
|
|
34
|
+
uv_with_arg = "--with " + '"' + ",".join(uv_with) + '"'
|
|
60
35
|
else:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
program = "$orig_path = $pwd\n" + program + "\ncd $orig_path"
|
|
72
|
-
else:
|
|
73
|
-
program = 'orig_path=$(cd -- "." && pwd)\n' + program + '\ncd "$orig_path" || exit'
|
|
74
|
-
if display:
|
|
75
|
-
print_code(code=program, lexer="shell", desc=desc, subtitle="PROGRAM")
|
|
76
|
-
if execute:
|
|
77
|
-
result = subprocess.run(program, shell=True, capture_output=True, text=True)
|
|
78
|
-
success = result.returncode == 0 and result.stderr == ""
|
|
79
|
-
if not success:
|
|
80
|
-
print("❌ 🛠️ EXECUTION | Shell script running failed")
|
|
81
|
-
if result.stdout:
|
|
82
|
-
print(f"STDOUT: {result.stdout}")
|
|
83
|
-
if result.stderr:
|
|
84
|
-
print(f"STDERR: {result.stderr}")
|
|
85
|
-
print(f"Return code: {result.returncode}")
|
|
86
|
-
return None
|
|
36
|
+
uv_with_arg = "--with rich"
|
|
37
|
+
if uv_project_dir is not None:
|
|
38
|
+
uv_project_dir_arg = "--project" + f' "{uv_project_dir}"'
|
|
39
|
+
else:
|
|
40
|
+
uv_project_dir_arg = ""
|
|
41
|
+
print_code_string = lambda_to_python_script(lambda: print_code(code=python_script, lexer="python", desc="Temporary Python Script", subtitle="Executing via shell script"),
|
|
42
|
+
in_global=True, import_module=False)
|
|
43
|
+
python_file.write_text(print_code_string + "\n" + python_script, encoding="utf-8")
|
|
44
|
+
shell_script = f"""uv run {uv_with_arg} {uv_project_dir_arg} {str(python_file)} """
|
|
45
|
+
return shell_script, python_file
|
|
87
46
|
|
|
88
47
|
|
|
89
|
-
def
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
48
|
+
def run_lambda_function(lmb: Callable[[], Any], uv_with: Optional[list[str]], uv_project_dir: Optional[str]) -> None:
|
|
49
|
+
code = lambda_to_python_script(lmb,
|
|
50
|
+
in_global=True, import_module=False)
|
|
51
|
+
uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=uv_with, uv_project_dir=uv_project_dir)
|
|
52
|
+
run_shell_script(uv_command)
|
|
53
|
+
def run_python_script_in_marimo(py_script: str, uv_project_with: Optional[str]):
|
|
54
|
+
tmp_dir = Path.home().joinpath("tmp_results", "tmp_scripts", "marimo", randstr())
|
|
55
|
+
tmp_dir.mkdir(parents=True, exist_ok=True)
|
|
56
|
+
pyfile = tmp_dir / "marimo_db_explore.py"
|
|
57
|
+
pyfile.write_text(py_script, encoding="utf-8")
|
|
58
|
+
if uv_project_with is not None:
|
|
59
|
+
requirements = f"""--with "marimo" --project {uv_project_with} """
|
|
60
|
+
else:
|
|
61
|
+
requirements = """--with "marimo" """
|
|
62
|
+
fire_line = f"""
|
|
63
|
+
cd {tmp_dir}
|
|
64
|
+
uv run {requirements} marimo convert {pyfile.name} -o marimo_nb.py
|
|
65
|
+
bat marimo_nb.py
|
|
66
|
+
uv run {requirements} marimo edit --host 0.0.0.0 marimo_nb.py
|
|
67
|
+
"""
|
|
68
|
+
print_code(code=py_script, desc="Generated Marimo DB Explore Script", lexer="python")
|
|
69
|
+
exit_then_run_shell_script(fire_line)
|
|
99
70
|
|
|
100
71
|
|
|
101
|
-
def run_shell_script(
|
|
72
|
+
def run_shell_script(script: str, display_script: bool = True, clean_env: bool = False):
|
|
102
73
|
import tempfile
|
|
74
|
+
import platform
|
|
75
|
+
from rich.console import Console
|
|
76
|
+
from rich.panel import Panel
|
|
77
|
+
from rich.syntax import Syntax
|
|
78
|
+
|
|
103
79
|
if platform.system() == "Windows":
|
|
104
80
|
suffix = ".ps1"
|
|
105
81
|
lexer = "powershell"
|
|
@@ -107,25 +83,76 @@ def run_shell_script(program: str):
|
|
|
107
83
|
suffix = ".sh"
|
|
108
84
|
lexer = "bash"
|
|
109
85
|
with tempfile.NamedTemporaryFile(mode='w', suffix=suffix, delete=False, encoding='utf-8') as temp_file:
|
|
110
|
-
temp_file.write(
|
|
111
|
-
|
|
86
|
+
temp_file.write(script)
|
|
87
|
+
temp_shell_script_path = Path(temp_file.name)
|
|
112
88
|
console = Console()
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
89
|
+
if display_script:
|
|
90
|
+
from rich.syntax import Syntax
|
|
91
|
+
console.print(Panel(Syntax(code=script, lexer=lexer), title=f"📄 shell script @ {temp_shell_script_path}", subtitle="shell script being executed"), style="bold red")
|
|
92
|
+
env = {} if clean_env else None
|
|
116
93
|
if platform.system() == "Windows":
|
|
117
94
|
import subprocess
|
|
118
|
-
subprocess.run(f'powershell -ExecutionPolicy Bypass -File "{
|
|
95
|
+
proc = subprocess.run(f'powershell -ExecutionPolicy Bypass -File "{temp_shell_script_path}"', check=True, shell=True, env=env)
|
|
119
96
|
elif platform.system() == "Linux" or platform.system() == "Darwin":
|
|
120
97
|
import subprocess
|
|
121
|
-
subprocess.run(f"bash {str(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
#
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
98
|
+
proc = subprocess.run(f"bash {str(temp_shell_script_path)}", check=True, shell=True, env=env)
|
|
99
|
+
else:
|
|
100
|
+
raise NotImplementedError(f"Platform {platform.system()} not supported.")
|
|
101
|
+
# console.print(f"✅ [green]Script executed successfully:[/green] [blue]{temp_script_path}[/blue]")
|
|
102
|
+
if proc.returncode != 0:
|
|
103
|
+
console.print(f"❌ [red]Script execution failed with return code {proc.returncode}:[/red] [blue]{temp_shell_script_path}[/blue]")
|
|
104
|
+
elif proc.returncode == 0:
|
|
105
|
+
console.print(f"✅ [green]Script executed successfully:[/green] [blue]{temp_shell_script_path}[/blue]")
|
|
106
|
+
else:
|
|
107
|
+
console.print(f"⚠️ [yellow]Script executed with warnings (return code {proc.returncode}):[/yellow] [blue]{temp_shell_script_path}[/blue]")
|
|
108
|
+
temp_shell_script_path.unlink(missing_ok=True)
|
|
109
|
+
console.print(f"🗑️ [blue]Temporary script deleted:[/blue] [green]{temp_shell_script_path}[/green]")
|
|
110
|
+
return proc
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def exit_then_run_shell_script(script: str, strict: bool = False):
|
|
114
|
+
import os
|
|
115
|
+
from rich.console import Console
|
|
116
|
+
|
|
117
|
+
console = Console()
|
|
118
|
+
op_program_path = os.environ.get("OP_PROGRAM_PATH", None)
|
|
119
|
+
if op_program_path is not None:
|
|
120
|
+
exists = Path(op_program_path).exists()
|
|
121
|
+
else:
|
|
122
|
+
exists = False
|
|
123
|
+
# three cases: (op_program_path is None, exists=False), (op_program_path is set, exists=False), (op_program_path is set, exists=True)
|
|
124
|
+
|
|
125
|
+
if strict: # we want to assert op_program_path is set and is not an already existing file
|
|
126
|
+
if (op_program_path is None or exists):
|
|
127
|
+
import platform
|
|
128
|
+
if platform.system() == "Windows":
|
|
129
|
+
suffix = ".ps1"
|
|
130
|
+
lexer = "powershell"
|
|
131
|
+
else:
|
|
132
|
+
suffix = ".sh"
|
|
133
|
+
lexer = "bash"
|
|
134
|
+
op_program_path = Path.home().joinpath("tmp_results", "tmp_scripts", "manual_run", f"manual_script_{randstr()}{suffix}")
|
|
135
|
+
op_program_path.parent.mkdir(parents=True, exist_ok=True)
|
|
136
|
+
op_program_path.write_text(script, encoding="utf-8")
|
|
137
|
+
print_code(code=script, lexer=lexer, desc="script to run manually")
|
|
138
|
+
console.print("[bold yellow]⚠️ STRICT MODE:[/bold yellow] [cyan]Please run the script manually via your shell by executing:[/cyan]")
|
|
139
|
+
console.print(f"[green]{str(op_program_path)}[/green]")
|
|
140
|
+
console.print("[red]❌ OP_PROGRAM_PATH environment variable is not set in strict mode.[/red]")
|
|
141
|
+
import sys
|
|
142
|
+
sys.exit(1)
|
|
143
|
+
|
|
144
|
+
if op_program_path is not None and not exists:
|
|
145
|
+
op_program_path = Path(op_program_path)
|
|
146
|
+
op_program_path.parent.mkdir(parents=True, exist_ok=True)
|
|
147
|
+
op_program_path.write_text(script, encoding="utf-8")
|
|
148
|
+
console.print("[cyan]🚀 Handing over to shell script runner via OP_PROGRAM_PATH:[/cyan]")
|
|
149
|
+
console.print(f"[bold green]{str(op_program_path)}[/bold green]")
|
|
150
|
+
print_code(code=script, lexer="shell", desc="script to run via OP_PROGRAM_PATH")
|
|
151
|
+
else:
|
|
152
|
+
if op_program_path is not None and exists:
|
|
153
|
+
console.print(f"[yellow]⚠️ OP_PROGRAM_PATH @ {str(op_program_path)} already exists.[/yellow] [cyan]Falling back to direct execution.[/cyan]")
|
|
154
|
+
elif op_program_path is None:
|
|
155
|
+
console.print("[cyan]ℹ️ OP_PROGRAM_PATH is not set.[/cyan] [yellow]Falling back to direct execution.[/yellow]")
|
|
156
|
+
run_shell_script(script)
|
|
157
|
+
import sys
|
|
158
|
+
sys.exit(0)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
_ ___ /^^\ /^\ /^^\_
|
|
2
|
+
_ _@)@) \ ,,/ '` ~ `'~~ ', `\.
|
|
3
|
+
_/o\_ _ _ _/~`.`...'~\ ./~~..,'`','',.,' ' ~:
|
|
4
|
+
/ `,'.~,~.~ . , . , ~|, ,/ .,' , ,. .. ,,. `, ~\_
|
|
5
|
+
( ' _' _ '_` _ ' . , `\_/ .' ..' ' ` ` `.. `, \_
|
|
6
|
+
~V~ V~ V~ V~ ~\ ` ' . ' , ' .,.,''`.,.''`.,.``. ', \_
|
|
7
|
+
_/\ /\ /\ /\_/, . ' , `_/~\_ .' .,. ,, , _/~\_ `. `. '., \_
|
|
8
|
+
< ~ ~ '~`'~'`, ., . `_: ::: \_ ' `_/ ::: \_ `.,' . ', \_
|
|
9
|
+
\ ' `_ '`_ _ ',/ _::_::_ \ _ _/ _::_::_ \ `.,'.,`., \-,-,-,_,_,
|
|
10
|
+
`'~~ `'~~ `'~~ `'~~ \(_)(_)(_)/ `~~' \(_)(_)(_)/ ~'`\_.._,._,'_;_;_;_;_;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
.--. .--.
|
|
2
|
+
/ \/ \
|
|
3
|
+
| .-. .-. \
|
|
4
|
+
|/_ |/_ | \
|
|
5
|
+
|| `\|| `\| `----.
|
|
6
|
+
|\0_/ \0_/ --, \_
|
|
7
|
+
.--"""""-. / (` \ `-.
|
|
8
|
+
/ \-----'-. \ \
|
|
9
|
+
\ () () /`\ \
|
|
10
|
+
| .___.-' | \
|
|
11
|
+
\ /` \| / ;
|
|
12
|
+
`-.___ ___.' .-.`.---.| \
|
|
13
|
+
\| ``-..___,.-'`\| / / / | `\
|
|
14
|
+
` \| ,`/ / / , /
|
|
15
|
+
` |\ / / |\/
|
|
16
|
+
, .'`-; ' \/
|
|
17
|
+
, |\-' .' , .-'`
|
|
18
|
+
.-|\--;`` .-' |\.'
|
|
19
|
+
( `"'-.|\ (___,.--'`'
|
|
20
|
+
`-. `"` _.--'
|
|
21
|
+
`. _.-'`-.
|
|
22
|
+
`''---''`` `."
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
_.---._ .---.
|
|
2
|
+
__...---' .---. `---'-. `.
|
|
3
|
+
~ -~ -.-''__.--' _.'( | )`. `. `._ :
|
|
4
|
+
-.~~ .'__-'_ .--'' ._`---'_.-. `. `-`.
|
|
5
|
+
~ ~_~-~-~_ ~ -._ -._``---. -. `-._ `.
|
|
6
|
+
~- ~ ~ -_ -~ ~ -.._ _ _ _ ..-_ `. `-._``--.._
|
|
7
|
+
~~-~ ~-_ _~ ~-~ ~ -~ _~~_-~ -._ `-. -. `-._``--.._.--''. ~ -~_
|
|
8
|
+
~~ -~_-~ _~- _~~ _~-_~ ~-_~~ ~-.___ -._ `-.__ `. `. ~ -_~
|
|
9
|
+
~~ _~- ~~- -_~ ~- ~ - _~~- _~~ ~---...__ _ ._ .` `. ~-_~
|
|
10
|
+
~ ~- _~~- _-_~ ~-_ ~-~ ~_-~ _~- ~_~-_~ ~--.....--~ -~_ ~
|
|
11
|
+
~ ~ - ~ ~ ~~ - ~~- ~~- ~- ~ -~ ~ ~ -~~- ~- ~-~
|
|
@@ -62,7 +62,7 @@ def get_art(comment: Optional[str] = None, artlib: Optional[BOX_OR_CHAR] = None,
|
|
|
62
62
|
try:
|
|
63
63
|
comment = subprocess.run("fortune", shell=True, capture_output=True, text=True, check=True).stdout
|
|
64
64
|
except Exception:
|
|
65
|
-
comment = "
|
|
65
|
+
comment = "machineconfig"
|
|
66
66
|
if artlib is None: artlib = random.choice(['boxes', 'cowsay'])
|
|
67
67
|
to_file = '' if not file else f'> {file}'
|
|
68
68
|
if artlib == 'boxes':
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from typing import Optional, Any, Callable
|
|
3
|
+
|
|
4
|
+
import polars as pl
|
|
5
|
+
|
|
6
|
+
from sqlalchemy.orm import sessionmaker
|
|
7
|
+
from sqlalchemy import create_engine, text, inspect as inspect__
|
|
8
|
+
from sqlalchemy.engine import Engine
|
|
9
|
+
from sqlalchemy.sql.schema import MetaData
|
|
10
|
+
from pathlib import Path as P
|
|
11
|
+
|
|
12
|
+
OPLike = Optional[P] | str | None
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class DBMS:
|
|
16
|
+
def __init__(self, engine: Engine):
|
|
17
|
+
self.eng: Engine = engine
|
|
18
|
+
|
|
19
|
+
@staticmethod
|
|
20
|
+
def from_local_db(path: OPLike = None, echo: bool = False, share_across_threads: bool = False, pool_size: int = 5, **kwargs: Any):
|
|
21
|
+
return DBMS(engine=DBMS.make_sql_engine(path=path, echo=echo, share_across_threads=share_across_threads, pool_size=pool_size, **kwargs))
|
|
22
|
+
|
|
23
|
+
def __repr__(self): return f"DataBase @ {self.eng}"
|
|
24
|
+
def close(self, sleep: int = 2):
|
|
25
|
+
self.eng.pool.dispose()
|
|
26
|
+
self.eng.dispose()
|
|
27
|
+
time.sleep(sleep)
|
|
28
|
+
@staticmethod
|
|
29
|
+
def _get_table_identifier(engine: Engine, table: str, sch: Optional[str]):
|
|
30
|
+
if sch is not None:
|
|
31
|
+
# Handle DuckDB schema names that contain dots (e.g., "klines.main")
|
|
32
|
+
if engine.url.drivername == 'duckdb' and '.' in sch and sch.endswith('.main'):
|
|
33
|
+
# For DuckDB schemas like "klines.main", just use the table name without schema
|
|
34
|
+
return f'"{table}"'
|
|
35
|
+
else:
|
|
36
|
+
return f'"{sch}"."{table}"'
|
|
37
|
+
else:
|
|
38
|
+
return f'"{table}"'
|
|
39
|
+
|
|
40
|
+
# ==================== QUERIES =====================================
|
|
41
|
+
def execute_as_you_go(self, *commands: str, res_func: Callable[[Any], Any] = lambda x: x.all(), df: bool = False):
|
|
42
|
+
with self.eng.begin() as conn:
|
|
43
|
+
result = None
|
|
44
|
+
for command in commands:
|
|
45
|
+
result = conn.execute(text(command))
|
|
46
|
+
# conn.commit() # if driver is sqlite3, the connection is autocommitting. # this commit is only needed in case of DBAPI driver.
|
|
47
|
+
return res_func(result) if not df else pl.DataFrame(res_func(result))
|
|
48
|
+
|
|
49
|
+
def execute_begin_once(self, command: str, res_func: Callable[[Any], Any] = lambda x: x.all(), df: bool = False):
|
|
50
|
+
with self.eng.begin() as conn:
|
|
51
|
+
result = conn.execute(text(command)) # no need for commit regardless of driver
|
|
52
|
+
result = res_func(result)
|
|
53
|
+
return result if not df else pl.DataFrame(result)
|
|
54
|
+
|
|
55
|
+
def execute(self, command: str):
|
|
56
|
+
with self.eng.begin() as conn:
|
|
57
|
+
result = conn.execute(text(command))
|
|
58
|
+
# conn.commit()
|
|
59
|
+
return result
|
|
60
|
+
|
|
61
|
+
# def execute_script(self, command: str, df: bool = False):
|
|
62
|
+
# with self.eng.begin() as conn: result = conn.executescript(text(command))
|
|
63
|
+
# return result if not df else pl.DataFrame(result)
|
|
64
|
+
|
|
65
|
+
# ========================== TABLES =====================================
|
|
66
|
+
def insert_dicts(self, table: str, *mydicts: dict[str, Any]) -> None:
|
|
67
|
+
cmd = f"""INSERT INTO {table} VALUES """
|
|
68
|
+
for mydict in mydicts: cmd += f"""({tuple(mydict)}), """
|
|
69
|
+
self.execute_begin_once(cmd)
|
|
70
|
+
|
|
71
|
+
def refresh(self, sch: Optional[str] = None) -> dict[str, Any]:
|
|
72
|
+
con = self.eng.connect()
|
|
73
|
+
ses = sessionmaker()(bind=self.eng)
|
|
74
|
+
meta = MetaData()
|
|
75
|
+
meta.reflect(bind=self.eng, schema=sch)
|
|
76
|
+
insp = inspect__(subject=self.eng)
|
|
77
|
+
schema = insp.get_schema_names()
|
|
78
|
+
sch_tab = {k: v for k, v in zip(schema, [insp.get_table_names(schema=x) for x in schema])}
|
|
79
|
+
sch_vws = {k: v for k, v in zip(schema, [insp.get_view_names(schema=x) for x in schema])}
|
|
80
|
+
return {'con': con, 'ses': ses, 'meta': meta, 'insp': insp, 'schema': schema, 'sch_tab': sch_tab, 'sch_vws': sch_vws}
|
|
81
|
+
|
|
82
|
+
def get_columns(self, table: str, sch: Optional[str] = None) -> list[str]:
|
|
83
|
+
meta = MetaData()
|
|
84
|
+
meta.reflect(bind=self.eng, schema=sch)
|
|
85
|
+
return list(meta.tables[self._get_table_identifier(self.eng, table, sch)].exported_columns.keys())
|
|
86
|
+
|
|
87
|
+
def read_table(self, table: Optional[str] = None, sch: Optional[str] = None, size: int = 5) -> pl.DataFrame:
|
|
88
|
+
insp = inspect__(self.eng)
|
|
89
|
+
schema = insp.get_schema_names()
|
|
90
|
+
sch_tab = {k: v for k, v in zip(schema, [insp.get_table_names(schema=x) for x in schema])}
|
|
91
|
+
if sch is None:
|
|
92
|
+
# First try to find schemas that have tables (excluding system schemas)
|
|
93
|
+
schemas_with_tables = []
|
|
94
|
+
for schema_name in schema:
|
|
95
|
+
if schema_name not in ["information_schema", "pg_catalog", "system"]:
|
|
96
|
+
if schema_name in sch_tab and len(sch_tab[schema_name]) > 0:
|
|
97
|
+
schemas_with_tables.append(schema_name)
|
|
98
|
+
|
|
99
|
+
if len(schemas_with_tables) == 0:
|
|
100
|
+
raise ValueError(f"No schemas with tables found. Available schemas: {schema}")
|
|
101
|
+
|
|
102
|
+
# Prefer non-"main" schemas if available, otherwise use main
|
|
103
|
+
if len(schemas_with_tables) > 1 and "main" in schemas_with_tables:
|
|
104
|
+
sch = [s for s in schemas_with_tables if s != "main"][0]
|
|
105
|
+
else:
|
|
106
|
+
sch = schemas_with_tables[0]
|
|
107
|
+
print(f"Auto-selected schema: `{sch}` from available schemas: {schemas_with_tables}")
|
|
108
|
+
|
|
109
|
+
if table is None:
|
|
110
|
+
if sch not in sch_tab:
|
|
111
|
+
raise ValueError(f"Schema `{sch}` not found. Available schemas: {list(sch_tab.keys())}")
|
|
112
|
+
tables = sch_tab[sch]
|
|
113
|
+
assert len(tables) > 0, f"No tables found in schema `{sch}`"
|
|
114
|
+
import random
|
|
115
|
+
table = random.choice(tables)
|
|
116
|
+
print(f"Reading table `{table}` from schema `{sch}`")
|
|
117
|
+
with self.eng.connect() as conn:
|
|
118
|
+
try:
|
|
119
|
+
res = conn.execute(text(f'''SELECT * FROM {self._get_table_identifier(self.eng, table, sch)} '''))
|
|
120
|
+
return pl.DataFrame(res.fetchmany(size))
|
|
121
|
+
except Exception:
|
|
122
|
+
print(f"Error executing query for table `{table}` in schema `{sch}`")
|
|
123
|
+
print(f"Available schemas and tables: {sch_tab}")
|
|
124
|
+
raise
|
|
125
|
+
|
|
126
|
+
def describe_db(self, sch: Optional[str] = None) -> pl.DataFrame:
|
|
127
|
+
meta = MetaData()
|
|
128
|
+
meta.reflect(bind=self.eng, schema=sch)
|
|
129
|
+
ses = sessionmaker()(bind=self.eng)
|
|
130
|
+
res_all = []
|
|
131
|
+
from rich.progress import Progress
|
|
132
|
+
with Progress() as progress:
|
|
133
|
+
task = progress.add_task("Inspecting tables", total=len(meta.sorted_tables))
|
|
134
|
+
for tbl in meta.sorted_tables:
|
|
135
|
+
table = tbl.name
|
|
136
|
+
if sch is not None:
|
|
137
|
+
table = f"{sch}.{table}"
|
|
138
|
+
count = ses.query(tbl).count()
|
|
139
|
+
res = dict(table=table, count=count, size_mb=count * len(tbl.exported_columns) * 10 / 1e6,
|
|
140
|
+
columns=len(tbl.exported_columns), schema=sch)
|
|
141
|
+
res_all.append(res)
|
|
142
|
+
progress.update(task, advance=1)
|
|
143
|
+
return pl.DataFrame(res_all)
|
|
144
|
+
|
|
145
|
+
def describe_table(self, table: str, sch: Optional[str] = None, dtype: bool = True) -> None:
|
|
146
|
+
print(table.center(100, "="))
|
|
147
|
+
meta = MetaData()
|
|
148
|
+
meta.reflect(bind=self.eng, schema=sch)
|
|
149
|
+
tbl = meta.tables[self._get_table_identifier(self.eng, table, sch)]
|
|
150
|
+
ses = sessionmaker()(bind=self.eng)
|
|
151
|
+
count = ses.query(tbl).count()
|
|
152
|
+
res = dict(name=table, count=count, size_mb=count * len(tbl.exported_columns) * 10 / 1e6)
|
|
153
|
+
from machineconfig.utils.accessories import pprint
|
|
154
|
+
pprint(res, title="TABLE DETAILS")
|
|
155
|
+
dat = self.read_table(table=table, sch=sch, size=2)
|
|
156
|
+
df = dat
|
|
157
|
+
print("SAMPLE:\n", df)
|
|
158
|
+
insp = inspect__(self.eng)
|
|
159
|
+
if dtype: print("\nDETAILED COLUMNS:\n", pl.DataFrame(insp.get_columns(self._get_table_identifier(self.eng, table, sch))))
|
|
160
|
+
print("\n" * 3)
|
|
161
|
+
|
|
162
|
+
@staticmethod
|
|
163
|
+
def make_sql_engine(path: OPLike = None, echo: bool = False, share_across_threads: bool = False, pool_size: int = 5, **kwargs: Any) -> Engine:
|
|
164
|
+
if path is None:
|
|
165
|
+
url = 'sqlite:///:memory:'
|
|
166
|
+
elif isinstance(path, str) and path.startswith(('sqlite://', 'postgresql://', 'mysql://', 'duckdb://')):
|
|
167
|
+
url = path
|
|
168
|
+
else:
|
|
169
|
+
path_str = str(P(path))
|
|
170
|
+
if path_str.endswith('.duckdb'):
|
|
171
|
+
url = f'duckdb:///{path_str}'
|
|
172
|
+
else:
|
|
173
|
+
url = f'sqlite:///{path_str}'
|
|
174
|
+
connect_args = {}
|
|
175
|
+
if share_across_threads and 'sqlite' in url:
|
|
176
|
+
connect_args['check_same_thread'] = False
|
|
177
|
+
return create_engine(url, echo=echo, pool_size=pool_size, connect_args=connect_args, **kwargs)
|
|
178
|
+
|
|
179
|
+
DB_TMP_PATH = P.home().joinpath(".tmp").joinpath("tmp_dbs").joinpath("results").joinpath("data.sqlite")
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def to_db(table: str, idx: int, idx_max: int, data: Any):
|
|
183
|
+
import pickle
|
|
184
|
+
DB_TMP_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
185
|
+
db = DBMS.from_local_db(DB_TMP_PATH)
|
|
186
|
+
time_now = time.time_ns()
|
|
187
|
+
data_blob = pickle.dumps(data)
|
|
188
|
+
create_table = f"""CREATE TABLE IF NOT EXISTS "{table}" (time INT PRIMARY KEY, idx INT, idx_max INT, data BLOB)"""
|
|
189
|
+
insert_row = f"""INSERT INTO "{table}" (time, idx, idx_max, data) VALUES (:time, :idx, :idx_max, :data)"""
|
|
190
|
+
with db.eng.begin() as conn:
|
|
191
|
+
conn.execute(text(create_table))
|
|
192
|
+
conn.execute(
|
|
193
|
+
text(insert_row),
|
|
194
|
+
{'time': time_now, 'idx': idx, 'idx_max': idx_max, 'data': data_blob}
|
|
195
|
+
)
|
|
196
|
+
db.close()
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def from_db(table: str):
|
|
200
|
+
import pickle
|
|
201
|
+
DB_TMP_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
202
|
+
db = DBMS.from_local_db(DB_TMP_PATH)
|
|
203
|
+
with db.eng.connect() as conn:
|
|
204
|
+
res = conn.execute(text(f"""SELECT * FROM "{table}" """))
|
|
205
|
+
records = res.fetchall()
|
|
206
|
+
df = pl.DataFrame(records, schema=['time', 'idx', 'idx_max', 'data'])
|
|
207
|
+
df = df.with_columns(pl.col('data').map_elements(pickle.loads))
|
|
208
|
+
return df
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def get_table_specs(engine: Engine, table_name: str) -> pl.DataFrame:
|
|
212
|
+
inspector = inspect__(engine)
|
|
213
|
+
# Collect table information
|
|
214
|
+
columns_info = [{
|
|
215
|
+
'name': col['name'],
|
|
216
|
+
'type': str(col['type']),
|
|
217
|
+
'nullable': col['nullable'],
|
|
218
|
+
'default': col['default'],
|
|
219
|
+
'autoincrement': col.get('autoincrement'),
|
|
220
|
+
'category': 'column'
|
|
221
|
+
} for col in inspector.get_columns(table_name)]
|
|
222
|
+
# Primary keys
|
|
223
|
+
pk_info = [{
|
|
224
|
+
'name': pk,
|
|
225
|
+
'type': None,
|
|
226
|
+
'nullable': False,
|
|
227
|
+
'default': None,
|
|
228
|
+
'autoincrement': None,
|
|
229
|
+
'category': 'primary_key'
|
|
230
|
+
} for pk in inspector.get_pk_constraint(table_name)['constrained_columns']]
|
|
231
|
+
# Foreign keys
|
|
232
|
+
fk_info = [{
|
|
233
|
+
'name': fk['constrained_columns'][0],
|
|
234
|
+
'type': f"FK -> {fk['referred_table']}.{fk['referred_columns'][0]}",
|
|
235
|
+
'nullable': None,
|
|
236
|
+
'default': None,
|
|
237
|
+
'autoincrement': None,
|
|
238
|
+
'category': 'foreign_key'
|
|
239
|
+
} for fk in inspector.get_foreign_keys(table_name)]
|
|
240
|
+
# Indexe
|
|
241
|
+
index_info = [{
|
|
242
|
+
'name': idx['name'],
|
|
243
|
+
'type': f"Index on {', '.join(col for col in idx['column_names'] if col)}",
|
|
244
|
+
'nullable': None,
|
|
245
|
+
'default': None,
|
|
246
|
+
'autoincrement': None,
|
|
247
|
+
'category': 'index',
|
|
248
|
+
'unique': idx['unique']
|
|
249
|
+
} for idx in inspector.get_indexes(table_name)]
|
|
250
|
+
# Combine all information
|
|
251
|
+
all_info = columns_info + pk_info + fk_info + index_info
|
|
252
|
+
# Convert to DataFrame
|
|
253
|
+
df = pl.DataFrame(all_info)
|
|
254
|
+
return df
|
|
255
|
+
|
|
256
|
+
if __name__ == '__main__':
|
|
257
|
+
pass
|
|
@@ -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
|