diff --git a/cliff/sphinxext.py b/cliff/sphinxext.py index 82497d0a..62c7e658 100644 --- a/cliff/sphinxext.py +++ b/cliff/sphinxext.py @@ -60,13 +60,18 @@ def _format_usage(parser): # becomes ['--format '] and not ['--format', '']. # Yes, they really do use regexes to break apart and rewrap their help # string. Don't ask me why. - part_regexp = r'\(.*?\)+|\[.*?\]+|(?:(?:-\w|--[\w-]+)(?:\s+?)?)|\S+' + part_regexp = re.compile(r""" + \(.*?\)+ | + \[.*?\]+ | + (?:(?:-\w|--\w+(?:-\w+)*)(?:\s+?)?) | + \S+ + """, re.VERBOSE) opt_usage = fmt._format_actions_usage(optionals, groups) pos_usage = fmt._format_actions_usage(positionals, groups) - opt_parts = re.findall(part_regexp, opt_usage) - pos_parts = re.findall(part_regexp, pos_usage) + opt_parts = part_regexp.findall(opt_usage) + pos_parts = part_regexp.findall(pos_usage) parts = opt_parts + pos_parts if len(' '.join([parser.prog] + parts)) < 72: diff --git a/cliff/tests/test_sphinxext.py b/cliff/tests/test_sphinxext.py index a8281bd9..852004c0 100644 --- a/cliff/tests/test_sphinxext.py +++ b/cliff/tests/test_sphinxext.py @@ -206,3 +206,57 @@ class TestSphinxExtension(base.TestBase): user name """).lstrip(), output) + + def test_various_option_names_with_hyphen(self): + """Handle options whose name and/or metavar contain hyphen(s)""" + parser = argparse.ArgumentParser(prog='hello-world', add_help=False) + parser.add_argument('--foo-bar', metavar='', + help='foo bar', required=True) + parser.add_argument('--foo-bar-baz', metavar='', + help='foo bar baz', required=True) + parser.add_argument('--foo', metavar='', + help='foo', required=True) + parser.add_argument('--alpha', metavar='', + help='alpha') + parser.add_argument('--alpha-beta', metavar='', + help='alpha beta') + parser.add_argument('--alpha-beta-gamma', metavar='', + help='alpha beta gamma') + + output = '\n'.join(sphinxext._format_parser(parser)) + self.assertEqual(textwrap.dedent(""" + .. program:: hello-world + .. code-block:: shell + + hello-world + --foo-bar + --foo-bar-baz + --foo + [--alpha ] + [--alpha-beta ] + [--alpha-beta-gamma ] + + .. option:: --foo-bar + + foo bar + + .. option:: --foo-bar-baz + + foo bar baz + + .. option:: --foo + + foo + + .. option:: --alpha + + alpha + + .. option:: --alpha-beta + + alpha beta + + .. option:: --alpha-beta-gamma + + alpha beta gamma + """).lstrip(), output)