summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2020-02-18 11:14:07 (GMT)
committerGitHub <noreply@github.com>2020-02-18 11:14:07 (GMT)
commite412cbba52e7cf6699720d99a4b88baef92db7b2 (patch)
treeb7c980cf29ccfbfec340dfd059bec1392e4f8cf0 /Lib/test
parent7fd752c1bc637aeca2bd122d07c0ebc379d0d8ca (diff)
downloadcpython-e412cbba52e7cf6699720d99a4b88baef92db7b2.zip
cpython-e412cbba52e7cf6699720d99a4b88baef92db7b2.tar.gz
cpython-e412cbba52e7cf6699720d99a4b88baef92db7b2.tar.bz2
[3.8] bpo-39546: argparse: Honor allow_abbrev=False for specified prefix_chars (GH-18337) (GH-18543)
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 (cherry picked from commit 8edfc47baec7ff4cb1b9db83dd35c8ffc1d498a4) Co-authored-by: Kyle Meyer <kyle@kyleam.com> https://bugs.python.org/issue39546 Automerge-Triggered-By: @encukou
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_argparse.py37
1 files changed, 37 insertions, 0 deletions
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 86ec6cc..0753a4b 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -786,6 +786,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"""
@@ -804,6 +821,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
# ================