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. +# 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: @@ -532,12 +536,7 @@ print("Warning: The timeout option requires " "faulthandler.dump_tracebacks_later") timeout = None - elif o == '--wait': - input("Press any key to continue...") - else: - print(("No handler for option {}. Please report this as a bug " - "at http://bugs.python.org.").format(o), file=sys.stderr) - sys.exit(1) + if single and fromfile: usage("-s and -f don't go together!") if use_mp and trace: @@ -549,6 +548,9 @@ if failfast and not (verbose or verbose3): usage("-G/--failfast needs either -v or -W") + if ns.wait: + input("Press return to continue...") + good = [] bad = [] skipped = [] 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): """