Skip to content

Commit a54c77e

Browse files
[primer] Create a class for easier comparison of pylint results
1 parent 406afd5 commit a54c77e

File tree

3 files changed

+51
-40
lines changed

3 files changed

+51
-40
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
2+
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
3+
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
4+
5+
from __future__ import annotations
6+
7+
import json
8+
from collections.abc import Generator
9+
from pathlib import Path
10+
11+
from pylint.testutils._primer.primer_command import Messages, PackageMessages
12+
13+
14+
class Comparator:
15+
def __init__(self, main_json: Path, pr_json: Path):
16+
main_messages = self._load_json(main_json)
17+
self.pr_messages = self._load_json(pr_json)
18+
self.missing_messages: PackageMessages = {}
19+
for package, messages in main_messages.items():
20+
self.missing_messages[package] = []
21+
for message in messages:
22+
try:
23+
self.pr_messages[package].remove(message)
24+
except ValueError:
25+
self.missing_messages[package].append(message)
26+
27+
def __iter__(
28+
self,
29+
) -> Generator[tuple[str, Messages, Messages], None, None]:
30+
for package, missing_messages in self.missing_messages.items():
31+
new_messages = self.pr_messages[package]
32+
if not missing_messages and not new_messages:
33+
print(f"PRIMER: No changes in {package}.")
34+
continue
35+
yield package, missing_messages, new_messages
36+
37+
@staticmethod
38+
def _load_json(file_path: Path | str) -> PackageMessages:
39+
with open(file_path, encoding="utf-8") as f:
40+
result: PackageMessages = json.load(f)
41+
return result

pylint/testutils/_primer/primer_command.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111

1212
from pylint.testutils._primer import PackageToLint
1313

14-
PackageMessages = Dict[str, List[Dict[str, Union[str, int]]]]
14+
Messages = List[Dict[str, Union[str, int]]]
15+
PackageMessages = Dict[str, Messages]
1516

1617

1718
class PrimerCommand:

pylint/testutils/_primer/primer_compare_command.py

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,26 @@
33
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
44
from __future__ import annotations
55

6-
import json
7-
from pathlib import Path
8-
9-
from pylint.testutils._primer.primer_command import PackageMessages, PrimerCommand
6+
from pylint.testutils._primer.comparator import Comparator
7+
from pylint.testutils._primer.primer_command import Messages, PrimerCommand
108

119
MAX_GITHUB_COMMENT_LENGTH = 65536
1210

1311

1412
class CompareCommand(PrimerCommand):
1513
def run(self) -> None:
16-
main_messages = self._load_json(self.config.base_file)
17-
pr_messages = self._load_json(self.config.new_file)
18-
missing_messages, new_messages = self._cross_reference(
19-
main_messages, pr_messages
20-
)
21-
comment = self._create_comment(missing_messages, new_messages)
14+
comparator = Comparator(self.config.base_file, self.config.new_file)
15+
comment = self._create_comment(comparator)
2216
with open(self.primer_directory / "comment.txt", "w", encoding="utf-8") as f:
2317
f.write(comment)
2418

25-
@staticmethod
26-
def _cross_reference(
27-
main_dict: PackageMessages, pr_messages: PackageMessages
28-
) -> tuple[PackageMessages, PackageMessages]:
29-
missing_messages: PackageMessages = {}
30-
for package, messages in main_dict.items():
31-
missing_messages[package] = []
32-
for message in messages:
33-
try:
34-
pr_messages[package].remove(message)
35-
except ValueError:
36-
missing_messages[package].append(message)
37-
return missing_messages, pr_messages
38-
39-
@staticmethod
40-
def _load_json(file_path: Path | str) -> PackageMessages:
41-
with open(file_path, encoding="utf-8") as f:
42-
result: PackageMessages = json.load(f)
43-
return result
44-
45-
def _create_comment(
46-
self, all_missing_messages: PackageMessages, all_new_messages: PackageMessages
47-
) -> str:
19+
def _create_comment(self, comparator: Comparator) -> str:
4820
comment = ""
49-
for package, missing_messages in all_missing_messages.items():
21+
for package, missing_messages, new_messages in comparator:
5022
if len(comment) >= MAX_GITHUB_COMMENT_LENGTH:
5123
break
52-
new_messages = all_new_messages[package]
53-
if not missing_messages and not new_messages:
54-
continue
5524
comment += self._create_comment_for_package(
56-
package, new_messages, missing_messages
25+
package, missing_messages, new_messages
5726
)
5827
if comment == "":
5928
comment = (
@@ -67,7 +36,7 @@ def _create_comment(
6736
return self._truncate_comment(comment)
6837

6938
def _create_comment_for_package(
70-
self, package: str, new_messages, missing_messages
39+
self, package: str, missing_messages: Messages, new_messages: Messages
7140
) -> str:
7241
comment = f"\n\n**Effect on [{package}]({self.packages[package].url}):**\n"
7342
# Create comment for new messages

0 commit comments

Comments
 (0)