From d4b0073167284c2ebb8c360afa376c4ff598f70c Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 8 Jul 2019 13:44:36 -0700 Subject: [PATCH] Fix / improve recently merged patches + CI --- .appveyor.yml | 2 +- setup.cfg | 10 ++---- src/flake8/checker.py | 2 +- src/flake8/main/options.py | 2 +- src/flake8/utils.py | 4 +-- tests/integration/test_main.py | 5 ++- tests/unit/test_utils.py | 61 +++++++++++++++++++++++++--------- 7 files changed, 57 insertions(+), 29 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index d9b34ca..dc5f334 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,6 +1,6 @@ # To activate, change the Appveyor settings to use `.appveyor.yml`. install: - - python -m pip install --upgrade tox virtualenv + - python -m pip install --upgrade setuptools tox virtualenv build: off diff --git a/setup.cfg b/setup.cfg index 528d87b..addb35c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -33,13 +33,7 @@ classifiers = [options] package_dir= =src -packages = - flake8 - flake8.api - flake8.formatting - flake8.main - flake8.options - flake8.plugins +packages = find: install_requires= # We document the reasoning for using ranges here: @@ -57,6 +51,8 @@ install_requires= python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +[options.packages.find] +where = src [options.entry_points] distutils.commands= diff --git a/src/flake8/checker.py b/src/flake8/checker.py index 405820c..6170d88 100644 --- a/src/flake8/checker.py +++ b/src/flake8/checker.py @@ -81,7 +81,7 @@ class Manager(object): "tokens": 0, } self.exclude = tuple( - itertools.chain(self.options.exclude, self.options.extend_exclude), + itertools.chain(self.options.exclude, self.options.extend_exclude) ) def _process_statistics(self): diff --git a/src/flake8/main/options.py b/src/flake8/main/options.py index e1f1767..bef5630 100644 --- a/src/flake8/main/options.py +++ b/src/flake8/main/options.py @@ -93,7 +93,7 @@ def register_default_options(option_manager): parse_from_config=True, comma_separated_list=True, help="Comma-separated list of files or directories to add to the list" - " of excluded ones." + " of excluded ones.", ) add_option( diff --git a/src/flake8/utils.py b/src/flake8/utils.py index a838140..02f0607 100644 --- a/src/flake8/utils.py +++ b/src/flake8/utils.py @@ -386,7 +386,7 @@ def filenames_from(arg, predicate=None): def fnmatch(filename, patterns): - # type: (str, List[str]) -> bool + # type: (str, Sequence[str]) -> bool """Wrap :func:`fnmatch.fnmatch` to add some functionality. :param str filename: @@ -453,7 +453,7 @@ def parameters_for(plugin): def matches_filename(path, patterns, log_message, logger): - # type: (str, List[str], str, logging.Logger) -> bool + # type: (str, Sequence[str], str, logging.Logger) -> bool """Use fnmatch to discern if a path exists in patterns. :param str path: diff --git a/tests/integration/test_main.py b/tests/integration/test_main.py index 21fd9e0..ccc70e1 100644 --- a/tests/integration/test_main.py +++ b/tests/integration/test_main.py @@ -1,4 +1,6 @@ """Integration tests for the main entrypoint of flake8.""" +import os + import mock from flake8 import utils @@ -69,10 +71,11 @@ def test_extend_exclude(tmpdir, capsys): application.Application().run(['--extend-exclude=vendor,legacy']) out, err = capsys.readouterr() - assert out == '''\ + expected_out = '''\ ./project/t.py:1:1: F401 'os' imported but unused ./project/t.py:2:1: F401 'sys' imported but unused ''' + assert out == expected_out.replace('/', os.sep) assert err == '' diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 0d1bed0..20c5fb9 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -163,39 +163,68 @@ def test_fnmatch(filename, patterns, expected): assert utils.fnmatch(filename, patterns) is expected +@pytest.fixture +def files_dir(tmpdir): + """Create test dir for testing filenames_from.""" + with tmpdir.as_cwd(): + tmpdir.join('a/b/c.py').ensure() + tmpdir.join('a/b/d.py').ensure() + tmpdir.join('a/b/e/f.py').ensure() + yield tmpdir + + +def _normpath(s): + return s.replace('/', os.sep) + + +def _normpaths(pths): + return {_normpath(pth) for pth in pths} + + +@pytest.mark.usefixtures('files_dir') def test_filenames_from_a_directory(): """Verify that filenames_from walks a directory.""" - filenames = list(utils.filenames_from('src/flake8/')) - assert len(filenames) > 2 - assert 'src/flake8/__init__.py' in filenames + filenames = set(utils.filenames_from(_normpath('a/b/'))) + # should include all files + expected = _normpaths(('a/b/c.py', 'a/b/d.py', 'a/b/e/f.py')) + assert filenames == expected +@pytest.mark.usefixtures('files_dir') def test_filenames_from_a_directory_with_a_predicate(): """Verify that predicates filter filenames_from.""" - filenames = list(utils.filenames_from( - arg='src/flake8/', - predicate=lambda filename: filename == 'flake8/__init__.py', + filenames = set(utils.filenames_from( + arg=_normpath('a/b/'), + predicate=lambda path: path.endswith(_normpath('b/c.py')), )) - assert len(filenames) > 2 - assert 'flake8/__init__.py' not in filenames + # should not include c.py + expected = _normpaths(('a/b/d.py', 'a/b/e/f.py')) + assert filenames == expected +@pytest.mark.usefixtures('files_dir') def test_filenames_from_a_directory_with_a_predicate_from_the_current_dir(): """Verify that predicates filter filenames_from.""" - filenames = list(utils.filenames_from( - arg='./src/flake8', - predicate=lambda filename: filename == '__init__.py', + filenames = set(utils.filenames_from( + arg=_normpath('./a/b'), + predicate=lambda path: path == 'c.py', )) - assert len(filenames) > 2 - assert './src/flake8/__init__.py' in filenames + # none should have matched the predicate so all returned + expected = _normpaths(('./a/b/c.py', './a/b/d.py', './a/b/e/f.py')) + assert filenames == expected +@pytest.mark.usefixtures('files_dir') def test_filenames_from_a_single_file(): """Verify that we simply yield that filename.""" - filenames = list(utils.filenames_from('flake8/__init__.py')) + filenames = set(utils.filenames_from(_normpath('a/b/c.py'))) + assert filenames == {_normpath('a/b/c.py')} - assert len(filenames) == 1 - assert ['flake8/__init__.py'] == filenames + +def test_filenames_from_a_single_file_does_not_exist(): + """Verify that a passed filename which does not exist is returned back.""" + filenames = set(utils.filenames_from(_normpath('d/n/e.py'))) + assert filenames == {_normpath('d/n/e.py')} def test_filenames_from_exclude_doesnt_exclude_directory_names(tmpdir):