diff options
| author | Kyle Meyer <kyle@kyleam.com> | 2020-02-18 09:48:57 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-18 09:48:57 (GMT) |
| commit | 8edfc47baec7ff4cb1b9db83dd35c8ffc1d498a4 (patch) | |
| tree | f4127d288dadd66c7546da9f1c1b4f5e0b7550a3 /Lib/test/test_argparse.py | |
| parent | ffda25f6b825f3dee493b6f0746266a4dd6989f0 (diff) | |
| download | cpython-8edfc47baec7ff4cb1b9db83dd35c8ffc1d498a4.zip cpython-8edfc47baec7ff4cb1b9db83dd35c8ffc1d498a4.tar.gz cpython-8edfc47baec7ff4cb1b9db83dd35c8ffc1d498a4.tar.bz2 | |
bpo-39546: argparse: Honor allow_abbrev=False for specified prefix_chars (GH-18337)
When `allow_abbrev` was first added, disabling the abbreviation of
long options broke the grouping of short flags ([bpo-26967](https://bugs.python.org/issue26967)). As a fix,
b1e4d1b603 (contained in v3.8) ignores `allow_abbrev=False` for a
given argument string if the string does _not_ start with "--"
(i.e. it doesn't look like a long option).
This fix, however, doesn't take into account that long options can
start with alternative characters specified via `prefix_chars`,
introducing a regression: `allow_abbrev=False` has no effect on long
options that start with an alternative prefix character.
The most minimal fix would be to replace the "starts with --" check
with a "starts with two prefix_chars characters". But
`_get_option_tuples` already distinguishes between long and short
options, so let's instead piggyback off of that check by moving the
`allow_abbrev` condition into `_get_option_tuples`.
https://bugs.python.org/issue39546
Diffstat (limited to 'Lib/test/test_argparse.py')
| -rw-r--r-- | Lib/test/test_argparse.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 60bf199..b095783 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -810,6 +810,23 @@ class TestOptionalsDisallowLongAbbreviation(ParserTestCase): ] +class TestOptionalsDisallowLongAbbreviationPrefixChars(ParserTestCase): + """Disallowing abbreviations works with alternative prefix characters""" + + parser_signature = Sig(prefix_chars='+', allow_abbrev=False) + argument_signatures = [ + Sig('++foo'), + Sig('++foodle', action='store_true'), + Sig('++foonly'), + ] + failures = ['+foon 3', '++foon 3', '++food', '++food ++foo 2'] + successes = [ + ('', NS(foo=None, foodle=False, foonly=None)), + ('++foo 3', NS(foo='3', foodle=False, foonly=None)), + ('++foonly 7 ++foodle ++foo 2', NS(foo='2', foodle=True, foonly='7')), + ] + + class TestDisallowLongAbbreviationAllowsShortGrouping(ParserTestCase): """Do not allow abbreviations of long options at all""" @@ -828,6 +845,26 @@ class TestDisallowLongAbbreviationAllowsShortGrouping(ParserTestCase): ('-ccrcc', NS(r='cc', c=2)), ] + +class TestDisallowLongAbbreviationAllowsShortGroupingPrefix(ParserTestCase): + """Short option grouping works with custom prefix and allow_abbrev=False""" + + parser_signature = Sig(prefix_chars='+', allow_abbrev=False) + argument_signatures = [ + Sig('+r'), + Sig('+c', action='count'), + ] + failures = ['+r', '+c +r'] + successes = [ + ('', NS(r=None, c=None)), + ('+ra', NS(r='a', c=None)), + ('+rcc', NS(r='cc', c=None)), + ('+cc', NS(r=None, c=2)), + ('+cc +ra', NS(r='a', c=2)), + ('+ccrcc', NS(r='cc', c=2)), + ] + + # ================ # Positional tests # ================ |
