mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
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
This commit is contained in:
parent
ffda25f6b8
commit
8edfc47bae
4 changed files with 67 additions and 26 deletions
|
@ -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
|
||||
# ================
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue