[Python-checkins] cpython: Issue #16854: Fix regrtest.usage() regression introduced in 6e2e5adc0400.

chris.jerdonek python-checkins at python.org
Tue Jan 8 02:10:40 CET 2013


http://hg.python.org/cpython/rev/ce99559efa46
changeset:   81314:ce99559efa46
user:        Chris Jerdonek <chris.jerdonek at gmail.com>
date:        Mon Jan 07 17:07:32 2013 -0800
summary:
  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.

files:
  Lib/test/regrtest.py      |  52 ++++++++++++++------------
  Lib/test/test_regrtest.py |   8 +++-
  2 files changed, 34 insertions(+), 26 deletions(-)


diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -202,16 +202,20 @@
 
 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 @@
 
     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 @@
             # 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 @@
 
     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
--- a/Lib/test/test_regrtest.py
+++ b/Lib/test/test_regrtest.py
@@ -23,10 +23,14 @@
 
 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):
         """

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list