summaryrefslogtreecommitdiff
path: root/src/virtualenv
diff options
context:
space:
mode:
authorFernando Herrera <fernando.j.herrera@gmail.com>2021-09-16 13:10:42 +0100
committerGitHub <noreply@github.com>2021-09-16 13:10:42 +0100
commite0410cafc8feedf72562174dee983fc709a5a36e (patch)
treed3043a56eeec1982b0157b9f7a9fe84085814ee5 /src/virtualenv
parent1cc503bfadc2c0e8c3ecac6c0a3f430ee601d9a0 (diff)
downloadvirtualenv-e0410cafc8feedf72562174dee983fc709a5a36e.tar.gz
Nushell activation scripts (#2170)
Diffstat (limited to 'src/virtualenv')
-rw-r--r--src/virtualenv/activation/__init__.py2
-rw-r--r--src/virtualenv/activation/nushell/__init__.py28
-rw-r--r--src/virtualenv/activation/nushell/activate.nu40
-rw-r--r--src/virtualenv/activation/nushell/deactivate.nu11
4 files changed, 81 insertions, 0 deletions
diff --git a/src/virtualenv/activation/__init__.py b/src/virtualenv/activation/__init__.py
index 962cdf7..e9296d8 100644
--- a/src/virtualenv/activation/__init__.py
+++ b/src/virtualenv/activation/__init__.py
@@ -4,6 +4,7 @@ from .bash import BashActivator
from .batch import BatchActivator
from .cshell import CShellActivator
from .fish import FishActivator
+from .nushell import NushellActivator
from .powershell import PowerShellActivator
from .python import PythonActivator
@@ -14,4 +15,5 @@ __all__ = [
"PythonActivator",
"BatchActivator",
"FishActivator",
+ "NushellActivator",
]
diff --git a/src/virtualenv/activation/nushell/__init__.py b/src/virtualenv/activation/nushell/__init__.py
new file mode 100644
index 0000000..994c1fb
--- /dev/null
+++ b/src/virtualenv/activation/nushell/__init__.py
@@ -0,0 +1,28 @@
+from __future__ import absolute_import, unicode_literals
+
+import os
+
+from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_text
+
+from ..via_template import ViaTemplateActivator
+
+
+class NushellActivator(ViaTemplateActivator):
+ def templates(self):
+ yield Path("activate.nu")
+ yield Path("deactivate.nu")
+
+ def replacements(self, creator, dest_folder):
+ # Due to nushell scoping, it isn't easy to create a function that will
+ # deactivate the environment. For that reason a __DEACTIVATE_PATH__
+ # replacement pointing to the deactivate.nu file is created
+
+ return {
+ "__VIRTUAL_PROMPT__": "" if self.flag_prompt is None else self.flag_prompt,
+ "__VIRTUAL_ENV__": ensure_text(str(creator.dest)),
+ "__VIRTUAL_NAME__": creator.env_name,
+ "__BIN_NAME__": ensure_text(str(creator.bin_dir.relative_to(creator.dest))),
+ "__PATH_SEP__": ensure_text(os.pathsep),
+ "__DEACTIVATE_PATH__": ensure_text(str(Path(dest_folder) / "deactivate.nu")),
+ }
diff --git a/src/virtualenv/activation/nushell/activate.nu b/src/virtualenv/activation/nushell/activate.nu
new file mode 100644
index 0000000..f0a4da4
--- /dev/null
+++ b/src/virtualenv/activation/nushell/activate.nu
@@ -0,0 +1,40 @@
+# Setting all environment variables for the venv
+let virtual-env = "__VIRTUAL_ENV__"
+let bin = "__BIN_NAME__"
+let path-sep = "__PATH_SEP__"
+
+let old-path = ($nu.path | str collect ($path-sep))
+
+let venv-path = ([$virtual-env $bin] | path join)
+let new-path = ($nu.path | prepend $venv-path | str collect ($path-sep))
+
+# environment variables that will be batched loaded to the virtual env
+let new-env = ([
+ [name, value];
+ [PATH $new-path]
+ [_OLD_VIRTUAL_PATH $old-path]
+ [VIRTUAL_ENV $virtual-env]
+])
+
+load-env $new-env
+
+# Creating the new prompt for the session
+let virtual_prompt = (if ("__VIRTUAL_PROMPT__" != "") {
+ "__VIRTUAL_PROMPT__"
+} {
+ $virtual-env | path basename
+}
+)
+
+# If there is no default prompt, then only the env is printed in the prompt
+let new_prompt = (if ( config | select prompt | empty? ) {
+ ($"build-string '(char lparen)' '($virtual_prompt)' '(char rparen) ' ")
+} {
+ ($"build-string '(char lparen)' '($virtual_prompt)' '(char rparen) ' (config get prompt | str find-replace "build-string" "")")
+})
+let-env PROMPT_COMMAND = $new_prompt
+
+# We are using alias as the function definitions because only aliases can be
+# removed from the scope
+alias pydoc = python -m pydoc
+alias deactivate = source "__DEACTIVATE_PATH__"
diff --git a/src/virtualenv/activation/nushell/deactivate.nu b/src/virtualenv/activation/nushell/deactivate.nu
new file mode 100644
index 0000000..4052438
--- /dev/null
+++ b/src/virtualenv/activation/nushell/deactivate.nu
@@ -0,0 +1,11 @@
+# Setting the old path
+let path-name = (if ((sys).host.name == "Windows") { "Path" } { "PATH" })
+let-env $path-name = $nu.env._OLD_VIRTUAL_PATH
+
+# Unleting the environment variables that were created when activating the env
+unlet-env VIRTUAL_ENV
+unlet-env _OLD_VIRTUAL_PATH
+unlet-env PROMPT_COMMAND
+
+unalias pydoc
+unalias deactivate