machineconfig 1.94__py3-none-any.whl → 1.96__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/cluster/cloud_manager.py +445 -343
- machineconfig/cluster/data_transfer.py +63 -56
- machineconfig/cluster/distribute.py +284 -280
- machineconfig/cluster/file_manager.py +234 -237
- machineconfig/cluster/job_params.py +133 -133
- machineconfig/cluster/loader_runner.py +183 -149
- machineconfig/cluster/remote_machine.py +269 -252
- machineconfig/cluster/script_execution.py +215 -209
- machineconfig/cluster/script_notify_upon_completion.py +50 -43
- machineconfig/cluster/self_ssh.py +52 -54
- machineconfig/cluster/sessions_managers/__init__.py +0 -0
- machineconfig/cluster/sessions_managers/archive/__init__.py +0 -0
- machineconfig/{jobs/python → cluster/sessions_managers/archive}/create_zellij_template.py +5 -3
- machineconfig/cluster/sessions_managers/archive/session_managers.py +184 -0
- machineconfig/cluster/sessions_managers/demo_rich_zellij.py +0 -0
- machineconfig/cluster/sessions_managers/enhanced_command_runner.py +160 -0
- machineconfig/cluster/sessions_managers/wt_local.py +494 -0
- machineconfig/cluster/sessions_managers/wt_local_manager.py +577 -0
- machineconfig/cluster/sessions_managers/wt_remote.py +288 -0
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +483 -0
- machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +196 -0
- machineconfig/cluster/sessions_managers/wt_utils/process_monitor.py +418 -0
- machineconfig/cluster/sessions_managers/wt_utils/remote_executor.py +175 -0
- machineconfig/cluster/sessions_managers/wt_utils/session_manager.py +300 -0
- machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +228 -0
- machineconfig/cluster/sessions_managers/zellij_local.py +418 -0
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +533 -0
- machineconfig/cluster/sessions_managers/zellij_remote.py +229 -0
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +188 -0
- machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +64 -0
- machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +126 -0
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +334 -0
- machineconfig/cluster/sessions_managers/zellij_utils/remote_executor.py +68 -0
- machineconfig/cluster/sessions_managers/zellij_utils/session_manager.py +119 -0
- machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +85 -0
- machineconfig/cluster/templates/cli_click.py +0 -1
- machineconfig/cluster/templates/cli_gooey.py +102 -104
- machineconfig/cluster/templates/run_cloud.py +51 -51
- machineconfig/cluster/templates/run_cluster.py +103 -59
- machineconfig/cluster/templates/run_remote.py +57 -58
- machineconfig/cluster/templates/utils.py +69 -36
- machineconfig/jobs/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/linux/msc/lid.sh +2 -4
- machineconfig/jobs/linux/msc/network.sh +3 -6
- machineconfig/jobs/python/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/python/check_installations.py +258 -190
- machineconfig/jobs/python/create_bootable_media.py +7 -3
- machineconfig/jobs/python/python_cargo_build_share.py +50 -50
- machineconfig/jobs/python/python_ve_symlink.py +10 -10
- machineconfig/jobs/python/vscode/__pycache__/select_interpreter.cpython-311.pyc +0 -0
- machineconfig/jobs/python/vscode/api.py +3 -3
- machineconfig/jobs/python/vscode/link_ve.py +6 -6
- machineconfig/jobs/python/vscode/select_interpreter.py +13 -9
- machineconfig/jobs/python/vscode/sync_code.py +14 -11
- machineconfig/jobs/python_custom_installers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/python_custom_installers/archive/ngrok.py +5 -5
- machineconfig/jobs/python_custom_installers/dev/aider.py +4 -4
- machineconfig/jobs/python_custom_installers/dev/alacritty.py +7 -6
- machineconfig/jobs/python_custom_installers/dev/brave.py +11 -7
- machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +7 -8
- machineconfig/jobs/python_custom_installers/dev/code.py +7 -5
- machineconfig/jobs/python_custom_installers/dev/cursor.py +66 -5
- machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +4 -5
- machineconfig/jobs/python_custom_installers/dev/espanso.py +21 -17
- machineconfig/jobs/python_custom_installers/dev/goes.py +6 -12
- machineconfig/jobs/python_custom_installers/dev/lvim.py +7 -6
- machineconfig/jobs/python_custom_installers/dev/nerdfont.py +5 -5
- machineconfig/jobs/python_custom_installers/dev/redis.py +11 -7
- machineconfig/jobs/python_custom_installers/dev/wezterm.py +12 -8
- machineconfig/jobs/python_custom_installers/dev/winget.py +194 -0
- machineconfig/jobs/python_custom_installers/{dev/docker.py → docker.py} +12 -7
- machineconfig/jobs/python_custom_installers/gh.py +10 -9
- machineconfig/jobs/python_custom_installers/hx.py +36 -65
- machineconfig/jobs/python_custom_installers/scripts/linux/brave.sh +4 -8
- machineconfig/jobs/python_custom_installers/scripts/linux/docker.sh +5 -10
- machineconfig/jobs/python_custom_installers/scripts/linux/docker_start.sh +3 -6
- machineconfig/jobs/python_custom_installers/scripts/linux/edge.sh +3 -6
- machineconfig/jobs/python_custom_installers/scripts/linux/nerdfont.sh +5 -10
- machineconfig/jobs/python_custom_installers/scripts/linux/pgsql.sh +4 -8
- machineconfig/jobs/python_custom_installers/scripts/linux/redis.sh +5 -10
- machineconfig/jobs/python_custom_installers/scripts/linux/timescaledb.sh +6 -12
- machineconfig/jobs/python_custom_installers/scripts/linux/vscode.sh +101 -33
- machineconfig/jobs/python_custom_installers/scripts/linux/warp-cli.sh +5 -10
- machineconfig/jobs/python_custom_installers/scripts/linux/wezterm.sh +3 -6
- machineconfig/jobs/python_custom_installers/{dev/warp-cli.py → warp-cli.py} +5 -5
- machineconfig/jobs/python_generic_installers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/python_generic_installers/config.json +133 -9
- machineconfig/jobs/python_generic_installers/dev/config.json +208 -37
- machineconfig/jobs/python_generic_installers/update.py +3 -0
- machineconfig/jobs/python_linux_installers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/python_linux_installers/config.json +42 -6
- machineconfig/jobs/python_linux_installers/dev/config.json +79 -11
- machineconfig/jobs/python_windows_installers/config.json +6 -0
- machineconfig/profile/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/profile/__pycache__/create.cpython-311.pyc +0 -0
- machineconfig/profile/__pycache__/shell.cpython-311.pyc +0 -0
- machineconfig/profile/create.py +5 -5
- machineconfig/profile/create_hardlinks.py +5 -5
- machineconfig/profile/shell.py +69 -63
- machineconfig/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
- machineconfig/scripts/cloud/init.sh +9 -18
- machineconfig/scripts/linux/fire +5 -24
- machineconfig/scripts/linux/fire_agents +27 -0
- machineconfig/scripts/linux/share_cloud.sh +6 -12
- machineconfig/scripts/linux/wifi_conn +24 -0
- machineconfig/scripts/python/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/__init__.cpython-313.pyc +0 -0
- machineconfig/scripts/python/__pycache__/cloud_copy.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/cloud_mount.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/cloud_sync.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/croshell.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/devops.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/devops_backup_retrieve.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/devops_devapps_install.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/devops_update_repos.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/fire_agents.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/fire_jobs.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/fire_jobs.cpython-313.pyc +0 -0
- machineconfig/scripts/python/__pycache__/get_zellij_cmd.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/repos.cpython-311.pyc +0 -0
- machineconfig/scripts/python/archive/im2text.py +28 -30
- machineconfig/scripts/python/archive/tmate_conn.py +10 -13
- machineconfig/scripts/python/archive/tmate_start.py +12 -16
- machineconfig/scripts/python/choose_wezterm_theme.py +12 -21
- machineconfig/scripts/python/cloud_copy.py +49 -104
- machineconfig/scripts/python/cloud_manager.py +77 -91
- machineconfig/scripts/python/cloud_mount.py +36 -46
- machineconfig/scripts/python/cloud_repo_sync.py +33 -79
- machineconfig/scripts/python/cloud_sync.py +35 -45
- machineconfig/scripts/python/croshell.py +70 -92
- machineconfig/scripts/python/devops.py +54 -113
- machineconfig/scripts/python/devops_add_identity.py +71 -109
- machineconfig/scripts/python/devops_add_ssh_key.py +42 -149
- machineconfig/scripts/python/devops_backup_retrieve.py +31 -119
- machineconfig/scripts/python/devops_devapps_install.py +6 -10
- machineconfig/scripts/python/devops_update_repos.py +5 -4
- machineconfig/scripts/python/dotfile.py +10 -7
- machineconfig/scripts/python/fire_agents.py +69 -0
- machineconfig/scripts/python/fire_jobs.py +117 -78
- machineconfig/scripts/python/ftpx.py +8 -8
- machineconfig/scripts/python/get_zellij_cmd.py +3 -3
- machineconfig/scripts/python/gh_models.py +6 -4
- machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-313.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/cloud_helpers.cpython-311.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/helpers2.cpython-311.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-311.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-313.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/repo_sync_helpers.cpython-311.pyc +0 -0
- machineconfig/scripts/python/helpers/cloud_helpers.py +49 -46
- machineconfig/scripts/python/helpers/helpers2.py +26 -39
- machineconfig/scripts/python/helpers/helpers4.py +23 -35
- machineconfig/scripts/python/helpers/repo_sync_helpers.py +33 -67
- machineconfig/scripts/python/mount_nfs.py +8 -11
- machineconfig/scripts/python/mount_nw_drive.py +4 -4
- machineconfig/scripts/python/mount_ssh.py +2 -2
- machineconfig/scripts/python/onetimeshare.py +56 -57
- machineconfig/scripts/python/pomodoro.py +55 -55
- machineconfig/scripts/python/repos.py +72 -49
- machineconfig/scripts/python/scheduler.py +70 -53
- machineconfig/scripts/python/snapshot.py +21 -24
- machineconfig/scripts/python/start_slidev.py +6 -5
- machineconfig/scripts/python/start_terminals.py +3 -1
- machineconfig/scripts/python/viewer.py +5 -4
- machineconfig/scripts/python/viewer_template.py +138 -140
- machineconfig/scripts/python/wifi_conn.py +416 -62
- machineconfig/scripts/python/wsl_windows_transfer.py +18 -3
- machineconfig/scripts/windows/fire.ps1 +27 -15
- machineconfig/settings/linters/.pylintrc +6 -7
- machineconfig/settings/lvim/windows/config.lua +0 -0
- machineconfig/settings/shells/bash/init.sh +6 -0
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +7 -6
- machineconfig/settings/shells/pwsh/init.ps1 +6 -6
- machineconfig/settings/shells/wt/settings.json +51 -266
- machineconfig/setup_linux/nix/cli_installation.sh +9 -18
- machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +3 -6
- machineconfig/setup_linux/web_shortcuts/all.sh +5 -10
- machineconfig/setup_linux/web_shortcuts/ascii_art.sh +7 -14
- machineconfig/setup_linux/web_shortcuts/croshell.sh +6 -12
- machineconfig/setup_linux/web_shortcuts/interactive.sh +39 -70
- machineconfig/setup_linux/web_shortcuts/ssh.sh +8 -16
- machineconfig/setup_linux/web_shortcuts/update_system.sh +7 -14
- machineconfig/setup_windows/wt_and_pwsh/set_pwsh_theme.py +3 -6
- machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +27 -21
- machineconfig/utils/ai/browser_user_wrapper.py +60 -45
- machineconfig/utils/ai/generate_file_checklist.py +4 -7
- machineconfig/utils/ai/url2md.py +15 -7
- machineconfig/utils/cloud/onedrive/setup_oauth.py +59 -0
- machineconfig/utils/cloud/onedrive/transaction.py +796 -0
- machineconfig/utils/{utils_code.py → code.py} +25 -22
- machineconfig/utils/installer.py +81 -44
- machineconfig/utils/installer_utils/installer_abc.py +7 -6
- machineconfig/utils/installer_utils/installer_class.py +44 -25
- machineconfig/utils/io_save.py +107 -0
- machineconfig/utils/{utils_links.py → links.py} +28 -35
- machineconfig/utils/{utils_options.py → options.py} +14 -28
- machineconfig/utils/path.py +112 -0
- machineconfig/utils/path_reduced.py +608 -0
- machineconfig/utils/procs.py +134 -73
- machineconfig/utils/scheduling.py +312 -222
- machineconfig/utils/utils.py +19 -26
- machineconfig/utils/utils2.py +42 -0
- machineconfig/utils/utils5.py +84 -0
- machineconfig/utils/ve.py +49 -103
- {machineconfig-1.94.dist-info → machineconfig-1.96.dist-info}/METADATA +5 -3
- machineconfig-1.96.dist-info/RECORD +437 -0
- {machineconfig-1.94.dist-info → machineconfig-1.96.dist-info}/WHEEL +1 -1
- machineconfig/cluster/session_managers.py +0 -183
- machineconfig/cluster/templates/f.py +0 -4
- machineconfig/jobs/python/__pycache__/check_installations.cpython-311.pyc +0 -0
- machineconfig/jobs/python/__pycache__/checkout_version.cpython-311.pyc +0 -0
- machineconfig/jobs/python/__pycache__/python_ve_symlink.cpython-311.pyc +0 -0
- machineconfig/jobs/python/checkout_version.py +0 -123
- machineconfig/jobs/python/vscode/__pycache__/api.cpython-311.pyc +0 -0
- machineconfig/jobs/python/vscode/__pycache__/link_ve.cpython-311.pyc +0 -0
- machineconfig/jobs/python_custom_installers/__pycache__/hx.cpython-311.pyc +0 -0
- machineconfig/jobs/python_windows_installers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/scripts/python/.mypy_cache/.gitignore +0 -2
- machineconfig/scripts/python/.mypy_cache/3.11/@plugins_snapshot.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/__future__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/__future__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_ast.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_ast.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_bz2.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_bz2.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_codecs.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_codecs.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_compression.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_compression.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_decimal.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_decimal.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_io.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_io.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_locale.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_locale.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_stat.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_stat.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_struct.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_struct.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_thread.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_thread.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_warnings.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_warnings.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_weakref.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_weakref.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/argparse.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/argparse.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/ast.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/ast.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/binascii.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/binascii.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/builtins.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/builtins.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/bz2.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/bz2.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/calendar.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/calendar.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/codecs.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/codecs.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/configparser.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/configparser.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/contextlib.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/contextlib.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/datetime.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/datetime.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/decimal.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/decimal.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/dis.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/dis.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/charset.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/charset.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/errors.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/errors.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/header.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/header.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/message.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/message.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/policy.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/policy.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/enum.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/enum.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/functools.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/functools.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/gc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/gc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/genericpath.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/genericpath.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/getpass.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/getpass.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/compat.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/compat.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/config.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/config.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/db.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/db.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/diff.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/diff.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/exc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/exc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/remote.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/remote.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/types.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/types.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/util.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/util.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/glob.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/glob.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/gzip.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/gzip.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/inspect.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/inspect.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/io.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/io.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/itertools.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/itertools.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/locale.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/locale.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/mmap.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/mmap.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/numbers.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/numbers.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/opcode.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/opcode.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/os/path.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/os/path.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/pathlib.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/pathlib.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/platform.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/platform.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/posixpath.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/posixpath.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/re.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/re.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/resource.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/resource.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/shlex.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/shlex.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/shutil.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/shutil.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/signal.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/signal.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/stat.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/stat.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/string.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/string.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/struct.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/struct.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/subprocess.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/subprocess.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/tarfile.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/tarfile.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/tempfile.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/tempfile.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/textwrap.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/textwrap.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/threading.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/threading.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/time.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/time.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/types.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/types.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/typing.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/typing.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/uuid.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/uuid.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/warnings.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/warnings.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/weakref.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/weakref.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/zlib.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/zlib.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/CACHEDIR.TAG +0 -3
- machineconfig/scripts/python/__pycache__/cloud_repo_sync.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/gh_models.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/url2md.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/viewer.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/vscode_api.cpython-311.pyc +0 -0
- machineconfig/settings/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/settings/linters/.ruff_cache/.gitignore +0 -2
- machineconfig/settings/linters/.ruff_cache/CACHEDIR.TAG +0 -1
- machineconfig/settings/shells/ipy/profiles/default/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/playext.cpython-311.pyc +0 -0
- machineconfig/utils/utils_path.py +0 -151
- machineconfig/utils/ve_utils/ve1.py +0 -111
- machineconfig/utils/ve_utils/ve2.py +0 -142
- machineconfig-1.94.dist-info/RECORD +0 -710
- {machineconfig-1.94.dist-info → machineconfig-1.96.dist-info}/top_level.txt +0 -0
|
@@ -3,12 +3,12 @@ import platform
|
|
|
3
3
|
from rich.console import Console
|
|
4
4
|
from rich.panel import Panel
|
|
5
5
|
from rich.syntax import Syntax
|
|
6
|
-
from
|
|
7
|
-
from
|
|
6
|
+
from machineconfig.utils.utils2 import randstr
|
|
7
|
+
from machineconfig.utils.path_reduced import P as PathExtended
|
|
8
8
|
from crocodile.meta import Terminal
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
PROGRAM_PATH = (
|
|
11
|
+
PROGRAM_PATH = (PathExtended.home().joinpath("tmp_results", "shells", "python_return_command") + (".ps1" if platform.system() == "Windows" else ".sh"))
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
def get_shell_script_executing_python_file(python_file: str, func: Optional[str] = None, ve_name: str="ve", strict_execution: bool=True):
|
|
@@ -23,17 +23,19 @@ deactivate || true
|
|
|
23
23
|
|
|
24
24
|
if strict_execution:
|
|
25
25
|
if platform.system() == "Windows": shell_script = """$ErrorActionPreference = "Stop" """ + "\n" + shell_script
|
|
26
|
-
if platform.system()
|
|
26
|
+
if platform.system() in ["Linux", "Darwin"]: shell_script = "set -e" + "\n" + shell_script
|
|
27
27
|
|
|
28
|
-
if platform.system()
|
|
28
|
+
if platform.system() in ["Linux", "Darwin"]: shell_script = "#!/bin/bash" + "\n" + shell_script # vs #!/usr/bin/env bash
|
|
29
29
|
return shell_script
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
def write_shell_script_to_file(shell_script: str):
|
|
33
|
-
if platform.system()
|
|
33
|
+
if platform.system() in ["Linux", "Darwin"]: suffix = ".sh"
|
|
34
34
|
elif platform.system() == "Windows": suffix = ".ps1"
|
|
35
35
|
else: raise NotImplementedError(f"Platform {platform.system()} not implemented.")
|
|
36
|
-
shell_file =
|
|
36
|
+
shell_file = PathExtended.tmp().joinpath("tmp_scripts", "shell", randstr() + suffix)
|
|
37
|
+
shell_file.parent.mkdir(parents=True, exist_ok=True)
|
|
38
|
+
shell_file.write_text(shell_script)
|
|
37
39
|
return shell_file
|
|
38
40
|
|
|
39
41
|
# Enhanced print/log/error/exception statements for better clarity and consistency
|
|
@@ -46,14 +48,9 @@ def write_shell_script_to_default_program_path(program: str, desc: str, preserve
|
|
|
46
48
|
program = "$orig_path = $pwd\n" + program + "\ncd $orig_path"
|
|
47
49
|
else:
|
|
48
50
|
program = 'orig_path=$(cd -- "." && pwd)\n' + program + '\ncd "$orig_path" || exit'
|
|
49
|
-
if display:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
⚙️ SHELL SCRIPT | Executing at {PROGRAM_PATH}
|
|
53
|
-
{'=' * 60}
|
|
54
|
-
""")
|
|
55
|
-
print_code(code=program, lexer="shell", desc=desc)
|
|
56
|
-
PROGRAM_PATH.create(parents_only=True).write_text(program)
|
|
51
|
+
if display: print_code(code=program, lexer="shell", desc=desc, subtitle=str(PROGRAM_PATH))
|
|
52
|
+
PROGRAM_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
53
|
+
PROGRAM_PATH.write_text(program)
|
|
57
54
|
if execute:
|
|
58
55
|
Terminal().run(f". {PROGRAM_PATH}", shell="powershell").capture().print_if_unsuccessful(desc="🛠️ EXECUTION | Shell script running", strict_err=True, strict_returncode=True)
|
|
59
56
|
return None
|
|
@@ -61,22 +58,28 @@ def write_shell_script_to_default_program_path(program: str, desc: str, preserve
|
|
|
61
58
|
def get_shell_file_executing_python_script(python_script: str, ve_name: str, verbose: bool=True):
|
|
62
59
|
if verbose:
|
|
63
60
|
python_script = f"""
|
|
64
|
-
code = r'''{python_script}'''
|
|
61
|
+
code = r'''{python_script}''' """ + """
|
|
65
62
|
try:
|
|
66
63
|
from machineconfig.utils.utils import print_code
|
|
67
64
|
print_code(code=code, lexer="python", desc="Python Script")
|
|
68
|
-
except ImportError:
|
|
65
|
+
except ImportError:
|
|
66
|
+
from rich.console import Console
|
|
67
|
+
from rich.panel import Panel
|
|
68
|
+
console = Console()
|
|
69
|
+
console.print(Panel(f'''📜 PYTHON SCRIPT:\n\n{{code}}''', title="Python Script", expand=False))
|
|
69
70
|
""" + python_script
|
|
70
|
-
python_file =
|
|
71
|
-
|
|
71
|
+
python_file = PathExtended.tmp().joinpath("tmp_scripts", "python", randstr() + ".py")
|
|
72
|
+
python_file.parent.mkdir(parents=True, exist_ok=True)
|
|
73
|
+
python_file.write_text(python_script)
|
|
74
|
+
shell_script = get_shell_script_executing_python_file(python_file=str(python_file), ve_name=ve_name)
|
|
72
75
|
shell_file = write_shell_script_to_file(shell_script)
|
|
73
76
|
return shell_file
|
|
74
77
|
|
|
75
|
-
def print_code(code: str, lexer: str, desc: str):
|
|
78
|
+
def print_code(code: str, lexer: str, desc: str, subtitle: str=""):
|
|
76
79
|
if lexer == "shell":
|
|
77
80
|
if platform.system() == "Windows": lexer = "powershell"
|
|
78
|
-
elif platform.system()
|
|
81
|
+
elif platform.system() in ["Linux", "Darwin"]: lexer = "sh"
|
|
79
82
|
else: raise NotImplementedError(f"Platform {platform.system()} not supported for lexer {lexer}")
|
|
80
83
|
console = Console()
|
|
81
|
-
console.print(Panel(Syntax(code=code, lexer=lexer), title=f"📄 {desc}"), style="bold red")
|
|
84
|
+
console.print(Panel(Syntax(code=code, lexer=lexer), title=f"📄 {desc}", subtitle=subtitle), style="bold red")
|
|
82
85
|
|
machineconfig/utils/installer.py
CHANGED
|
@@ -3,26 +3,25 @@
|
|
|
3
3
|
from machineconfig.utils.installer_utils.installer_abc import LINUX_INSTALL_PATH, CATEGORY
|
|
4
4
|
from machineconfig.utils.installer_utils.installer_class import Installer
|
|
5
5
|
from rich.console import Console
|
|
6
|
+
from rich.panel import Panel # Added import
|
|
6
7
|
|
|
7
|
-
from
|
|
8
|
-
from crocodile.core import List as L
|
|
8
|
+
from machineconfig.utils.path_reduced import P as PathExtended
|
|
9
9
|
from crocodile.meta import Terminal
|
|
10
10
|
from machineconfig.utils.utils import INSTALL_VERSION_ROOT
|
|
11
|
+
from machineconfig.utils.utils2 import read_json
|
|
11
12
|
|
|
12
13
|
# from dataclasses import dataclass
|
|
13
14
|
from typing import Any
|
|
14
15
|
import platform
|
|
16
|
+
from joblib import Parallel, delayed
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
def check_latest():
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
║ 🔍 CHECKING FOR LATEST VERSIONS ║
|
|
21
|
-
╚{'═'*78}╝
|
|
22
|
-
""")
|
|
20
|
+
console = Console() # Added console initialization
|
|
21
|
+
console.print(Panel("🔍 CHECKING FOR LATEST VERSIONS", title="Status", expand=False)) # Replaced print with Panel
|
|
23
22
|
installers = get_installers(system=platform.system(), dev=False)
|
|
24
23
|
# installers += get_installers(system=platform.system(), dev=True)
|
|
25
|
-
|
|
24
|
+
installers_github = []
|
|
26
25
|
for inst__ in installers:
|
|
27
26
|
if "ntop" in inst__.name:
|
|
28
27
|
print(f"⏭️ Skipping {inst__.name} (ntop)")
|
|
@@ -30,9 +29,9 @@ def check_latest():
|
|
|
30
29
|
if "github" not in inst__.repo_url:
|
|
31
30
|
print(f"⏭️ Skipping {inst__.name} (not a GitHub release)")
|
|
32
31
|
continue
|
|
33
|
-
|
|
32
|
+
installers_github.append(inst__)
|
|
34
33
|
|
|
35
|
-
print(f"\n🔍 Checking {len(
|
|
34
|
+
print(f"\n🔍 Checking {len(installers_github)} GitHub-based installers...\n")
|
|
36
35
|
|
|
37
36
|
def func(inst: Installer):
|
|
38
37
|
print(f"🔎 Checking {inst.exe_name}...")
|
|
@@ -41,20 +40,37 @@ def check_latest():
|
|
|
41
40
|
return inst.exe_name, verdict, current_ver, new_ver
|
|
42
41
|
|
|
43
42
|
print("\n⏳ Processing installers...\n")
|
|
44
|
-
res =
|
|
43
|
+
res = [func(inst) for inst in installers_github]
|
|
45
44
|
|
|
46
|
-
import pandas as pd
|
|
47
45
|
print("\n📊 Generating results table...\n")
|
|
48
|
-
res_df = pd.DataFrame(res, columns=["Tool", "Status", "Current Version", "New Version"]).groupby("Status").apply(lambda x: x).reset_index(drop=True)
|
|
49
46
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
""
|
|
57
|
-
|
|
47
|
+
# Convert to list of dictionaries and group by status
|
|
48
|
+
result_data = []
|
|
49
|
+
for tool, status, current_ver, new_ver in res:
|
|
50
|
+
result_data.append({
|
|
51
|
+
"Tool": tool,
|
|
52
|
+
"Status": status,
|
|
53
|
+
"Current Version": current_ver,
|
|
54
|
+
"New Version": new_ver
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
# Group by status
|
|
58
|
+
grouped_data = {}
|
|
59
|
+
for item in result_data:
|
|
60
|
+
status = item["Status"]
|
|
61
|
+
if status not in grouped_data:
|
|
62
|
+
grouped_data[status] = []
|
|
63
|
+
grouped_data[status].append(item)
|
|
64
|
+
|
|
65
|
+
console.print(Panel("📊 INSTALLATION STATUS SUMMARY", title="Status", expand=False))
|
|
66
|
+
|
|
67
|
+
# Print each group
|
|
68
|
+
for status, items in grouped_data.items():
|
|
69
|
+
print(f"\n{status.upper()}:")
|
|
70
|
+
print("-" * 60)
|
|
71
|
+
for item in items:
|
|
72
|
+
print(f" {item['Tool']:<20} | Current: {item['Current Version']:<15} | New: {item['New Version']}")
|
|
73
|
+
print("-" * 60)
|
|
58
74
|
print(f"{'═'*80}")
|
|
59
75
|
|
|
60
76
|
|
|
@@ -62,16 +78,18 @@ def get_installed_cli_apps():
|
|
|
62
78
|
print(f"\n{'='*80}\n🔍 LISTING INSTALLED CLI APPS 🔍\n{'='*80}")
|
|
63
79
|
if platform.system() == "Windows":
|
|
64
80
|
print("🪟 Searching for Windows executables...")
|
|
65
|
-
apps =
|
|
66
|
-
elif platform.system()
|
|
67
|
-
print("🐧 Searching for
|
|
68
|
-
|
|
81
|
+
apps = PathExtended.home().joinpath("AppData/Local/Microsoft/WindowsApps").search("*.exe", not_in=["notepad"])
|
|
82
|
+
elif platform.system() in ["Linux", "Darwin"]:
|
|
83
|
+
print(f"🐧 Searching for {platform.system()} executables...")
|
|
84
|
+
if platform.system() == "Linux":
|
|
85
|
+
apps = PathExtended(LINUX_INSTALL_PATH).search("*") + PathExtended("/usr/local/bin").search("*")
|
|
86
|
+
else: # Darwin/macOS
|
|
87
|
+
apps = PathExtended("/usr/local/bin").search("*") + PathExtended("/opt/homebrew/bin").search("*")
|
|
69
88
|
else:
|
|
70
89
|
error_msg = f"❌ ERROR: System {platform.system()} not supported"
|
|
71
90
|
print(error_msg)
|
|
72
91
|
raise NotImplementedError(error_msg)
|
|
73
|
-
|
|
74
|
-
apps = L([app for app in apps if app.size("kb") > 0.1 and not app.is_symlink()]) # no symlinks like paint and wsl and bash
|
|
92
|
+
apps = [app for app in apps if app.size("kb") > 0.1 and not app.is_symlink()] # no symlinks like paint and wsl and bash
|
|
75
93
|
print(f"✅ Found {len(apps)} installed applications\n{'='*80}")
|
|
76
94
|
return apps
|
|
77
95
|
|
|
@@ -102,8 +120,8 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
|
|
|
102
120
|
|
|
103
121
|
print("🔍 Importing generic installers...")
|
|
104
122
|
import machineconfig.jobs.python_generic_installers as generic_installer
|
|
105
|
-
path_os_specific =
|
|
106
|
-
path_os_generic =
|
|
123
|
+
path_os_specific = PathExtended(os_specific_installer.__file__).parent
|
|
124
|
+
path_os_generic = PathExtended(generic_installer.__file__).parent
|
|
107
125
|
|
|
108
126
|
path_os_specific_dev = path_os_specific.joinpath("dev")
|
|
109
127
|
path_os_generic_dev = path_os_generic.joinpath("dev")
|
|
@@ -111,16 +129,16 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
|
|
|
111
129
|
print("📂 Loading configuration files...")
|
|
112
130
|
res_final: dict[CATEGORY, dict[str, dict[str, Any]]] = {}
|
|
113
131
|
print(f"""📄 Loading OS-specific config from: {path_os_specific.joinpath('config.json')}""")
|
|
114
|
-
res_final["OS_SPECIFIC"] =
|
|
132
|
+
res_final["OS_SPECIFIC"] = read_json(path=path_os_specific.joinpath("config.json"))
|
|
115
133
|
|
|
116
134
|
print(f"""📄 Loading OS-generic config from: {path_os_generic.joinpath("config.json")}""")
|
|
117
|
-
res_final["OS_GENERIC"] =
|
|
135
|
+
res_final["OS_GENERIC"] = read_json(path=path_os_generic.joinpath("config.json"))
|
|
118
136
|
|
|
119
137
|
print(f"""📄 Loading OS-specific dev config from: {path_os_specific_dev.joinpath("config.json")}""")
|
|
120
|
-
res_final["OS_SPECIFIC_DEV"] =
|
|
138
|
+
res_final["OS_SPECIFIC_DEV"] = read_json(path=path_os_specific_dev.joinpath("config.json"))
|
|
121
139
|
|
|
122
140
|
print(f"""📄 Loading OS-generic dev config from: {path_os_generic_dev.joinpath("config.json")}""")
|
|
123
|
-
res_final["OS_GENERIC_DEV"] =
|
|
141
|
+
res_final["OS_GENERIC_DEV"] = read_json(path=path_os_generic_dev.joinpath("config.json"))
|
|
124
142
|
|
|
125
143
|
path_custom_installer = path_os_generic.with_name("python_custom_installers")
|
|
126
144
|
path_custom_installer_dev = path_custom_installer.joinpath("dev")
|
|
@@ -153,7 +171,7 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
|
|
|
153
171
|
return res_final
|
|
154
172
|
|
|
155
173
|
|
|
156
|
-
def install_all(installers:
|
|
174
|
+
def install_all(installers: list[Installer], safe: bool=False, jobs: int = 10, fresh: bool=False):
|
|
157
175
|
print(f"\n{'='*80}\n🚀 BULK INSTALLATION PROCESS 🚀\n{'='*80}")
|
|
158
176
|
if fresh:
|
|
159
177
|
print("🧹 Fresh install requested - clearing version cache...")
|
|
@@ -167,10 +185,17 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
|
|
|
167
185
|
|
|
168
186
|
if platform.system().lower() == "windows":
|
|
169
187
|
print("🪟 Moving applications to Windows Apps folder...")
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
188
|
+
# PathExtended.get_env().WindowsPaths().WindowsApps)
|
|
189
|
+
folder = PathExtended.home().joinpath("AppData/Local/Microsoft/WindowsApps")
|
|
190
|
+
apps_dir.search("*").apply(lambda app: app.move(folder=folder))
|
|
191
|
+
elif platform.system().lower() in ["linux", "darwin"]:
|
|
192
|
+
system_name = "Linux" if platform.system().lower() == "linux" else "macOS"
|
|
193
|
+
print(f"🐧 Moving applications to {system_name} bin folder...")
|
|
194
|
+
if platform.system().lower() == "linux":
|
|
195
|
+
install_path = LINUX_INSTALL_PATH
|
|
196
|
+
else: # Darwin/macOS
|
|
197
|
+
install_path = "/usr/local/bin"
|
|
198
|
+
Terminal().run(f"sudo mv {apps_dir.as_posix()}/* {install_path}/").capture().print_if_unsuccessful(desc=f"MOVING executable to {install_path}", strict_err=True, strict_returncode=True)
|
|
174
199
|
else:
|
|
175
200
|
error_msg = f"❌ ERROR: System {platform.system()} not supported"
|
|
176
201
|
print(error_msg)
|
|
@@ -182,10 +207,16 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
|
|
|
182
207
|
|
|
183
208
|
print(f"🚀 Starting installation of {len(installers)} packages...")
|
|
184
209
|
print(f"\n{'='*80}\n📦 INSTALLING FIRST PACKAGE 📦\n{'='*80}")
|
|
185
|
-
installers
|
|
186
|
-
|
|
210
|
+
installers[0].install(version=None)
|
|
211
|
+
installers_remaining = installers[1:]
|
|
187
212
|
print(f"\n{'='*80}\n📦 INSTALLING REMAINING PACKAGES 📦\n{'='*80}")
|
|
188
|
-
|
|
213
|
+
|
|
214
|
+
# Use joblib for parallel processing of remaining installers
|
|
215
|
+
res = Parallel(n_jobs=jobs)(
|
|
216
|
+
delayed(lambda x: x.install_robust(version=None))(installer)
|
|
217
|
+
for installer in installers_remaining
|
|
218
|
+
)
|
|
219
|
+
|
|
189
220
|
console = Console()
|
|
190
221
|
|
|
191
222
|
print("\n")
|
|
@@ -193,15 +224,21 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
|
|
|
193
224
|
|
|
194
225
|
print("\n")
|
|
195
226
|
console.rule("✓ Same Version Apps")
|
|
196
|
-
|
|
227
|
+
same_version_results = [r for r in res if r and 'same version' in str(r)]
|
|
228
|
+
for result in same_version_results:
|
|
229
|
+
print(f" {result}")
|
|
197
230
|
|
|
198
231
|
print("\n")
|
|
199
232
|
console.rule("⬆️ Updated Apps")
|
|
200
|
-
|
|
233
|
+
updated_results = [r for r in res if r and 'updated from' in str(r)]
|
|
234
|
+
for result in updated_results:
|
|
235
|
+
print(f" {result}")
|
|
201
236
|
|
|
202
237
|
print("\n")
|
|
203
238
|
console.rule("❌ Failed Apps")
|
|
204
|
-
|
|
239
|
+
failed_results = [r for r in res if r and 'Failed at' in str(r)]
|
|
240
|
+
for result in failed_results:
|
|
241
|
+
print(f" {result}")
|
|
205
242
|
|
|
206
243
|
print("\n")
|
|
207
244
|
print("✨ INSTALLATION COMPLETE ✨".center(100, "="))
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
from
|
|
1
|
+
from machineconfig.utils.path_reduced import P as PathExtended
|
|
2
2
|
from crocodile.meta import Terminal
|
|
3
3
|
from typing import Optional, TypeAlias, Literal
|
|
4
4
|
|
|
5
5
|
# LINUX_INSTALL_PATH = '/usr/local/bin'
|
|
6
|
-
LINUX_INSTALL_PATH = '~/.local/bin'
|
|
7
|
-
|
|
6
|
+
# LINUX_INSTALL_PATH = '~/.local/bin'
|
|
7
|
+
LINUX_INSTALL_PATH = PathExtended.home().joinpath(".local/bin").__str__()
|
|
8
|
+
WINDOWS_INSTALL_PATH = PathExtended.home().joinpath("AppData/Local/Microsoft/WindowsApps").__str__()
|
|
8
9
|
CATEGORY: TypeAlias = Literal["OS_SPECIFIC", "OS_GENERIC", "CUSTOM", "OS_SPECIFIC_DEV", "OS_GENERIC_DEV", "CUSTOM_DEV"]
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
def find_move_delete_windows(downloaded_file_path:
|
|
12
|
+
def find_move_delete_windows(downloaded_file_path: PathExtended, exe_name: Optional[str] = None, delete: bool=True, rename_to: Optional[str] = None):
|
|
12
13
|
print(f"\n{'='*80}\n🔍 PROCESSING WINDOWS EXECUTABLE 🔍\n{'='*80}")
|
|
13
14
|
if exe_name is not None and ".exe" in exe_name: exe_name = exe_name.replace(".exe", "")
|
|
14
15
|
if downloaded_file_path.is_file():
|
|
@@ -52,7 +53,7 @@ def find_move_delete_windows(downloaded_file_path: P, exe_name: Optional[str] =
|
|
|
52
53
|
return exe_new_location
|
|
53
54
|
|
|
54
55
|
|
|
55
|
-
def find_move_delete_linux(downloaded:
|
|
56
|
+
def find_move_delete_linux(downloaded: PathExtended, tool_name: str, delete: Optional[bool] = True, rename_to: Optional[str] = None):
|
|
56
57
|
print(f"\n{'='*80}\n🔍 PROCESSING LINUX EXECUTABLE 🔍\n{'='*80}")
|
|
57
58
|
if downloaded.is_file():
|
|
58
59
|
exe = downloaded
|
|
@@ -95,6 +96,6 @@ def find_move_delete_linux(downloaded: P, tool_name: str, delete: Optional[bool]
|
|
|
95
96
|
downloaded.delete(sure=True)
|
|
96
97
|
print("✅ Temporary files removed")
|
|
97
98
|
|
|
98
|
-
exe_new_location =
|
|
99
|
+
exe_new_location = PathExtended(LINUX_INSTALL_PATH).joinpath(exe.name)
|
|
99
100
|
print(f"✅ Executable installed at: {exe_new_location}\n{'='*80}")
|
|
100
101
|
return exe_new_location
|
|
@@ -1,22 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
from
|
|
1
|
+
|
|
2
|
+
from machineconfig.utils.path_reduced import P as PathExtended
|
|
3
3
|
from crocodile.meta import Terminal
|
|
4
4
|
from machineconfig.utils.installer_utils.installer_abc import find_move_delete_linux, find_move_delete_windows
|
|
5
5
|
from machineconfig.utils.utils import INSTALL_TMP_DIR, INSTALL_VERSION_ROOT, LIBRARY_ROOT, check_tool_exists
|
|
6
|
-
|
|
6
|
+
from machineconfig.utils.utils2 import pprint, read_json
|
|
7
7
|
|
|
8
8
|
import platform
|
|
9
9
|
from typing import Any, Optional
|
|
10
|
+
from pathlib import Path
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class Installer:
|
|
13
|
-
def __init__(self, repo_url: str, name: str, doc: str,
|
|
14
|
-
|
|
14
|
+
def __init__(self, repo_url: str, name: str, doc: str,
|
|
15
|
+
strip_v: bool, exe_name: str,
|
|
16
|
+
filename_template_windows_amd_64: str,
|
|
17
|
+
filename_template_linux_amd_64: str,
|
|
18
|
+
filename_template_windows_arm_64: Optional[str] = None,
|
|
19
|
+
filename_template_linux_arm_64: Optional[str] = None,
|
|
20
|
+
filename_template_macos_amd_64: Optional[str] = None,
|
|
21
|
+
filename_template_macos_arm_64: Optional[str] = None,
|
|
22
|
+
):
|
|
15
23
|
self.repo_url: str=repo_url
|
|
16
24
|
self.name: str=name
|
|
17
25
|
self.doc: str=doc
|
|
18
26
|
self.filename_template_windows_amd_64: str=filename_template_windows_amd_64
|
|
19
27
|
self.filename_template_linux_amd_64: str=filename_template_linux_amd_64
|
|
28
|
+
self.filename_template_windows_arm_64: Optional[str]=filename_template_windows_arm_64
|
|
29
|
+
self.filename_template_linux_arm_64: Optional[str]=filename_template_linux_arm_64
|
|
30
|
+
self.filename_template_macos_amd_64: Optional[str]=filename_template_macos_amd_64
|
|
31
|
+
self.filename_template_macos_arm_64: Optional[str]=filename_template_macos_arm_64
|
|
20
32
|
self.strip_v: bool=strip_v
|
|
21
33
|
self.exe_name: str=exe_name
|
|
22
34
|
def __repr__(self) -> str: return f"Installer of {self.repo_url}"
|
|
@@ -32,16 +44,18 @@ class Installer:
|
|
|
32
44
|
def from_dict(d: dict[str, Any], name: str):
|
|
33
45
|
try: return Installer(name=name, **d)
|
|
34
46
|
except Exception as ex:
|
|
35
|
-
|
|
47
|
+
pprint(d, "Installer Creation Error")
|
|
36
48
|
raise ex
|
|
37
49
|
@staticmethod
|
|
38
50
|
def choose_app_and_install():
|
|
39
51
|
print(f"\n{'='*80}\n🔍 SELECT APPLICATION TO INSTALL 🔍\n{'='*80}")
|
|
40
52
|
from machineconfig.utils.utils import choose_one_option
|
|
41
53
|
print("📂 Searching for configuration files...")
|
|
42
|
-
|
|
54
|
+
jobs_dir = Path(LIBRARY_ROOT.joinpath("jobs"))
|
|
55
|
+
config_paths = [Path(p) for p in jobs_dir.rglob("config.json")]
|
|
56
|
+
path = choose_one_option(options=config_paths)
|
|
43
57
|
print(f"📄 Loading configuration from: {path}")
|
|
44
|
-
config: dict[str, Any] =
|
|
58
|
+
config: dict[str, Any] = read_json(path) # /python_generic_installers/config.json"))
|
|
45
59
|
print("🔍 Select an application to install:")
|
|
46
60
|
app_name = choose_one_option(options=list(config.keys()), fzf=True)
|
|
47
61
|
# for keys, dict_ in config.items():
|
|
@@ -78,9 +92,9 @@ class Installer:
|
|
|
78
92
|
if self.repo_url == "CUSTOM":
|
|
79
93
|
print(f"🧩 Using custom installer for {self.exe_name}")
|
|
80
94
|
import machineconfig.jobs.python_custom_installers as python_custom_installers
|
|
81
|
-
installer_path =
|
|
95
|
+
installer_path = Path(python_custom_installers.__file__).parent.joinpath(self.exe_name + ".py")
|
|
82
96
|
if not installer_path.exists():
|
|
83
|
-
installer_path =
|
|
97
|
+
installer_path = Path(python_custom_installers.__file__).parent.joinpath("dev", self.exe_name + ".py")
|
|
84
98
|
print(f"🔍 Looking for installer in dev folder: {installer_path}")
|
|
85
99
|
else:
|
|
86
100
|
print(f"🔍 Found installer at: {installer_path}")
|
|
@@ -108,7 +122,7 @@ class Installer:
|
|
|
108
122
|
else:
|
|
109
123
|
print("📥 Downloading from repository...")
|
|
110
124
|
downloaded, version_to_be_installed = self.download(version=version)
|
|
111
|
-
if downloaded
|
|
125
|
+
if str(downloaded).endswith(".deb"):
|
|
112
126
|
print(f"📦 Installing .deb package: {downloaded}")
|
|
113
127
|
assert platform.system() == "Linux"
|
|
114
128
|
Terminal().run(f"sudo nala install -y {downloaded}").capture().print_if_unsuccessful(desc="Installing .deb", strict_err=True, strict_returncode=True)
|
|
@@ -119,8 +133,9 @@ class Installer:
|
|
|
119
133
|
if platform.system() == "Windows":
|
|
120
134
|
print("🪟 Installing on Windows...")
|
|
121
135
|
exe = find_move_delete_windows(downloaded_file_path=downloaded, exe_name=self.exe_name, delete=True, rename_to=self.exe_name.replace(".exe", "") + ".exe")
|
|
122
|
-
elif platform.system()
|
|
123
|
-
|
|
136
|
+
elif platform.system() in ["Linux", "Darwin"]:
|
|
137
|
+
system_name = "Linux" if platform.system() == "Linux" else "macOS"
|
|
138
|
+
print(f"🐧 Installing on {system_name}...")
|
|
124
139
|
exe = find_move_delete_linux(downloaded=downloaded, tool_name=self.exe_name, delete=True, rename_to=self.exe_name)
|
|
125
140
|
else:
|
|
126
141
|
error_msg = f"❌ ERROR: System {platform.system()} not supported"
|
|
@@ -138,24 +153,26 @@ class Installer:
|
|
|
138
153
|
exe.with_name(name=new_exe_name, inplace=True, overwrite=True)
|
|
139
154
|
|
|
140
155
|
print(f"💾 Saving version information to: {INSTALL_VERSION_ROOT.joinpath(self.exe_name)}")
|
|
141
|
-
INSTALL_VERSION_ROOT.joinpath(self.exe_name).
|
|
156
|
+
INSTALL_VERSION_ROOT.joinpath(self.exe_name).parent.mkdir(parents=True, exist_ok=True)
|
|
157
|
+
INSTALL_VERSION_ROOT.joinpath(self.exe_name).write_text(version_to_be_installed)
|
|
142
158
|
print(f"✅ Installation completed successfully!\n{'='*80}")
|
|
143
159
|
|
|
144
160
|
def download(self, version: Optional[str]):
|
|
145
161
|
print(f"\n{'='*80}\n📥 DOWNLOADING: {self.exe_name} 📥\n{'='*80}")
|
|
146
162
|
if "github" not in self.repo_url or ".zip" in self.repo_url or ".tar.gz" in self.repo_url:
|
|
147
|
-
download_link =
|
|
163
|
+
download_link = Path(self.repo_url)
|
|
148
164
|
version_to_be_installed = "predefined_url"
|
|
149
165
|
print(f"🔗 Using direct download URL: {download_link}")
|
|
150
166
|
print(f"📦 Version to be installed: {version_to_be_installed}")
|
|
151
167
|
|
|
152
168
|
elif "http" in self.filename_template_linux_amd_64 or "http" in self.filename_template_windows_amd_64:
|
|
153
169
|
if platform.system() == "Windows":
|
|
154
|
-
download_link =
|
|
170
|
+
download_link = Path(self.filename_template_windows_amd_64)
|
|
155
171
|
print(f"🪟 Using Windows-specific download URL: {download_link}")
|
|
156
|
-
elif platform.system()
|
|
157
|
-
download_link =
|
|
158
|
-
|
|
172
|
+
elif platform.system() in ["Linux", "Darwin"]:
|
|
173
|
+
download_link = Path(self.filename_template_linux_amd_64)
|
|
174
|
+
system_name = "Linux" if platform.system() == "Linux" else "macOS"
|
|
175
|
+
print(f"🐧 Using {system_name}-specific download URL: {download_link}")
|
|
159
176
|
else:
|
|
160
177
|
error_msg = f"❌ ERROR: System {platform.system()} not supported"
|
|
161
178
|
print(error_msg)
|
|
@@ -175,9 +192,10 @@ class Installer:
|
|
|
175
192
|
if platform.system() == "Windows":
|
|
176
193
|
file_name = self.filename_template_windows_amd_64.format(version_to_be_installed_stripped)
|
|
177
194
|
print(f"🪟 Windows file name: {file_name}")
|
|
178
|
-
elif platform.system()
|
|
195
|
+
elif platform.system() in ["Linux", "Darwin"]:
|
|
179
196
|
file_name = self.filename_template_linux_amd_64.format(version_to_be_installed_stripped)
|
|
180
|
-
|
|
197
|
+
system_name = "Linux" if platform.system() == "Linux" else "macOS"
|
|
198
|
+
print(f"🐧 {system_name} file name: {file_name}")
|
|
181
199
|
else:
|
|
182
200
|
error_msg = f"❌ ERROR: System {platform.system()} not supported"
|
|
183
201
|
print(error_msg)
|
|
@@ -186,8 +204,8 @@ class Installer:
|
|
|
186
204
|
print(f"📄 File name: {file_name}")
|
|
187
205
|
download_link = release_url.joinpath(file_name)
|
|
188
206
|
|
|
189
|
-
print(f"📥 Downloading {self.name} from: {download_link
|
|
190
|
-
downloaded = download_link.download(folder=INSTALL_TMP_DIR).decompress()
|
|
207
|
+
print(f"📥 Downloading {self.name} from: {download_link}")
|
|
208
|
+
downloaded = PathExtended(download_link).download(folder=INSTALL_TMP_DIR).decompress()
|
|
191
209
|
print(f"✅ Download and extraction completed to: {downloaded}\n{'='*80}")
|
|
192
210
|
return downloaded, version_to_be_installed
|
|
193
211
|
|
|
@@ -208,7 +226,7 @@ class Installer:
|
|
|
208
226
|
version_to_be_installed = version
|
|
209
227
|
print(f"📝 Using specified version: {version_to_be_installed}")
|
|
210
228
|
|
|
211
|
-
release_url =
|
|
229
|
+
release_url = Path(repo_url + "/releases/download/" + version_to_be_installed)
|
|
212
230
|
print(f"🔗 Release download URL: {release_url}\n{'='*80}")
|
|
213
231
|
return release_url, version_to_be_installed
|
|
214
232
|
|
|
@@ -216,7 +234,8 @@ class Installer:
|
|
|
216
234
|
def check_if_installed_already(exe_name: str, version: str, use_cache: bool):
|
|
217
235
|
print(f"\n{'='*80}\n🔍 CHECKING INSTALLATION STATUS: {exe_name} 🔍\n{'='*80}")
|
|
218
236
|
version_to_be_installed = version
|
|
219
|
-
|
|
237
|
+
INSTALL_VERSION_ROOT.joinpath(exe_name).parent.mkdir(parents=True, exist_ok=True)
|
|
238
|
+
tmp_path = INSTALL_VERSION_ROOT.joinpath(exe_name)
|
|
220
239
|
|
|
221
240
|
if use_cache:
|
|
222
241
|
print("🗂️ Using cached version information...")
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Union, Optional, Mapping
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import json
|
|
6
|
+
import pickle
|
|
7
|
+
import configparser
|
|
8
|
+
|
|
9
|
+
try:
|
|
10
|
+
import toml # type: ignore
|
|
11
|
+
except Exception: # pragma: no cover
|
|
12
|
+
toml = None # type: ignore
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
import yaml # type: ignore
|
|
16
|
+
except Exception: # pragma: no cover
|
|
17
|
+
yaml = None # type: ignore
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
PathLike = Union[str, Path]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _ensure_parent(path: PathLike) -> Path:
|
|
24
|
+
path_obj = Path(path)
|
|
25
|
+
path_obj.parent.mkdir(parents=True, exist_ok=True)
|
|
26
|
+
return path_obj
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def save_pickle(obj: Any, path: PathLike, verbose: bool = False) -> Path:
|
|
30
|
+
path_obj = _ensure_parent(path)
|
|
31
|
+
with open(path_obj, "wb") as fh:
|
|
32
|
+
pickle.dump(obj, fh, protocol=pickle.HIGHEST_PROTOCOL)
|
|
33
|
+
if verbose:
|
|
34
|
+
print(f"Saved pickle -> {path_obj}")
|
|
35
|
+
return Path(path_obj)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def save_json(obj: Any, path: PathLike, indent: Optional[int] = None, verbose: bool = False) -> Path:
|
|
39
|
+
path_obj = _ensure_parent(path)
|
|
40
|
+
with open(path_obj, "w", encoding="utf-8") as fh:
|
|
41
|
+
json.dump(obj, fh, indent=indent, ensure_ascii=False)
|
|
42
|
+
fh.write("\n")
|
|
43
|
+
if verbose:
|
|
44
|
+
print(f"Saved json -> {path_obj}")
|
|
45
|
+
return Path(path_obj)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def save_toml(obj: Mapping[str, Any], path: PathLike, verbose: bool = False) -> Path:
|
|
49
|
+
if toml is None:
|
|
50
|
+
raise RuntimeError("toml package is required to write TOML files")
|
|
51
|
+
path_obj = _ensure_parent(path)
|
|
52
|
+
with open(path_obj, "w", encoding="utf-8") as fh:
|
|
53
|
+
toml.dump(obj, fh)
|
|
54
|
+
if verbose:
|
|
55
|
+
print(f"Saved toml -> {path_obj}")
|
|
56
|
+
return Path(path_obj)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def save_yaml(obj: Any, path: PathLike, verbose: bool = False) -> Path:
|
|
60
|
+
if yaml is None:
|
|
61
|
+
raise RuntimeError("PyYAML is required to write YAML files")
|
|
62
|
+
path_obj = _ensure_parent(path)
|
|
63
|
+
with open(path_obj, "w", encoding="utf-8") as fh:
|
|
64
|
+
yaml.safe_dump(obj, fh, sort_keys=False)
|
|
65
|
+
if verbose:
|
|
66
|
+
print(f"Saved yaml -> {path_obj}")
|
|
67
|
+
return Path(path_obj)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def save_ini(path: PathLike, obj: Mapping[str, Mapping[str, Any]], verbose: bool = False) -> Path:
|
|
71
|
+
cp = configparser.ConfigParser()
|
|
72
|
+
for section, values in obj.items():
|
|
73
|
+
cp[section] = {str(k): str(v) for k, v in values.items()}
|
|
74
|
+
path_obj = _ensure_parent(path)
|
|
75
|
+
with open(path_obj, "w", encoding="utf-8") as fh:
|
|
76
|
+
cp.write(fh)
|
|
77
|
+
if verbose:
|
|
78
|
+
print(f"Saved ini -> {path_obj}")
|
|
79
|
+
return Path(path_obj)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class Save:
|
|
83
|
+
"""Drop-in replacement for crocodile's Save helper.
|
|
84
|
+
|
|
85
|
+
Provides static methods for common serialization formats while ensuring
|
|
86
|
+
parent directories exist and returning a `P` path object.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
@staticmethod
|
|
90
|
+
def pickle(obj: Any, path: PathLike, verbose: bool = False, **_kwargs: Any) -> Path:
|
|
91
|
+
return save_pickle(obj=obj, path=path, verbose=verbose)
|
|
92
|
+
|
|
93
|
+
@staticmethod
|
|
94
|
+
def json(obj: Any, path: PathLike, indent: Optional[int] = None, verbose: bool = False, **_kwargs: Any) -> Path:
|
|
95
|
+
return save_json(obj=obj, path=path, indent=indent, verbose=verbose)
|
|
96
|
+
|
|
97
|
+
@staticmethod
|
|
98
|
+
def toml(obj: Mapping[str, Any], path: PathLike, verbose: bool = False, **_kwargs: Any) -> Path:
|
|
99
|
+
return save_toml(obj=obj, path=path, verbose=verbose)
|
|
100
|
+
|
|
101
|
+
@staticmethod
|
|
102
|
+
def yaml(obj: Any, path: PathLike, verbose: bool = False, **_kwargs: Any) -> Path:
|
|
103
|
+
return save_yaml(obj=obj, path=path, verbose=verbose)
|
|
104
|
+
|
|
105
|
+
@staticmethod
|
|
106
|
+
def ini(obj: Mapping[str, Mapping[str, Any]], path: PathLike, verbose: bool = False, **_kwargs: Any) -> Path:
|
|
107
|
+
return save_ini(path=path, obj=obj, verbose=verbose)
|