4
4
from __future__ import annotations
5
5
6
6
import json
7
- from pathlib import Path
7
+ from pathlib import Path , PurePosixPath
8
8
9
- from pylint .testutils ._primer .primer_command import PackageMessages , PrimerCommand
9
+ from pylint .reporters .json_reporter import OldJsonExport
10
+ from pylint .testutils ._primer .primer_command import (
11
+ PackageData ,
12
+ PackageMessages ,
13
+ PrimerCommand ,
14
+ )
10
15
11
16
MAX_GITHUB_COMMENT_LENGTH = 65536
12
17
13
18
14
19
class CompareCommand (PrimerCommand ):
15
20
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
21
+ main_data = self ._load_json (self .config .base_file )
22
+ pr_data = self ._load_json (self .config .new_file )
23
+ missing_messages_data , new_messages_data = self ._cross_reference (
24
+ main_data , pr_data
20
25
)
21
- comment = self ._create_comment (missing_messages , new_messages )
26
+ comment = self ._create_comment (missing_messages_data , new_messages_data )
22
27
with open (self .primer_directory / "comment.txt" , "w" , encoding = "utf-8" ) as f :
23
28
f .write (comment )
24
29
25
30
@staticmethod
26
31
def _cross_reference (
27
- main_dict : PackageMessages , pr_messages : PackageMessages
32
+ main_data : PackageMessages , pr_data : PackageMessages
28
33
) -> tuple [PackageMessages , PackageMessages ]:
29
- missing_messages : PackageMessages = {}
30
- for package , messages in main_dict .items ():
31
- missing_messages [ package ] = []
32
- for message in messages :
34
+ missing_messages_data : PackageMessages = {}
35
+ for package , data in main_data .items ():
36
+ package_missing_messages : list [ OldJsonExport ] = []
37
+ for message in data [ " messages" ] :
33
38
try :
34
- pr_messages [package ].remove (message )
39
+ pr_data [package ][ "messages" ].remove (message )
35
40
except ValueError :
36
- missing_messages [package ].append (message )
37
- return missing_messages , pr_messages
41
+ package_missing_messages .append (message )
42
+ missing_messages_data [package ] = PackageData (
43
+ commit = pr_data [package ]["commit" ], messages = package_missing_messages
44
+ )
45
+ return missing_messages_data , pr_data
38
46
39
47
@staticmethod
40
48
def _load_json (file_path : Path | str ) -> PackageMessages :
@@ -50,7 +58,7 @@ def _create_comment(
50
58
if len (comment ) >= MAX_GITHUB_COMMENT_LENGTH :
51
59
break
52
60
new_messages = all_new_messages [package ]
53
- if not missing_messages and not new_messages :
61
+ if not missing_messages [ "messages" ] and not new_messages [ "messages" ] :
54
62
continue
55
63
comment += self ._create_comment_for_package (
56
64
package , new_messages , missing_messages
@@ -67,18 +75,20 @@ def _create_comment(
67
75
return self ._truncate_comment (comment )
68
76
69
77
def _create_comment_for_package (
70
- self , package : str , new_messages , missing_messages
78
+ self , package : str , new_messages : PackageData , missing_messages : PackageData
71
79
) -> str :
72
80
comment = f"\n \n **Effect on [{ package } ]({ self .packages [package ].url } ):**\n "
73
81
# Create comment for new messages
74
82
count = 1
75
83
astroid_errors = 0
76
84
new_non_astroid_messages = ""
77
- if new_messages :
85
+ if new_messages [ "messages" ] :
78
86
print ("Now emitted:" )
79
- for message in new_messages :
80
- filepath = str (message ["path" ]).replace (
81
- str (self .packages [package ].clone_directory ), ""
87
+ for message in new_messages ["messages" ]:
88
+ filepath = str (
89
+ PurePosixPath (message ["path" ]).relative_to (
90
+ self .packages [package ].clone_directory
91
+ )
82
92
)
83
93
# Existing astroid errors may still show up as "new" because the timestamp
84
94
# in the message is slightly different.
@@ -87,7 +97,7 @@ def _create_comment_for_package(
87
97
else :
88
98
new_non_astroid_messages += (
89
99
f"{ count } ) { message ['symbol' ]} :\n *{ message ['message' ]} *\n "
90
- f"{ self .packages [package ].url } /blob/{ self . packages [ package ]. branch } { filepath } #L{ message ['line' ]} \n "
100
+ f"{ self .packages [package ].url } /blob/{ new_messages [ 'commit' ] } / { filepath } #L{ message ['line' ]} \n "
91
101
)
92
102
print (message )
93
103
count += 1
@@ -106,18 +116,20 @@ def _create_comment_for_package(
106
116
107
117
# Create comment for missing messages
108
118
count = 1
109
- if missing_messages :
119
+ if missing_messages [ "messages" ] :
110
120
comment += "The following messages are no longer emitted:\n \n <details>\n \n "
111
121
print ("No longer emitted:" )
112
- for message in missing_messages :
122
+ for message in missing_messages [ "messages" ] :
113
123
comment += f"{ count } ) { message ['symbol' ]} :\n *{ message ['message' ]} *\n "
114
- filepath = str (message ["path" ]).replace (
115
- str (self .packages [package ].clone_directory ), ""
124
+ filepath = str (
125
+ PurePosixPath (message ["path" ]).relative_to (
126
+ self .packages [package ].clone_directory
127
+ )
116
128
)
117
129
assert not self .packages [package ].url .endswith (
118
130
".git"
119
131
), "You don't need the .git at the end of the github url."
120
- comment += f"{ self .packages [package ].url } /blob/{ self . packages [ package ]. branch } { filepath } #L{ message ['line' ]} \n "
132
+ comment += f"{ self .packages [package ].url } /blob/{ new_messages [ 'commit' ] } / { filepath } #L{ message ['line' ]} \n "
121
133
count += 1
122
134
print (message )
123
135
if missing_messages :
0 commit comments