diff -r 9ea84f006892 Lib/argparse.py --- a/Lib/argparse.py Wed May 01 15:15:50 2013 +0200 +++ b/Lib/argparse.py Tue Jul 02 23:12:01 2013 -0700 @@ -467,7 +467,8 @@ text = _re.sub(r'(%s) ' % open, r'\1', text) text = _re.sub(r' (%s)' % close, r'\1', text) text = _re.sub(r'%s *%s' % (open, close), r'', text) - text = _re.sub(r'\(([^|]*)\)', r'\1', text) + # text = _re.sub(r'\(([^|]*)\)', r'\1', text) + text = _re.sub(r'( )\(([^|]*)\)', r'\1\2', text) text = text.strip() # return the text diff -r 9ea84f006892 Lib/test/test_argparse.py --- a/Lib/test/test_argparse.py Wed May 01 15:15:50 2013 +0200 +++ b/Lib/test/test_argparse.py Tue Jul 02 23:12:01 2013 -0700 @@ -4885,6 +4885,45 @@ def test_nargs_3_metavar_length3(self): self.do_test_no_exception(nargs=3, metavar=("1", "2", "3")) +# ========================== +# metavar with () +# ========================== + +class TestMetavarWithParen(TestCase): + "MutuallyExclusiveGroup trimming should not remove () from metavars" + def test_default_formatting(self): + "default usage with expanded range of choices" + full = r"\[-h\] \[--foo {0,1,2,3,4,5,6,7,8,9}\]\n" + parser = ErrorRaisingArgumentParser() + parser.add_argument("--foo", type=int, choices=range(10)) + cm = parser.format_usage() + self.assertRegex(cm, full) + + def test_format_with_metavar(self): + "usage with metavar" + parser = ErrorRaisingArgumentParser() + parser.add_argument("--foo", type=int, choices=range(20), metavar='range:20') + cm = parser.format_usage() + self.assertRegex(cm, r'usage: (.*) \[\-h\] \[--foo range:20\]\n') + + def test_format_with_paren(self): + "usage with a metavar that include ()" + parser = ErrorRaisingArgumentParser() + parser.add_argument("--foo", type=int, choices=range(20), metavar='range(0,20)') + cm = parser.format_usage() + self.assertRegex(cm, r'usage: (.*) \[-h\] \[--foo range\(0,20\)\]\n') + + def test_format_with_paren(self): + "metavar has no effect on the choices error message - yet" + parser = ErrorRaisingArgumentParser() + parser.add_argument("--foo", type=int, choices=range(20), metavar='range(0,20)') + self.assertEqual(parser.parse_args(['--foo','1']), NS(foo=1)) + with self.assertRaises(ArgumentParserError) as cm: + parser.parse_args(['--foo','21']) + msg = str(cm.exception) + self.assertRegex(msg, 'invalid choice') + self.assertNotIn(msg, 'range\(0,20\)') + # ============================ # from argparse import * tests # ============================