diff options
Diffstat (limited to 'reporters/text.py')
-rw-r--r-- | reporters/text.py | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/reporters/text.py b/reporters/text.py new file mode 100644 index 000000000..f4dfd2c01 --- /dev/null +++ b/reporters/text.py @@ -0,0 +1,151 @@ +# 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. +""" Copyright (c) 2000-2003 LOGILAB S.A. (Paris, FRANCE). + http://www.logilab.fr/ -- mailto:contact@logilab.fr + +Plain text reporter +""" + +__revision__ = "$Id: text.py,v 1.21 2005-12-28 00:24:35 syt Exp $" + +import os +import sys + +from logilab.common.ureports import TextWriter +from logilab.common.textutils import colorize_ansi + +from pylint.interfaces import IReporter +from pylint.reporters import BaseReporter + +TITLE_UNDERLINES = ['', '=', '-', '.'] + + +## def modname_to_path(modname, prefix=os.getcwd() + os.sep): +## """transform a module name into a path""" +## module = load_module_from_name(modname).__file__.replace(prefix, '') +## return module.replace('.pyc', '.py').replace('.pyo', '.py') + + +class TextReporter(BaseReporter): + """reports messages and layouts in plain text + """ + + __implements__ = IReporter + extension = 'txt' + + def __init__(self, output=sys.stdout): + BaseReporter.__init__(self, output) + self._modules = {} + + def add_message(self, msg_id, location, msg): + """manage message of different type and in the context of path""" + module, obj, line = location[1:] + if not self._modules.has_key(module): + self.writeln('************* Module %s' % module) + self._modules[module] = 1 + if obj: + obj = ':%s' % obj + if self.include_ids: + sigle = msg_id + else: + sigle = msg_id[0] + self.writeln('%s:%3s%s: %s' % (sigle, line, obj, msg)) + + def _display(self, layout): + """launch layouts display""" + print >> self.out + TextWriter().format(layout, self.out) + + +class TextReporter2(TextReporter): + """a reporter very similar to TextReporter, but display messages in a form + recognized by most text editors : + + <filename>:<linenum>:<msg> + """ + def __init__(self, output=sys.stdout, relative=True): + TextReporter.__init__(self, output) + if relative: + self._prefix = os.getcwd() + os.sep + else: + self._prefix = '' + + def add_message(self, msg_id, location, msg): + """manage message of different type and in the context of path""" + path, _, obj, line = location + if obj: + obj = ', %s' % obj + if self.include_ids: + sigle = msg_id + else: + sigle = msg_id[0] + if self._prefix: + path = path.replace(self._prefix, '') +## try: +## modpath = self._modules[module] +## except KeyError: +## modpath = self._modules[module] = self.linter.current_file or \ +## modname_to_path(module) + self.writeln('%s:%s: [%s%s] %s' % (path, line, sigle, obj, msg)) + + +class ColorizedTextReporter(TextReporter): + """Simple TextReporter that colorizes text output""" + + COLOR_MAPPING = { + "I" : ("green", None), + 'C' : (None, "bold"), + 'R' : ("magenta", "bold, italic"), + 'W' : ("blue", None), + 'E' : ("red", "bold"), + 'F' : ("red", "bold, underline"), + 'S' : ("yellow", "inverse"), # S stands for module Separator + } + + def __init__(self, output=sys.stdout, color_mapping = None): + TextReporter.__init__(self, output) + self.color_mapping = color_mapping or \ + dict(ColorizedTextReporter.COLOR_MAPPING) + + + def _get_decoration(self, msg_id): + """Returns the tuple color, style associated with msg_id as defined + in self.color_mapping + """ + try: + return self.color_mapping[msg_id] + except KeyError: + return None, None + + def add_message(self, msg_id, location, msg): + """manage message of different types, and colorize output + using ansi escape codes + """ + module, obj, line = location[1:] + if not self._modules.has_key(module): + color, style = self._get_decoration('S') + modsep = colorize_ansi('************* Module %s' % module, + color, style) + self.writeln(modsep) + self._modules[module] = 1 + if obj: + obj = ':%s' % obj + if self.include_ids: + sigle = msg_id + else: + sigle = msg_id[0] + color, style = self._get_decoration(sigle) + msg = colorize_ansi(msg, color, style) + sigle = colorize_ansi(sigle, color, style) + self.writeln('%s:%3s%s: %s' % (sigle, line, obj, msg)) + |