-
Notifications
You must be signed in to change notification settings - Fork 203
/
python-venv.nu
100 lines (84 loc) · 2.66 KB
/
python-venv.nu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
###
# An example auto-venv module.
# Copy this into `~/your/project/__auto-venv.nu` (or whatever you named your trigger file)
# adapted from https://github.com/pypa/virtualenv/blob/46f68d67c79f2280554f47f3c21265b3a1e899a4/src/virtualenv/activation/nushell/activate.nu
export def-env auto-venv-on-enter [
_env: record,
] {
def is-string [x] {
($x | describe) == 'string'
}
def has-env [name: string] {
$name in ($_env)
}
let virtual_env = (path_extensions path find-sub ($_env.PWD | into string) '.venv')
let bin = ([$virtual_env, "bin"] | path join)
let virtual_prompt = ""
let is_windows = ((sys).host.name | str downcase) == 'windows'
let path_name = if $is_windows {
if (has-env 'Path') {
'Path'
} else {
'PATH'
}
} else {
'PATH'
}
let path_sep = (if $nu.os-info.name == "windows" {
'\'
}
else {
'/'
})
let old_path = (
if $is_windows {
if (has-env 'Path') {
$_env.Path
} else {
$_env.PATH
}
} else {
$_env.PATH
} | if (is-string $in) {
# if Path/PATH is a string, make it a list
$in | split row $path_sep | path expand
} else {
$in
}
)
let venv_path = ([$virtual_env $bin] | path join)
# let new_path = ($old_path | prepend $venv_path | str join $path_sep)
let new_path = ($old_path | prepend $venv_path)
# Creating the new prompt for the session
let virtual_prompt = if ($virtual_prompt == '') {
$'(char lparen)($virtual_env | path split | drop 1 | path join | path basename)(char rparen) '
} else {
'(' + $virtual_prompt + ') '
}
let old_prompt_command = if (has-env 'PROMPT_COMMAND') {
$_env.PROMPT_COMMAND
} else {
''
}
# If there is no default prompt, then only the env is printed in the prompt
let new_prompt = if (has-env 'PROMPT_COMMAND') {
if (($old_prompt_command | describe) in ['block', 'closure']) {
$'($virtual_prompt)(do $old_prompt_command)'
} else {
$'($virtual_prompt)($old_prompt_command)'
}
} else {
$'($virtual_prompt)'
}
# Environment variables that will be batched loaded to the virtual env
let new_env = {
$path_name : $new_path
VIRTUAL_ENV : $virtual_env
PROMPT_COMMAND : $new_prompt
VIRTUAL_PROMPT : $virtual_prompt
}
# Activate the environment variables
load-env $new_env
}
export alias pydoc = python -m pydoc
export alias pip = python -m pip