optmanager: Inherit options from parent argument parsers

Allow for including options from parent `argparse.ArgumentParser`
objects in preparation of splitting out the handling of preliminary
options from the `OptionManager`.
This commit is contained in:
Eric N. Vander Weele 2019-10-25 15:01:30 -04:00
parent 2a5c2bb696
commit 1d7558f7da
2 changed files with 30 additions and 3 deletions

View file

@ -338,8 +338,12 @@ class OptionManager(object):
"""Manage Options and OptionParser while adding post-processing."""
def __init__(
self, prog, version, usage="%(prog)s [options] file file ..."
): # type: (str, str, str) -> None
self,
prog,
version,
usage="%(prog)s [options] file file ...",
parents=None,
): # type: (str, str, str, Optional[List[argparse.ArgumentParser]]) -> None # noqa: E501
"""Initialize an instance of an OptionManager.
:param str prog:
@ -348,9 +352,15 @@ class OptionManager(object):
Version string for the program.
:param str usage:
Basic usage string used by the OptionParser.
:param argparse.ArgumentParser parents:
A list of ArgumentParser objects whose arguments should also be
included.
"""
if parents is None:
parents = []
self.parser = argparse.ArgumentParser(
prog=prog, usage=usage
prog=prog, usage=usage, parents=parents
) # type: argparse.ArgumentParser
self._current_group = None # type: Optional[argparse._ArgumentGroup]
self.version_action = cast(

View file

@ -22,6 +22,23 @@ def test_option_manager_creates_option_parser(optmanager):
assert isinstance(optmanager.parser, argparse.ArgumentParser)
def test_option_manager_including_parent_options():
"""Verify parent options are included in the parsed options."""
# GIVEN
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('--parent')
# WHEN
optmanager = manager.OptionManager(
prog='flake8',
version=TEST_VERSION,
parents=[parent_parser])
option, _ = optmanager.parse_args(['--parent', 'foo'])
# THEN
assert option.parent == 'foo'
def test_parse_args_forwarding_default_values(optmanager):
"""Verify default provided values are present in the final result."""
namespace = argparse.Namespace(foo='bar')