From bce2c059a45a8747592caa50616a434d369a1002 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Wed, 21 Oct 2020 11:20:40 +0300 Subject: [PATCH] Adapt code for flake8 >= 3.8.0 * Application.__init__() modification may be drasticaly reduced if the upstream removes the hardcoded arguments for manager.OptionManager. * Reimplemented RstFileChecker.reporter() * Added disable_noqa option with default value for tests Closes #22 --- flake8_rst/application.py | 32 +++++++++++++++++++++++++++++--- flake8_rst/checker.py | 23 +++++++++++++++++++++-- tests/test_precisely.py | 3 ++- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/flake8_rst/application.py b/flake8_rst/application.py index 1ea509e..1bc6e20 100644 --- a/flake8_rst/application.py +++ b/flake8_rst/application.py @@ -1,3 +1,6 @@ +import argparse +import time + from flake8.main import options from flake8.main.application import Application as Flake8Application from flake8.options import manager @@ -8,11 +11,35 @@ class Application(Flake8Application): def __init__(self, program='flake8-rst', version=__version__): - super(Application, self).__init__(program, version) + self.start_time = time.time() + self.end_time = None # type: float + self.program = program + self.version = version + self.prelim_arg_parser = argparse.ArgumentParser(add_help=False) + options.register_preliminary_options(self.prelim_arg_parser) + # super(Application, self).__init__(program, version) doesn't work + # because flake8 has hardcoded 'flake8' in this code snippet: self.option_manager = manager.OptionManager( - prog=program, version=version + prog=program, + version=version, + parents=[self.prelim_arg_parser], ) + options.register_default_options(self.option_manager) + + self.check_plugins = None # type: plugin_manager.Checkers + self.formatting_plugins = None # type: plugin_manager.ReportFormatters + self.formatter = None # type: BaseFormatter + self.guide = None # type: style_guide.StyleGuideManager + self.file_checker_manager = None # type: checker.Manager + self.options = None # type: argparse.Namespace + self.args = None # type: List[str] + self.result_count = 0 + self.total_result_count = 0 + self.catastrophic_failure = False + self.running_against_diff = False + self.parsed_diff = {} # type: Dict[str, Set[int]] + self.option_manager.add_option( '--bootstrap', default=None, parse_from_config=True, help='Bootstrap code snippets. Useful for add imports.', @@ -21,7 +48,6 @@ def __init__(self, program='flake8-rst', version=__version__): '--default-groupnames', default="*.rst->*: default", parse_from_config=True, help='Set default group names.', type='string', ) - options.register_default_options(self.option_manager) def make_file_checker_manager(self): if self.file_checker_manager is None: diff --git a/flake8_rst/checker.py b/flake8_rst/checker.py index b912238..a66d951 100644 --- a/flake8_rst/checker.py +++ b/flake8_rst/checker.py @@ -3,6 +3,7 @@ from flake8.checker import FileChecker, Manager, LOG from flake8.processor import FileProcessor from flake8.style_guide import DecisionEngine +from flake8 import exceptions from .rst import find_sourcecode @@ -27,6 +28,7 @@ def make_checkers(self, paths=None): checkers.append(checker) self.checkers = checkers + self._all_checkers = checkers LOG.info('Checking %d blocks', len(self.checkers)) @@ -74,8 +76,25 @@ def report(self, error_code, line_number, column, text, line=None): if line['lineno'] == 0: return error_code - return super(RstFileChecker, self).report(error_code, line['lineno'], column + line['indent'], - text, line=line['raw_source']) + if error_code is None: + error_code, text = text.split(" ", 1) + + # If we're recovering from a problem in _make_processor, we will not + # have this attribute. + if hasattr(self, "processor"): + try: + self.processor.file_tokens + source = self.processor.noqa_line_for(line_number) + except exceptions.InvalidSyntax: + source = line['source'] + else: + source = None + + if source: + source = line['raw_source'][:line['indent']] + source + + self.results.append((error_code, line['lineno'], column + line['indent'], text, source)) + return error_code except IndexError: return error_code diff --git a/tests/test_precisely.py b/tests/test_precisely.py index cb69938..a6dfac9 100644 --- a/tests/test_precisely.py +++ b/tests/test_precisely.py @@ -8,7 +8,8 @@ @pytest.fixture() def options(mocker): return mocker.Mock(max_line_length=80, verbose=0, hang_closing=False, max_doc_length=100, - ignore=[], bootstrap=None, default_groupnames='*.rst->*: default') + ignore=[], bootstrap=None, default_groupnames='*.rst->*: default', + disable_noqa=False) @pytest.fixture()