Skip to content

Commit 4fe6f1a

Browse files
committed
Improve de-register reports logic
1 parent 175f75b commit 4fe6f1a

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

pylint/lint/pylinter.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -323,10 +323,10 @@ def __init__(
323323
"""Dictionary of registered and initialized checkers."""
324324
self._dynamic_plugins: dict[str, ModuleType | ModuleNotFoundError | bool] = {}
325325
"""Set of loaded plugin names."""
326-
self._registered_checkers: set[tuple[str, checkers.BaseChecker]] = set()
326+
self._registered_checkers: set[tuple[str, checkers.BaseChecker, int]] = set()
327327
"""Set of tuples with loaded checker names and reference to checker."""
328328
self._registered_dynamic_plugin_checkers: set[
329-
tuple[str, checkers.BaseChecker]
329+
tuple[str, checkers.BaseChecker, int]
330330
] = set()
331331
"""Set of tuples with loaded dynamic plugin checker names and reference to
332332
checker.
@@ -504,7 +504,7 @@ def report_order(self) -> list[BaseChecker]:
504504
def register_checker(self, checker: checkers.BaseChecker) -> None:
505505
"""This method auto registers the checker."""
506506
self._checkers[checker.name].append(checker)
507-
self._registered_checkers.add((checker.name, checker))
507+
self._registered_checkers.add((checker.name, checker, id(checker)))
508508
for r_id, r_title, r_cb in checker.reports:
509509
self.register_report(r_id, r_title, r_cb, checker)
510510
if not self._freeze_register_msgs and hasattr(checker, "msgs"):
@@ -517,13 +517,13 @@ def register_checker(self, checker: checkers.BaseChecker) -> None:
517517
self.disable(checker.name)
518518

519519
def _deregister_checkers(
520-
self, checker_collection: Collection[tuple[str, checkers.BaseChecker]]
520+
self, checker_collection: Collection[tuple[str, checkers.BaseChecker, int]]
521521
) -> None:
522522
"""De-registered a collection of checkers with its reports.
523523
524524
Leave messages in place as re-registering them is a no-op.
525525
"""
526-
for checker_name, checker in checker_collection:
526+
for checker_name, checker, _ in checker_collection:
527527
self._checkers[checker_name].remove(checker)
528528
if checker.reports:
529529
self.deregister_reports(checker)

pylint/reporters/reports_handler_mix_in.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ def register_report(
5050

5151
def deregister_reports(self, checker: BaseChecker) -> None:
5252
"""De-register all reports for a checker."""
53-
self._reports.pop(checker)
53+
for r_id, r_title, r_cb in checker.reports:
54+
self._reports[checker].remove((r_id, r_title, r_cb))
5455

5556
def enable_report(self, reportid: str) -> None:
5657
"""Enable the report of the given id."""

tests/test_check_parallel.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,11 @@ def test_worker_initialize_custom_plugins(self) -> None:
225225
linter = PyLinter(reporter=Reporter())
226226
linter.load_default_plugins()
227227
config_data = {
228-
"load-plugins": "pylint.extensions.code_style,pylint.extensions.typing",
228+
"load-plugins": (
229+
"pylint.extensions.code_style,"
230+
"pylint.extensions.typing,"
231+
"pylint.checkers.raw_metrics," # Custom report
232+
),
229233
}
230234
config_args = [
231235
"--enable=consider-using-augmented-assign",
@@ -238,6 +242,9 @@ def test_worker_initialize_custom_plugins(self) -> None:
238242
_config_initialization(linter, [])
239243
assert len(linter._checkers["code_style"]) == 1
240244
assert len(linter._checkers["typing"]) == 1
245+
assert len(linter._checkers["metrics"]) == 2
246+
old_metrics_checker = linter._checkers["metrics"][-1]
247+
assert len(linter._reports[old_metrics_checker]) == 2
241248
assert linter.is_message_enabled("consider-using-augmented-assign") is True
242249
assert ( # default disabled
243250
linter.is_message_enabled("prefer-typing-namedtuple") is False
@@ -246,8 +253,17 @@ def test_worker_initialize_custom_plugins(self) -> None:
246253
worker_initialize(linter=dill.dumps(linter))
247254
worker_linter = pylint.lint.parallel._worker_linter
248255
assert isinstance(worker_linter, PyLinter)
256+
assert len(worker_linter._registered_dynamic_plugin_checkers) == 3
249257
assert len(worker_linter._checkers["code_style"]) == 1
250258
assert len(worker_linter._checkers["typing"]) == 1
259+
assert len(worker_linter._checkers["metrics"]) == 2
260+
# The base checker overwrite __eq__ and __hash__ to only compare name and msgs.
261+
# Thus, while the ids for the metrics checker are different, they have the same
262+
# hash. That is used as key for the '_reports' dict.
263+
new_metrics_checker = worker_linter._checkers["metrics"][-1]
264+
assert id(old_metrics_checker) != id(new_metrics_checker)
265+
assert old_metrics_checker == new_metrics_checker
266+
assert len(worker_linter._reports[new_metrics_checker]) == 2
251267
assert linter.is_message_enabled("consider-using-augmented-assign") is True
252268
assert ( # default disabled
253269
linter.is_message_enabled("prefer-typing-namedtuple") is False

0 commit comments

Comments
 (0)