Merge branch 'plugin_argparse_groups' into 'master'

Put plugin options into separate argparse groups

Closes #565

See merge request pycqa/flake8!342
This commit is contained in:
Anthony Sottile 2019-08-19 22:59:20 +00:00
commit eea5bf9225
4 changed files with 30 additions and 4 deletions

View file

@ -1,9 +1,10 @@
"""Option handling and Option management logic.""" """Option handling and Option management logic."""
import argparse import argparse
import collections import collections
import contextlib
import functools import functools
import logging import logging
from typing import Any, Dict, List, Optional, Set from typing import Any, Dict, Generator, List, Optional, Set, Union
from flake8 import utils from flake8 import utils
@ -312,7 +313,9 @@ class OptionManager(object):
:param str usage: :param str usage:
Basic usage string used by the OptionParser. 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( self.version_action = self.parser.add_argument(
"--version", action="version", version=version "--version", action="version", version=version
) )
@ -330,6 +333,16 @@ class OptionManager(object):
"""Convert a PluginVersion into a dictionary mapping name to value.""" """Convert a PluginVersion into a dictionary mapping name to value."""
return {attr: getattr(plugin, attr) for attr in ["name", "version"]} 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): def add_option(self, *args, **kwargs):
"""Create and register a new option. """Create and register a new option.

View file

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

View file

@ -307,3 +307,14 @@ def test_optparse_normalize_help(optmanager, capsys):
out, err = capsys.readouterr() out, err = capsys.readouterr()
output = out + err output = out + err
assert 'default: bar' in output 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 import pytest
from flake8 import exceptions from flake8 import exceptions
from flake8.options import manager as options_manager
from flake8.plugins import manager from flake8.plugins import manager
@ -91,7 +92,7 @@ def test_register_options():
entry_point = mock.Mock(spec=['load']) entry_point = mock.Mock(spec=['load'])
plugin_obj = mock.Mock(spec_set=['name', 'version', 'add_options', plugin_obj = mock.Mock(spec_set=['name', 'version', 'add_options',
'parse_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 = manager.Plugin('T000', entry_point)
plugin._plugin = plugin_obj plugin._plugin = plugin_obj