Re-allow for relative paths for exclude
*Description of changes*
Use the directory that the configuration file is found in as the parent (instead of the current working directory) when normalizing paths.
*Related to:* #194
See merge request !109
Previously, all testing was done from the directory in which the
configuration file lived, so this bug went unnoticed. However, if you
run Flake8 against its own source from a directory above, you would
notice that the patterns in the exclude config value in tox.ini were
ignored. This is because we (like any reasonable person) are using
relative paths. The path is relative, however, to the directory in
which the configuration file was located. So we keep track of which
directory that is and use that to normalize the paths in the config
file.
Yes, there is an unrelated change to our tox.ini in this commit as
well. ;-)
Closes#194
Test loading non-callable plugins
*Description of changes*
This is just a simple addition to prevent a regression regarding bug #164 and merge request !101.
*Related to:* #164, !101
See merge request !106
Diable multiprocessing behaviour on Windows
*Description of changes*
Due to https://bugs.python.org/issue27649, while Flake8 can *run* with multiprocessing on Windows, it does not behave as we expect it to behave. To provide the best experience that is in agreement with our documentation, we must disable multiprocessing until https://bugs.python.org/issue27649 is fixed and released.
Closes#184
See merge request !105
Due to https://bugs.python.org/issue27649, we cannot continue to
expect multiprocessing to work as we expect and document it on Windows.
As such, we are going to revert back to our previous behaviour of
disabling it across all versions of Python on Windows to provide the
default expected behaviour of Flake8 on that Operating System.
Allow plugins that are on by default to be ignored
*Description of changes*
Previously, users were unable to ignore the error code of a plugin that was on by default. This adds a tiny bit of extra logic to re-enable that behaviour.
*Related to:* #195
See merge request !104
Previously, to ensure that plugins on by default were reported, we
added them to the select list. This means that ignoring them became
impossible. To accomodate our reporting logic and a user's ability
to ignore, we need to keep our select and extended select lists
separated.
This allows us to have a better understanding of who is selecting what,
where, and how and make our decision as to whether or not an error
should be reported more wisely.
Closes#195
Raise exception when entry_point not callable
Raise exception when entry_point not callable
E.g.:
```
$ .tox/flake8/bin/flake8 mobileweb
Traceback (most recent call last):
File ".tox/flake8/bin/flake8", line 9, in <module>
load_entry_point('flake8', 'console_scripts', 'flake8')()
File "/Users/marca/dev/git-repos/flake8/src/flake8/main/cli.py", line 16, in main
app.run(argv)
File "/Users/marca/dev/git-repos/flake8/src/flake8/main/application.py", line 316, in run
self._run(argv)
File "/Users/marca/dev/git-repos/flake8/src/flake8/main/application.py", line 299, in _run
self.initialize(argv)
File "/Users/marca/dev/git-repos/flake8/src/flake8/main/application.py", line 289, in initialize
self.find_plugins()
File "/Users/marca/dev/git-repos/flake8/src/flake8/main/application.py", line 143, in find_plugins
self.check_plugins.load_plugins()
File "/Users/marca/dev/git-repos/flake8/src/flake8/plugins/manager.py", line 375, in load_plugins
plugins = list(self.manager.map(load_plugin))
File "/Users/marca/dev/git-repos/flake8/src/flake8/plugins/manager.py", line 267, in map
yield func(self.plugins[name], *args, **kwargs)
File "/Users/marca/dev/git-repos/flake8/src/flake8/plugins/manager.py", line 373, in load_plugin
return plugin.load_plugin()
File "/Users/marca/dev/git-repos/flake8/src/flake8/plugins/manager.py", line 173, in load_plugin
raise failed_to_load
flake8.exceptions.FailedToLoadPlugin: Flake8 failed to load plugin "P999" due to Plugin <module 'teamcity.flake8_plugin' from '/Users/marca/dev/git-repos/teamcity-messages/teamcity/flake8_plugin.pyc'> is not a callable. It might be written for an older version of flake8 and might not work with this version.
```
This is nicer than the previous behavior of raising an obscure `PicklingError` and then hanging.
```
$ .tox/flake8/bin/flake8 mobileweb
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/queues.py", line 268, in _feed
send(obj)
PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed
```
*Related to:* 164
See merge request !101
E.g.:
```
$ .tox/flake8/bin/flake8 mobileweb
Traceback (most recent call last):
File ".tox/flake8/bin/flake8", line 9, in <module>
load_entry_point('flake8', 'console_scripts', 'flake8')()
File "/Users/marca/dev/git-repos/flake8/src/flake8/main/cli.py", line 16, in main
app.run(argv)
File "/Users/marca/dev/git-repos/flake8/src/flake8/main/application.py", line 316, in run
self._run(argv)
File "/Users/marca/dev/git-repos/flake8/src/flake8/main/application.py", line 299, in _run
self.initialize(argv)
File "/Users/marca/dev/git-repos/flake8/src/flake8/main/application.py", line 289, in initialize
self.find_plugins()
File "/Users/marca/dev/git-repos/flake8/src/flake8/main/application.py", line 143, in find_plugins
self.check_plugins.load_plugins()
File "/Users/marca/dev/git-repos/flake8/src/flake8/plugins/manager.py", line 375, in load_plugins
plugins = list(self.manager.map(load_plugin))
File "/Users/marca/dev/git-repos/flake8/src/flake8/plugins/manager.py", line 267, in map
yield func(self.plugins[name], *args, **kwargs)
File "/Users/marca/dev/git-repos/flake8/src/flake8/plugins/manager.py", line 373, in load_plugin
return plugin.load_plugin()
File "/Users/marca/dev/git-repos/flake8/src/flake8/plugins/manager.py", line 173, in load_plugin
raise failed_to_load
flake8.exceptions.FailedToLoadPlugin: Flake8 failed to load plugin "P999" due to Plugin <module 'teamcity.flake8_plugin' from '/Users/marca/dev/git-repos/teamcity-messages/teamcity/flake8_plugin.pyc'> is not a callable. It might be written for an older version of flake8 and might not work with this version.
```
This is nicer than the previous behavior of raising an obscure `PicklingError` and then hanging.
```
$ .tox/flake8/bin/flake8 mobileweb
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/queues.py", line 268, in _feed
send(obj)
PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed
```
See #164
Sort reports by line and column
*Description of changes*
The reports have been incorrectly sorted. This fixes the sorting order to use the line number and then column. It also adds a test to verify that the sorting algorithm works.
*Related to:* #196
See merge request !100
This makes the regular expression a bit more complex, and potentially
slower, but it will fix the issue where users had noqa comments with
colons followed by explanations.
Closes#178
Plugins do not have their parameters checked in advance, so when we
try to aggregate parameters for a plugin, there's a chance it may
request an attribute of the FileProcessor that simply does not exist.
We catch this and re-raise it but we should also capture it in the
checker manager and handle it appropriately there as well.
Fix multiprocessing on Windows
*Related to:* #184
I'm still running into #179 with this fix but all processes start now at least.
BTW the current design is pretty bad regarding memory footprint and bootstrap time as you have to pickle the manager object for *every* subprocess. So this does not only fix multiprocessing on Windows. It improves the multiprocessing design on other platforms, too.
See merge request !97
Fix read_lines_splits_lines test for CRLF endings
This change makes the test pass for when files are saved with CRLF Windows-style line endings since those are included in various `.readlines()` methods by default.
See merge request !96
Clarify what the X in the entry points does
*Description of changes*
Previously the `X` wasn't further explained in the documentation on how to
register a plugin. This plugs the hole at least for checking plugins.
*Related to:* #183
See merge request !93
When attempting to centralize all inline NoQA handling in the StyleGuide
we inadvertently broke plugins relying on it in combination with checker
state. For example, the check for E402 relies both on NoQA and the state
to determine if it has seen a non-import line. Placing NoQA on the sole
line that is not an import is more elegant than placing it on each of
the following import lines.
Closes#186
Update our flake8 testenv dependencies
*Description of changes*
Uncap Flake8 and add a lower bound to flake8-import-order
*Related to:* N/A
See merge request !94
Previously the `X` wasn't further explained in the documentation on how to
register a plugin. This plugs the hole at least for checking plugins.
See also: #183
Fix project config file discovery
*Description of changes*
Keep searching past the current directory to find project config files.
*Related to:* #181
See merge request !91
Flake8 3.0 was stopping once it found the current directory but the
historical behaviour (that we didn't intend to break) searched past
that (towards root) until it found one of the project/local config
file names that could be read.
Closes#181
Fundamentally on Flake8 2.x using -q altered the format of the errors
(and the behaviour a little) so it makes the most sense to implement
this logic with formatters rather than messy logic spread throughout
the project.
The FilenameOnly formatter will keep track of filenames already reported
and only print the name once while Nothing will print nothing.
Closes#180
Set-up and stop our formatter
*Description of changes*
Make `--output-file` work consistently (especially without verbose logging)
*Related to:* #180
See merge request !86