Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ jobs:
sudo apt-get update -y
sudo apt-get install snapd fish csh nushell -y
elif [ "${{ runner.os }}" = "macOS" ]; then
brew update
if [[ "${{ matrix.py }}" == brew@* ]]; then
PY=$(echo '${{ matrix.py }}' | cut -c 6-)
brew install python@$PY || brew upgrade python@$PY
Expand Down
3 changes: 3 additions & 0 deletions docs/changelog/2910.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Resolve Nushell activation script deprecation warnings by dynamically selecting the ``--optional`` flag for Nushell
``get`` command on version 0.106.0 and newer, while retaining the deprecated ``-i`` flag for older versions to maintain
compatibility. Contributed by :user:`gaborbernat`.
121 changes: 47 additions & 74 deletions src/virtualenv/activation/nushell/activate.nu
Original file line number Diff line number Diff line change
@@ -1,106 +1,79 @@
# virtualenv activation module
# Activate with `overlay use activate.nu`
# Deactivate with `deactivate`, as usual
# virtualenv activation module:
# - Activate with `overlay use activate.nu`
# - Deactivate with `deactivate`, as usual
#
# To customize the overlay name, you can call `overlay use activate.nu as foo`,
# but then simply `deactivate` won't work because it is just an alias to hide
# the "activate" overlay. You'd need to call `overlay hide foo` manually.
# To customize the overlay name, you can call `overlay use activate.nu as foo`, but then simply `deactivate` won't work
# because it is just an alias to hide the "activate" overlay. You'd need to call `overlay hide foo` manually.

# Warn users who accidentally 'source' it
module warning {
export-env {
const file = path self
error make -u {
msg: $"`($file | path basename)` is meant to be used with `overlay use`, not `source`"
}
}
export-env {
const file = path self
error make -u {
msg: $"`($file | path basename)` is meant to be used with `overlay use`, not `source`"
}
}

}

use warning

export-env {

let nu_ver = (version | get version | split row '.' | take 2 | each { into int })
if $nu_ver.0 == 0 and $nu_ver.1 < 106 {
error make {
msg: 'virtualenv Nushell activation requires Nushell 0.106 or greater.'
}
}

def is-string [x] {
($x | describe) == 'string'
}

def has-env [...names] {
$names | each {|n|
$n in $env
} | all {|i| $i == true}
$names | each {|n| $n in $env } | all {|i| $i }
}

# Emulates a `test -z`, but better as it handles e.g 'false'
def is-env-true [name: string] {
if (has-env $name) {
# Try to parse 'true', '0', '1', and fail if not convertible
let parsed = (do -i { $env | get $name | into bool })
if ($parsed | describe) == 'bool' {
$parsed
if (has-env $name) {
let val = ($env | get --optional $name)
if ($val | describe) == 'bool' {
$val
} else {
not ($val | is-empty)
}
} else {
not ($env | get -i $name | is-empty)
false
}
} else {
false
}
}

let virtual_env = __VIRTUAL_ENV__
let bin = __BIN_NAME__

let is_windows = ($nu.os-info.family) == 'windows'
let path_name = (if (has-env 'Path') {
'Path'
} else {
'PATH'
}
)

let path_name = if (has-env 'Path') { 'Path' } else { 'PATH' }
let venv_path = ([$virtual_env $bin] | path join)
let new_path = ($env | get $path_name | prepend $venv_path)

# If there is no default prompt, then use the env name instead
let virtual_env_prompt = (if (__VIRTUAL_PROMPT__ | is-empty) {
let virtual_env_prompt = if (__VIRTUAL_PROMPT__ | is-empty) {
($virtual_env | path basename)
} else {
__VIRTUAL_PROMPT__
})

let new_env = {
$path_name : $new_path
VIRTUAL_ENV : $virtual_env
VIRTUAL_ENV_PROMPT : $virtual_env_prompt
}

let new_env = (if (is-env-true 'VIRTUAL_ENV_DISABLE_PROMPT') {
$new_env
let new_env = { $path_name: $new_path VIRTUAL_ENV: $virtual_env VIRTUAL_ENV_PROMPT: $virtual_env_prompt }
let old_prompt_command = if (has-env 'PROMPT_COMMAND') { $env.PROMPT_COMMAND } else { '' }
let new_env = if (is-env-true 'VIRTUAL_ENV_DISABLE_PROMPT') {
$new_env
} else {
# Creating the new prompt for the session
let virtual_prefix = $'(char lparen)($virtual_env_prompt)(char rparen) '

# Back up the old prompt builder
let old_prompt_command = (if (has-env 'PROMPT_COMMAND') {
$env.PROMPT_COMMAND
} else {
''
})

let new_prompt = (if (has-env 'PROMPT_COMMAND') {
if 'closure' in ($old_prompt_command | describe) {
{|| $'($virtual_prefix)(do $old_prompt_command)' }
} else {
{|| $'($virtual_prefix)($old_prompt_command)' }
}
} else {
{|| $'($virtual_prefix)' }
})

$new_env | merge {
PROMPT_COMMAND : $new_prompt
VIRTUAL_PREFIX : $virtual_prefix
}
})

# Environment variables that will be loaded as the virtual env
let virtual_prefix = $'(char lparen)($virtual_env_prompt)(char rparen) '
let new_prompt = if (has-env 'PROMPT_COMMAND') {
if ('closure' in ($old_prompt_command | describe)) {
{|| $'($virtual_prefix)(do $old_prompt_command)' }
} else {
{|| $'($virtual_prefix)($old_prompt_command)' }
}
} else {
{|| $'($virtual_prefix)' }
}
$new_env | merge { PROMPT_COMMAND: $new_prompt VIRTUAL_PREFIX: $virtual_prefix }
}
load-env $new_env
}

Expand Down
Loading