From 6cc7f8a24eeb41033b0fa6f74a7559f064c06d80 Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Thu, 1 Apr 2021 13:38:33 +0800 Subject: [PATCH] change the location of completion scripts --- pdm.lock | 12 +-- pdm/cli/commands/completion.py | 18 ++-- pdm/cli/completions/__init__.py | 0 pdm/cli/completions/pdm.bash | 127 ++++++++++++++++++++++++++ pdm/cli/completions/pdm.fish | Bin 0 -> 39604 bytes pdm/cli/completions/pdm.ps1 | Bin 0 -> 7460 bytes pdm/cli/completions/{_pdm => pdm.zsh} | 0 pyproject.toml | 2 +- 8 files changed, 139 insertions(+), 20 deletions(-) create mode 100644 pdm/cli/completions/__init__.py create mode 100644 pdm/cli/completions/pdm.bash create mode 100644 pdm/cli/completions/pdm.fish create mode 100644 pdm/cli/completions/pdm.ps1 rename pdm/cli/completions/{_pdm => pdm.zsh} (100%) diff --git a/pdm.lock b/pdm.lock index 0907ace83a..e1bf205231 100644 --- a/pdm.lock +++ b/pdm.lock @@ -370,12 +370,6 @@ sections = ["test"] version = "1.10.0" summary = "library with cross-python path, ini-parsing, io, code, log facilities" -[[package]] -name = "pycomplete" -sections = ["default"] -version = "0.3.1" -summary = "A Python library to generate static completion scripts for your CLI app" - [[package]] name = "pycparser" sections = ["default"] @@ -651,7 +645,7 @@ summary = "Backport of pathlib-compatible object wrapper for zip files" [metadata] lock_version = "2" -content_hash = "sha256:fbe7d1276b7e0b9dc837a7bc67039bb678655a2a250bf816a60f3cdfb0c6c184" +content_hash = "sha256:d7a1b535fc534c81920b4cec1e68821f920dca5e2433679e558cdf7b1b83d1ad" [metadata.files] "apipkg 1.5" = [ @@ -989,10 +983,6 @@ content_hash = "sha256:fbe7d1276b7e0b9dc837a7bc67039bb678655a2a250bf816a60f3cdfb {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, ] -"pycomplete 0.3.1" = [ - {file = "pycomplete-0.3.1-py3-none-any.whl", hash = "sha256:1221dad380f3930455726847df6d5743c3c0c7e35c06436e1b1d16569a4792fb"}, - {file = "pycomplete-0.3.1.tar.gz", hash = "sha256:7f7532f7e0950e4e8c8017f89acb3f3e645cce1f164020ab9792fd5100c11211"}, -] "pycparser 2.20" = [ {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, diff --git a/pdm/cli/commands/completion.py b/pdm/cli/commands/completion.py index 5687c66d6c..e7380a3133 100644 --- a/pdm/cli/commands/completion.py +++ b/pdm/cli/commands/completion.py @@ -1,7 +1,8 @@ import argparse -import pathlib +import importlib.resources from pdm.cli.commands.base import BaseCommand +from pdm.exceptions import PdmUsageError from pdm.project import Project @@ -9,6 +10,7 @@ class Command(BaseCommand): """Generate completion scripts for the given shell""" arguments = [] + SUPPORTED_SHELLS = ("bash", "zsh", "fish", "powershell") def add_arguments(self, parser: argparse.ArgumentParser) -> None: parser.add_argument( @@ -20,12 +22,12 @@ def add_arguments(self, parser: argparse.ArgumentParser) -> None: def handle(self, project: Project, options: argparse.Namespace) -> None: import shellingham - from pycomplete import Completer shell = options.shell or shellingham.detect_shell()[0] - if shell == "zsh": - zsh_completion = pathlib.Path(__file__).parent / "../completions/_pdm" - stream.echo(zsh_completion.read_text()) - else: - completer = Completer(project.core.parser) - stream.echo(completer.render(shell)) + if shell not in self.SUPPORTED_SHELLS: + raise PdmUsageError(f"Unsupported shell: {shell}") + suffix = "ps1" if shell == "powershell" else shell + completion = importlib.resources.read_text( + "pdm.cli.completions", f"pdm.{suffix}" + ) + project.core.ui.echo(completion) diff --git a/pdm/cli/completions/__init__.py b/pdm/cli/completions/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pdm/cli/completions/pdm.bash b/pdm/cli/completions/pdm.bash new file mode 100644 index 0000000000..d8c34d2191 --- /dev/null +++ b/pdm/cli/completions/pdm.bash @@ -0,0 +1,127 @@ +# BASH completion script for pdm +# Generated by pycomplete 0.3.1 + +_pdm_74498d98b6b27a5a_complete() +{ + local cur script coms opts com + COMPREPLY=() + _get_comp_words_by_ref -n : cur words + + # for an alias, get the real script behind it + if [[ $(type -t ${words[0]}) == "alias" ]]; then + script=$(alias ${words[0]} | sed -E "s/alias ${words[0]}='(.*)'/\\1/") + else + script=${words[0]} + fi + + # lookup for command + for word in ${words[@]:1}; do + if [[ $word != -* ]]; then + com=$word + break + fi + done + + # completing for an option + if [[ ${cur} == --* ]] ; then + opts="--help --ignore-python --pep582 --verbose --version" + + case "$com" in + + (add) + opts="--dev --editable --global --help --no-sync --project --save-compatible --save-exact --save-wildcard --section --update-eager --update-reuse --verbose" + ;; + + (build) + opts="--dest --help --no-clean --no-sdist --no-wheel --project --verbose" + ;; + + (cache) + opts="--help --verbose" +;; + +(completion) +opts="--help" +;; + +(config) +opts="--delete --global --help --local --project --verbose" +;; + +(export) +opts="--dev --format --global --help --no-default --output --project --pyproject --section --verbose --without-hashes" +;; + +(import) +opts="--dev --format --global --help --project --section --verbose" +;; + +(info) +opts="--env --global --help --project --python --verbose --where" +;; + +(init) +opts="--global --help --project --verbose" +;; + +(install) +opts="--dev --global --help --no-default --no-lock --project --section --verbose" +;; + +(list) +opts="--global --graph --help --project --reverse --verbose" +;; + +(lock) +opts="--global --help --project --verbose" +;; + +(remove) +opts="--dev --global --help --no-sync --project --section --verbose" +;; + +(run) +opts="--global --help --list --project --verbose" +;; + +(search) +opts="--global --help --project --verbose" +;; + +(show) +opts="--global --help --project --verbose" +;; + +(sync) +opts="--clean --dev --dry-run --global --help --no-clean --no-default --project --section --verbose" +;; + +(update) +opts="--dev --global --help --no-default --outdated --project --save-compatible --save-exact --save-wildcard --section --top --unconstrained --update-eager --update-reuse --verbose" +;; + +(use) +opts="--first --global --help --project --verbose" +;; + +esac + + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + __ltrim_colon_completions "$cur" + + return 0; + fi + + # completing for a command + if [[ $cur == $com ]]; then + coms="add build cache completion config export import info init install list lock remove run search show sync update use" + + COMPREPLY=($(compgen -W "${coms}" -- ${cur})) + __ltrim_colon_completions "$cur" + + return 0 + fi +} + +complete -o default -F _pdm_74498d98b6b27a5a_complete pdm + diff --git a/pdm/cli/completions/pdm.fish b/pdm/cli/completions/pdm.fish new file mode 100644 index 0000000000000000000000000000000000000000..debea5e94a099870eb04928ff9fa51894e878b88 GIT binary patch literal 39604 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 YI_>NF(xqRjG&?kXwel-d=0.6.0", "pep517", "pip>=20.1", - "pycomplete<1.0.0,>=0.2.0", + "python-cfonts", "python-dotenv<1.0.0,>=0.15.0", "pythonfinder",