cleaner test

This commit is contained in:
Divyansh Singh 2023-06-09 00:21:41 +05:30
parent 6475345a8f
commit 3315555d06
2 changed files with 39 additions and 25 deletions

View file

@ -28,19 +28,7 @@ SUBPARSER_ALIASES = {
} }
def parse_subparser_arguments(arguments, unparsed_arguments, subparsers): def get_unparsable_arguments(remaining_subparser_arguments):
remaining_subparser_arguments = []
for subparser_name, subparser in reversed(subparsers.items()):
if subparser_name not in arguments.keys():
continue
subparser = subparsers[subparser_name]
unused_parsed, remaining = subparser.parse_known_args(
[argument for argument in unparsed_arguments if argument != subparser_name]
)
remaining_subparser_arguments.append(remaining)
# Determine the remaining arguments that no subparsers have consumed. # Determine the remaining arguments that no subparsers have consumed.
if remaining_subparser_arguments: if remaining_subparser_arguments:
remaining_arguments = [ remaining_arguments = [
@ -128,7 +116,20 @@ def parse_subparser_arguments(unparsed_arguments, subparsers):
# Now ask each subparser, one by one, to greedily consume arguments, from last to first. This # Now ask each subparser, one by one, to greedily consume arguments, from last to first. This
# allows subparsers to consume arguments before their parent subparsers do. # allows subparsers to consume arguments before their parent subparsers do.
remaining_arguments = parse_subparser_arguments(arguments, unparsed_arguments, subparsers) remaining_subparser_arguments = []
for subparser_name, subparser in reversed(subparsers.items()):
if subparser_name not in arguments.keys():
continue
subparser = subparsers[subparser_name]
unused_parsed, remaining = subparser.parse_known_args(
[argument for argument in unparsed_arguments if argument != subparser_name]
)
remaining_subparser_arguments.append(remaining)
if remaining_subparser_arguments:
remaining_arguments = get_unparsable_arguments(remaining_subparser_arguments)
# Special case: If "borg" is present in the arguments, consume all arguments after (+1) the # Special case: If "borg" is present in the arguments, consume all arguments after (+1) the
# "borg" action. # "borg" action.

View file

@ -178,19 +178,32 @@ def test_parse_subparser_arguments_raises_error_when_no_subparser_is_specified()
@pytest.mark.parametrize( @pytest.mark.parametrize(
'arguments, unparsed_arguments, subparsers, expected_remaining_arguments', 'arguments, expected',
[ [
( (
{'action': flexmock()}, (
['--verbosity', 'lots'], ('--latest', 'archive', 'prune', 'extract', 'list', '--test-flag'),
{'action': flexmock(parse_known_args=lambda arguments: (flexmock(), ['--verbosity', 'lots']))}, ('--latest', 'archive', 'check', 'extract', 'list', '--test-flag'),
['--verbosity', 'lots'], ('prune', 'check', 'list', '--test-flag'),
('prune', 'check', 'extract', '--test-flag'),
), ),
[
'--test-flag',
],
),
(
(
('--latest', 'archive', 'prune', 'extract', 'list'),
('--latest', 'archive', 'check', 'extract', 'list'),
('prune', 'check', 'list'),
('prune', 'check', 'extract'),
),
[],
),
((), []),
], ],
) )
def test_get_remaining_arguments_returns_expected_remaining_arguments( def test_get_unparsable_arguments_returns_remaining_arguments_that_no_subparser_can_parse(
arguments, unparsed_arguments, subparsers, expected_remaining_arguments arguments, expected
): ):
remaining_arguments = module.get_remaining_arguments(arguments, unparsed_arguments, subparsers) assert module.get_unparsable_arguments(arguments) == expected
assert remaining_arguments == expected_remaining_arguments