Как получить просто список команд / подкоманд, используя click в моем наборе тестов? - PullRequest
2 голосов
/ 15 мая 2019

У меня есть приложение CLI, которое использует сгруппированные команды и подкоманды. Все работает. Однако я хочу убедиться, что это будет продолжаться и в будущем, поэтому я хочу убедиться, что все мои команды и подкоманды были загружены правильно.

Моей первой мыслью сделать это было просто запустить

commands = ["config", "othercommand"]
runner = CliRunner()
result = runner.invoke(cli.main)
for command in commands:
    assert command in result.output

Это несколько ловушек, с моей точки зрения.

  • Требуется, чтобы я обновлял commands каждый раз, когда добавляю новый. Я хотел бы иметь возможность автоматически генерировать это.
  • Если у меня есть команда, которая является относительно распространенным словом, которое появляется в справочном тесте (т. Е. config), я могу получить неверный результат.
  • Я не знаю, как бы я элегантно обрабатывал подкоманды каждого из них.

Мое приложение выложено так:

@click.group()
def main():
    """My entry point"""

@click.group()
def config():
    """config group"""

@config.command()
def add_config():
    """this is a subcommand to config"""

@click.group()
def othercommand():
    """othercommand group"""

@othercommand.command()
def do_thing():
    """this is a subcommand to othercommand"""

Мой вопрос: есть ли способ получить список всех команд (и подкоманд), которые я могу использовать, и сделать это из моего набора тестов? Желательно без всякого окружающего теста помощи, чтобы я мог устранить ложные результаты.

1 Ответ

1 голос
/ 16 мая 2019

Можно проанализировать cli, чтобы получить его структуру:

Код:

def command_tree(obj):
    if isinstance(obj, click.Group):
        return {name: command_tree(value)
                for name, value in obj.commands.items()}

Код теста:

import click

@click.group()
def main():
    """My entry point"""

@main.group()
def config():
    """config group"""

@config.command()
def add_config():
    """this is a subcommand to config"""

@main.group()
def othercommand():
    """othercommand group"""


@othercommand.command()
def do_thing():
    """this is a subcommand to othercommand"""


print(command_tree(main))

Результаты:

{'config': {'add_config': None}, 'othercommand': {'do_thing': None}}
...