Skip to content
Snippets Groups Projects
Commit b1dff315 authored by David Douard's avatar David Douard
Browse files

cli: add support for aliases in click command groups

parent ceb68e3c
No related branches found
No related tags found
1 merge request!60cli: add support for aliases in click command groups
Click
pytest < 4
pytest-postgresql
requests-mock
......
......@@ -14,7 +14,25 @@ CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
logger = logging.getLogger(__name__)
@click.group(context_settings=CONTEXT_SETTINGS)
class AliasedGroup(click.Group):
'A simple Group that supports command aliases'
@property
def aliases(self):
if not hasattr(self, '_aliases'):
self._aliases = {}
return self._aliases
def get_command(self, ctx, cmd_name):
return super().get_command(ctx, self.aliases.get(cmd_name, cmd_name))
def add_alias(self, name, alias):
if not isinstance(name, str):
name = name.name
self.aliases[alias] = name
@click.group(context_settings=CONTEXT_SETTINGS, cls=AliasedGroup)
@click.option('--log-level', '-l', default='INFO',
type=click.Choice(LOG_LEVEL_NAMES),
help="Log level (default to INFO)")
......
#
import logging
import click
from click.testing import CliRunner
from swh.core.cli import swh as swhmain
help_msg = '''Usage: swh [OPTIONS] COMMAND [ARGS]...
Command line interface for Software Heritage.
Options:
-l, --log-level [NOTSET|DEBUG|INFO|WARNING|ERROR|CRITICAL]
Log level (default to INFO)
-h, --help Show this message and exit.
'''
def test_swh_help():
runner = CliRunner()
result = runner.invoke(swhmain, ['-h'])
assert result.exit_code == 0
assert result.output == help_msg
result = runner.invoke(swhmain, ['--help'])
assert result.exit_code == 0
assert result.output == help_msg
def test_command():
@swhmain.command(name='test')
@click.pass_context
def swhtest(ctx):
click.echo('Hello SWH!')
runner = CliRunner()
result = runner.invoke(swhmain, ['test'])
assert result.exit_code == 0
assert result.output.strip() == 'Hello SWH!'
def test_loglevel_default(caplog):
@swhmain.command(name='test')
@click.pass_context
def swhtest(ctx):
assert logging.root.level == 20
click.echo('Hello SWH!')
runner = CliRunner()
result = runner.invoke(swhmain, ['test'])
assert result.exit_code == 0
print(result.output)
assert result.output.strip() == '''Hello SWH!'''
def test_loglevel_error(caplog):
@swhmain.command(name='test')
@click.pass_context
def swhtest(ctx):
assert logging.root.level == 40
click.echo('Hello SWH!')
runner = CliRunner()
result = runner.invoke(swhmain, ['-l', 'ERROR', 'test'])
assert result.exit_code == 0
assert result.output.strip() == '''Hello SWH!'''
def test_loglevel_debug(caplog):
@swhmain.command(name='test')
@click.pass_context
def swhtest(ctx):
assert logging.root.level == 10
click.echo('Hello SWH!')
runner = CliRunner()
result = runner.invoke(swhmain, ['-l', 'DEBUG', 'test'])
assert result.exit_code == 0
assert result.output.strip() == '''Hello SWH!'''
def test_aliased_command():
@swhmain.command(name='canonical-test')
@click.pass_context
def swhtest(ctx):
'A test command.'
click.echo('Hello SWH!')
swhmain.add_alias(swhtest, 'othername')
runner = CliRunner()
# check we have only 'canonical-test' listed in the usage help msg
result = runner.invoke(swhmain, ['-h'])
assert result.exit_code == 0
assert 'canonical-test A test command.' in result.output
assert 'othername' not in result.output
# check we can execute the cmd with 'canonical-test'
result = runner.invoke(swhmain, ['canonical-test'])
assert result.exit_code == 0
assert result.output.strip() == '''Hello SWH!'''
# check we can also execute the cmd with the alias 'othername'
result = runner.invoke(swhmain, ['othername'])
assert result.exit_code == 0
assert result.output.strip() == '''Hello SWH!'''
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment