Port before v0.60/virtual_environments (#849)

This PR is part of porting all old scripts #221 and includes the
`virtual_environments` module

## 5 files changed

- `conda.nu`: removed, already in
`modules/virtual_enviromnents/conda/nu_conda.nu`
- `conda_deactivate.nu`: also removed, has already been merged with
`nu_conda.nu`
- `README.nu`: removed, similar info in
`modules/virtual_enviromnents/README.md`

- `venv.nu`: ported to `modules/virtual_enviromnents/venv/venv.nu`
- `venv_deactivate.nu`: ported to
`modules/virtual_enviromnents/venv/venv_deactivate.nu`
This commit is contained in:
Igor 2024-05-26 21:38:00 +04:00 committed by GitHub
parent 275a0f8f26
commit 840d723d89
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 25 additions and 142 deletions

View File

@ -1,53 +0,0 @@
# Virtual environment scripts
The scripts in this directory activate virtual environments like Python venvs
and Conda environments. They follow the pattern described in the [Nushell 0.32
changelog](https://www.nushell.sh/blog/2021-06-01-nushell_0_32.html#environment-loading-lily-mara):
```
$ load-env (activate some-env)
```
A custom command (`activate`) creates a table with environment variables and
`load-env` is used to load it into the shell's scope.
In most cases, deactivation is a matter of restoring the PATH variable to the
state before activating the env and removing any additional variables. There are
no environment-specific elements to this, which is why the same deactivation
script can be used for deactivating any environment of a specific type. For
example, `source conda_deactivate.nu` will deactivate any Conda env, there are
no input parameters.
## Expected Usage
1. Source an activation script in your `config.toml`. For example, `conda.nu`.
You'll then have the `conda-env` command available.
2. Create an alias for sourcing the appropriate deactivation script:
`alias conda-deactivate = source /path/to/conda_deactivate.nu`
3. Activate with `load-env (conda-env env-name)`. You might want to define some
shorter aliases for both commands, if typing that every time seems like a
hassle.
4. If you're using [Starship](https://starship.rs/), your prompt should reflect the activated env.
5. When done, deactivate with your alias: `conda-deactivate`.
Look at the script files to find the exact command name for creating an environment table.
## `conda.nu`
Limitations:
- The "root_prefix" might not actually correspond to the correct path to the Conda envs. You can fix
this for your setup by changing how the root prefix is found in the `conda-env` command.
- Nested envs are not well supported. If you activate a Conda env while another one is
activated, new elements will be appended to the PATH, but the other environment
variables will be overwritten. There's no way to then restore the PATH to the state
it was in before activating the *first* env (at least not with this script directly).
- The prompt is not updated by the script. Consider using [Starship](https://starship.rs/)
with the Python prompt element.
## `venv.nu`
Limitations:
- The prompt is not updated by the script. Consider using [Starship](https://starship.rs/)
with the Python prompt element.

View File

@ -1,45 +0,0 @@
def conda-env [env-name] {
let conda-info = (conda info --envs --json | from json)
let suffix = (if $env-name == "base" {""} {(["envs" $env-name] | path join)})
let env-dir = ([$conda-info.root_prefix $suffix] | path join)
let old-path = ($nu.path | str collect (path-sep))
let new-path = (if (windows?) { (conda-create-path-windows $env-dir) } { (conda-create-path-unix $env-dir) })
let new-env = [[name, value];
[CONDA_DEFAULT_ENV $env-name]
[CONDA_PREFIX $env-dir]
[CONDA_PROMPT_MODIFIER $"[($env-name)]"]
[CONDA_SHLVL "1"]
[CONDA_OLD_PATH $old-path]]
$new-env | append $new-path
}
def conda-create-path-windows [env-dir] {
# 1. Conda on Windows needs a few additional Path elements
# 2. The path env var on Windows is called Path (not PATH)
let env-path = [
$env-dir
([$env-dir "Scripts"] | path join)
([$env-dir "Library" "mingw-w64"] | path join)
([$env-dir "Library" "bin"] | path join)
([$env-dir "Library" "usr" "bin"] | path join)
]
let new-path = ([$env-path $nu.path] | flatten | str collect (path-sep))
[[name, value]; [Path $new-path]]
}
def conda-create-path-unix [env-dir] {
let env-path = [
([$env-dir "bin"] | path join)
]
let new-path = ([$env-path $nu.path] | flatten | str collect (path-sep))
[[name, value]; [PATH $new-path]]
}
def windows? [] {
(sys).host.name == "Windows"
}
def path-sep [] {
if (windows?) { ";" } { ":" }
}

View File

@ -1,7 +0,0 @@
let path-name = (if ((sys).host.name == "Windows") { "Path" } { "PATH" })
let-env $path-name = $nu.env.CONDA_OLD_PATH
unlet-env CONDA_PROMPT_MODIFIER
unlet-env CONDA_PREFIX
unlet-env CONDA_SHLVL
unlet-env CONDA_DEFAULT_ENV
unlet-env CONDA_OLD_PATH

View File

@ -1,33 +0,0 @@
def venv [venv-dir] {
let venv-abs-dir = ($venv-dir | path expand)
let venv-name = ($venv-abs-dir | path basename)
let old-path = ($nu.path | str collect (path-sep))
let new-path = (if (windows?) { (venv-path-windows $venv-abs-dir) } { (venv-path-unix $venv-abs-dir) })
let new-env = [[name, value];
[VENV_OLD_PATH $old-path]
[VIRTUAL_ENV $venv-name]]
$new-env | append $new-path
}
def venv-path-unix [venv-dir] {
let venv-path = ([$venv-dir "bin"] | path join)
let new-path = ($nu.path | prepend $venv-path | str collect (path-sep))
[[name, value]; [PATH $new-path]]
}
def venv-path-windows [venv-dir] {
# 1. Conda on Windows needs a few additional Path elements
# 2. The path env var on Windows is called Path (not PATH)
let venv-path = ([$venv-dir "Scripts"] | path join)
let new-path = ($nu.path | prepend $venv-path | str collect (path-sep))
[[name, value]; [Path $new-path]]
}
def windows? [] {
(sys).host.name == "Windows"
}
def path-sep [] {
if (windows?) { ";" } { ":" }
}

View File

@ -1,4 +0,0 @@
let path-name = (if ((sys).host.name == "Windows") { "Path" } { "PATH" })
let-env $path-name = $nu.env.VENV_OLD_PATH
unlet-env VIRTUAL_ENV
unlet-env VENV_OLD_PATH

View File

@ -0,0 +1,25 @@
export def --env activate [venv_dir] {
let venv_abs_dir = ($venv_dir | path expand)
let venv_name = ($venv_abs_dir | path basename)
let old_path = $env.PATH
let new_path = (venv-path $venv_abs_dir)
let new_env = ({VENV_OLD_PATH: $old_path, VIRTUAL_ENV: $venv_name} | merge $new_path)
load-env $new_env
}
def "venv-path" [venv_dir] {
let env_path = [
$venv_dir,
([$venv_dir, "bin"] | path join)
]
return {
PATH: ($env.PATH | prepend $env_path)
}
}
export def --env deactivate [] {
$env.PATH = $env.VENV_OLD_PATH
hide-env VIRTUAL_ENV
hide-env VENV_OLD_PATH
}