summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Marek <tmarek@google.com>2013-11-06 10:47:04 -0800
committerTorsten Marek <tmarek@google.com>2013-11-06 10:47:04 -0800
commitcb0d54530b8585eccebdd16b159ea7d6c4604bc1 (patch)
treebe5cd75a0f864f66313a8c2e0b3662eaa10ba8c1
parentd917d28ea80325d4190f943cfc439c678d32d5e0 (diff)
downloadpylint-git-cb0d54530b8585eccebdd16b159ea7d6c4604bc1.tar.gz
Take first steps to use the symbolic name internally instead of the numeric id.
This changeset changes utils.py to use the symbolic name as the primary key in _messages, and the numeric ID as an alternative name in a new dictionary. Also prepares the codebase for supporting renamed messages.
-rw-r--r--lint.py2
-rw-r--r--test/test_func.py2
-rw-r--r--utils.py61
3 files changed, 39 insertions, 26 deletions
diff --git a/lint.py b/lint.py
index 7f736f55e..812a953b8 100644
--- a/lint.py
+++ b/lint.py
@@ -518,7 +518,7 @@ This is used by the global evaluation report (RP0004).'}),
if first <= lineno <= last:
# Set state for all lines for this block, if the
# warning is applied to nodes.
- if self._messages[msgid].scope == WarningScope.NODE:
+ if self.check_message_id(msgid).scope == WarningScope.NODE:
if lineno > firstchildlineno:
state = True
first_, last_ = node.block_range(lineno)
diff --git a/test/test_func.py b/test/test_func.py
index 56bb82c7e..833d72779 100644
--- a/test/test_func.py
+++ b/test/test_func.py
@@ -54,7 +54,7 @@ class TestTests(testlib.TestCase):
@testlib.tag('coverage')
def test_exhaustivity(self):
# skip fatal messages
- todo = [msgid for msgid in linter._messages if msgid[0] != 'F']
+ todo = [msg.msgid for msg in linter.messages if msg.msgid[0] != 'F']
for msgid in test_reporter.message_ids:
try:
todo.remove(msgid)
diff --git a/utils.py b/utils.py
index 875ac10fc..c84dc87d6 100644
--- a/utils.py
+++ b/utils.py
@@ -189,10 +189,15 @@ class MessagesHandlerMixIn(object):
"""
def __init__(self):
- # dictionary of registered messages
+ # Primary registry for all active messages (i.e. all messages
+ # that can be emitted by pylint for the underlying Python
+ # version). It contains the 1:1 mapping from symbolic names
+ # to message definition objects.
self._messages = {}
- # dictionary from string symbolic id to Message object.
- self._messages_by_symbol = {}
+ # Maps alternative names (numeric IDs, deprecated names) to
+ # message definitions. May contain several names for each definition
+ # object.
+ self._alternative_names = {}
self._msgs_state = {}
self._module_msgs_state = {} # None
self._raw_module_msgs_state = {}
@@ -213,10 +218,10 @@ class MessagesHandlerMixIn(object):
chkid = None
for msgid, msg_tuple in checker.msgs.iteritems():
msg = build_message_def(checker, msgid, msg_tuple)
- assert msg.symbol not in self._messages_by_symbol, \
+ assert msg.symbol not in self._messages, \
'Message symbol %r is already defined' % msg.symbol
# avoid duplicate / malformed ids
- assert msg.msgid not in self._messages, \
+ assert msg.msgid not in self._alternative_names, \
'Message id %r is already defined' % msgid
assert chkid is None or chkid == msg.msgid[1:3], \
'Inconsistent checker part in message id %r' % msgid
@@ -224,8 +229,8 @@ class MessagesHandlerMixIn(object):
if not msg.may_be_emitted():
self._msgs_state[msg.msgid] = False
continue
- self._messages[msg.msgid] = msg
- self._messages_by_symbol[msg.symbol] = msg
+ self._messages[msg.symbol] = msg
+ self._alternative_names[msg.msgid] = msg
self._msgs_by_category.setdefault(msg.msgid[0], []).append(msg.msgid)
def disable(self, msgid, scope='package', line=None):
@@ -246,7 +251,7 @@ class MessagesHandlerMixIn(object):
if msgid.lower() in self._checkers:
for checker in self._checkers[msgid.lower()]:
for _msgid in checker.msgs:
- if _msgid in self._messages:
+ if _msgid in self._alternative_names:
self.disable(_msgid, scope, line)
return
# msgid is report id?
@@ -312,13 +317,14 @@ class MessagesHandlerMixIn(object):
Raises UnknownMessage if the message id is not defined.
"""
- if msgid in self._messages_by_symbol:
- return self._messages_by_symbol[msgid]
- msgid = msgid.upper()
- try:
- return self._messages[msgid]
- except KeyError:
- raise UnknownMessage('No such message id %s' % msgid)
+ if msgid[1:].isdigit():
+ msgid = msgid.upper()
+ for source in (self._alternative_names, self._messages):
+ try:
+ return source[msgid]
+ except KeyError:
+ pass
+ raise UnknownMessage('No such message id %s' % msgid)
def get_msg_display_string(self, msgid):
"""Generates a user-consumable representation of a message.
@@ -335,14 +341,19 @@ class MessagesHandlerMixIn(object):
except (KeyError, TypeError):
return MSG_STATE_SCOPE_CONFIG
- def is_message_enabled(self, msgid, line=None):
+ def is_message_enabled(self, msg_descr, line=None):
"""return true if the message associated to the given message id is
enabled
msgid may be either a numeric or symbolic message id.
"""
- if msgid in self._messages_by_symbol:
- msgid = self._messages_by_symbol[msgid].msgid
+ try:
+ msgid = self.check_message_id(msg_descr).msgid
+ except UnknownMessage:
+ # The linter checks for messages that are not registered
+ # due to version mismatch, just treat them as message IDs
+ # for now.
+ msgid = msg_descr
if line is None:
return self._msgs_state.get(msgid, True)
try:
@@ -487,14 +498,16 @@ class MessagesHandlerMixIn(object):
print
print
+ @property
+ def messages(self):
+ """The list of all active messages."""
+ return self._messages.itervalues()
+
def list_messages(self):
"""output full messages list documentation in ReST format"""
- msgids = []
- for msgid in self._messages:
- msgids.append(msgid)
- msgids.sort()
- for msgid in msgids:
- print self.check_message_id(msgid).format_help(checkerref=False)
+ msgs = sorted(self._messages.itervalues(), key=lambda msg: msg.msgid)
+ for msg in msgs:
+ print msg.format_help(checkerref=False)
print