about summary refs log tree commit diff
path: root/Completion/Unix/Command/_pip
blob: bafc7f9e91910b5c4407e6129c2e9ffc565db624 (plain) (blame)
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#compdef -P pip[0-9.]#

# To get completion of installable packages, do:
#     pip install pip-cache
# and then run:
#     pip-cache update

local curcontext="$curcontext" ret=1
local -a state state_descr line
local -A opt_args
local python pip
local -a args subcommands packages

pip=${words[1]}
python=${${pip}/pip/python}
[[ $python == $pip ]] && python=python

args=(
  '(* : -)'{-h,--help}'[display usage information]'
  '--isolated[ignore environment variables and user configuration]'
  \*{-v,--verbose}'[give more output]'
  \*{-q,--quiet}"[give less output]"
  '--log=[specify log file where a complete record will be kept]:file:_files'
  '--proxy=[specify a proxy]:proxy ([user\:passwd@]proxy.server\:port)'
  '--retries=[specify maximum number of retries each connection should attempt]:retries [5]'
  '--timeout=[set the socket timeout]:timeout (seconds) [15]'
  '--exists-action=[specify action when a path already exists]:action:((s\:switch i\:ignore w\:wipe b\:backup a\:abort))'
  '--cert=[specify path to alternate CA bundle]:path:_files'
  '--client-cert=[specify path to SSL client certificate]:certificate file:_files'
  '(--no-cache-dir)--cache-dir=[specify location to store the cache data]: :_directories'
  '(--cache-dir)--no-cache-dir[disable the cache]'
  "--disable-pip-version-check[don't check whether a new version of pip is available]"
)

subcommands=(
  'install:install packages'
  'download:download packages'
  'uninstall:uninstall packages'
  'freeze:output installed packages in requirements format'
  'list:list installed packages'
  'show:show information about installed packages'
  'check:verify installed packages have compatible dependencies'
  'search:search PyPI for packages'
  'wheel:build wheels from your requirements'
  'hash:compute hashes of package archives'
  'help:show available commands'
)

_arguments -C $args \
  '(* : -)'{-V,--version}'[display version information]' \
  ':subcommand:->subcommand' \
  '*::options:->options' && ret=0

case $state in
  subcommand)
    _describe -t subcommands 'pip subcommand' subcommands && ret=0
  ;;

  options)
    curcontext="${curcontext%:*}-$words[2]:"

    case $words[1] in
      download|install|list|wheel)
        args+=(
          '--pre[include pre-release and development versions]'
          '(-i --index-url)'{-i+,--index-url=}'[base URL of Python Package Index]:url:_urls'
          '--extra-index-url=[extra URLs of package indexes to use in addition to --index-url]:url:_urls'
          '--no-index[ignore package index (only looking at --find-links URLs instead)]'
          '(-f --find-links)'{-f+,--find-links=}'[parse specified URL or HTML file for links to packages]:URL or file:_files -g "*.htm(|l)(-.)"'
          '--process-dependency-links[enable the processing of dependency links]'
        )
      ;|
      download|(un|)install|freeze|wheel)
        args+=(
          '(-r --requirement)'{-r+,--requirement=}'[all the packages listed in the given requirements file]:requirements file:_files -g "(requirement*|*.txt)(-.)"'
        )
      ;|
      download|install|wheel)
        args+=(
          '!--use-wheel' '!--no-use-wheel'
          "*--no-binary=[don't use binary packages]: :->package_list"
          "*--only-binary=[don't use source packages]: :->package_list"
          \*{-c+,--constraint=}'[constrain versions using the given constraints file]:constraints file:_files'
          '(-e --editable)'{-e+,--editable=}'[install a package directly from a checkout]:directory or VCS+REPOS_URL[@REV]#egg=PACKAGE:_files -/'
          '--src=[check out --editable packages into given directory]: :_directories'
          '--ignore-requires-python[ignore the Requires-Python information]'
          "--no-deps[don't install package dependencies]"
          '(-b --build)'{-https://cloud.kiddleb+,--build=}'[specify directory to unpack packages into]: :_directories'
          '--global-option=[extra global options to be supplied to the setup.py call before the install command]:options'
          "--no-clean[don't clean up build directories]"
          '--require-hashes[require a hash to check each requirement against]'
        )
      ;|

      download)
        args+=(
          '(-d --dest)'{-d+,--dest=}'[download packages into given directory]: :_directories'
          '--platform=[only download wheels compatible with platform]::platform'
          '--python-version=[only download wheels compatible with specified Python interpreter version]:version'
          '--implementation=[only download wheels compatible with specified Python implementation]:implementation:(pp jy cp ip py)'
        )
      ;;

      install)
        args+=(
          '(-t --target)'{-t+,--target=}'[specify directory to install packages into]: :_directories'
          '(-d --download)'{-d+,--download=}'[download packages into directory instead of installing them]: :_directories'
          '(-U --upgrade)'{-U,--upgrade}'[upgrade all packages to the newest available version]'
          '--upgrade-strategy=[determine how dependency upgrading should be handled]:strategy:(eager only-if-needed)'
          '--force-reinstall[when upgrading, reinstall all packages even if they are already up-to-date]'
          '(-I --ignore-installed)'{-I,--ignore-installed}'[ignore installed packages]'
          "--no-install[download and unpack all packages, but don't actually install them]"
          "--no-download[don't download any packages, just install the ones already downloaded]"
          '--install-option=[extra arguments to be supplied to the setup.py install command]:options'
          '--user[install to the user install directory, typically ~/.local]'
          '--egg[install as self contained egg file, like easy_install does]'
          '--root=[install everything relative to this alternate root directory]: :_directories'
          '--strip-file-prefix=[strip given prefix from script paths in wheel RECORD]:prefix'
          '--prefix=[specify installation prefix where lib, bin and other top-level folders are placed]: :_directories'
          '(--no-compile)--compile[compile py files to pyc]'
          "(--compile)--no-compile[don't compile py files to pyc]"
          '*:package name:->packages_or_dirs'
        )
      ;;

      uninstall)
        args+=(
          '(-y --yes)'{-y,--yes}"[don't ask for confirmation of uninstall deletions]"
          ':installed package:->installed_packages'
        )
      ;;

      freeze)
        args+=(
          '(-f --find-links)'{-f+,--find-links=}'[specify URL to look for packages at]:url:_urls'
          '(-l --local)'{-l,--local}"[if in a virtualenv that has global access, don't list globally-installed packages]"
          '--user[only output packages installed in user-site]'
          '--all[include pip, setuptools, distribute and wheel in output]'
        )
      ;;

      hash)
        args+=(
          '(-a  --algorithm)'{-a+,--algorithm=}'[specify hash algorithm]:algorithm:(sha256 sha384 sha512)'
          '*: :_files'
        )
      ;;

      list)
        args+=(
          '(-o --outdated -u --uptodate)'{-o,--outdated}'[list outdated packages (excluding editables)]'
          '(-u --uptodate -o --outdated)'{-u,--uptodate}'[list uptodated packages (excluding editables)]'
          '(-e --editable)'{-e,--editable}'[list editable projects]'
          '(-l --local)'{-l,--local}"[if in a virtualenv that has global access, don't list globally-installed packages]"
          '--user[only output packages installed in user-site]'
          '--format=[select the output format]:format [legacy]:(legacy columns freeze json)'
          '--not-required[list packages that are not dependencies of installed packages]'
        )
      ;;

      show)
        args+=(
          '(-f --files)'{-f,--files}'[show the full list of installed files for each package]'
          ':installed package:->installed_packages'
        )
      ;;

      search)
        args+=(
          '(-i --index)'{-i+,--index=}'[specify base URL of Python Package Index]:URL:_urls'
        )
      ;;

      wheel)
        args+=(
          '(-w --wheel-dir)'{-w+,--wheel-dir=}"[build wheels into given directory]: :_directories"
          "--build-option=[extra arguments to be supplied to 'setup.py bdist_wheel']:options"
        )
      ;;

      help)
        _describe -t subcommands 'pip subcommand' subcommands
        return
      ;;

      *) args+=( '*: :_default' ) ;;
    esac

    _arguments -s -S $args && ret=0

    case $state in
      package_list)
        packages=( ${(f)"$(_call_program packages pip-cache pkgnames)"} )
        _sequence _wanted packages expl package compadd - -a packages && ret=0
      ;;

      packages_or_dirs)
        [[ -prefix - ]] || packages=( ${(f)"$(_call_program packages pip-cache pkgnames)"} )
        _alternative \
          'all-packages:package:compadd -a packages' \
          'directories:directory with setup.py:_directories' && ret=0
      ;;

      installed_packages)
        packages=( $(_call_program fetch-installed \
          "env COMP_WORDS='pip uninstall' COMP_CWORD=2 PIP_AUTO_COMPLETE=1 $pip") )
        _wanted installed-packages expl 'installed package' compadd -a packages && ret=0
      ;;
    esac
  ;;
esac

return ret