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 0000000000..debea5e94a Binary files /dev/null and b/pdm/cli/completions/pdm.fish differ diff --git a/pdm/cli/completions/pdm.ps1 b/pdm/cli/completions/pdm.ps1 new file mode 100644 index 0000000000..e28ab0bb44 Binary files /dev/null and b/pdm/cli/completions/pdm.ps1 differ diff --git a/pdm/cli/completions/_pdm b/pdm/cli/completions/pdm.zsh similarity index 100% rename from pdm/cli/completions/_pdm rename to pdm/cli/completions/pdm.zsh diff --git a/pyproject.toml b/pyproject.toml index 35b80f4d06..900ab71ba4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ dependencies = [ "pdm-pep517<0.7.0,>=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",