summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAnthony Sottile <asottile@umich.edu>2019-08-10 18:28:32 -0700
committerAnthony Sottile <asottile@umich.edu>2019-08-17 20:09:45 -0700
commitb66ebd7034090f96cb0806e5e2d8026b6e35d045 (patch)
treea354bc5e4b62fd2949e16c1d404b9ccc5ec1c041 /tests
parent03cb85f556b61d408a578becab50936ba2c246e7 (diff)
downloadflake8-b66ebd7034090f96cb0806e5e2d8026b6e35d045.tar.gz
move from optparse to argparse
Diffstat (limited to 'tests')
-rw-r--r--tests/integration/test_main.py36
-rw-r--r--tests/unit/conftest.py4
-rw-r--r--tests/unit/test_application.py6
-rw-r--r--tests/unit/test_base_formatter.py6
-rw-r--r--tests/unit/test_debug.py14
-rw-r--r--tests/unit/test_decision_engine.py6
-rw-r--r--tests/unit/test_filenameonly_formatter.py6
-rw-r--r--tests/unit/test_merged_config_parser.py2
-rw-r--r--tests/unit/test_nothing_formatter.py6
-rw-r--r--tests/unit/test_option.py55
-rw-r--r--tests/unit/test_option_manager.py103
-rw-r--r--tests/unit/test_plugin.py4
-rw-r--r--tests/unit/test_style_guide.py6
13 files changed, 166 insertions, 88 deletions
diff --git a/tests/integration/test_main.py b/tests/integration/test_main.py
index ccc70e1..001f1ff 100644
--- a/tests/integration/test_main.py
+++ b/tests/integration/test_main.py
@@ -1,10 +1,18 @@
"""Integration tests for the main entrypoint of flake8."""
+import json
import os
import mock
+import pytest
from flake8 import utils
-from flake8.main import application
+from flake8.main import cli
+
+
+def _call_main(argv, retv=0):
+ with pytest.raises(SystemExit) as excinfo:
+ cli.main(argv)
+ assert excinfo.value.code == retv
def test_diff_option(tmpdir, capsys):
@@ -36,9 +44,7 @@ index d64ac39..7d943de 100644
with mock.patch.object(utils, 'stdin_get_value', return_value=diff):
with tmpdir.as_cwd():
tmpdir.join('t.py').write(t_py_contents)
-
- app = application.Application()
- app.run(['--diff'])
+ _call_main(['--diff'], retv=1)
out, err = capsys.readouterr()
assert out == "t.py:8:1: F821 undefined name 'y'\n"
@@ -49,9 +55,7 @@ def test_statistics_option(tmpdir, capsys):
"""Ensure that `flake8 --statistics` works."""
with tmpdir.as_cwd():
tmpdir.join('t.py').write('import os\nimport sys\n')
-
- app = application.Application()
- app.run(['--statistics', 't.py'])
+ _call_main(['--statistics', 't.py'], retv=1)
out, err = capsys.readouterr()
assert out == '''\
@@ -68,7 +72,7 @@ def test_extend_exclude(tmpdir, capsys):
tmpdir.mkdir(d).join('t.py').write('import os\nimport sys\n')
with tmpdir.as_cwd():
- application.Application().run(['--extend-exclude=vendor,legacy'])
+ _call_main(['--extend-exclude=vendor,legacy'], retv=1)
out, err = capsys.readouterr()
expected_out = '''\
@@ -90,9 +94,7 @@ per-file-ignores =
with tmpdir.as_cwd():
tmpdir.join('setup.cfg').write(setup_cfg)
-
- app = application.Application()
- app.run(['.'])
+ _call_main(['.'], retv=1)
out, err = capsys.readouterr()
assert out == '''\
@@ -111,10 +113,16 @@ def test_tokenization_error_but_not_syntax_error(tmpdir, capsys):
with tmpdir.as_cwd():
# this is a crash in the tokenizer, but not in the ast
tmpdir.join('t.py').write("b'foo' \\\n")
-
- app = application.Application()
- app.run(['t.py'])
+ _call_main(['t.py'], retv=1)
out, err = capsys.readouterr()
assert out == 't.py:1:1: E902 TokenError: EOF in multi-line statement\n'
assert err == ''
+
+
+def test_bug_report_successful(capsys):
+ """Test that --bug-report does not crash."""
+ _call_main(['--bug-report'])
+ out, err = capsys.readouterr()
+ assert json.loads(out)
+ assert err == ''
diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py
index d570564..3541ec3 100644
--- a/tests/unit/conftest.py
+++ b/tests/unit/conftest.py
@@ -1,5 +1,5 @@
"""Shared fixtures between unit tests."""
-import optparse
+import argparse
import pytest
@@ -11,7 +11,7 @@ def options_from(**kwargs):
kwargs.setdefault('max_doc_length', None)
kwargs.setdefault('verbose', False)
kwargs.setdefault('stdin_display_name', 'stdin')
- return optparse.Values(kwargs)
+ return argparse.Namespace(**kwargs)
@pytest.fixture
diff --git a/tests/unit/test_application.py b/tests/unit/test_application.py
index cb8372b..8e5c9d5 100644
--- a/tests/unit/test_application.py
+++ b/tests/unit/test_application.py
@@ -1,5 +1,5 @@
"""Tests for the Application class."""
-import optparse
+import argparse
import sys
import mock
@@ -9,12 +9,12 @@ from flake8.main import application as app
def options(**kwargs):
- """Generate optparse.Values for our Application."""
+ """Generate argparse.Namespace for our Application."""
kwargs.setdefault('verbose', 0)
kwargs.setdefault('output_file', None)
kwargs.setdefault('count', False)
kwargs.setdefault('exit_zero', False)
- return optparse.Values(kwargs)
+ return argparse.Namespace(**kwargs)
@pytest.fixture
diff --git a/tests/unit/test_base_formatter.py b/tests/unit/test_base_formatter.py
index ee589aa..7a85554 100644
--- a/tests/unit/test_base_formatter.py
+++ b/tests/unit/test_base_formatter.py
@@ -1,5 +1,5 @@
"""Tests for the BaseFormatter object."""
-import optparse
+import argparse
import mock
import pytest
@@ -9,10 +9,10 @@ from flake8.formatting import base
def options(**kwargs):
- """Create an optparse.Values instance."""
+ """Create an argparse.Namespace instance."""
kwargs.setdefault('output_file', None)
kwargs.setdefault('tee', False)
- return optparse.Values(kwargs)
+ return argparse.Namespace(**kwargs)
@pytest.mark.parametrize('filename', [None, 'out.txt'])
diff --git a/tests/unit/test_debug.py b/tests/unit/test_debug.py
index 2b7995d..c973abb 100644
--- a/tests/unit/test_debug.py
+++ b/tests/unit/test_debug.py
@@ -73,9 +73,10 @@ def test_information(system, pyversion, pyimpl):
def test_print_information_no_plugins(dumps, information, print_mock):
"""Verify we print and exit only when we have plugins."""
option_manager = mock.Mock(registered_plugins=set())
- assert debug.print_information(
- None, None, None, None, option_manager=option_manager,
- ) is None
+ action = debug.DebugAction(
+ "--bug-report", dest="bug_report", option_manager=option_manager,
+ )
+ assert action(None, None, None, None) is None
assert dumps.called is False
assert information.called is False
assert print_mock.called is False
@@ -91,10 +92,11 @@ def test_print_information(dumps, information, print_mock):
manager.PluginVersion('mccabe', '0.5.9', False),
]
option_manager = mock.Mock(registered_plugins=set(plugins))
+ action = debug.DebugAction(
+ "--bug-report", dest="bug_report", option_manager=option_manager,
+ )
with pytest.raises(SystemExit):
- debug.print_information(
- None, None, None, None, option_manager=option_manager,
- )
+ action(None, None, None, None)
print_mock.assert_called_once_with('{}')
dumps.assert_called_once_with({}, indent=2, sort_keys=True)
information.assert_called_once_with(option_manager)
diff --git a/tests/unit/test_decision_engine.py b/tests/unit/test_decision_engine.py
index 635c9d8..7d92309 100644
--- a/tests/unit/test_decision_engine.py
+++ b/tests/unit/test_decision_engine.py
@@ -1,5 +1,5 @@
"""Tests for the flake8.style_guide.DecisionEngine class."""
-import optparse
+import argparse
import pytest
@@ -8,14 +8,14 @@ from flake8 import style_guide
def create_options(**kwargs):
- """Create and return an instance of optparse.Values."""
+ """Create and return an instance of argparse.Namespace."""
kwargs.setdefault('select', [])
kwargs.setdefault('extended_default_select', [])
kwargs.setdefault('ignore', [])
kwargs.setdefault('extend_ignore', [])
kwargs.setdefault('disable_noqa', False)
kwargs.setdefault('enable_extensions', [])
- return optparse.Values(kwargs)
+ return argparse.Namespace(**kwargs)
@pytest.mark.parametrize('ignore_list,extend_ignore,error_code', [
diff --git a/tests/unit/test_filenameonly_formatter.py b/tests/unit/test_filenameonly_formatter.py
index b423ee3..8d0c88f 100644
--- a/tests/unit/test_filenameonly_formatter.py
+++ b/tests/unit/test_filenameonly_formatter.py
@@ -1,15 +1,15 @@
"""Tests for the FilenameOnly formatter object."""
-import optparse
+import argparse
from flake8 import style_guide
from flake8.formatting import default
def options(**kwargs):
- """Create an optparse.Values instance."""
+ """Create an argparse.Namespace instance."""
kwargs.setdefault('output_file', None)
kwargs.setdefault('tee', False)
- return optparse.Values(kwargs)
+ return argparse.Namespace(**kwargs)
def test_caches_filenames_already_printed():
diff --git a/tests/unit/test_merged_config_parser.py b/tests/unit/test_merged_config_parser.py
index 37d5e6f..1112a0d 100644
--- a/tests/unit/test_merged_config_parser.py
+++ b/tests/unit/test_merged_config_parser.py
@@ -215,7 +215,7 @@ def test_parsed_hyphenated_and_underscored_names(
max_line_length in our config files.
"""
optmanager.add_option('--max-line-length', parse_from_config=True,
- type='int')
+ type=int)
optmanager.add_option('--enable-extensions', parse_from_config=True,
comma_separated_list=True)
parser = config.MergedConfigParser(optmanager, config_finder)
diff --git a/tests/unit/test_nothing_formatter.py b/tests/unit/test_nothing_formatter.py
index a1fd683..85a2e76 100644
--- a/tests/unit/test_nothing_formatter.py
+++ b/tests/unit/test_nothing_formatter.py
@@ -1,15 +1,15 @@
"""Tests for the Nothing formatter obbject."""
-import optparse
+import argparse
from flake8 import style_guide
from flake8.formatting import default
def options(**kwargs):
- """Create an optparse.Values instance."""
+ """Create an argparse.Namespace instance."""
kwargs.setdefault('output_file', None)
kwargs.setdefault('tee', False)
- return optparse.Values(kwargs)
+ return argparse.Namespace(**kwargs)
def test_format_returns_nothing():
diff --git a/tests/unit/test_option.py b/tests/unit/test_option.py
index e931d13..d4607b3 100644
--- a/tests/unit/test_option.py
+++ b/tests/unit/test_option.py
@@ -1,12 +1,14 @@
"""Unit tests for flake8.options.manager.Option."""
+import functools
+
import mock
import pytest
from flake8.options import manager
-def test_to_optparse():
- """Test conversion to an optparse.Option class."""
+def test_to_argparse():
+ """Test conversion to an argparse arguments."""
opt = manager.Option(
short_option_name='-t',
long_option_name='--test',
@@ -17,45 +19,26 @@ def test_to_optparse():
assert opt.normalize_paths is True
assert opt.parse_from_config is True
- optparse_opt = opt.to_optparse()
- assert not hasattr(optparse_opt, 'parse_from_config')
- assert not hasattr(optparse_opt, 'normalize_paths')
- assert optparse_opt.action == 'count'
+ args, kwargs = opt.to_argparse()
+ assert args == ['-t', '--test']
+ assert kwargs == {'action': 'count', 'type': mock.ANY}
+ assert isinstance(kwargs['type'], functools.partial)
-@pytest.mark.parametrize('opttype,str_val,expected', [
- ('float', '2', 2.0),
- ('complex', '2', (2 + 0j)),
-])
-def test_to_support_optparses_standard_types(opttype, str_val, expected):
- """Show that optparse converts float and complex types correctly."""
- opt = manager.Option('-t', '--test', type=opttype)
- assert opt.normalize_from_setuptools(str_val) == expected
+def test_to_optparse():
+ """Test that .to_optparse() produces a useful error message."""
+ with pytest.raises(AttributeError) as excinfo:
+ manager.Option('--foo').to_optparse()
+ msg, = excinfo.value.args
+ assert msg == 'to_optparse: flake8 now uses argparse'
-@mock.patch('optparse.Option')
-def test_to_optparse_creates_an_option_as_we_expect(Option): # noqa: N803
- """Show that we pass all keyword args to optparse.Option."""
+def test_to_argparse_creates_an_option_as_we_expect():
+ """Show that we pass all keyword args to argparse."""
opt = manager.Option('-t', '--test', action='count')
- opt.to_optparse()
- option_kwargs = {
- 'action': 'count',
- 'default': None,
- 'type': None,
- 'dest': 'test',
- 'nargs': None,
- 'const': None,
- 'choices': None,
- 'callback': None,
- 'callback_args': None,
- 'callback_kwargs': None,
- 'help': None,
- 'metavar': None,
- }
-
- Option.assert_called_once_with(
- '-t', '--test', **option_kwargs
- )
+ args, kwargs = opt.to_argparse()
+ assert args == ['-t', '--test']
+ assert kwargs == {'action': 'count'}
def test_config_name_generation():
diff --git a/tests/unit/test_option_manager.py b/tests/unit/test_option_manager.py
index df1f9a2..ebcd9e7 100644
--- a/tests/unit/test_option_manager.py
+++ b/tests/unit/test_option_manager.py
@@ -1,5 +1,5 @@
"""Unit tests for flake.options.manager.OptionManager."""
-import optparse
+import argparse
import os
import mock
@@ -19,8 +19,7 @@ def optmanager():
def test_option_manager_creates_option_parser(optmanager):
"""Verify that a new manager creates a new parser."""
- assert optmanager.parser is not None
- assert isinstance(optmanager.parser, optparse.OptionParser) is True
+ assert isinstance(optmanager.parser, argparse.ArgumentParser)
def test_add_option_short_option_only(optmanager):
@@ -38,7 +37,7 @@ def test_add_option_long_option_only(optmanager):
assert optmanager.config_options_dict == {}
optmanager.add_option('--long', help='Test long opt')
- assert optmanager.options[0].short_option_name is None
+ assert optmanager.options[0].short_option_name is manager._NOARG
assert optmanager.options[0].long_option_name == '--long'
@@ -171,7 +170,7 @@ def test_generate_versions_with_format_string(optmanager):
def test_update_version_string(optmanager):
"""Verify we update the version string idempotently."""
assert optmanager.version == TEST_VERSION
- assert optmanager.parser.version == TEST_VERSION
+ assert optmanager.version_action.version == TEST_VERSION
optmanager.registered_plugins = [
manager.PluginVersion('Testing 100', '0.0.0', False),
@@ -182,7 +181,7 @@ def test_update_version_string(optmanager):
optmanager.update_version_string()
assert optmanager.version == TEST_VERSION
- assert (optmanager.parser.version == TEST_VERSION
+ assert (optmanager.version_action.version == TEST_VERSION
+ ' (Testing 100: 0.0.0, Testing 101: 0.0.0, Testing 300: 0.0.0) '
+ utils.get_python_version())
@@ -211,9 +210,7 @@ def test_extend_default_ignore(optmanager):
assert optmanager.extended_default_ignore == set()
optmanager.extend_default_ignore(['T100', 'T101', 'T102'])
- assert optmanager.extended_default_ignore == {'T100',
- 'T101',
- 'T102'}
+ assert optmanager.extended_default_ignore == {'T100', 'T101', 'T102'}
def test_parse_known_args(optmanager):
@@ -222,3 +219,91 @@ def test_parse_known_args(optmanager):
optmanager.parse_known_args(['--max-complexity', '5'])
assert sysexit.called is False
+
+
+def test_optparse_normalize_callback_option_legacy(optmanager):
+ """Test the optparse shim for `callback=`."""
+ callback_foo = mock.Mock()
+ optmanager.add_option(
+ '--foo',
+ action='callback',
+ callback=callback_foo,
+ callback_args=(1, 2),
+ callback_kwargs={'a': 'b'},
+ )
+ callback_bar = mock.Mock()
+ optmanager.add_option(
+ '--bar',
+ action='callback',
+ type='string',
+ callback=callback_bar,
+ )
+ callback_baz = mock.Mock()
+ optmanager.add_option(
+ '--baz',
+ action='callback',
+ type='string',
+ nargs=2,
+ callback=callback_baz,
+ )
+
+ optmanager.parse_args(['--foo', '--bar', 'bararg', '--baz', '1', '2'])
+
+ callback_foo.assert_called_once_with(
+ mock.ANY, # the option / action instance
+ '--foo',
+ None,
+ mock.ANY, # the OptionParser / ArgumentParser
+ 1,
+ 2,
+ a='b',
+ )
+ callback_bar.assert_called_once_with(
+ mock.ANY, # the option / action instance
+ '--bar',
+ 'bararg',
+ mock.ANY, # the OptionParser / ArgumentParser
+ )
+ callback_baz.assert_called_once_with(
+ mock.ANY, # the option / action instance
+ '--baz',
+ ('1', '2'),
+ mock.ANY, # the OptionParser / ArgumentParser
+ )
+
+
+@pytest.mark.parametrize(
+ ('type_s', 'input_val', 'expected'),
+ (
+ ('int', '5', 5),
+ ('long', '6', 6),
+ ('string', 'foo', 'foo'),
+ ('float', '1.5', 1.5),
+ ('complex', '1+5j', 1 + 5j),
+ ),
+)
+def test_optparse_normalize_types(optmanager, type_s, input_val, expected):
+ """Test the optparse shim for type="typename"."""
+ optmanager.add_option('--foo', type=type_s)
+ opts, args = optmanager.parse_args(['--foo', input_val])
+ assert opts.foo == expected
+
+
+def test_optparse_normalize_choice_type(optmanager):
+ """Test the optparse shim for type="choice"."""
+ optmanager.add_option('--foo', type='choice', choices=('1', '2', '3'))
+ opts, args = optmanager.parse_args(['--foo', '1'])
+ assert opts.foo == '1'
+ # fails to parse
+ with pytest.raises(SystemExit):
+ optmanager.parse_args(['--foo', '4'])
+
+
+def test_optparse_normalize_help(optmanager, capsys):
+ """Test the optparse shim for %default in help text."""
+ optmanager.add_option('--foo', default='bar', help='default: %default')
+ with pytest.raises(SystemExit):
+ optmanager.parse_args(['--help'])
+ out, err = capsys.readouterr()
+ output = out + err
+ assert 'default: bar' in output
diff --git a/tests/unit/test_plugin.py b/tests/unit/test_plugin.py
index 4d5510f..cf87ea1 100644
--- a/tests/unit/test_plugin.py
+++ b/tests/unit/test_plugin.py
@@ -1,5 +1,5 @@
"""Tests for flake8.plugins.manager.Plugin."""
-import optparse
+import argparse
import mock
import pytest
@@ -124,7 +124,7 @@ def test_provide_options():
entry_point = mock.Mock(spec=['load'])
plugin_obj = mock.Mock(spec_set=['name', 'version', 'add_options',
'parse_options'])
- option_values = optparse.Values({'enable_extensions': []})
+ option_values = argparse.Namespace(enable_extensions=[])
option_manager = mock.Mock()
plugin = manager.Plugin('T000', entry_point)
plugin._plugin = plugin_obj
diff --git a/tests/unit/test_style_guide.py b/tests/unit/test_style_guide.py
index 46ab28e..38121c1 100644
--- a/tests/unit/test_style_guide.py
+++ b/tests/unit/test_style_guide.py
@@ -1,5 +1,5 @@
"""Tests for the flake8.style_guide.StyleGuide class."""
-import optparse
+import argparse
import mock
import pytest
@@ -11,7 +11,7 @@ from flake8.formatting import base
def create_options(**kwargs):
- """Create and return an instance of optparse.Values."""
+ """Create and return an instance of argparse.Namespace."""
kwargs.setdefault('select', [])
kwargs.setdefault('extended_default_select', [])
kwargs.setdefault('ignore', [])
@@ -19,7 +19,7 @@ def create_options(**kwargs):
kwargs.setdefault('disable_noqa', False)
kwargs.setdefault('enable_extensions', [])
kwargs.setdefault('per_file_ignores', [])
- return optparse.Values(kwargs)
+ return argparse.Namespace(**kwargs)
def test_handle_error_does_not_raise_type_errors():