aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniƫl van Noord <13665637+DanielNoord@users.noreply.github.com>2021-09-16 22:12:19 +0200
committerPierre Sassoulas <pierre.sassoulas@gmail.com>2021-09-16 22:38:28 +0200
commit6d07d6f1a51c2e3e3e2db37f23c12ebdec094410 (patch)
treeeab8b8aea151845c8713e3233483db1f65682320
parentf45ab4972bbf140d449a023bf1407237d21c5879 (diff)
downloadpylint-6d07d6f1a51c2e3e3e2db37f23c12ebdec094410.tar.gz
Add typing for ``json_reporter`` and sub-classes
-rw-r--r--pylint/interfaces.py7
-rw-r--r--pylint/reporters/base_reporter.py17
-rw-r--r--pylint/reporters/collecting_reporter.py8
-rw-r--r--pylint/reporters/json_reporter.py13
-rw-r--r--pylint/reporters/multi_reporter.py10
-rw-r--r--pylint/reporters/text.py7
-rw-r--r--pylint/testutils/reporter_for_tests.py17
-rw-r--r--tests/extensions/test_broad_try_clause.py7
-rw-r--r--tests/extensions/test_comparetozero.py7
-rw-r--r--tests/test_self.py8
-rw-r--r--tests/unittest_reporting.py8
11 files changed, 76 insertions, 33 deletions
diff --git a/pylint/interfaces.py b/pylint/interfaces.py
index 8480f9d74..e657e7115 100644
--- a/pylint/interfaces.py
+++ b/pylint/interfaces.py
@@ -18,10 +18,13 @@
"""Interfaces for Pylint objects"""
from collections import namedtuple
-from typing import Tuple
+from typing import TYPE_CHECKING, Tuple
from astroid import nodes
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import Section
+
Confidence = namedtuple("Confidence", ["name", "description"])
# Warning Certainties
HIGH = Confidence("HIGH", "No false positive possible.")
@@ -99,7 +102,7 @@ class IReporter(Interface):
def handle_message(self, msg) -> None:
"""Handle the given message object."""
- def display_reports(self, layout):
+ def display_reports(self, layout: "Section") -> None:
"""display results encapsulated in the layout tree"""
diff --git a/pylint/reporters/base_reporter.py b/pylint/reporters/base_reporter.py
index e74ffdd89..9bd9e80e6 100644
--- a/pylint/reporters/base_reporter.py
+++ b/pylint/reporters/base_reporter.py
@@ -3,11 +3,15 @@
import os
import sys
-from typing import List, Optional
+from typing import TYPE_CHECKING, List, Optional
from pylint.message import Message
+from pylint.reporters.ureports.nodes import Text
from pylint.typing import CheckerStats
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import Section
+
class BaseReporter:
"""base class for reporters
@@ -39,18 +43,21 @@ class BaseReporter:
"""write a line in the output buffer"""
print(string, file=self.out)
- def display_reports(self, layout):
+ def display_reports(self, layout: "Section") -> None:
"""display results encapsulated in the layout tree"""
self.section = 0
if layout.report_id:
- layout.children[0].children[0].data += f" ({layout.report_id})"
+ if isinstance(layout.children[0].children[0], Text):
+ layout.children[0].children[0].data += f" ({layout.report_id})"
+ else:
+ raise ValueError(f"Incorrect child for {layout.children[0].children}")
self._display(layout)
- def _display(self, layout):
+ def _display(self, layout: "Section") -> None:
"""display the layout"""
raise NotImplementedError()
- def display_messages(self, layout):
+ def display_messages(self, layout: Optional["Section"]) -> None:
"""Hook for displaying the messages of the reporter
This will be called whenever the underlying messages
diff --git a/pylint/reporters/collecting_reporter.py b/pylint/reporters/collecting_reporter.py
index 145c3c81b..fbd9eb46b 100644
--- a/pylint/reporters/collecting_reporter.py
+++ b/pylint/reporters/collecting_reporter.py
@@ -1,7 +1,12 @@
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
+from typing import TYPE_CHECKING
+
from pylint.reporters.base_reporter import BaseReporter
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import Section
+
class CollectingReporter(BaseReporter):
"""collects messages"""
@@ -15,4 +20,5 @@ class CollectingReporter(BaseReporter):
def reset(self) -> None:
self.messages = []
- _display = None
+ def _display(self, layout: "Section") -> None:
+ pass
diff --git a/pylint/reporters/json_reporter.py b/pylint/reporters/json_reporter.py
index 12aab69db..87949c1c4 100644
--- a/pylint/reporters/json_reporter.py
+++ b/pylint/reporters/json_reporter.py
@@ -13,10 +13,15 @@
"""JSON reporter"""
import json
+from typing import TYPE_CHECKING, Optional
from pylint.interfaces import IReporter
from pylint.reporters.base_reporter import BaseReporter
+if TYPE_CHECKING:
+ from pylint.lint.pylinter import PyLinter
+ from pylint.reporters.ureports.nodes import Section
+
class JSONReporter(BaseReporter):
"""Report messages and layouts in JSON."""
@@ -25,7 +30,7 @@ class JSONReporter(BaseReporter):
name = "json"
extension = "json"
- def display_messages(self, layout):
+ def display_messages(self, layout: Optional["Section"]) -> None:
"""Launch layouts display"""
json_dumpable = [
{
@@ -43,13 +48,13 @@ class JSONReporter(BaseReporter):
]
print(json.dumps(json_dumpable, indent=4), file=self.out)
- def display_reports(self, layout):
+ def display_reports(self, layout: "Section") -> None:
"""Don't do anything in this reporter."""
- def _display(self, layout):
+ def _display(self, layout: "Section") -> None:
"""Do nothing."""
-def register(linter):
+def register(linter: "PyLinter") -> None:
"""Register the reporter classes with the linter."""
linter.register_reporter(JSONReporter)
diff --git a/pylint/reporters/multi_reporter.py b/pylint/reporters/multi_reporter.py
index 445e9b32e..b3b67d87a 100644
--- a/pylint/reporters/multi_reporter.py
+++ b/pylint/reporters/multi_reporter.py
@@ -3,14 +3,16 @@
import os
-from typing import IO, Any, AnyStr, Callable, List, Optional
+from typing import IO, TYPE_CHECKING, Any, AnyStr, Callable, List, Optional
from pylint.interfaces import IReporter
from pylint.message import Message
from pylint.reporters.base_reporter import BaseReporter
-from pylint.reporters.ureports.nodes import BaseLayout
from pylint.typing import CheckerStats
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import Section
+
AnyFile = IO[AnyStr]
PyLinter = Any
@@ -78,12 +80,12 @@ class MultiReporter:
for rep in self._sub_reporters:
rep.writeln(string)
- def display_reports(self, layout: BaseLayout) -> None:
+ def display_reports(self, layout: "Section") -> None:
"""display results encapsulated in the layout tree"""
for rep in self._sub_reporters:
rep.display_reports(layout)
- def display_messages(self, layout: BaseLayout) -> None:
+ def display_messages(self, layout: Optional["Section"]) -> None:
"""hook for displaying the messages of the reporter"""
for rep in self._sub_reporters:
rep.display_messages(layout)
diff --git a/pylint/reporters/text.py b/pylint/reporters/text.py
index 53eef21d2..e941ba60d 100644
--- a/pylint/reporters/text.py
+++ b/pylint/reporters/text.py
@@ -26,7 +26,7 @@
import os
import sys
import warnings
-from typing import Optional
+from typing import TYPE_CHECKING, Optional
from pylint import utils
from pylint.interfaces import IReporter
@@ -34,6 +34,9 @@ from pylint.message import Message
from pylint.reporters import BaseReporter
from pylint.reporters.ureports.text_writer import TextWriter
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import Section
+
TITLE_UNDERLINES = ["", "=", "-", "."]
ANSI_PREFIX = "\033["
@@ -155,7 +158,7 @@ class TextReporter(BaseReporter):
self.writeln("************* ")
self.write_message(msg)
- def _display(self, layout):
+ def _display(self, layout: "Section") -> None:
"""launch layouts display"""
print(file=self.out)
TextWriter().format(layout, self.out)
diff --git a/pylint/testutils/reporter_for_tests.py b/pylint/testutils/reporter_for_tests.py
index 9527544a0..480f1ed2d 100644
--- a/pylint/testutils/reporter_for_tests.py
+++ b/pylint/testutils/reporter_for_tests.py
@@ -3,12 +3,15 @@
from io import StringIO
from os import getcwd, linesep, sep
-from typing import Dict, List, Optional
+from typing import TYPE_CHECKING, Dict, List, Optional
from pylint import interfaces
from pylint.message import Message
from pylint.reporters import BaseReporter
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import Section
+
class GenericTestReporter(BaseReporter):
"""reporter storing plain text messages"""
@@ -56,25 +59,27 @@ class GenericTestReporter(BaseReporter):
# pylint: enable=unused-argument
- def display_reports(self, layout):
+ def display_reports(self, layout: "Section") -> None:
"""ignore layouts"""
- _display = None
+ def _display(self, layout: "Section") -> None:
+ pass
class MinimalTestReporter(BaseReporter):
def on_set_current_module(self, module: str, filepath: Optional[str]) -> None:
self.messages = []
- _display = None
+ def _display(self, layout: "Section") -> None:
+ pass
class FunctionalTestReporter(BaseReporter):
def on_set_current_module(self, module: str, filepath: Optional[str]) -> None:
self.messages = []
- def display_reports(self, layout):
+ def display_reports(self, layout: "Section") -> None:
"""Ignore layouts and don't call self._display()."""
- def _display(self, layout):
+ def _display(self, layout: "Section") -> None:
pass
diff --git a/tests/extensions/test_broad_try_clause.py b/tests/extensions/test_broad_try_clause.py
index 85c51ebf3..4e38adb23 100644
--- a/tests/extensions/test_broad_try_clause.py
+++ b/tests/extensions/test_broad_try_clause.py
@@ -14,19 +14,22 @@
"""Tests for the pylint checker in :mod:`pylint.extensions.broad_try_clause`"""
import unittest
from os import path as osp
-from typing import Optional
+from typing import TYPE_CHECKING, Optional
from pylint import checkers
from pylint.extensions.broad_try_clause import BroadTryClauseChecker
from pylint.lint import PyLinter
from pylint.reporters import BaseReporter
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import Section
+
class BroadTryClauseTestReporter(BaseReporter):
def on_set_current_module(self, module: str, filepath: Optional[str]) -> None:
self.messages = []
- def _display(self, layout):
+ def _display(self, layout: "Section") -> None:
pass
diff --git a/tests/extensions/test_comparetozero.py b/tests/extensions/test_comparetozero.py
index 52be28c1f..7b5bb1624 100644
--- a/tests/extensions/test_comparetozero.py
+++ b/tests/extensions/test_comparetozero.py
@@ -15,19 +15,22 @@
import os
import unittest
-from typing import Optional
+from typing import TYPE_CHECKING, Optional
from pylint import checkers
from pylint.extensions.comparetozero import CompareToZeroChecker
from pylint.lint import PyLinter
from pylint.reporters import BaseReporter
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import Section
+
class CompareToZeroTestReporter(BaseReporter):
def on_set_current_module(self, module: str, filepath: Optional[str]) -> None:
self.messages = []
- def _display(self, layout):
+ def _display(self, layout: "Section") -> None:
pass
diff --git a/tests/test_self.py b/tests/test_self.py
index 9c0444150..41e7898e8 100644
--- a/tests/test_self.py
+++ b/tests/test_self.py
@@ -51,7 +51,7 @@ from copy import copy
from io import StringIO
from os.path import abspath, dirname, join
from pathlib import Path
-from typing import Any, Generator, Iterator, List, Optional, Union
+from typing import TYPE_CHECKING, Any, Generator, Iterator, List, Optional, Union
from unittest import mock
from unittest.mock import patch
@@ -66,9 +66,11 @@ from pylint.lint.pylinter import PyLinter
from pylint.message import Message
from pylint.reporters import JSONReporter
from pylint.reporters.text import BaseReporter, ColorizedTextReporter, TextReporter
-from pylint.reporters.ureports.nodes import EvaluationSection
from pylint.utils import utils
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import Section
+
HERE = abspath(dirname(__file__))
CLEAN_PATH = re.escape(dirname(dirname(__file__)) + os.path.sep)
UNNECESSARY_LAMBDA = join(
@@ -116,7 +118,7 @@ class MultiReporter(BaseReporter):
for rep in self._reporters:
rep.handle_message(msg)
- def _display(self, layout: EvaluationSection) -> None:
+ def _display(self, layout: "Section") -> None:
pass
@property
diff --git a/tests/unittest_reporting.py b/tests/unittest_reporting.py
index 88f9c43b5..c0fdb61d4 100644
--- a/tests/unittest_reporting.py
+++ b/tests/unittest_reporting.py
@@ -21,6 +21,7 @@ import warnings
from contextlib import redirect_stdout
from io import StringIO
from json import dumps
+from typing import TYPE_CHECKING
import pytest
@@ -31,6 +32,9 @@ from pylint.reporters import BaseReporter
from pylint.reporters.text import ParseableTextReporter, TextReporter
from pylint.typing import FileItem
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import Section
+
@pytest.fixture(scope="module")
def reporter():
@@ -93,7 +97,7 @@ class NopReporter(BaseReporter):
def writeln(self, string=""):
pass
- def _display(self, layout):
+ def _display(self, layout: "Section") -> None:
pass
@@ -257,7 +261,7 @@ def test_multi_format_output(tmp_path):
def test_display_results_is_renamed():
class CustomReporter(TextReporter):
- def _display(self, layout):
+ def _display(self, layout: "Section") -> None:
return None
reporter = CustomReporter()