Merge branch 'latest_pyflakes' into 'master'

use latest pyflakes

See merge request pycqa/flake8!283
This commit is contained in:
Anthony Sottile 2019-01-28 16:21:00 +00:00
commit d83fed0987
13 changed files with 69 additions and 38 deletions

17
.gitignore vendored
View file

@ -1,13 +1,14 @@
*.pyc
.tox
.eggs
*.egg *.egg
*.egg-info *.egg-info
build *.log
dist *.pyc
*.sw*
*.zip *.zip
.cache .cache
*.sw*
*.log
docs/build/html/*
.coverage .coverage
.eggs
.tox
/.mypy_cache
build
dist
docs/build/html/*

2
mypy.ini Normal file
View file

@ -0,0 +1,2 @@
[mypy]
ignore_missing_imports = true

View file

@ -20,13 +20,14 @@ requires = [
# And in which releases we will update those ranges here: # And in which releases we will update those ranges here:
# http://flake8.pycqa.org/en/latest/internal/releases.html#releasing-flake8 # http://flake8.pycqa.org/en/latest/internal/releases.html#releasing-flake8
"entrypoints >= 0.2.3, < 0.3.0", "entrypoints >= 0.2.3, < 0.3.0",
"pyflakes >= 2.0.0, < 2.1.0", "pyflakes >= 2.1.0, < 2.2.0",
"pycodestyle >= 2.4.0, < 2.5.0", "pycodestyle >= 2.4.0, < 2.5.0",
"mccabe >= 0.6.0, < 0.7.0", "mccabe >= 0.6.0, < 0.7.0",
] ]
extras_require = { extras_require = {
":python_version<'3.4'": ['enum34'], ":python_version<'3.4'": ['enum34'],
":python_version<'3.5'": ['typing'],
":python_version<'3.2'": ['configparser'], ":python_version<'3.2'": ['configparser'],
} }

View file

@ -5,6 +5,7 @@ import logging
import signal import signal
import sys import sys
import tokenize import tokenize
from typing import List, Optional # noqa: F401 (until flake8 3.7)
try: try:
import multiprocessing import multiprocessing
@ -195,7 +196,7 @@ class Manager(object):
) )
def make_checkers(self, paths=None): def make_checkers(self, paths=None):
# type: (List[str]) -> NoneType # type: (List[str]) -> None
"""Create checkers for each file.""" """Create checkers for each file."""
if paths is None: if paths is None:
paths = self.arguments paths = self.arguments
@ -411,7 +412,7 @@ class FileChecker(object):
return None return None
def report(self, error_code, line_number, column, text, line=None): def report(self, error_code, line_number, column, text, line=None):
# type: (str, int, int, str) -> str # type: (str, int, int, str, Optional[str]) -> str
"""Report an error by storing it in the results list.""" """Report an error by storing it in the results list."""
if error_code is None: if error_code is None:
error_code, text = text.split(" ", 1) error_code, text = text.split(" ", 1)

View file

@ -4,6 +4,8 @@ from __future__ import print_function
import logging import logging
import sys import sys
import time import time
from typing import List, Optional, Sequence # noqa: F401 (until flake8 3.7)
from typing import Type, TYPE_CHECKING # noqa: F401 (until flake8 3.7)
import flake8 import flake8
from flake8 import checker from flake8 import checker
@ -16,6 +18,12 @@ from flake8.options import aggregator, config
from flake8.options import manager from flake8.options import manager
from flake8.plugins import manager as plugin_manager from flake8.plugins import manager as plugin_manager
if TYPE_CHECKING:
# fmt: off
from flake8.formatting.base import BaseFormatter # noqa: F401, E501 (until flake8 3.7)
# fmt: on
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -23,7 +31,7 @@ class Application(object):
"""Abstract our application into a class.""" """Abstract our application into a class."""
def __init__(self, program="flake8", version=flake8.__version__): def __init__(self, program="flake8", version=flake8.__version__):
# type: (str, str) -> NoneType # type: (str, str) -> None
"""Initialize our application. """Initialize our application.
:param str program: :param str program:
@ -132,7 +140,7 @@ class Application(object):
self.prelim_opts, self.prelim_args = opts, args self.prelim_opts, self.prelim_args = opts, args
def exit(self): def exit(self):
# type: () -> NoneType # type: () -> None
"""Handle finalization and exiting the program. """Handle finalization and exiting the program.
This should be the last thing called on the application instance. It This should be the last thing called on the application instance. It
@ -159,7 +167,7 @@ class Application(object):
) )
def find_plugins(self): def find_plugins(self):
# type: () -> NoneType # type: () -> None
"""Find and load the plugins for this application. """Find and load the plugins for this application.
If :attr:`check_plugins`, or :attr:`formatting_plugins` are ``None`` If :attr:`check_plugins`, or :attr:`formatting_plugins` are ``None``
@ -191,14 +199,14 @@ class Application(object):
self.formatting_plugins.load_plugins() self.formatting_plugins.load_plugins()
def register_plugin_options(self): def register_plugin_options(self):
# type: () -> NoneType # type: () -> None
"""Register options provided by plugins to our option manager.""" """Register options provided by plugins to our option manager."""
self.check_plugins.register_options(self.option_manager) self.check_plugins.register_options(self.option_manager)
self.check_plugins.register_plugin_versions(self.option_manager) self.check_plugins.register_plugin_versions(self.option_manager)
self.formatting_plugins.register_options(self.option_manager) self.formatting_plugins.register_options(self.option_manager)
def parse_configuration_and_cli(self, argv=None): def parse_configuration_and_cli(self, argv=None):
# type: (Union[NoneType, List[str]]) -> NoneType # type: (Optional[List[str]]) -> None
"""Parse configuration files and the CLI options. """Parse configuration files and the CLI options.
:param list argv: :param list argv:
@ -238,7 +246,7 @@ class Application(object):
return formatter_plugin.execute return formatter_plugin.execute
def make_formatter(self, formatter_class=None): def make_formatter(self, formatter_class=None):
# type: () -> NoneType # type: (Optional[Type[BaseFormatter]]) -> None
"""Initialize a formatter based on the parsed options.""" """Initialize a formatter based on the parsed options."""
if self.formatter is None: if self.formatter is None:
format_plugin = self.options.format format_plugin = self.options.format
@ -253,7 +261,7 @@ class Application(object):
self.formatter = formatter_class(self.options) self.formatter = formatter_class(self.options)
def make_guide(self): def make_guide(self):
# type: () -> NoneType # type: () -> None
"""Initialize our StyleGuide.""" """Initialize our StyleGuide."""
if self.guide is None: if self.guide is None:
self.guide = style_guide.StyleGuideManager( self.guide = style_guide.StyleGuideManager(
@ -264,7 +272,7 @@ class Application(object):
self.guide.add_diff_ranges(self.parsed_diff) self.guide.add_diff_ranges(self.parsed_diff)
def make_file_checker_manager(self): def make_file_checker_manager(self):
# type: () -> NoneType # type: () -> None
"""Initialize our FileChecker Manager.""" """Initialize our FileChecker Manager."""
if self.file_checker_manager is None: if self.file_checker_manager is None:
self.file_checker_manager = checker.Manager( self.file_checker_manager = checker.Manager(
@ -274,7 +282,7 @@ class Application(object):
) )
def run_checks(self, files=None): def run_checks(self, files=None):
# type: (Union[List[str], NoneType]) -> NoneType # type: (Optional[List[str]]) -> None
"""Run the actual checks with the FileChecker Manager. """Run the actual checks with the FileChecker Manager.
This method encapsulates the logic to make a This method encapsulates the logic to make a
@ -315,7 +323,7 @@ class Application(object):
self.formatter.show_benchmarks(statistics) self.formatter.show_benchmarks(statistics)
def report_errors(self): def report_errors(self):
# type: () -> NoneType # type: () -> None
"""Report all the errors found by flake8 3.0. """Report all the errors found by flake8 3.0.
This also updates the :attr:`result_count` attribute with the total This also updates the :attr:`result_count` attribute with the total
@ -338,7 +346,7 @@ class Application(object):
self.formatter.show_statistics(self.guide.stats) self.formatter.show_statistics(self.guide.stats)
def initialize(self, argv): def initialize(self, argv):
# type: () -> NoneType # type: (Sequence[str]) -> None
"""Initialize the application to be run. """Initialize the application to be run.
This finds the plugins, registers their options, and parses the This finds the plugins, registers their options, and parses the
@ -367,13 +375,13 @@ class Application(object):
self.formatter.stop() self.formatter.stop()
def _run(self, argv): def _run(self, argv):
# type: (Union[NoneType, List[str]]) -> NoneType # type: (Optional[List[str]]) -> None
self.initialize(argv) self.initialize(argv)
self.run_checks() self.run_checks()
self.report() self.report()
def run(self, argv=None): def run(self, argv=None):
# type: (Union[NoneType, List[str]]) -> NoneType # type: (Optional[List[str]]) -> None
"""Run our application. """Run our application.
This method will also handle KeyboardInterrupt exceptions for the This method will also handle KeyboardInterrupt exceptions for the
@ -389,7 +397,7 @@ class Application(object):
self.catastrophic_failure = True self.catastrophic_failure = True
except exceptions.ExecutionError as exc: except exceptions.ExecutionError as exc:
print("There was a critical error during execution of Flake8:") print("There was a critical error during execution of Flake8:")
print(exc.message) print(exc)
LOG.exception(exc) LOG.exception(exc)
self.catastrophic_failure = True self.catastrophic_failure = True
except exceptions.EarlyQuit: except exceptions.EarlyQuit:

View file

@ -1,9 +1,11 @@
"""Command-line implementation of flake8.""" """Command-line implementation of flake8."""
from typing import List, Optional # noqa: F401 (until flake8 3.7)
from flake8.main import application from flake8.main import application
def main(argv=None): def main(argv=None):
# type: (Union[NoneType, List[str]]) -> NoneType # type: (Optional[List[str]]) -> None
"""Execute the main bit of the application. """Execute the main bit of the application.
This handles the creation of an instance of :class:`Application`, runs it, This handles the creation of an instance of :class:`Application`, runs it,

View file

@ -1,5 +1,6 @@
"""The logic for Flake8's integration with setuptools.""" """The logic for Flake8's integration with setuptools."""
import os import os
from typing import List # noqa: F401 (until flake8 3.7)
import setuptools import setuptools
@ -19,7 +20,7 @@ class Flake8(setuptools.Command):
# of options, and since this will break when users use plugins that # of options, and since this will break when users use plugins that
# provide command-line options, we are leaving this empty. If users want # provide command-line options, we are leaving this empty. If users want
# to configure this command, they can do so through config files. # to configure this command, they can do so through config files.
user_options = [] user_options = [] # type: List[str]
def initialize_options(self): def initialize_options(self):
"""Override this method to initialize our application.""" """Override this method to initialize our application."""

View file

@ -315,7 +315,7 @@ class PluginManager(object): # pylint: disable=too-few-public-methods
def version_for(plugin): def version_for(plugin):
# (Plugin) -> Union[str, NoneType] # (Plugin) -> Optional[str]
"""Determine the version of a plugin by its module. """Determine the version of a plugin by its module.
:param plugin: :param plugin:

View file

@ -30,6 +30,8 @@ FLAKE8_PYFLAKES_CODES = {
"TooManyExpressionsInStarredAssignment": "F621", "TooManyExpressionsInStarredAssignment": "F621",
"TwoStarredExpressions": "F622", "TwoStarredExpressions": "F622",
"AssertTuple": "F631", "AssertTuple": "F631",
"IsLiteral": "F632",
"InvalidPrintSyntax": "F633",
"BreakOutsideLoop": "F701", "BreakOutsideLoop": "F701",
"ContinueOutsideLoop": "F702", "ContinueOutsideLoop": "F702",
"ContinueInFinally": "F703", "ContinueInFinally": "F703",
@ -39,6 +41,7 @@ FLAKE8_PYFLAKES_CODES = {
"DefaultExceptNotLast": "F707", "DefaultExceptNotLast": "F707",
"DoctestSyntaxError": "F721", "DoctestSyntaxError": "F721",
"ForwardAnnotationSyntaxError": "F722", "ForwardAnnotationSyntaxError": "F722",
"CommentAnnotationSyntaxError": "F723",
"RedefinedWhileUnused": "F811", "RedefinedWhileUnused": "F811",
"RedefinedInListComp": "F812", "RedefinedInListComp": "F812",
"UndefinedName": "F821", "UndefinedName": "F821",
@ -72,7 +75,7 @@ class FlakesChecker(pyflakes.checker.Checker):
include_in_doctest = [] include_in_doctest = []
exclude_from_doctest = [] exclude_from_doctest = []
def __init__(self, tree, filename): def __init__(self, tree, file_tokens, filename):
"""Initialize the PyFlakes plugin with an AST tree and filename.""" """Initialize the PyFlakes plugin with an AST tree and filename."""
filename = utils.normalize_paths(filename)[0] filename = utils.normalize_paths(filename)[0]
with_doctest = self.with_doctest with_doctest = self.with_doctest
@ -97,7 +100,10 @@ class FlakesChecker(pyflakes.checker.Checker):
with_doctest = True with_doctest = True
super(FlakesChecker, self).__init__( super(FlakesChecker, self).__init__(
tree, filename=filename, withDoctest=with_doctest tree,
filename=filename,
withDoctest=with_doctest,
file_tokens=file_tokens,
) )
@classmethod @classmethod

View file

@ -3,6 +3,7 @@ import contextlib
import logging import logging
import sys import sys
import tokenize import tokenize
from typing import List # noqa: F401 (until flake8 3.7)
import flake8 import flake8
from flake8 import defaults from flake8 import defaults
@ -348,7 +349,7 @@ class FileProcessor(object):
return False return False
def strip_utf_bom(self): def strip_utf_bom(self):
# type: () -> NoneType # type: () -> None
"""Strip the UTF bom from the lines of the file.""" """Strip the UTF bom from the lines of the file."""
if not self.lines: if not self.lines:
# If we have nothing to analyze quit early # If we have nothing to analyze quit early

View file

@ -7,6 +7,7 @@ import functools
import itertools import itertools
import linecache import linecache
import logging import logging
from typing import Optional, Union # noqa: F401 (until flake8 3.7)
from flake8 import defaults from flake8 import defaults
from flake8 import statistics from flake8 import statistics
@ -391,7 +392,7 @@ class StyleGuideManager(object):
text, text,
physical_line=None, physical_line=None,
): ):
# type: (str, str, int, int, str) -> int # type: (str, str, int, int, str, Optional[str]) -> int
"""Handle an error reported by a check. """Handle an error reported by a check.
:param str code: :param str code:
@ -511,7 +512,7 @@ class StyleGuide(object):
text, text,
physical_line=None, physical_line=None,
): ):
# type: (str, str, int, int, str) -> int # type: (str, str, int, int, str, Optional[str]) -> int
"""Handle an error reported by a check. """Handle an error reported by a check.
:param str code: :param str code:

View file

@ -8,6 +8,13 @@ import platform
import re import re
import sys import sys
import tokenize import tokenize
from typing import Callable, Dict, Generator # noqa: F401 (until flake8 3.7)
from typing import List, Pattern, Sequence # noqa: F401 (until flake8 3,7)
from typing import Tuple, TYPE_CHECKING # noqa: F401 (until flake8 3.7)
from typing import Union # noqa: F401 (until flake8 3.7)
if TYPE_CHECKING:
from flake8.plugins.manager import Plugin # noqa: F401 (until flake8 3.7)
DIFF_HUNK_REGEXP = re.compile(r"^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@.*$") DIFF_HUNK_REGEXP = re.compile(r"^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@.*$")
COMMA_SEPARATED_LIST_RE = re.compile(r"[,\s]") COMMA_SEPARATED_LIST_RE = re.compile(r"[,\s]")
@ -15,7 +22,7 @@ LOCAL_PLUGIN_LIST_RE = re.compile(r"[,\t\n\r\f\v]")
def parse_comma_separated_list(value, regexp=COMMA_SEPARATED_LIST_RE): def parse_comma_separated_list(value, regexp=COMMA_SEPARATED_LIST_RE):
# type: (Union[Sequence[str], str]) -> List[str] # type: (Union[Sequence[str], str], Pattern[str]) -> List[str]
"""Parse a comma-separated list. """Parse a comma-separated list.
:param value: :param value:
@ -321,7 +328,7 @@ def _default_predicate(*args):
def filenames_from(arg, predicate=None): def filenames_from(arg, predicate=None):
# type: (str, callable) -> Generator # type: (str, Callable[[str], bool]) -> Generator
"""Generate filenames from an argument. """Generate filenames from an argument.
:param str arg: :param str arg:
@ -382,7 +389,7 @@ def fnmatch(filename, patterns, default=True):
def parameters_for(plugin): def parameters_for(plugin):
# type: (flake8.plugins.manager.Plugin) -> Dict[str, bool] # type: (Plugin) -> Dict[str, bool]
"""Return the parameters for the plugin. """Return the parameters for the plugin.
This will inspect the plugin and return either the function parameters This will inspect the plugin and return either the function parameters

View file

@ -74,9 +74,9 @@ commands =
basepython = python3 basepython = python3
skip_install = true skip_install = true
deps = deps =
mypy-lang mypy
commands = commands =
mypy flake8 mypy src
[testenv:bandit] [testenv:bandit]
basepython = python3 basepython = python3