diff options
author | Torsten Marek <tmarek@google.com> | 2013-11-06 10:47:04 -0800 |
---|---|---|
committer | Torsten Marek <tmarek@google.com> | 2013-11-06 10:47:04 -0800 |
commit | cb0d54530b8585eccebdd16b159ea7d6c4604bc1 (patch) | |
tree | be5cd75a0f864f66313a8c2e0b3662eaa10ba8c1 | |
parent | d917d28ea80325d4190f943cfc439c678d32d5e0 (diff) | |
download | pylint-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.py | 2 | ||||
-rw-r--r-- | test/test_func.py | 2 | ||||
-rw-r--r-- | utils.py | 61 |
3 files changed, 39 insertions, 26 deletions
@@ -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) @@ -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 |