Put plugin options into separate argparse groups

This commit is contained in:
Anthony Sottile 2019-08-19 15:58:34 -07:00
parent f265b2275b
commit 8fd36ba15b
4 changed files with 30 additions and 4 deletions

View file

@ -1,9 +1,10 @@
"""Option handling and Option management logic."""
import argparse
import collections
import contextlib
import functools
import logging
from typing import Any, Dict, List, Optional, Set
from typing import Any, Dict, Generator, List, Optional, Set, Union
from flake8 import utils
@ -312,7 +313,9 @@ class OptionManager(object):
:param str usage:
Basic usage string used by the OptionParser.
"""
self.parser = argparse.ArgumentParser(prog=prog, usage=usage)
self.parser = argparse.ArgumentParser(
prog=prog, usage=usage
) # type: Union[argparse.ArgumentParser, argparse._ArgumentGroup]
self.version_action = self.parser.add_argument(
"--version", action="version", version=version
)
@ -330,6 +333,16 @@ class OptionManager(object):
"""Convert a PluginVersion into a dictionary mapping name to value."""
return {attr: getattr(plugin, attr) for attr in ["name", "version"]}
@contextlib.contextmanager
def group(self, name): # type: (str) -> Generator[None, None, None]
"""Attach options to an argparse group during this context."""
group = self.parser.add_argument_group(name)
self.parser, orig_parser = group, self.parser
try:
yield
finally:
self.parser = orig_parser
def add_option(self, *args, **kwargs):
"""Create and register a new option.

View file

@ -213,7 +213,8 @@ class Plugin(object):
self.name,
optmanager,
)
add_options(optmanager)
with optmanager.group(self.plugin_name):
add_options(optmanager)
if self.off_by_default:
self.disable(optmanager)

View file

@ -307,3 +307,14 @@ def test_optparse_normalize_help(optmanager, capsys):
out, err = capsys.readouterr()
output = out + err
assert 'default: bar' in output
def test_optmanager_group(optmanager, capsys):
"""Test that group(...) causes options to be assigned to a group."""
with optmanager.group('groupname'):
optmanager.add_option('--foo')
with pytest.raises(SystemExit):
optmanager.parse_args(['--help'])
out, err = capsys.readouterr()
output = out + err
assert '\ngroupname:\n' in output

View file

@ -5,6 +5,7 @@ import mock
import pytest
from flake8 import exceptions
from flake8.options import manager as options_manager
from flake8.plugins import manager
@ -91,7 +92,7 @@ def test_register_options():
entry_point = mock.Mock(spec=['load'])
plugin_obj = mock.Mock(spec_set=['name', 'version', 'add_options',
'parse_options'])
option_manager = mock.Mock(spec=['register_plugin'])
option_manager = mock.MagicMock(spec=options_manager.OptionManager)
plugin = manager.Plugin('T000', entry_point)
plugin._plugin = plugin_obj