-
-
Couldn't load subscription status.
- Fork 1.2k
Multiple output-format support
#4492
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Pierre-Sassoulas
merged 14 commits into
pylint-dev:master
from
ruro:feature/multi-output-formats
May 24, 2021
Merged
Changes from all commits
Commits
Show all changes
14 commits
Select commit
Hold shift + click to select a range
4874c68
implement MultiReporter
ruro b294ade
implement ,-separated output-format with :outputs
ruro 0fd8b4b
add tests for new output-format
ruro 60ff2c6
add docs, changelog, whatsnew, contributor entry
ruro f21b932
fix minor test nitpicks
ruro 13011f9
add a bunch of type hints
ruro c8c9ce0
fix split for windows paths containing semicolons
ruro f1456ce
make MultiReporter.path_strip_prefix readonly
ruro 087396d
improve MultiReporter coverage
ruro 2c737ec
explicitly close the files for pypy delayed gc
ruro 03619cb
properly escape paths for json output test
ruro afd18e4
cover the FQN name class format loading code
ruro 2deb605
enable newline translation in tests for windows
ruro 399d0d3
Update doc/whatsnew/2.9.rst
Pierre-Sassoulas File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -491,3 +491,5 @@ contributors: | |
| - Added ignore_signatures to duplicate checker | ||
|
|
||
| * Jacob Walls: contributor | ||
|
|
||
| * ruro: contributor | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,102 @@ | ||
| # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html | ||
| # For details: https://github.com/PyCQA/pylint/blob/master/LICENSE | ||
|
|
||
|
|
||
| import os | ||
| from typing import IO, Any, AnyStr, Callable, List, Mapping, Optional, Union | ||
|
|
||
| from pylint.interfaces import IReporter | ||
| from pylint.reporters.base_reporter import BaseReporter | ||
| from pylint.reporters.ureports.nodes import BaseLayout | ||
|
|
||
| AnyFile = IO[AnyStr] | ||
| AnyPath = Union[str, bytes, os.PathLike] | ||
| PyLinter = Any | ||
|
|
||
|
|
||
| class MultiReporter: | ||
| """Reports messages and layouts in plain text""" | ||
|
|
||
| __implements__ = IReporter | ||
| name = "_internal_multi_reporter" | ||
| # Note: do not register this reporter with linter.register_reporter as it is | ||
| # not intended to be used directly like a regular reporter, but is | ||
| # instead used to implement the | ||
| # `--output-format=json:somefile.json,colorized` | ||
| # multiple output formats feature | ||
|
|
||
| extension = "" | ||
|
|
||
| def __init__( | ||
| self, | ||
| sub_reporters: List[BaseReporter], | ||
| close_output_files: Callable[[], None], | ||
| output: Optional[AnyFile] = None, | ||
| ): | ||
| self._sub_reporters = sub_reporters | ||
| self.close_output_files = close_output_files | ||
|
|
||
| self._path_strip_prefix = os.getcwd() + os.sep | ||
| self._linter: Optional[PyLinter] = None | ||
|
|
||
| self.set_output(output) | ||
|
|
||
| def __del__(self): | ||
| self.close_output_files() | ||
|
|
||
| @property | ||
| def path_strip_prefix(self) -> str: | ||
| return self._path_strip_prefix | ||
|
|
||
| @property | ||
| def linter(self) -> Optional[PyLinter]: | ||
| return self._linter | ||
|
|
||
| @linter.setter | ||
| def linter(self, value: PyLinter) -> None: | ||
| self._linter = value | ||
| for rep in self._sub_reporters: | ||
| rep.linter = value | ||
|
|
||
| def handle_message(self, msg: str) -> None: | ||
| """Handle a new message triggered on the current file.""" | ||
| for rep in self._sub_reporters: | ||
| rep.handle_message(msg) | ||
|
|
||
| # pylint: disable=no-self-use | ||
| def set_output(self, output: Optional[AnyFile] = None) -> None: | ||
| """set output stream""" | ||
| # MultiReporter doesn't have it's own output. This method is only | ||
| # provided for API parity with BaseReporter and should not be called | ||
| # with non-None values for 'output'. | ||
| if output is not None: | ||
| raise NotImplementedError("MultiReporter does not support direct output.") | ||
|
|
||
| def writeln(self, string: str = "") -> None: | ||
| """write a line in the output buffer""" | ||
| for rep in self._sub_reporters: | ||
| rep.writeln(string) | ||
|
|
||
| def display_reports(self, layout: BaseLayout) -> 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: | ||
| """hook for displaying the messages of the reporter""" | ||
| for rep in self._sub_reporters: | ||
| rep.display_messages(layout) | ||
|
|
||
| def on_set_current_module(self, module: str, filepath: Optional[AnyPath]) -> None: | ||
| """hook called when a module starts to be analysed""" | ||
| for rep in self._sub_reporters: | ||
| rep.on_set_current_module(module, filepath) | ||
|
|
||
| def on_close( | ||
| self, | ||
| stats: Mapping[Any, Any], | ||
| previous_stats: Mapping[Any, Any], | ||
| ) -> None: | ||
| """hook called when a module finished analyzing""" | ||
| for rep in self._sub_reporters: | ||
| rep.on_close(stats, previous_stats) |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.