cliutil: EnumArgument matches user arguments against aliases.
This commit is contained in:
parent
ee2bd6c096
commit
5231a1784f
2 changed files with 13 additions and 7 deletions
|
@ -94,7 +94,11 @@ class EnumArgument(Generic[ET]):
|
||||||
def enum_type(self, arg: str) -> ET:
|
def enum_type(self, arg: str) -> ET:
|
||||||
"""Return a single enum whose name matches the user argument"""
|
"""Return a single enum whose name matches the user argument"""
|
||||||
regexp = re.compile(re.escape(arg), re.IGNORECASE)
|
regexp = re.compile(re.escape(arg), re.IGNORECASE)
|
||||||
matches = frozenset(choice for choice in self.base if regexp.match(choice.name))
|
matches = frozenset(
|
||||||
|
choice
|
||||||
|
for name, choice in self.base.__members__.items()
|
||||||
|
if regexp.match(name)
|
||||||
|
)
|
||||||
count = len(matches)
|
count = len(matches)
|
||||||
if count == 1:
|
if count == 1:
|
||||||
return next(iter(matches))
|
return next(iter(matches))
|
||||||
|
|
|
@ -32,6 +32,8 @@ class ArgChoices(enum.Enum):
|
||||||
AA = 'aa'
|
AA = 'aa'
|
||||||
AB = 'ab'
|
AB = 'ab'
|
||||||
BB = 'bb'
|
BB = 'bb'
|
||||||
|
START = AA
|
||||||
|
END = BB
|
||||||
|
|
||||||
|
|
||||||
class MockTraceback:
|
class MockTraceback:
|
||||||
|
@ -270,9 +272,9 @@ def test_diff_year(date, diff, expected):
|
||||||
def test_can_run(cmd, expected):
|
def test_can_run(cmd, expected):
|
||||||
assert cliutil.can_run(cmd) == expected
|
assert cliutil.can_run(cmd) == expected
|
||||||
|
|
||||||
@pytest.mark.parametrize('choice', ArgChoices)
|
@pytest.mark.parametrize('name,choice', ArgChoices.__members__.items())
|
||||||
def test_enum_arg_enum_type(arg_enum, choice):
|
def test_enum_arg_enum_type(arg_enum, name, choice):
|
||||||
assert arg_enum.enum_type(choice.name) is choice
|
assert arg_enum.enum_type(name.lower()) is choice
|
||||||
assert arg_enum.enum_type(choice.value) is choice
|
assert arg_enum.enum_type(choice.value) is choice
|
||||||
|
|
||||||
@pytest.mark.parametrize('arg', 'az\0')
|
@pytest.mark.parametrize('arg', 'az\0')
|
||||||
|
@ -280,9 +282,9 @@ def test_enum_arg_no_enum_match(arg_enum, arg):
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
arg_enum.enum_type(arg)
|
arg_enum.enum_type(arg)
|
||||||
|
|
||||||
@pytest.mark.parametrize('choice', ArgChoices)
|
@pytest.mark.parametrize('name,choice', ArgChoices.__members__.items())
|
||||||
def test_enum_arg_value_type(arg_enum, choice):
|
def test_enum_arg_value_type(arg_enum, name, choice):
|
||||||
assert arg_enum.value_type(choice.name) == choice.value
|
assert arg_enum.value_type(name.lower()) == choice.value
|
||||||
assert arg_enum.value_type(choice.value) == choice.value
|
assert arg_enum.value_type(choice.value) == choice.value
|
||||||
|
|
||||||
@pytest.mark.parametrize('arg', 'az\0')
|
@pytest.mark.parametrize('arg', 'az\0')
|
||||||
|
|
Loading…
Reference in a new issue