Skip to content

Commit

Permalink
completion: fix broken completion generation for zsh
Browse files Browse the repository at this point in the history
`dvc commit --help` was also completely broken, which is also fixed.

This adds unit tests for completion generation for both zsh/bash, and
tests that --help works for all commands.
  • Loading branch information
skshetry committed Aug 3, 2023
1 parent b9b9f91 commit e59b387
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 3 deletions.
4 changes: 2 additions & 2 deletions dvc/commands/commit.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ def add_parser(subparsers, parent_parser):
action="store_true",
default=False,
help=(
"Commit data even if hash values for dependencies or",
"outputs did not change.",
"Commit data even if hash values for dependencies or "
"outputs did not change."
),
)
commit_parser.add_argument(
Expand Down
5 changes: 4 additions & 1 deletion dvc/commands/completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
logger = logging.getLogger(__name__)


SUPPORTED_SHELLS = ["bash", "zsh"]


class CmdCompletion(CmdBaseNoRepo):
def run(self):
import shtab
Expand All @@ -35,6 +38,6 @@ def add_parser(subparsers, parent_parser):
"--shell",
help="Shell syntax for completions.",
default="bash",
choices=["bash", "zsh"],
choices=SUPPORTED_SHELLS,
)
completion_parser.set_defaults(func=CmdCompletion)
17 changes: 17 additions & 0 deletions tests/unit/command/test_completion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import logging

import pytest

from dvc.cli import main
from dvc.commands.completion import SUPPORTED_SHELLS


@pytest.mark.parametrize("shell", SUPPORTED_SHELLS)
def test_completion(caplog, capsys, shell):
with caplog.at_level(logging.INFO):
assert main(["completion", "-s", shell]) == 0
assert not caplog.text

out, err = capsys.readouterr()
assert not err
assert out
48 changes: 48 additions & 0 deletions tests/unit/command/test_help.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import logging
from argparse import SUPPRESS, ArgumentParser
from typing import Tuple

import pytest
import shtab

from dvc.cli import main
from dvc.cli.parser import get_main_parser


def command_tuples():
root: Tuple[str, ...] = ()
commands = [root]

def recurse_parser(parser: ArgumentParser, parents: Tuple[str, ...] = root) -> None:
for positional in parser._get_positional_actions():
if positional.help != SUPPRESS and isinstance(positional.choices, dict):
public_cmds = shtab.get_public_subcommands(positional)
for subcmd, subparser in positional.choices.items():
if subcmd in public_cmds:
cmd = (*parents, subcmd)
commands.append(cmd)
recurse_parser(subparser, cmd)

main_parser = get_main_parser()
recurse_parser(main_parser)
return sorted(commands)


def pytest_generate_tests(metafunc):
def ids(values):
if values:
return "-".join(values)
return "dvc"

metafunc.parametrize("command_tuples", command_tuples(), ids=ids)


def test_help(caplog, capsys, command_tuples):
with caplog.at_level(logging.INFO), pytest.raises(SystemExit) as e:
main([*command_tuples, "--help"])
assert e.value.code == 0
assert not caplog.text

out, err = capsys.readouterr()
assert not err
assert out

0 comments on commit e59b387

Please sign in to comment.