summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorChris Jerdonek <chris.jerdonek@gmail.com>2013-01-08 01:07:32 (GMT)
committerChris Jerdonek <chris.jerdonek@gmail.com>2013-01-08 01:07:32 (GMT)
commit15738427f612a447475254d0ac26ce4b4bb9ef2e (patch)
treee9c81d26cfc4b860eec4c93ff770c3e7ffe352b5 /Lib
parent2716d531a1e2553bc6df43852357053370ff8bb0 (diff)
downloadcpython-15738427f612a447475254d0ac26ce4b4bb9ef2e.zip
cpython-15738427f612a447475254d0ac26ce4b4bb9ef2e.tar.gz
cpython-15738427f612a447475254d0ac26ce4b4bb9ef2e.tar.bz2
Issue #16854: Fix regrtest.usage() regression introduced in 6e2e5adc0400.
This fixes a regression introduced in the commit for issue #15302, which switched regrtest from getopt to argparse.
Diffstat (limited to 'Lib')
-rwxr-xr-xLib/test/regrtest.py52
-rw-r--r--Lib/test/test_regrtest.py8
2 files changed, 34 insertions, 26 deletions
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index daa2c95..43d561e 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -202,16 +202,20 @@ RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network',
TEMPDIR = os.path.abspath(tempfile.gettempdir())
+class _ArgParser(argparse.ArgumentParser):
+
+ def error(self, message):
+ super().error(message + "\nPass -h or --help for complete help.")
+
def _create_parser():
# Set prog to prevent the uninformative "__main__.py" from displaying in
# error messages when using "python -m test ...".
- parser = argparse.ArgumentParser(prog='regrtest.py',
- usage=USAGE,
- description=DESCRIPTION,
- epilog=EPILOG,
- add_help=False,
- formatter_class=
- argparse.RawDescriptionHelpFormatter)
+ parser = _ArgParser(prog='regrtest.py',
+ usage=USAGE,
+ description=DESCRIPTION,
+ epilog=EPILOG,
+ add_help=False,
+ formatter_class=argparse.RawDescriptionHelpFormatter)
# Arguments with this clause added to its help are described further in
# the epilog's "Additional option details" section.
@@ -301,8 +305,18 @@ def _create_parser():
return parser
+# TODO: remove this function as described in issue #16799, for example.
+# We use this function since regrtest.main() was originally written to use
+# getopt for parsing.
def _convert_namespace_to_getopt(ns):
- """Convert an argparse.Namespace object to a getopt-style (opts, args)."""
+ """Convert an argparse.Namespace object to a getopt-style opts list.
+
+ The return value of this function mimics the first element of
+ getopt.getopt()'s (opts, args) return value. In addition, the (option,
+ value) pairs in the opts list are sorted by option and use the long
+ option string. The args part of (opts, args) can be mimicked by the
+ args attribute of the Namespace object we are using in regrtest.
+ """
opts = []
args_dict = vars(ns)
for key in sorted(args_dict.keys()):
@@ -319,21 +333,7 @@ def _convert_namespace_to_getopt(ns):
# includes these with value '' in the opts list.
val = ''
opts.append(('--' + key, val))
- return opts, ns.args
-
-# This function has a getopt-style return value because regrtest.main()
-# was originally written using getopt.
-# TODO: switch this to return an argparse.Namespace instance.
-def _parse_args(args=None):
- """Parse arguments, and return a getopt-style (opts, args).
-
- This method mimics the return value of getopt.getopt(). In addition,
- the (option, value) pairs in opts are sorted by option and use the long
- option string.
- """
- parser = _create_parser()
- ns = parser.parse_args(args=args)
- return _convert_namespace_to_getopt(ns)
+ return opts
def main(tests=None, testdir=None, verbose=0, quiet=False,
@@ -381,7 +381,11 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
support.record_original_stdout(sys.stdout)
- opts, args = _parse_args()
+ parser = _create_parser()
+ ns = parser.parse_args()
+ opts = _convert_namespace_to_getopt(ns)
+ args = ns.args
+ usage = parser.error
# Defaults
if random_seed is None:
diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py
index 40d0f97..5b972ca 100644
--- a/Lib/test/test_regrtest.py
+++ b/Lib/test/test_regrtest.py
@@ -23,10 +23,14 @@ def old_parse_args(args):
class ParseArgsTestCase(unittest.TestCase):
- """Test that regrtest._parse_args() matches the prior getopt behavior."""
+ """Test that regrtest's parsing code matches the prior getopt behavior."""
def _parse_args(self, args):
- return regrtest._parse_args(args=args)
+ # This is the same logic as that used in regrtest.main()
+ parser = regrtest._create_parser()
+ ns = parser.parse_args(args=args)
+ opts = regrtest._convert_namespace_to_getopt(ns)
+ return opts, ns.args
def _check_args(self, args, expected=None):
"""