diff -r 514cb18945aa Lib/argparse.py --- a/Lib/argparse.py Fri Jul 12 20:17:00 2013 -0400 +++ b/Lib/argparse.py Sun Jul 14 18:55:59 2013 +0800 @@ -311,7 +311,7 @@ # build full usage string format = self._format_actions_usage - action_usage = format(optionals + positionals, groups) + (action_usage, __) = format(optionals + positionals, groups) usage = ' '.join([s for s in [prog, action_usage] if s]) # wrap the usage parts if it's too long @@ -320,10 +320,8 @@ # break usage into wrappable parts part_regexp = r'\(.*?\)+|\[.*?\]+|\S+' - opt_usage = format(optionals, groups) - pos_usage = format(positionals, groups) - opt_parts = _re.findall(part_regexp, opt_usage) - pos_parts = _re.findall(part_regexp, pos_usage) + (opt_usage, opt_parts) = format(optionals, groups) + (pos_usage, pos_parts) = format(positionals, groups) assert ' '.join(opt_parts) == opt_usage assert ' '.join(pos_parts) == pos_usage @@ -460,6 +458,30 @@ # join all the action items with spaces text = ' '.join([item for item in parts if item is not None]) + arg_parts = [] + pairs = {'[': ']', '(': ')'} + opening_pairs = ('[', '(') + closing_pairs = (']', ')') + inner = False + block = [] + opening = None + # Converting ['[-h]', '(', '--klmno X', '|', '--pqrst X', ')'] to + # ['[-h]', '(--klmno X | --pqrst X)'] + for part in parts: + if part is not None: + if part in opening_pairs: + opening = part + block.append(part) + elif opening: + if part == '|': + part = ' | ' + block.append(part) + if part in closing_pairs and part == pairs[opening]: + arg_parts.append(''.join(block)) + block = [] + opening = None + else: + arg_parts.append(part) # clean up separators for mutually exclusive groups open = r'[\[(]' @@ -471,7 +493,7 @@ text = text.strip() # return the text - return text + return (text, arg_parts) def _format_text(self, text): if '%(prog)' in text: diff -r 514cb18945aa Lib/test/test_argparse.py --- a/Lib/test/test_argparse.py Fri Jul 12 20:17:00 2013 -0400 +++ b/Lib/test/test_argparse.py Sun Jul 14 18:55:59 2013 +0800 @@ -4118,6 +4118,46 @@ version = '' +class TestHelpMetavarArgumentsInnerBracketSplitLines(HelpTestCase): + """""" + + def custom_type(string): + return string + + parser_signature = Sig(prog='PROG') + long_a = 'a' * 60 + long_d = 'd' * 60 + argument_signatures = [Sig('--a', metavar=long_a), + Sig('--b', metavar='[innerpart]outerpart'), + Sig('--c'), + Sig('d', metavar=long_d), + Sig('e', metavar='[innerpart2]outerpart2'), + Sig('f'), + ] + argument_group_signatures = [] + usage = '''\ + usage: PROG [-h] + [--a {0}] + [--b [innerpart]outerpart] [--c C] + {1} + [innerpart2]outerpart2 f + '''.format(long_a, long_d) + help = usage + '''\ + + positional arguments: + {0} + [innerpart2]outerpart2 + f + + optional arguments: + -h, --help show this help message and exit + --a {1} + --b [innerpart]outerpart + --c C + '''.format(long_d, long_a) + version = '' + + # ===================================== # Optional/Positional constructor tests # =====================================