39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
|
#!/usr/bin/python
|
||
|
# coding: utf-8 -*-
|
||
|
# pylint: disable=inconsistent-return-statements
|
||
|
|
||
|
|
||
|
"""
|
||
|
Extension for the python ``click`` module
|
||
|
to provide a group or command with aliases.
|
||
|
"""
|
||
|
|
||
|
|
||
|
from typing import Any
|
||
|
import click
|
||
|
|
||
|
|
||
|
class AliasedGroup(click.Group):
|
||
|
"""
|
||
|
Implements a subclass of Group that accepts a prefix for a command.
|
||
|
If there were a command called push, it would accept pus as an alias (so long as it was unique)
|
||
|
"""
|
||
|
def get_command(self, ctx: click.Context, cmd_name: str) -> Any:
|
||
|
"""Documentation to build"""
|
||
|
rv = click.Group.get_command(self, ctx, cmd_name)
|
||
|
if rv is not None:
|
||
|
return rv
|
||
|
matches = [x for x in self.list_commands(ctx)
|
||
|
if x.startswith(cmd_name)]
|
||
|
if not matches:
|
||
|
return None
|
||
|
if len(matches) == 1:
|
||
|
return click.Group.get_command(self, ctx, matches[0])
|
||
|
ctx.fail(f"Too many matches: {', '.join(sorted(matches))}")
|
||
|
|
||
|
def resolve_command(self, ctx: click.Context, args: Any) -> Any:
|
||
|
"""Documentation to build"""
|
||
|
# always return the full command name
|
||
|
_, cmd, args = super().resolve_command(ctx, args)
|
||
|
return cmd.name, cmd, args
|