Skip to content

Commit 280b1c9

Browse files
committed
Add pylint message name to code analysis pane and refine format
1 parent 03172b7 commit 280b1c9

5 files changed

Lines changed: 63 additions & 38 deletions

File tree

binder/environment.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ dependencies:
2424
- pickleshare >=0.4
2525
- psutil >=5.3
2626
- pygments >=2.0
27-
- pylint >=0.25
27+
- pylint >=1.0
2828
- pyqt <5.13
2929
- pyyaml
3030
- python-language-server >=0.31.9,<0.32.0

requirements/conda.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pexpect >=4.4.0
1919
pickleshare >=0.4
2020
psutil >=5.3
2121
pygments >=2.0
22-
pylint >=0.25
22+
pylint >=1.0
2323
pyqt <5.13
2424
# There's no need to set a version for python-language-server
2525
# because we install it from master for our tests.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ def run(self):
223223
'pickleshare>=0.4',
224224
'psutil>=5.3',
225225
'pygments>=2.0',
226-
'pylint>=0.25',
226+
'pylint>=1.0',
227227
'pyqt5<5.13;python_version>="3"',
228228
'pyqtwebengine<5.13;python_version>="3"',
229229
'python-language-server[all]>=0.31.9,<0.32.0',

spyder/dependencies.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
PICKLESHARE_REQVER = '>=0.4'
4747
PSUTIL_REQVER = '>=5.3'
4848
PYGMENTS_REQVER = '>=2.0'
49-
PYLINT_REQVER = '>=0.25'
49+
PYLINT_REQVER = '>=1.0'
5050
PYLS_REQVER = '>=0.31.9;<0.32.0'
5151
PYXDG_REQVER = '>=0.26'
5252
PYZMQ_REQVER = '>=17'

spyder/plugins/pylint/widgets/pylintgui.py

Lines changed: 59 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,19 @@ def refresh(self):
9494
ima.icon('error'), self.results['E:']))
9595
for title, icon, messages in results:
9696
title += ' (%d message%s)' % (len(messages),
97-
's' if len(messages)>1 else '')
97+
's' if len(messages) > 1 else '')
9898
title_item = QTreeWidgetItem(self, [title], QTreeWidgetItem.Type)
9999
title_item.setIcon(0, icon)
100100
if not messages:
101101
title_item.setDisabled(True)
102102
modules = {}
103-
for module, lineno, message, msg_id in messages:
103+
for message_data in messages:
104+
# If message data is legacy version without message_name
105+
if len(message_data) == 4:
106+
message_data = (*message_data, None)
107+
108+
module, lineno, message, msg_id, message_name = message_data
109+
104110
basename = osp.splitext(osp.basename(self.filename))[0]
105111
if not module.startswith(basename):
106112
# Pylint bug
@@ -128,10 +134,18 @@ def refresh(self):
128134
else:
129135
parent = title_item
130136
if len(msg_id) > 1:
131-
text = "[%s] %d : %s" % (msg_id, lineno, message)
132-
else:
133-
text = "%d : %s" % (lineno, message)
134-
msg_item = QTreeWidgetItem(parent, [text], QTreeWidgetItem.Type)
137+
if not message_name:
138+
message_string = "{msg_id} "
139+
else:
140+
message_string = "{msg_id} ({message_name}) "
141+
142+
message_string += "line {lineno}: {message}"
143+
144+
message_string = message_string.format(
145+
msg_id=msg_id, message_name=message_name,
146+
lineno=lineno, message=message)
147+
msg_item = QTreeWidgetItem(
148+
parent, [message_string], QTreeWidgetItem.Type)
135149
msg_item.setIcon(0, ima.icon('arrow'))
136150
self.data[id(msg_item)] = (modname, lineno)
137151

@@ -351,27 +365,22 @@ def start(self):
351365
self.output = ''
352366
self.error_output = ''
353367

354-
plver = PYLINT_VER
355-
if plver is not None:
356-
p_args = ['-m', 'pylint', '--output-format=text']
357-
if plver.split('.')[0] == '0':
358-
p_args += ['-i', 'yes']
359-
else:
360-
# Option '-i' (alias for '--include-ids') was removed in pylint
361-
# 1.0
362-
p_args += ["--msg-template='{msg_id}:{line:3d},"
363-
"{column}: {obj}: {msg}"]
368+
if PYLINT_VER is not None:
369+
pylint_args = [
370+
'-m', 'pylint', '--output-format=text',
371+
'--msg-template='
372+
"'{msg_id}:{symbol}:{line:3d},{column}: {msg}'"]
364373

365374
pylintrc_path = self.get_pylintrc_path(filename=filename)
366375
if pylintrc_path is not None:
367-
p_args += ['--rcfile={}'.format(pylintrc_path)]
376+
pylint_args += ['--rcfile={}'.format(pylintrc_path)]
368377

369-
p_args += [filename]
378+
pylint_args.append(filename)
370379
processEnvironment = QProcessEnvironment()
371380
processEnvironment.insert("PYTHONIOENCODING", "utf8")
372381
self.process.setProcessEnvironment(processEnvironment)
373382

374-
self.process.start(sys.executable, p_args)
383+
self.process.start(sys.executable, pylint_args)
375384

376385
running = self.process.waitForStarted()
377386
self.set_running_state(running)
@@ -412,7 +421,7 @@ def finished(self, exit_code, exit_status):
412421
results = {'C:': [], 'R:': [], 'W:': [], 'E:': []}
413422
txt_module = '************* Module '
414423

415-
module = '' # Should not be needed - just in case something goes wrong
424+
module = '' # Should not be needed - just in case something goes wrong
416425
for line in self.output.splitlines():
417426
if line.startswith(txt_module):
418427
# New module
@@ -421,20 +430,36 @@ def finished(self, exit_code, exit_status):
421430
# Supporting option include-ids: ('R3873:' instead of 'R:')
422431
if not re.match(r'^[CRWE]+([0-9]{4})?:', line):
423432
continue
424-
i1 = line.find(':')
425-
if i1 == -1:
426-
continue
427-
msg_id = line[:i1]
428-
i2 = line.find(':', i1+1)
429-
if i2 == -1:
430-
continue
431-
line_nb = line[i1+1:i2].strip()
432-
if not line_nb:
433-
continue
434-
line_nb = int(line_nb.split(',')[0])
435-
message = line[i2+1:]
436-
item = (module, line_nb, message, msg_id)
437-
results[line[0]+':'].append(item)
433+
items = {}
434+
idx_0 = 0
435+
idx_1 = 0
436+
key_names = ["msg_id", "message_name", "line_nb", "message"]
437+
for key_idx, key_name in enumerate(key_names):
438+
if key_idx == len(key_names) - 1:
439+
idx_1 = len(line)
440+
else:
441+
idx_1 = line.find(":", idx_0)
442+
443+
if idx_1 < 0:
444+
445+
break
446+
item = line[(idx_0):idx_1]
447+
448+
if not item:
449+
450+
break
451+
452+
if key_name == "line_nb":
453+
454+
item = int(item.split(',')[0])
455+
456+
items[key_name] = item
457+
458+
idx_0 = idx_1 + 1
459+
else:
460+
pylint_item = (module, items["line_nb"], items["message"],
461+
items["msg_id"], items["message_name"])
462+
results[line[0] + ':'].append(pylint_item)
438463

439464
# Rate
440465
rate = None

0 commit comments

Comments
 (0)