summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZac Hatfield-Dodds <Zac-HD@users.noreply.github.com>2019-06-25 13:51:33 +1000
committerZac Hatfield-Dodds <Zac-HD@users.noreply.github.com>2019-06-25 13:51:33 +1000
commitd72fb73fa091534a862dbe462257efeef7ecaa2f (patch)
tree70b336bd9df40f48af464777425fccc2dd9707f6 /src
parent4f57d40a43e0c27d82b8996d70e170ba9c879ee9 (diff)
downloadpytest-d72fb73fa091534a862dbe462257efeef7ecaa2f.tar.gz
Do not allow abbreviated arguments
Diffstat (limited to 'src')
-rw-r--r--src/_pytest/config/argparsing.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/_pytest/config/argparsing.py b/src/_pytest/config/argparsing.py
index fb36c7985..d62ed0d03 100644
--- a/src/_pytest/config/argparsing.py
+++ b/src/_pytest/config/argparsing.py
@@ -1,5 +1,7 @@
import argparse
+import sys
import warnings
+from gettext import gettext
import py
@@ -328,6 +330,7 @@ class MyOptionParser(argparse.ArgumentParser):
usage=parser._usage,
add_help=False,
formatter_class=DropShorterLongHelpFormatter,
+ allow_abbrev=False,
)
# extra_info is a dict of (param -> value) to display if there's
# an usage error to provide more contextual information to the user
@@ -355,6 +358,42 @@ class MyOptionParser(argparse.ArgumentParser):
getattr(args, FILE_OR_DIR).extend(argv)
return args
+ if sys.version_info[:2] < (3, 8): # pragma: no cover
+ # Backport of https://github.com/python/cpython/pull/14316 so we can
+ # disable long --argument abbreviations without breaking short flags.
+ def _parse_optional(self, arg_string):
+ if not arg_string:
+ return None
+ if not arg_string[0] in self.prefix_chars:
+ return None
+ if arg_string in self._option_string_actions:
+ action = self._option_string_actions[arg_string]
+ return action, arg_string, None
+ if len(arg_string) == 1:
+ return None
+ if "=" in arg_string:
+ option_string, explicit_arg = arg_string.split("=", 1)
+ if option_string in self._option_string_actions:
+ action = self._option_string_actions[option_string]
+ return action, option_string, explicit_arg
+ if self.allow_abbrev or not arg_string.startswith("--"):
+ option_tuples = self._get_option_tuples(arg_string)
+ if len(option_tuples) > 1:
+ msg = gettext(
+ "ambiguous option: %(option)s could match %(matches)s"
+ )
+ options = ", ".join(option for _, option, _ in option_tuples)
+ self.error(msg % {"option": arg_string, "matches": options})
+ elif len(option_tuples) == 1:
+ option_tuple, = option_tuples
+ return option_tuple
+ if self._negative_number_matcher.match(arg_string):
+ if not self._has_negative_number_optionals:
+ return None
+ if " " in arg_string:
+ return None
+ return None, arg_string, None
+
class DropShorterLongHelpFormatter(argparse.HelpFormatter):
"""shorten help for long options that differ only in extra hyphens