diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 2d61621a6..71264b2f6 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -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 diff --git a/docs/changelog/2910.bugfix.rst b/docs/changelog/2910.bugfix.rst new file mode 100644 index 000000000..ec994c828 --- /dev/null +++ b/docs/changelog/2910.bugfix.rst @@ -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`. diff --git a/src/virtualenv/activation/nushell/activate.nu b/src/virtualenv/activation/nushell/activate.nu index 1d7ff54f7..7f43071f7 100644 --- a/src/virtualenv/activation/nushell/activate.nu +++ b/src/virtualenv/activation/nushell/activate.nu @@ -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 }