summaryrefslogtreecommitdiff
path: root/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'utils.py')
-rw-r--r--utils.py61
1 files changed, 37 insertions, 24 deletions
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