config: Pass description and epilog through

We can already pass a usage string through, we should also be able to
pass the description and epilog through. Often some explanatory text
about how to combine the options productively is very useful.

Change-Id: I0cea0a22284ca8338658534c8c300bb9b7c93dd8
This commit is contained in:
Alexis Lee 2016-11-17 13:38:08 +00:00
parent 30dbe55791
commit e5269392d8
2 changed files with 24 additions and 10 deletions

View File

@ -2218,8 +2218,8 @@ class ConfigOpts(collections.Mapping):
self._cli_opts = collections.deque()
self._validate_default_values = False
def _pre_setup(self, project, prog, version, usage, default_config_files,
default_config_dirs):
def _pre_setup(self, project, prog, version, usage, description, epilog,
default_config_files, default_config_dirs):
"""Initialize a ConfigCliParser object for option parsing."""
if prog is None:
@ -2233,7 +2233,8 @@ class ConfigOpts(collections.Mapping):
if default_config_dirs is None:
default_config_dirs = find_config_dirs(project, prog)
self._oparser = _CachedArgumentParser(prog=prog, usage=usage)
self._oparser = _CachedArgumentParser(
prog=prog, usage=usage, description=description, epilog=epilog)
if version is not None:
self._oparser.add_parser_argument(self._oparser,
@ -2300,7 +2301,9 @@ class ConfigOpts(collections.Mapping):
usage=None,
default_config_files=None,
default_config_dirs=None,
validate_default_values=False):
validate_default_values=False,
description=None,
epilog=None):
"""Parse command line arguments and config files.
Calling a ConfigOpts object causes the supplied command line arguments
@ -2323,6 +2326,8 @@ class ConfigOpts(collections.Mapping):
basename, without extension .py)
:param version: the program version (for --version)
:param usage: a usage string (%prog will be expanded)
:param description: A description of what the program does
:param epilog: Text following the argument descriptions
:param default_config_files: config files to use by default
:param default_config_dirs: config dirs to use by default
:param validate_default_values: whether to validate the default values
@ -2335,12 +2340,8 @@ class ConfigOpts(collections.Mapping):
self._validate_default_values = validate_default_values
prog, default_config_files, default_config_dirs = self._pre_setup(
project,
prog,
version,
usage,
default_config_files,
default_config_dirs)
project, prog, version, usage, description, epilog,
default_config_files, default_config_dirs)
self._setup(project, prog, version, usage, default_config_files,
default_config_dirs)

View File

@ -100,6 +100,8 @@ class BaseTestCase(base.BaseTestCase):
prog='test',
version='1.0',
usage='%(prog)s FOO BAR',
description='somedesc',
epilog='tepilog',
default_config_files=default_config_files,
default_config_dirs=default_config_dirs,
validate_default_values=True)
@ -140,6 +142,17 @@ class UsageTestCase(BaseTestCase):
self.conf([])
self.conf.print_usage(file=f)
self.assertIn('usage: test FOO BAR', f.getvalue())
self.assertNotIn('somedesc', f.getvalue())
self.assertNotIn('tepilog', f.getvalue())
self.assertNotIn('optional:', f.getvalue())
def test_print_help(self):
f = moves.StringIO()
self.conf([])
self.conf.print_help(file=f)
self.assertIn('usage: test FOO BAR', f.getvalue())
self.assertIn('somedesc', f.getvalue())
self.assertIn('tepilog', f.getvalue())
self.assertNotIn('optional:', f.getvalue())