machineconfig 1.95__py3-none-any.whl → 1.97__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 -57
- 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/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 +6 -6
- machineconfig/jobs/python/vscode/__pycache__/select_interpreter.cpython-311.pyc +0 -0
- machineconfig/jobs/python/vscode/api.py +1 -1
- machineconfig/jobs/python/vscode/link_ve.py +2 -2
- machineconfig/jobs/python/vscode/select_interpreter.py +9 -5
- machineconfig/jobs/python/vscode/sync_code.py +8 -5
- machineconfig/jobs/python_custom_installers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/python_custom_installers/archive/ngrok.py +1 -1
- machineconfig/jobs/python_custom_installers/dev/alacritty.py +3 -2
- machineconfig/jobs/python_custom_installers/dev/brave.py +7 -3
- machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +3 -4
- machineconfig/jobs/python_custom_installers/dev/code.py +3 -1
- machineconfig/jobs/python_custom_installers/dev/cursor.py +66 -5
- machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +0 -1
- machineconfig/jobs/python_custom_installers/dev/espanso.py +13 -9
- machineconfig/jobs/python_custom_installers/dev/goes.py +2 -8
- machineconfig/jobs/python_custom_installers/dev/lvim.py +3 -2
- machineconfig/jobs/python_custom_installers/dev/nerdfont.py +1 -1
- machineconfig/jobs/python_custom_installers/dev/redis.py +7 -3
- machineconfig/jobs/python_custom_installers/dev/wezterm.py +8 -4
- machineconfig/jobs/python_custom_installers/dev/winget.py +194 -0
- machineconfig/jobs/python_custom_installers/{dev/docker.py → docker.py} +8 -3
- machineconfig/jobs/python_custom_installers/gh.py +4 -3
- machineconfig/jobs/python_custom_installers/hx.py +9 -8
- machineconfig/jobs/python_custom_installers/scripts/linux/vscode.sh +97 -30
- machineconfig/jobs/python_custom_installers/{dev/warp-cli.py → warp-cli.py} +1 -1
- 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 +44 -17
- machineconfig/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
- machineconfig/scripts/linux/fire_agents +27 -0
- machineconfig/scripts/linux/mcinit +27 -0
- 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/ai/__pycache__/init.cpython-311.pyc +0 -0
- machineconfig/scripts/python/ai/init.py +56 -0
- machineconfig/scripts/python/ai/rules/python/dev.md +31 -0
- machineconfig/scripts/python/archive/im2text.py +1 -3
- machineconfig/scripts/python/choose_wezterm_theme.py +3 -3
- machineconfig/scripts/python/cloud_copy.py +10 -10
- machineconfig/scripts/python/cloud_manager.py +77 -99
- machineconfig/scripts/python/cloud_mount.py +13 -12
- machineconfig/scripts/python/cloud_repo_sync.py +14 -11
- machineconfig/scripts/python/croshell.py +24 -21
- machineconfig/scripts/python/devops.py +12 -17
- machineconfig/scripts/python/devops_add_identity.py +32 -10
- machineconfig/scripts/python/devops_add_ssh_key.py +10 -10
- machineconfig/scripts/python/devops_backup_retrieve.py +9 -8
- machineconfig/scripts/python/devops_devapps_install.py +6 -6
- machineconfig/scripts/python/devops_update_repos.py +4 -3
- machineconfig/scripts/python/dotfile.py +10 -7
- machineconfig/scripts/python/fire_agents.py +69 -0
- machineconfig/scripts/python/fire_jobs.py +62 -65
- 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 +12 -12
- machineconfig/scripts/python/helpers/helpers2.py +9 -8
- machineconfig/scripts/python/helpers/helpers4.py +23 -35
- machineconfig/scripts/python/helpers/repo_sync_helpers.py +17 -16
- 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 +26 -18
- 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 +412 -60
- machineconfig/scripts/python/wsl_windows_transfer.py +18 -3
- machineconfig/scripts/windows/mcinit.ps1 +4 -0
- 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/web_shortcuts/interactive.sh +5 -2
- machineconfig/setup_windows/wt_and_pwsh/set_pwsh_theme.py +3 -6
- machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +11 -9
- machineconfig/utils/ai/url2md.py +2 -2
- machineconfig/utils/cloud/onedrive/setup_oauth.py +59 -0
- machineconfig/utils/cloud/onedrive/transaction.py +796 -0
- machineconfig/utils/code.py +22 -13
- machineconfig/utils/installer.py +78 -35
- 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/links.py +19 -15
- machineconfig/utils/options.py +4 -8
- machineconfig/utils/path.py +91 -78
- machineconfig/utils/path_reduced.py +608 -0
- machineconfig/utils/procs.py +110 -45
- machineconfig/utils/scheduling.py +312 -222
- machineconfig/utils/utils.py +7 -7
- machineconfig/utils/utils2.py +42 -0
- machineconfig/utils/utils5.py +84 -0
- machineconfig/utils/ve.py +49 -87
- {machineconfig-1.95.dist-info → machineconfig-1.97.dist-info}/METADATA +2 -2
- machineconfig-1.97.dist-info/RECORD +442 -0
- 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/ve_utils/ve1.py +0 -111
- machineconfig/utils/ve_utils/ve2.py +0 -155
- machineconfig-1.95.dist-info/RECORD +0 -712
- {machineconfig-1.95.dist-info → machineconfig-1.97.dist-info}/WHEEL +0 -0
- {machineconfig-1.95.dist-info → machineconfig-1.97.dist-info}/top_level.txt +0 -0
machineconfig/utils/code.py
CHANGED
|
@@ -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
|
|
@@ -47,7 +49,8 @@ def write_shell_script_to_default_program_path(program: str, desc: str, preserve
|
|
|
47
49
|
else:
|
|
48
50
|
program = 'orig_path=$(cd -- "." && pwd)\n' + program + '\ncd "$orig_path" || exit'
|
|
49
51
|
if display: print_code(code=program, lexer="shell", desc=desc, subtitle=str(PROGRAM_PATH))
|
|
50
|
-
PROGRAM_PATH.
|
|
52
|
+
PROGRAM_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
53
|
+
PROGRAM_PATH.write_text(program)
|
|
51
54
|
if execute:
|
|
52
55
|
Terminal().run(f". {PROGRAM_PATH}", shell="powershell").capture().print_if_unsuccessful(desc="🛠️ EXECUTION | Shell script running", strict_err=True, strict_returncode=True)
|
|
53
56
|
return None
|
|
@@ -55,21 +58,27 @@ def write_shell_script_to_default_program_path(program: str, desc: str, preserve
|
|
|
55
58
|
def get_shell_file_executing_python_script(python_script: str, ve_name: str, verbose: bool=True):
|
|
56
59
|
if verbose:
|
|
57
60
|
python_script = f"""
|
|
58
|
-
code = r'''{python_script}'''
|
|
61
|
+
code = r'''{python_script}''' """ + """
|
|
59
62
|
try:
|
|
60
63
|
from machineconfig.utils.utils import print_code
|
|
61
64
|
print_code(code=code, lexer="python", desc="Python Script")
|
|
62
|
-
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))
|
|
63
70
|
""" + python_script
|
|
64
|
-
python_file =
|
|
65
|
-
|
|
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)
|
|
66
75
|
shell_file = write_shell_script_to_file(shell_script)
|
|
67
76
|
return shell_file
|
|
68
77
|
|
|
69
78
|
def print_code(code: str, lexer: str, desc: str, subtitle: str=""):
|
|
70
79
|
if lexer == "shell":
|
|
71
80
|
if platform.system() == "Windows": lexer = "powershell"
|
|
72
|
-
elif platform.system()
|
|
81
|
+
elif platform.system() in ["Linux", "Darwin"]: lexer = "sh"
|
|
73
82
|
else: raise NotImplementedError(f"Platform {platform.system()} not supported for lexer {lexer}")
|
|
74
83
|
console = Console()
|
|
75
84
|
console.print(Panel(Syntax(code=code, lexer=lexer), title=f"📄 {desc}", subtitle=subtitle), style="bold red")
|
machineconfig/utils/installer.py
CHANGED
|
@@ -5,14 +5,15 @@ from machineconfig.utils.installer_utils.installer_class import Installer
|
|
|
5
5
|
from rich.console import Console
|
|
6
6
|
from rich.panel import Panel # Added import
|
|
7
7
|
|
|
8
|
-
from
|
|
9
|
-
from crocodile.core import List as L
|
|
8
|
+
from machineconfig.utils.path_reduced import P as PathExtended
|
|
10
9
|
from crocodile.meta import Terminal
|
|
11
10
|
from machineconfig.utils.utils import INSTALL_VERSION_ROOT
|
|
11
|
+
from machineconfig.utils.utils2 import read_json
|
|
12
12
|
|
|
13
13
|
# from dataclasses import dataclass
|
|
14
14
|
from typing import Any
|
|
15
15
|
import platform
|
|
16
|
+
from joblib import Parallel, delayed
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
def check_latest():
|
|
@@ -20,7 +21,7 @@ def check_latest():
|
|
|
20
21
|
console.print(Panel("🔍 CHECKING FOR LATEST VERSIONS", title="Status", expand=False)) # Replaced print with Panel
|
|
21
22
|
installers = get_installers(system=platform.system(), dev=False)
|
|
22
23
|
# installers += get_installers(system=platform.system(), dev=True)
|
|
23
|
-
|
|
24
|
+
installers_github = []
|
|
24
25
|
for inst__ in installers:
|
|
25
26
|
if "ntop" in inst__.name:
|
|
26
27
|
print(f"⏭️ Skipping {inst__.name} (ntop)")
|
|
@@ -28,9 +29,9 @@ def check_latest():
|
|
|
28
29
|
if "github" not in inst__.repo_url:
|
|
29
30
|
print(f"⏭️ Skipping {inst__.name} (not a GitHub release)")
|
|
30
31
|
continue
|
|
31
|
-
|
|
32
|
+
installers_github.append(inst__)
|
|
32
33
|
|
|
33
|
-
print(f"\n🔍 Checking {len(
|
|
34
|
+
print(f"\n🔍 Checking {len(installers_github)} GitHub-based installers...\n")
|
|
34
35
|
|
|
35
36
|
def func(inst: Installer):
|
|
36
37
|
print(f"🔎 Checking {inst.exe_name}...")
|
|
@@ -39,16 +40,37 @@ def check_latest():
|
|
|
39
40
|
return inst.exe_name, verdict, current_ver, new_ver
|
|
40
41
|
|
|
41
42
|
print("\n⏳ Processing installers...\n")
|
|
42
|
-
res =
|
|
43
|
+
res = [func(inst) for inst in installers_github]
|
|
43
44
|
|
|
44
|
-
import pandas as pd
|
|
45
45
|
print("\n📊 Generating results table...\n")
|
|
46
|
-
res_df = pd.DataFrame(res, columns=["Tool", "Status", "Current Version", "New Version"]).groupby("Status").apply(lambda x: x).reset_index(drop=True)
|
|
47
46
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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)
|
|
52
74
|
print(f"{'═'*80}")
|
|
53
75
|
|
|
54
76
|
|
|
@@ -56,16 +78,18 @@ def get_installed_cli_apps():
|
|
|
56
78
|
print(f"\n{'='*80}\n🔍 LISTING INSTALLED CLI APPS 🔍\n{'='*80}")
|
|
57
79
|
if platform.system() == "Windows":
|
|
58
80
|
print("🪟 Searching for Windows executables...")
|
|
59
|
-
apps =
|
|
60
|
-
elif platform.system()
|
|
61
|
-
print("🐧 Searching for
|
|
62
|
-
|
|
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("*")
|
|
63
88
|
else:
|
|
64
89
|
error_msg = f"❌ ERROR: System {platform.system()} not supported"
|
|
65
90
|
print(error_msg)
|
|
66
91
|
raise NotImplementedError(error_msg)
|
|
67
|
-
|
|
68
|
-
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
|
|
69
93
|
print(f"✅ Found {len(apps)} installed applications\n{'='*80}")
|
|
70
94
|
return apps
|
|
71
95
|
|
|
@@ -96,8 +120,8 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
|
|
|
96
120
|
|
|
97
121
|
print("🔍 Importing generic installers...")
|
|
98
122
|
import machineconfig.jobs.python_generic_installers as generic_installer
|
|
99
|
-
path_os_specific =
|
|
100
|
-
path_os_generic =
|
|
123
|
+
path_os_specific = PathExtended(os_specific_installer.__file__).parent
|
|
124
|
+
path_os_generic = PathExtended(generic_installer.__file__).parent
|
|
101
125
|
|
|
102
126
|
path_os_specific_dev = path_os_specific.joinpath("dev")
|
|
103
127
|
path_os_generic_dev = path_os_generic.joinpath("dev")
|
|
@@ -105,16 +129,16 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
|
|
|
105
129
|
print("📂 Loading configuration files...")
|
|
106
130
|
res_final: dict[CATEGORY, dict[str, dict[str, Any]]] = {}
|
|
107
131
|
print(f"""📄 Loading OS-specific config from: {path_os_specific.joinpath('config.json')}""")
|
|
108
|
-
res_final["OS_SPECIFIC"] =
|
|
132
|
+
res_final["OS_SPECIFIC"] = read_json(path=path_os_specific.joinpath("config.json"))
|
|
109
133
|
|
|
110
134
|
print(f"""📄 Loading OS-generic config from: {path_os_generic.joinpath("config.json")}""")
|
|
111
|
-
res_final["OS_GENERIC"] =
|
|
135
|
+
res_final["OS_GENERIC"] = read_json(path=path_os_generic.joinpath("config.json"))
|
|
112
136
|
|
|
113
137
|
print(f"""📄 Loading OS-specific dev config from: {path_os_specific_dev.joinpath("config.json")}""")
|
|
114
|
-
res_final["OS_SPECIFIC_DEV"] =
|
|
138
|
+
res_final["OS_SPECIFIC_DEV"] = read_json(path=path_os_specific_dev.joinpath("config.json"))
|
|
115
139
|
|
|
116
140
|
print(f"""📄 Loading OS-generic dev config from: {path_os_generic_dev.joinpath("config.json")}""")
|
|
117
|
-
res_final["OS_GENERIC_DEV"] =
|
|
141
|
+
res_final["OS_GENERIC_DEV"] = read_json(path=path_os_generic_dev.joinpath("config.json"))
|
|
118
142
|
|
|
119
143
|
path_custom_installer = path_os_generic.with_name("python_custom_installers")
|
|
120
144
|
path_custom_installer_dev = path_custom_installer.joinpath("dev")
|
|
@@ -147,7 +171,7 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
|
|
|
147
171
|
return res_final
|
|
148
172
|
|
|
149
173
|
|
|
150
|
-
def install_all(installers:
|
|
174
|
+
def install_all(installers: list[Installer], safe: bool=False, jobs: int = 10, fresh: bool=False):
|
|
151
175
|
print(f"\n{'='*80}\n🚀 BULK INSTALLATION PROCESS 🚀\n{'='*80}")
|
|
152
176
|
if fresh:
|
|
153
177
|
print("🧹 Fresh install requested - clearing version cache...")
|
|
@@ -161,10 +185,17 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
|
|
|
161
185
|
|
|
162
186
|
if platform.system().lower() == "windows":
|
|
163
187
|
print("🪟 Moving applications to Windows Apps folder...")
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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)
|
|
168
199
|
else:
|
|
169
200
|
error_msg = f"❌ ERROR: System {platform.system()} not supported"
|
|
170
201
|
print(error_msg)
|
|
@@ -176,10 +207,16 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
|
|
|
176
207
|
|
|
177
208
|
print(f"🚀 Starting installation of {len(installers)} packages...")
|
|
178
209
|
print(f"\n{'='*80}\n📦 INSTALLING FIRST PACKAGE 📦\n{'='*80}")
|
|
179
|
-
installers
|
|
180
|
-
|
|
210
|
+
installers[0].install(version=None)
|
|
211
|
+
installers_remaining = installers[1:]
|
|
181
212
|
print(f"\n{'='*80}\n📦 INSTALLING REMAINING PACKAGES 📦\n{'='*80}")
|
|
182
|
-
|
|
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
|
+
|
|
183
220
|
console = Console()
|
|
184
221
|
|
|
185
222
|
print("\n")
|
|
@@ -187,15 +224,21 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
|
|
|
187
224
|
|
|
188
225
|
print("\n")
|
|
189
226
|
console.rule("✓ Same Version Apps")
|
|
190
|
-
|
|
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}")
|
|
191
230
|
|
|
192
231
|
print("\n")
|
|
193
232
|
console.rule("⬆️ Updated Apps")
|
|
194
|
-
|
|
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}")
|
|
195
236
|
|
|
196
237
|
print("\n")
|
|
197
238
|
console.rule("❌ Failed Apps")
|
|
198
|
-
|
|
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}")
|
|
199
242
|
|
|
200
243
|
print("\n")
|
|
201
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)
|