mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-10 07:18:27 +01:00
* cli: split main_parser * cli: basic parser tree printing * cli: major completion tidy * completion: more missing root commands * completion: much automagic such beauty - fixes #2985 automatically generate bash completion * tests: bash completion * tests: completion: tidy script a little * minor tidy * command: positional name consistency * completion: bash: add logging * double-check renames and consistency * cli: add completion subcommand * ci: completion: update test * minor logging * more completion logging verbosity * fix completion of files * add shtab * purge unneeded completion => shtab * completion: neaten UI * completion: use `shtab>=0.0.2` * completion: purge hardcoded completions! * revert unneeded renames for now * fix isort * completion: tidy CLI API * fix snap build * fix snap build again * snap: internally build completion * allow repo-less completion * command: tidy headless logic * use CmdBaseNoRepo * better DVC-file completion * merge command.choices -> command.completion * drop choices class * remove completion optionals * tidy docs
69 lines
1.7 KiB
Python
69 lines
1.7 KiB
Python
import argparse
|
|
import logging
|
|
|
|
import shtab
|
|
|
|
from dvc.command.base import CmdBaseNoRepo, append_doc_link
|
|
|
|
logger = logging.getLogger(__name__)
|
|
CHOICE_FUNCTIONS = {
|
|
"bash": {"DVCFile": "_dvc_compgen_DVCFiles"},
|
|
"zsh": {"DVCFile": "_files -g '(*?.dvc|Dvcfile|dvc.yaml)'"},
|
|
}
|
|
PREAMBLE = {
|
|
"bash": """
|
|
# $1=COMP_WORDS[1]
|
|
_dvc_compgen_DVCFiles() {
|
|
compgen -d -S '/' -- $1 # recurse into subdirs
|
|
compgen -f -X '!*?.dvc' -- $1
|
|
compgen -f -X '!*Dvcfile' -- $1
|
|
compgen -f -X '!*dvc.yaml' -- $1
|
|
}
|
|
""",
|
|
"zsh": "",
|
|
}
|
|
|
|
|
|
class Optional(shtab.Optional):
|
|
DVC_FILE = [shtab.Choice("DVCFile", required=False)]
|
|
|
|
|
|
class Required(shtab.Required):
|
|
DVC_FILE = [shtab.Choice("DVCFile", required=True)]
|
|
|
|
|
|
class CmdCompletion(CmdBaseNoRepo):
|
|
def run(self):
|
|
from dvc.cli import get_main_parser
|
|
|
|
parser = get_main_parser()
|
|
shell = self.args.shell
|
|
script = shtab.complete(
|
|
parser,
|
|
shell=shell,
|
|
preamble=PREAMBLE[shell],
|
|
choice_functions=CHOICE_FUNCTIONS[shell],
|
|
)
|
|
print(script)
|
|
return 0
|
|
|
|
|
|
def add_parser(subparsers, parent_parser):
|
|
COMPLETION_HELP = "Generate shell tab completion."
|
|
COMPLETION_DESCRIPTION = "Prints out shell tab completion scripts."
|
|
completion_parser = subparsers.add_parser(
|
|
"completion",
|
|
parents=[parent_parser],
|
|
description=append_doc_link(COMPLETION_DESCRIPTION, "completion"),
|
|
help=COMPLETION_HELP,
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
)
|
|
completion_parser.add_argument(
|
|
"-s",
|
|
"--shell",
|
|
help="Shell syntax for completions.",
|
|
default="bash",
|
|
choices=["bash", "zsh"],
|
|
)
|
|
completion_parser.set_defaults(func=CmdCompletion)
|