zsh-workers
 help / color / mirror / code / Atom feed
From: Oliver Kiddle <opk@zsh.org>
To: Zsh workers <zsh-workers@zsh.org>
Subject: PATCH: new (old) pip completion
Date: Sat, 18 Dec 2021 00:51:25 +0100	[thread overview]
Message-ID: <59700-1639785085.018529@R__q.WtE0.NkUI> (raw)

A pip completion was posted in workers/34928 back in 2015 by Daniel
Hahler but was never applied. I contacted him and he sent me his most
recent version of it and this is based on that. Pypi's XML-RPC interface
appears to be dead so I ripped that out entirely. For completing
available packages, there is a pip package named pip-cache that appears
to have been created with the bash completion in mind and using it is
very easy. Other methods could potentially be added, e.g. if they fix
pip search.

Oliver

diff --git a/Completion/Unix/Command/_pip b/Completion/Unix/Command/_pip
new file mode 100644
index 000000000..bafc7f9e9
--- /dev/null
+++ b/Completion/Unix/Command/_pip
@@ -0,0 +1,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


                 reply	other threads:[~2021-12-17 23:51 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=59700-1639785085.018529@R__q.WtE0.NkUI \
    --to=opk@zsh.org \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).