machineconfig 7.50__py3-none-any.whl → 8.14__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/remote/cloud_manager.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +23 -11
- machineconfig/cluster/sessions_managers/wt_local_manager.py +22 -19
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +3 -1
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +3 -1
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
- machineconfig/jobs/installer/installer_data.json +1185 -165
- machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
- machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
- machineconfig/jobs/installer/package_groups.py +52 -84
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +2 -2
- machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
- machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +4 -1
- machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
- machineconfig/jobs/installer/{custom → python_scripts}/hx.py +16 -12
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +27 -22
- machineconfig/jobs/installer/python_scripts/sysabc.py +139 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
- machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
- machineconfig/jobs/installer/python_scripts/yazi.py +121 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
- machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
- machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
- machineconfig/jobs/scripts_dynamic/a.py +25 -0
- machineconfig/logger.py +0 -1
- machineconfig/profile/create_helper.py +21 -22
- machineconfig/profile/create_links_export.py +25 -11
- machineconfig/profile/create_shell_profile.py +14 -3
- machineconfig/profile/mapper.toml +8 -6
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/wrap_mcfg +20 -21
- machineconfig/scripts/python/agents.py +74 -50
- machineconfig/scripts/python/ai/initai.py +1 -1
- machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
- machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
- machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/generic.py +1 -1
- machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
- machineconfig/scripts/python/cloud.py +6 -6
- machineconfig/scripts/python/croshell.py +67 -60
- machineconfig/scripts/python/devops.py +41 -21
- machineconfig/scripts/python/devops_navigator.py +0 -4
- machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +1 -1
- machineconfig/scripts/python/fire_jobs.py +95 -67
- machineconfig/scripts/python/ftpx.py +44 -17
- machineconfig/scripts/python/helpers/ast_search.py +74 -0
- machineconfig/scripts/python/helpers/qr_code.py +166 -0
- machineconfig/scripts/python/helpers/repo_rag.py +325 -0
- machineconfig/scripts/python/helpers/symantic_search.py +25 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +1 -1
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +9 -7
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +21 -8
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +0 -12
- machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +30 -11
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +9 -2
- machineconfig/scripts/python/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/copilot/config.yml +1 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/crush/crush.json +10 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/gemini/settings.json +12 -0
- machineconfig/scripts/python/helpers_agents/privacy/privacy.py +109 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +8 -4
- machineconfig/scripts/python/helpers_agents/templates/template.sh +18 -8
- machineconfig/scripts/python/helpers_cloud/cloud_copy.py +28 -21
- machineconfig/scripts/python/helpers_cloud/cloud_helpers.py +1 -1
- machineconfig/scripts/python/helpers_cloud/cloud_mount.py +19 -17
- machineconfig/scripts/python/helpers_cloud/cloud_sync.py +8 -7
- machineconfig/scripts/python/helpers_croshell/crosh.py +3 -3
- machineconfig/scripts/python/helpers_croshell/start_slidev.py +6 -7
- machineconfig/scripts/python/helpers_devops/cli_config.py +19 -25
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +22 -13
- machineconfig/scripts/python/helpers_devops/cli_nw.py +113 -26
- machineconfig/scripts/python/helpers_devops/cli_repos.py +37 -11
- machineconfig/scripts/python/helpers_devops/cli_self.py +95 -42
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +9 -9
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +13 -12
- machineconfig/scripts/python/helpers_devops/{cli_terminal.py → cli_share_terminal.py} +15 -17
- machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +4 -4
- machineconfig/scripts/python/helpers_devops/devops_status.py +7 -19
- machineconfig/scripts/python/helpers_devops/run_script.py +180 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_wezterm_theme.py +1 -1
- machineconfig/scripts/python/helpers_fire_command/file_wrangler.py +2 -19
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +1 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +25 -15
- machineconfig/scripts/python/helpers_msearch/scripts_linux/fzfg +3 -3
- machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +58 -1
- machineconfig/scripts/python/helpers_navigator/command_tree.py +50 -18
- machineconfig/scripts/python/helpers_network/address.py +176 -0
- machineconfig/scripts/python/helpers_network/address_switch.py +78 -0
- machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
- machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
- machineconfig/scripts/python/{nw/devops_add_identity.py → helpers_network/ssh_add_identity.py} +35 -1
- machineconfig/scripts/python/{nw/devops_add_ssh_key.py → helpers_network/ssh_add_ssh_key.py} +26 -7
- machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
- machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
- machineconfig/scripts/python/helpers_repos/clone.py +0 -1
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +13 -5
- machineconfig/scripts/python/helpers_repos/entrypoint.py +2 -1
- machineconfig/scripts/python/helpers_repos/record.py +2 -1
- machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/helpers_repos/{count_lines.py → repo_analyzer_2.py} +113 -192
- machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +19 -13
- machineconfig/scripts/python/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers_utils/pdf.py +96 -0
- machineconfig/scripts/python/helpers_utils/python.py +187 -0
- machineconfig/scripts/python/interactive.py +30 -31
- machineconfig/scripts/python/{machineconfig.py → mcfg_entry.py} +4 -5
- machineconfig/scripts/python/msearch.py +57 -6
- machineconfig/scripts/python/sessions.py +100 -31
- machineconfig/scripts/python/terminal.py +26 -17
- machineconfig/scripts/python/utils.py +17 -15
- machineconfig/scripts/windows/wrap_mcfg.ps1 +6 -3
- machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
- machineconfig/settings/linters/.ruff.toml +1 -1
- machineconfig/settings/shells/bash/init.sh +29 -2
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
- machineconfig/settings/shells/nushell/config.nu +2 -2
- machineconfig/settings/shells/nushell/env.nu +45 -6
- machineconfig/settings/shells/nushell/init.nu +282 -95
- machineconfig/settings/shells/pwsh/init.ps1 +1 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
- machineconfig/settings/shells/zsh/init.sh +1 -8
- machineconfig/settings/television/cable_unix/alias.toml +8 -0
- machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
- machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
- machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
- machineconfig/settings/television/cable_unix/channels.toml +19 -0
- machineconfig/settings/television/cable_unix/dirs.toml +13 -0
- machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
- machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
- machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_unix/env.toml +17 -0
- machineconfig/settings/television/cable_unix/files.toml +11 -0
- machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
- machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
- machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
- machineconfig/settings/television/cable_unix/git-log.toml +12 -0
- machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
- machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
- machineconfig/settings/television/cable_unix/guix.toml +20 -0
- machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
- machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
- machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
- machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
- machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
- machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
- machineconfig/settings/television/cable_unix/procs.toml +20 -0
- machineconfig/settings/television/cable_unix/text.toml +17 -0
- machineconfig/settings/television/cable_unix/tldr.toml +18 -0
- machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
- machineconfig/settings/television/cable_windows/alias.toml +7 -0
- machineconfig/settings/television/cable_windows/dirs.toml +13 -0
- machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
- machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_windows/env.toml +17 -0
- machineconfig/settings/television/cable_windows/files.toml +14 -0
- machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
- machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
- machineconfig/settings/television/cable_windows/git-log.toml +11 -0
- machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
- machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
- machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
- machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
- machineconfig/settings/television/cable_windows/text.toml +17 -0
- machineconfig/settings/wt/__init__.py +0 -0
- machineconfig/settings/yazi/init.lua +49 -24
- machineconfig/settings/yazi/keymap_linux.toml +19 -4
- machineconfig/settings/yazi/keymap_windows.toml +0 -1
- machineconfig/settings/yazi/shell/yazi_cd.ps1 +29 -5
- machineconfig/settings/yazi/theme.toml +4 -0
- machineconfig/settings/yazi/yazi_linux.toml +84 -0
- machineconfig/settings/yazi/yazi_windows.toml +58 -0
- machineconfig/settings/zellij/layouts/st.kdl +39 -8
- machineconfig/setup_linux/__init__.py +1 -2
- machineconfig/setup_linux/apps_desktop.sh +8 -27
- machineconfig/setup_linux/web_shortcuts/interactive.sh +12 -10
- machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
- machineconfig/setup_mac/__init__.py +2 -3
- machineconfig/setup_windows/__init__.py +3 -5
- machineconfig/setup_windows/ssh/openssh-server.ps1 +1 -1
- machineconfig/setup_windows/uv.ps1 +8 -1
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +12 -10
- machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
- machineconfig/utils/accessories.py +7 -4
- machineconfig/utils/code.py +69 -27
- machineconfig/utils/files/headers.py +2 -2
- machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
- machineconfig/utils/installer_utils/install_from_url.py +183 -0
- machineconfig/utils/installer_utils/installer_class.py +43 -100
- machineconfig/utils/installer_utils/installer_cli.py +175 -0
- machineconfig/utils/installer_utils/installer_helper.py +129 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +36 -85
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +16 -59
- machineconfig/utils/io.py +0 -1
- machineconfig/utils/links.py +2 -2
- machineconfig/utils/meta.py +30 -16
- machineconfig/utils/options.py +42 -24
- machineconfig/utils/options_tv.py +119 -0
- machineconfig/utils/path_extended.py +42 -20
- machineconfig/utils/path_helper.py +75 -22
- machineconfig/utils/procs.py +1 -1
- machineconfig/utils/scheduler.py +20 -53
- machineconfig/utils/schemas/layouts/layout_types.py +1 -1
- machineconfig/utils/ssh.py +159 -418
- machineconfig/utils/ssh_utils/abc.py +5 -0
- machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
- machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
- machineconfig/utils/ssh_utils/utils.py +142 -0
- machineconfig/utils/ssh_utils/wsl.py +210 -0
- machineconfig/utils/terminal.py +1 -0
- machineconfig/utils/upgrade_packages.py +6 -1
- machineconfig/utils/ve.py +12 -4
- machineconfig-8.14.dist-info/METADATA +132 -0
- {machineconfig-7.50.dist-info → machineconfig-8.14.dist-info}/RECORD +264 -215
- {machineconfig-7.50.dist-info → machineconfig-8.14.dist-info}/entry_points.txt +2 -4
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
- machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
- machineconfig/jobs/installer/powershell_scripts/openssh-server_add_key.ps1 +0 -7
- machineconfig/jobs/installer/powershell_scripts/openssh-server_copy-ssh-id.ps1 +0 -14
- machineconfig/scripts/linux/other/switch_ip +0 -20
- machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
- machineconfig/scripts/python/define.py +0 -31
- machineconfig/scripts/python/explore.py +0 -49
- machineconfig/scripts/python/helpers_devops/cli_utils.py +0 -246
- machineconfig/scripts/python/helpers_msearch/scripts_linux/fzfag +0 -17
- machineconfig/scripts/python/helpers_msearch/scripts_linux/fzfrga +0 -21
- machineconfig/scripts/python/helpers_msearch/scripts_linux/skrg +0 -4
- machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfb.ps1 +0 -3
- machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfrga.bat +0 -20
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
- machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
- machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
- machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
- machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
- machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
- machineconfig/settings/lf/windows/tst.ps1 +0 -1
- machineconfig/settings/yazi/yazi.toml +0 -17
- machineconfig/setup_linux/apps.sh +0 -66
- machineconfig/setup_linux/others/cli_installation.sh +0 -137
- machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
- machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
- machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
- machineconfig/setup_mac/apps.sh +0 -73
- machineconfig/setup_windows/apps.ps1 +0 -62
- machineconfig/setup_windows/others/obs.ps1 +0 -4
- machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
- machineconfig/utils/installer_utils/installer.py +0 -221
- machineconfig-7.50.dist-info/METADATA +0 -92
- /machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/__init__.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
- /machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
- /machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
- /machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
- /machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
- /machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
- /machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
- /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
- /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
- /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
- /machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
- /machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
- /machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
- /machineconfig/scripts/python/{nw → ai/utils}/__init__.py +0 -0
- /machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +0 -0
- /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers_network}/__init__.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
- {machineconfig-7.50.dist-info → machineconfig-8.14.dist-info}/WHEEL +0 -0
- {machineconfig-7.50.dist-info → machineconfig-8.14.dist-info}/top_level.txt +0 -0
|
@@ -2,75 +2,77 @@
|
|
|
2
2
|
|
|
3
3
|
"""
|
|
4
4
|
croshell
|
|
5
|
+
|
|
5
6
|
"""
|
|
6
7
|
|
|
7
8
|
from typing import Annotated, Optional
|
|
8
9
|
import typer
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
|
|
12
12
|
def croshell(
|
|
13
13
|
path: Annotated[Optional[str], typer.Argument(help="path of file to read.")] = None,
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
project_path: Annotated[Optional[str], typer.Option("--project", "-p", help="specify uv project to use")] = None,
|
|
15
|
+
uv_with: Annotated[Optional[str], typer.Option("--uv-with", "-w", help="specify uv with packages to use")] = None,
|
|
16
|
+
marimo: Annotated[bool, typer.Option("--marimo", "-m", help="open the notebook using marimo if available")] = False,
|
|
16
17
|
jupyter: Annotated[bool, typer.Option("--jupyter", "-j", help="run in jupyter interactive console")] = False,
|
|
17
18
|
vscode: Annotated[bool, typer.Option("--vscode", "-c", help="open the script in vscode")] = False,
|
|
18
|
-
streamlit_viewer: Annotated[bool, typer.Option("--streamlit", "-s", help="view in streamlit app")] = False,
|
|
19
19
|
visidata: Annotated[bool, typer.Option("--visidata", "-v", help="open data file in visidata")] = False,
|
|
20
|
-
|
|
20
|
+
# streamlit_viewer: Annotated[bool, typer.Option("--streamlit", "-s", help="view in streamlit app")] = False,
|
|
21
|
+
python: Annotated[bool, typer.Option("--python", "-P", help="flag to use python over IPython.")] = False,
|
|
22
|
+
profile: Annotated[Optional[str], typer.Option("--profile", "-r", help="ipython profile to use, defaults to default profile.")] = None,
|
|
23
|
+
|
|
21
24
|
) -> None:
|
|
22
|
-
|
|
25
|
+
if uv_with is not None: user_uv_with_line = f"--with {uv_with} "
|
|
26
|
+
else: user_uv_with_line = ""
|
|
27
|
+
|
|
28
|
+
if project_path is not None:
|
|
29
|
+
uv_project_line = f'--project {project_path}'
|
|
30
|
+
uv_python_line = ""
|
|
31
|
+
else:
|
|
32
|
+
uv_project_line = ""
|
|
33
|
+
uv_python_line = "--python 3.14"
|
|
34
|
+
|
|
35
|
+
from machineconfig.scripts.python.helpers_croshell.crosh import get_read_python_file_pycode, get_read_data_pycode
|
|
23
36
|
from machineconfig.utils.meta import lambda_to_python_script
|
|
24
|
-
from machineconfig.utils.path_extended import PathExtended
|
|
25
37
|
from pathlib import Path
|
|
26
38
|
from machineconfig.utils.accessories import randstr
|
|
39
|
+
from machineconfig.utils.ve import get_ve_path_and_ipython_profile
|
|
27
40
|
import json
|
|
28
|
-
from machineconfig.utils.options import choose_from_options
|
|
29
41
|
from rich.console import Console
|
|
30
42
|
from rich.panel import Panel
|
|
31
43
|
console = Console()
|
|
32
44
|
|
|
45
|
+
|
|
33
46
|
# ==================================================================================
|
|
34
47
|
# flags processing
|
|
35
48
|
interactivity = "-i"
|
|
36
49
|
interpreter = "python" if python else "ipython"
|
|
37
50
|
ipython_profile: Optional[str] = profile
|
|
38
|
-
file_obj =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
# #!/bin/bash
|
|
58
|
-
# streamlit run {py_file_path}
|
|
59
|
-
# """
|
|
60
|
-
# PROGRAM_PATH.write_text(data=final_program, encoding="utf-8")
|
|
61
|
-
print("Streamlit viewer is not yet implemented in this version.")
|
|
62
|
-
return None
|
|
63
|
-
file_obj = PathExtended(str(path).lstrip()).expanduser().absolute()
|
|
64
|
-
program = lambda_to_python_script(lambda: get_read_data_pycode(path=str(file_obj)), in_global=True, import_module=False)
|
|
65
|
-
text = f"📄 Reading data from: {file_obj.name}"
|
|
66
|
-
console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
|
|
51
|
+
file_obj = Path.cwd() # initialization value, could be modified according to args.
|
|
52
|
+
if path is not None:
|
|
53
|
+
from machineconfig.utils.path_helper import get_choice_file
|
|
54
|
+
choice_file = get_choice_file(path=path, suffixes={".*"})
|
|
55
|
+
if project_path is None:
|
|
56
|
+
ve_path, _ = get_ve_path_and_ipython_profile(choice_file)
|
|
57
|
+
if ve_path is not None:
|
|
58
|
+
ve_path_obj = Path(ve_path)
|
|
59
|
+
uv_project_line = f'--project {ve_path_obj.parent}'
|
|
60
|
+
uv_python_line = ""
|
|
61
|
+
if choice_file.suffix == ".py":
|
|
62
|
+
program = choice_file.read_text(encoding="utf-8")
|
|
63
|
+
text = f"📄 Selected file: {choice_file.name}"
|
|
64
|
+
console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
|
|
65
|
+
else:
|
|
66
|
+
program = lambda_to_python_script(lambda: get_read_data_pycode(path=str(choice_file)),
|
|
67
|
+
in_global=True, import_module=False)
|
|
68
|
+
text = f"📄 Reading data from: {file_obj.name}"
|
|
69
|
+
console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
|
|
67
70
|
else: # if nothing is specified, then run in interactive mode.
|
|
68
|
-
# text = "⌨️ Entering interactive mode"
|
|
69
|
-
# console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
|
|
70
|
-
# from machineconfig.scripts.python.croshell import InteractiveShell
|
|
71
|
-
# InteractiveShell().run()
|
|
72
|
-
# return None
|
|
73
71
|
program = ""
|
|
72
|
+
|
|
73
|
+
if Path.home().joinpath("code/machineconfig").exists() and uv_project_line == "":
|
|
74
|
+
uv_project_line = f'--project "{str(Path.home().joinpath("code/machineconfig"))}"'
|
|
75
|
+
|
|
74
76
|
preprogram = """
|
|
75
77
|
#%%
|
|
76
78
|
"""
|
|
@@ -81,17 +83,19 @@ def croshell(
|
|
|
81
83
|
from pathlib import Path
|
|
82
84
|
from machineconfig.utils.path_extended import PathExtended
|
|
83
85
|
_ = Path, PathExtended # avoid unused import warnings
|
|
84
|
-
import inspect
|
|
86
|
+
import inspect
|
|
87
|
+
import textwrap
|
|
85
88
|
from types import FunctionType
|
|
86
89
|
def get_body_simple_function_no_args(f: FunctionType):
|
|
87
90
|
return textwrap.dedent("\n".join(inspect.getsource(f).splitlines()[1:]))
|
|
88
91
|
preprogram += get_body_simple_function_no_args(preprogram_func)
|
|
89
92
|
|
|
90
|
-
|
|
93
|
+
from pathlib import Path
|
|
94
|
+
pyfile = Path.home().joinpath(f"tmp_results/tmp_scripts/python/croshell/{randstr()}/script.py")
|
|
91
95
|
pyfile.parent.mkdir(parents=True, exist_ok=True)
|
|
92
|
-
|
|
93
96
|
title = "Reading Data"
|
|
94
|
-
def_code = lambda_to_python_script(lambda:
|
|
97
|
+
def_code = lambda_to_python_script(lambda: get_read_python_file_pycode(path=str(pyfile), title=title),
|
|
98
|
+
in_global=False, import_module=False)
|
|
95
99
|
# print(def_code)
|
|
96
100
|
python_program = preprogram + "\n\n" + def_code + program
|
|
97
101
|
pyfile.write_text(python_program, encoding="utf-8")
|
|
@@ -125,37 +129,40 @@ def croshell(
|
|
|
125
129
|
pass
|
|
126
130
|
if visidata:
|
|
127
131
|
if file_obj.suffix == ".json":
|
|
128
|
-
fire_line = f"uv run
|
|
132
|
+
fire_line = f"uv run {uv_python_line} {user_uv_with_line} {uv_project_line} --with visidata vd {str(file_obj)}"
|
|
129
133
|
else:
|
|
130
|
-
fire_line = f"uv run
|
|
134
|
+
fire_line = f"uv run {uv_python_line} {user_uv_with_line} {uv_project_line} --with visidata,pyarrow vd {str(file_obj)}"
|
|
131
135
|
elif marimo:
|
|
132
|
-
if Path.home().joinpath("code/machineconfig").exists():
|
|
133
|
-
|
|
136
|
+
if Path.home().joinpath("code/machineconfig").exists():
|
|
137
|
+
requirements = f"""{user_uv_with_line} {uv_project_line} --with marimo,sqlglot """
|
|
138
|
+
else: requirements = f"""{uv_python_line} {user_uv_with_line} {uv_project_line} --with "marimo,sqlglot,cowsay,machineconfig[plot]>=8.14" """
|
|
134
139
|
fire_line = f"""
|
|
135
140
|
cd {str(pyfile.parent)}
|
|
136
|
-
uv run
|
|
141
|
+
uv run {uv_python_line} --with "marimo" marimo convert {pyfile.name} -o marimo_nb.py
|
|
137
142
|
uv run {requirements} marimo edit --host 0.0.0.0 marimo_nb.py
|
|
138
143
|
"""
|
|
139
144
|
elif jupyter:
|
|
140
|
-
if Path.home().joinpath("code/machineconfig").exists():
|
|
141
|
-
|
|
142
|
-
|
|
145
|
+
if Path.home().joinpath("code/machineconfig").exists():
|
|
146
|
+
requirements = f"""{user_uv_with_line} {uv_project_line} --with jupyterlab """
|
|
147
|
+
else: requirements = f"""{user_uv_with_line} {uv_project_line} --with "cowsay,machineconfig[plot]>=8.14" """
|
|
148
|
+
fire_line = f"uv run {requirements} {uv_project_line} jupyter-lab {str(nb_target)}"
|
|
143
149
|
elif vscode:
|
|
150
|
+
user_uv_add = f"uv add {uv_with}" if uv_with is not None else ""
|
|
144
151
|
fire_line = f"""
|
|
145
152
|
cd {str(pyfile.parent)}
|
|
146
|
-
uv init
|
|
153
|
+
uv init {uv_python_line}
|
|
147
154
|
uv venv
|
|
148
|
-
uv add "machineconfig[plot]>=
|
|
155
|
+
uv add "cowsay,machineconfig[plot]>=8.14"
|
|
156
|
+
uv add {user_uv_add}
|
|
149
157
|
# code serve-web
|
|
150
158
|
code --new-window {str(pyfile)}
|
|
151
159
|
"""
|
|
152
160
|
else:
|
|
153
161
|
if interpreter == "ipython": profile = f" --profile {ipython_profile} --no-banner"
|
|
154
162
|
else: profile = ""
|
|
155
|
-
if Path.home().joinpath("code/machineconfig").exists():
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
# --python 3.14
|
|
163
|
+
if Path.home().joinpath("code/machineconfig").exists():
|
|
164
|
+
ve_line = f"""{user_uv_with_line} {uv_project_line} """
|
|
165
|
+
else: ve_line = f"""{uv_python_line} {user_uv_with_line} {uv_project_line} --with "cowsay,machineconfig[plot]>=8.14" """
|
|
159
166
|
fire_line = f"uv run {ve_line} {interpreter} {interactivity} {profile} {str(pyfile)}"
|
|
160
167
|
|
|
161
168
|
from machineconfig.utils.code import exit_then_run_shell_script
|
|
@@ -8,39 +8,59 @@ import machineconfig.scripts.python.helpers_devops.cli_config as cli_config
|
|
|
8
8
|
import machineconfig.scripts.python.helpers_devops.cli_self as cli_self
|
|
9
9
|
import machineconfig.scripts.python.helpers_devops.cli_data as cli_data
|
|
10
10
|
import machineconfig.scripts.python.helpers_devops.cli_nw as cli_network
|
|
11
|
-
|
|
11
|
+
import machineconfig.scripts.python.helpers_devops.run_script as run_py_script_module
|
|
12
12
|
|
|
13
13
|
def install(which: Annotated[Optional[str], typer.Argument(..., help="Comma-separated list of program names to install, or group name if --group flag is set.")] = None,
|
|
14
14
|
group: Annotated[bool, typer.Option(..., "--group", "-g", help="Treat 'which' as a group name. A group is bundle of apps.")] = False,
|
|
15
|
-
interactive: Annotated[bool, typer.Option(..., "--interactive", "-
|
|
15
|
+
interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Interactive selection of programs to install.")] = False,
|
|
16
16
|
) -> None:
|
|
17
|
-
"""📦 Install
|
|
18
|
-
import machineconfig.utils.installer_utils.
|
|
19
|
-
installer_entry_point.
|
|
17
|
+
"""📦 Install packages"""
|
|
18
|
+
import machineconfig.utils.installer_utils.installer_cli as installer_entry_point
|
|
19
|
+
installer_entry_point.main_installer_cli(which=which, group=group, interactive=interactive)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# def get_app():
|
|
24
|
+
# app = typer.Typer(add_completion=False, no_args_is_help=True)
|
|
25
|
+
# app.command(name="scripts", help="define all scripts", no_args_is_help=False)(define_scripts)
|
|
26
|
+
# return app
|
|
27
|
+
|
|
28
|
+
# def main():
|
|
29
|
+
# # return app
|
|
30
|
+
# app = get_app()
|
|
31
|
+
# app()
|
|
32
|
+
|
|
33
|
+
# define_app = get_define_app()
|
|
20
34
|
|
|
21
35
|
|
|
22
36
|
def get_app():
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
37
|
+
|
|
38
|
+
cli_app = typer.Typer(help="🛠️ DevOps operations", no_args_is_help=True, add_help_option=False, add_completion=False)
|
|
39
|
+
cli_app.command("install", no_args_is_help=True, help=install.__doc__, short_help="🛠️ [i] Install essential packages")(install)
|
|
40
|
+
cli_app.command("i", no_args_is_help=True, help=install.__doc__, hidden=True)(install)
|
|
41
|
+
|
|
28
42
|
app_repos = cli_repos.get_app()
|
|
29
|
-
|
|
30
|
-
|
|
43
|
+
cli_app.add_typer(app_repos, name="repos")
|
|
44
|
+
cli_app.add_typer(app_repos, name="r", hidden=True)
|
|
31
45
|
app_config = cli_config.get_app()
|
|
32
|
-
|
|
33
|
-
|
|
46
|
+
cli_app.add_typer(app_config, name="config")
|
|
47
|
+
cli_app.add_typer(app_config, name="c", hidden=True)
|
|
34
48
|
app_data = cli_data.get_app()
|
|
35
|
-
|
|
36
|
-
|
|
49
|
+
cli_app.add_typer(app_data, name="data")
|
|
50
|
+
cli_app.add_typer(app_data, name="d", hidden=True)
|
|
37
51
|
app_self = cli_self.get_app()
|
|
38
|
-
|
|
39
|
-
|
|
52
|
+
cli_app.add_typer(app_self, name="self")
|
|
53
|
+
cli_app.add_typer(app_self, name="s", hidden=True)
|
|
40
54
|
app_nw = cli_network.get_app()
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
55
|
+
cli_app.add_typer(app_nw, name="network")
|
|
56
|
+
cli_app.add_typer(app_nw, name="n", hidden=True)
|
|
57
|
+
|
|
58
|
+
cli_app.command("execute", no_args_is_help=True, help=run_py_script_module.__doc__,
|
|
59
|
+
short_help="▶️ [e] Execute python/shell scripts from pre-defined directories or as command",
|
|
60
|
+
context_settings={"show_help_on_error": True})(run_py_script_module.run_py_script)
|
|
61
|
+
cli_app.command("e", no_args_is_help=True, help=run_py_script_module.__doc__, hidden=True)(run_py_script_module.run_py_script)
|
|
62
|
+
|
|
63
|
+
return cli_app
|
|
44
64
|
|
|
45
65
|
|
|
46
66
|
def main():
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
#!/usr/bin/env -S uv run --script
|
|
2
|
+
# /// script
|
|
3
|
+
# requires-python = ">=3.13"
|
|
4
|
+
# dependencies = [
|
|
5
|
+
# "machineconfig>=8.14",
|
|
6
|
+
# "textual",
|
|
7
|
+
# "pyperclip",
|
|
8
|
+
# ]
|
|
9
|
+
# ///
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import platform
|
|
15
|
+
from collections.abc import Mapping
|
|
16
|
+
from typing import Final
|
|
17
|
+
|
|
18
|
+
from rich.text import Text
|
|
19
|
+
from textual import on
|
|
20
|
+
from textual.app import App, ComposeResult
|
|
21
|
+
from textual.binding import Binding
|
|
22
|
+
from textual.containers import Horizontal, Vertical
|
|
23
|
+
from textual.widgets import Footer, Header, Label, ListItem, ListView, Static
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
VALUE_PREVIEW_LIMIT: Final[int] = 4096
|
|
27
|
+
SUMMARY_LIMIT: Final[int] = 96
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def truncate_text(text: str, limit: int) -> tuple[str, int]:
|
|
31
|
+
length = len(text)
|
|
32
|
+
if length <= limit:
|
|
33
|
+
return text, 0
|
|
34
|
+
return text[:limit], length - limit
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def format_summary(env_key: str, env_value: str, limit: int) -> str:
|
|
38
|
+
sanitized = env_value.replace("\n", "\\n").replace("\t", "\\t")
|
|
39
|
+
preview, remainder = truncate_text(sanitized, limit)
|
|
40
|
+
if preview == "":
|
|
41
|
+
base = f"{env_key} = <empty>"
|
|
42
|
+
else:
|
|
43
|
+
base = f"{env_key} = {preview}"
|
|
44
|
+
if remainder == 0:
|
|
45
|
+
return base
|
|
46
|
+
return f"{base}... (+{remainder} chars)"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def collect_environment(env: Mapping[str, str]) -> list[tuple[str, str]]:
|
|
50
|
+
return sorted(env.items(), key=lambda pair: pair[0].lower())
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class EnvListItem(ListItem):
|
|
54
|
+
def __init__(self, env_key: str, summary: str) -> None:
|
|
55
|
+
super().__init__(Label(summary))
|
|
56
|
+
self._env_key = env_key
|
|
57
|
+
|
|
58
|
+
def env_key(self) -> str:
|
|
59
|
+
return self._env_key
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class EnvValuePreview(Static):
|
|
63
|
+
def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def]
|
|
64
|
+
super().__init__(*args, **kwargs)
|
|
65
|
+
self.border_title = "Environment Value"
|
|
66
|
+
|
|
67
|
+
def show_value(self, env_key: str, env_value: str) -> None:
|
|
68
|
+
preview, remainder = truncate_text(env_value, VALUE_PREVIEW_LIMIT)
|
|
69
|
+
text = Text()
|
|
70
|
+
text.append(f"{env_key}\n\n", style="bold cyan")
|
|
71
|
+
if preview == "":
|
|
72
|
+
text.append("<empty>", style="dim")
|
|
73
|
+
else:
|
|
74
|
+
text.append(preview)
|
|
75
|
+
if remainder > 0:
|
|
76
|
+
text.append(f"\n... truncated {remainder} characters", style="yellow")
|
|
77
|
+
self.update(text)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class StatusBar(Static):
|
|
81
|
+
def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def]
|
|
82
|
+
super().__init__(*args, **kwargs)
|
|
83
|
+
self.border_title = "Status"
|
|
84
|
+
|
|
85
|
+
def show_message(self, message: str, level: str) -> None:
|
|
86
|
+
palette = {
|
|
87
|
+
"info": "cyan",
|
|
88
|
+
"success": "green",
|
|
89
|
+
"warning": "yellow",
|
|
90
|
+
"error": "red",
|
|
91
|
+
}
|
|
92
|
+
color = palette.get(level, "white")
|
|
93
|
+
self.update(f"[{color}]{message}[/{color}]")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class EnvExplorerApp(App[None]):
|
|
97
|
+
CSS = """
|
|
98
|
+
Screen { background: $surface; }
|
|
99
|
+
Header { background: $primary; color: $text; }
|
|
100
|
+
Footer { background: $panel; }
|
|
101
|
+
#main-container { height: 100%; }
|
|
102
|
+
#left-panel { width: 50%; height: 100%; border: solid $primary; padding: 1; }
|
|
103
|
+
#right-panel { width: 50%; height: 100%; border: solid $accent; padding: 1; }
|
|
104
|
+
ListView { height: 1fr; border: solid $accent; background: $surface; }
|
|
105
|
+
ListView > ListItem { padding: 0 1; }
|
|
106
|
+
EnvValuePreview { height: 1fr; border: solid $primary; background: $surface; padding: 1; overflow-y: auto; }
|
|
107
|
+
StatusBar { height: 3; border: solid $success; background: $surface; padding: 1; }
|
|
108
|
+
Label { padding: 0 1; height: auto; }
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
BINDINGS = [
|
|
112
|
+
Binding("q", "quit", "Quit", show=True),
|
|
113
|
+
Binding("r", "refresh", "Refresh", show=True),
|
|
114
|
+
Binding("c", "copy_entry", "Copy", show=True),
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
def __init__(self) -> None:
|
|
118
|
+
super().__init__()
|
|
119
|
+
self._env_pairs: list[tuple[str, str]] = []
|
|
120
|
+
self._env_lookup: dict[str, str] = {}
|
|
121
|
+
self._selected_key: str = ""
|
|
122
|
+
|
|
123
|
+
def compose(self) -> ComposeResult:
|
|
124
|
+
platform_name = platform.system()
|
|
125
|
+
yield Header(show_clock=True)
|
|
126
|
+
with Horizontal(id="main-container"):
|
|
127
|
+
with Vertical(id="left-panel"):
|
|
128
|
+
yield Label(f"🌐 Environment Variables ({platform_name})")
|
|
129
|
+
yield ListView(id="env-list")
|
|
130
|
+
with Vertical(id="right-panel"):
|
|
131
|
+
yield EnvValuePreview(id="preview")
|
|
132
|
+
yield StatusBar(id="status")
|
|
133
|
+
yield Footer()
|
|
134
|
+
|
|
135
|
+
def on_mount(self) -> None:
|
|
136
|
+
self.title = "Environment Explorer"
|
|
137
|
+
self.sub_title = f"Platform: {platform.system()}"
|
|
138
|
+
self._reload_environment()
|
|
139
|
+
self._status().show_message("Ready. Select a variable to preview its value.", "info")
|
|
140
|
+
|
|
141
|
+
def _reload_environment(self) -> None:
|
|
142
|
+
self._env_pairs = collect_environment(os.environ)
|
|
143
|
+
self._env_lookup = dict(self._env_pairs)
|
|
144
|
+
self._populate_list()
|
|
145
|
+
|
|
146
|
+
def _populate_list(self) -> None:
|
|
147
|
+
list_view = self.query_one("#env-list", ListView)
|
|
148
|
+
list_view.clear()
|
|
149
|
+
for env_key, env_value in self._env_pairs:
|
|
150
|
+
summary = format_summary(env_key, env_value, SUMMARY_LIMIT)
|
|
151
|
+
list_view.append(EnvListItem(env_key, summary))
|
|
152
|
+
self._status().show_message(f"Loaded {len(self._env_pairs)} environment variables.", "success")
|
|
153
|
+
|
|
154
|
+
def _status(self) -> StatusBar:
|
|
155
|
+
return self.query_one("#status", StatusBar)
|
|
156
|
+
|
|
157
|
+
def _preview(self) -> EnvValuePreview:
|
|
158
|
+
return self.query_one("#preview", EnvValuePreview)
|
|
159
|
+
|
|
160
|
+
@on(ListView.Highlighted)
|
|
161
|
+
def handle_highlight(self, event: ListView.Highlighted) -> None:
|
|
162
|
+
if not isinstance(event.item, EnvListItem):
|
|
163
|
+
return
|
|
164
|
+
env_key = event.item.env_key()
|
|
165
|
+
env_value = self._env_lookup.get(env_key, "")
|
|
166
|
+
self._preview().show_value(env_key, env_value)
|
|
167
|
+
self._status().show_message(f"Previewing {env_key}", "info")
|
|
168
|
+
|
|
169
|
+
@on(ListView.Selected)
|
|
170
|
+
def handle_selection(self, event: ListView.Selected) -> None:
|
|
171
|
+
if not isinstance(event.item, EnvListItem):
|
|
172
|
+
return
|
|
173
|
+
env_key = event.item.env_key()
|
|
174
|
+
self._selected_key = env_key
|
|
175
|
+
env_value = self._env_lookup.get(env_key, "")
|
|
176
|
+
self._preview().show_value(env_key, env_value)
|
|
177
|
+
self._status().show_message(f"Selected {env_key}", "success")
|
|
178
|
+
|
|
179
|
+
def action_refresh(self) -> None:
|
|
180
|
+
self._reload_environment()
|
|
181
|
+
self._status().show_message("Environment reloaded.", "success")
|
|
182
|
+
|
|
183
|
+
def action_copy_entry(self) -> None:
|
|
184
|
+
if self._selected_key == "":
|
|
185
|
+
self._status().show_message("No variable selected.", "warning")
|
|
186
|
+
return
|
|
187
|
+
env_value = self._env_lookup.get(self._selected_key, "")
|
|
188
|
+
payload = f"{self._selected_key}={env_value}"
|
|
189
|
+
try:
|
|
190
|
+
import pyperclip # type: ignore[import]
|
|
191
|
+
|
|
192
|
+
pyperclip.copy(payload)
|
|
193
|
+
self._status().show_message(f"Copied {self._selected_key} to clipboard.", "success")
|
|
194
|
+
except ImportError:
|
|
195
|
+
self._status().show_message("pyperclip unavailable. Install it for clipboard support.", "warning")
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def main() -> None:
|
|
199
|
+
app = EnvExplorerApp()
|
|
200
|
+
app.run()
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
if __name__ == "__main__":
|
|
204
|
+
main()
|