| Index: third_party/pylint/checkers/__init__.py
|
| diff --git a/third_party/pylint/checkers/__init__.py b/third_party/pylint/checkers/__init__.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..969066b5b90a7ff0a5d34b7f7b72364c6b759233
|
| --- /dev/null
|
| +++ b/third_party/pylint/checkers/__init__.py
|
| @@ -0,0 +1,163 @@
|
| +# Copyright (c) 2003-2010 LOGILAB S.A. (Paris, FRANCE).
|
| +# http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
| +#
|
| +# This program is free software; you can redistribute it and/or modify it under
|
| +# the terms of the GNU General Public License as published by the Free Software
|
| +# Foundation; either version 2 of the License, or (at your option) any later
|
| +# version.
|
| +#
|
| +# This program is distributed in the hope that it will be useful, but WITHOUT
|
| +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
| +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
| +#
|
| +# You should have received a copy of the GNU General Public License along with
|
| +# this program; if not, write to the Free Software Foundation, Inc.,
|
| +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
| +"""utilities methods and classes for checkers
|
| +
|
| +Base id of standard checkers (used in msg and report ids):
|
| +01: base
|
| +02: classes
|
| +03: format
|
| +04: import
|
| +05: misc
|
| +06: variables
|
| +07: exceptions
|
| +08: similar
|
| +09: design_analysis
|
| +10: newstyle
|
| +11: typecheck
|
| +12: logging
|
| +13: string_format
|
| +14-50: not yet used: reserved for future internal checkers.
|
| +51-99: perhaps used: reserved for external checkers
|
| +
|
| +The raw_metrics checker has no number associated since it doesn't emit any
|
| +messages nor reports. XXX not true, emit a 07 report !
|
| +
|
| +"""
|
| +
|
| +import tokenize
|
| +from os import listdir
|
| +from os.path import dirname, join, isdir, splitext
|
| +
|
| +from logilab.astng.utils import ASTWalker
|
| +from logilab.common.configuration import OptionsProviderMixIn
|
| +
|
| +from pylint.reporters import diff_string, EmptyReport
|
| +
|
| +def table_lines_from_stats(stats, old_stats, columns):
|
| + """get values listed in <columns> from <stats> and <old_stats>,
|
| + and return a formated list of values, designed to be given to a
|
| + ureport.Table object
|
| + """
|
| + lines = []
|
| + for m_type in columns:
|
| + new = stats[m_type]
|
| + format = str
|
| + if isinstance(new, float):
|
| + format = lambda num: '%.3f' % num
|
| + old = old_stats.get(m_type)
|
| + if old is not None:
|
| + diff_str = diff_string(old, new)
|
| + old = format(old)
|
| + else:
|
| + old, diff_str = 'NC', 'NC'
|
| + lines += (m_type.replace('_', ' '), format(new), old, diff_str)
|
| + return lines
|
| +
|
| +
|
| +class BaseChecker(OptionsProviderMixIn, ASTWalker):
|
| + """base class for checkers"""
|
| + # checker name (you may reuse an existing one)
|
| + name = None
|
| + # options level (0 will be displaying in --help, 1 in --long-help)
|
| + level = 1
|
| + # ordered list of options to control the ckecker behaviour
|
| + options = ()
|
| + # messages issued by this checker
|
| + msgs = {}
|
| + # reports issued by this checker
|
| + reports = ()
|
| +
|
| + def __init__(self, linter=None):
|
| + """checker instances should have the linter as argument
|
| +
|
| + linter is an object implementing ILinter
|
| + """
|
| + ASTWalker.__init__(self, self)
|
| + self.name = self.name.lower()
|
| + OptionsProviderMixIn.__init__(self)
|
| + self.linter = linter
|
| + # messages that are active for the current check
|
| + self.active_msgs = set()
|
| +
|
| + def add_message(self, msg_id, line=None, node=None, args=None):
|
| + """add a message of a given type"""
|
| + self.linter.add_message(msg_id, line, node, args)
|
| +
|
| + def package_dir(self):
|
| + """return the base directory for the analysed package"""
|
| + return dirname(self.linter.base_file)
|
| +
|
| +
|
| + # dummy methods implementing the IChecker interface
|
| +
|
| + def open(self):
|
| + """called before visiting project (i.e set of modules)"""
|
| +
|
| + def close(self):
|
| + """called after visiting project (i.e set of modules)"""
|
| +
|
| +class BaseRawChecker(BaseChecker):
|
| + """base class for raw checkers"""
|
| +
|
| + def process_module(self, node):
|
| + """process a module
|
| +
|
| + the module's content is accessible via the stream object
|
| +
|
| + stream must implement the readline method
|
| + """
|
| + stream = node.file_stream
|
| + stream.seek(0) # XXX may be removed with astng > 0.23
|
| + self.process_tokens(tokenize.generate_tokens(stream.readline))
|
| +
|
| + def process_tokens(self, tokens):
|
| + """should be overridden by subclasses"""
|
| + raise NotImplementedError()
|
| +
|
| +
|
| +PY_EXTS = ('.py', '.pyc', '.pyo', '.pyw', '.so', '.dll')
|
| +
|
| +def initialize(linter):
|
| + """initialize linter with checkers in this package """
|
| + package_load(linter, __path__[0])
|
| +
|
| +def package_load(linter, directory):
|
| + """load all module and package in the given directory, looking for a
|
| + 'register' function in each one, used to register pylint checkers
|
| + """
|
| + globs = globals()
|
| + imported = {}
|
| + for filename in listdir(directory):
|
| + basename, extension = splitext(filename)
|
| + if basename in imported or basename == '__pycache__':
|
| + continue
|
| + if extension in PY_EXTS and basename != '__init__' or (
|
| + not extension and basename != 'CVS' and
|
| + isdir(join(directory, basename))):
|
| + try:
|
| + module = __import__(basename, globs, globs, None)
|
| + except ValueError:
|
| + # empty module name (usually emacs auto-save files)
|
| + continue
|
| + except ImportError, exc:
|
| + import sys
|
| + print >> sys.stderr, "Problem importing module %s: %s" % (filename, exc)
|
| + else:
|
| + if hasattr(module, 'register'):
|
| + module.register(linter)
|
| + imported[basename] = 1
|
| +
|
| +__all__ = ('CheckerHandler', 'BaseChecker', 'initialize', 'package_load')
|
|
|