| Index: third_party/pylint/checkers/raw_metrics.py
|
| diff --git a/third_party/pylint/checkers/raw_metrics.py b/third_party/pylint/checkers/raw_metrics.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..872ca7bcc567989db6e38841713906fbaa779f60
|
| --- /dev/null
|
| +++ b/third_party/pylint/checkers/raw_metrics.py
|
| @@ -0,0 +1,125 @@
|
| +# 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) 2003-2010 LOGILAB S.A. (Paris, FRANCE).
|
| + http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
| +
|
| +Raw metrics checker
|
| +"""
|
| +
|
| +import tokenize
|
| +
|
| +# pylint now requires pylint >= 2.2, so this is no longer necessary
|
| +#if not hasattr(tokenize, 'NL'):
|
| +# raise ValueError("tokenize.NL doesn't exist -- tokenize module too old")
|
| +
|
| +from logilab.common.ureports import Table
|
| +
|
| +from pylint.interfaces import IRawChecker
|
| +from pylint.checkers import BaseRawChecker, EmptyReport
|
| +from pylint.reporters import diff_string
|
| +
|
| +def report_raw_stats(sect, stats, old_stats):
|
| + """calculate percentage of code / doc / comment / empty
|
| + """
|
| + total_lines = stats['total_lines']
|
| + if not total_lines:
|
| + raise EmptyReport()
|
| + sect.description = '%s lines have been analyzed' % total_lines
|
| + lines = ('type', 'number', '%', 'previous', 'difference')
|
| + for node_type in ('code', 'docstring', 'comment', 'empty'):
|
| + key = node_type + '_lines'
|
| + total = stats[key]
|
| + percent = float(total * 100) / total_lines
|
| + old = old_stats.get(key, None)
|
| + if old is not None:
|
| + diff_str = diff_string(old, total)
|
| + else:
|
| + old, diff_str = 'NC', 'NC'
|
| + lines += (node_type, str(total), '%.2f' % percent,
|
| + str(old), diff_str)
|
| + sect.append(Table(children=lines, cols=5, rheaders=1))
|
| +
|
| +
|
| +class RawMetricsChecker(BaseRawChecker):
|
| + """does not check anything but gives some raw metrics :
|
| + * total number of lines
|
| + * total number of code lines
|
| + * total number of docstring lines
|
| + * total number of comments lines
|
| + * total number of empty lines
|
| + """
|
| +
|
| + __implements__ = (IRawChecker,)
|
| +
|
| + # configuration section name
|
| + name = 'metrics'
|
| + # configuration options
|
| + options = ( )
|
| + # messages
|
| + msgs = {}
|
| + # reports
|
| + reports = ( ('RP0701', 'Raw metrics', report_raw_stats), )
|
| +
|
| + def __init__(self, linter):
|
| + BaseRawChecker.__init__(self, linter)
|
| + self.stats = None
|
| +
|
| + def open(self):
|
| + """init statistics"""
|
| + self.stats = self.linter.add_stats(total_lines=0, code_lines=0,
|
| + empty_lines=0, docstring_lines=0,
|
| + comment_lines=0)
|
| +
|
| + def process_tokens(self, tokens):
|
| + """update stats"""
|
| + i = 0
|
| + tokens = list(tokens)
|
| + while i < len(tokens):
|
| + i, lines_number, line_type = get_type(tokens, i)
|
| + self.stats['total_lines'] += lines_number
|
| + self.stats[line_type] += lines_number
|
| +
|
| +
|
| +JUNK = (tokenize.NL, tokenize.INDENT, tokenize.NEWLINE, tokenize.ENDMARKER)
|
| +
|
| +def get_type(tokens, start_index):
|
| + """return the line type : docstring, comment, code, empty"""
|
| + i = start_index
|
| + tok_type = tokens[i][0]
|
| + start = tokens[i][2]
|
| + pos = start
|
| + line_type = None
|
| + while i < len(tokens) and tokens[i][2][0] == start[0]:
|
| + tok_type = tokens[i][0]
|
| + pos = tokens[i][3]
|
| + if line_type is None:
|
| + if tok_type == tokenize.STRING:
|
| + line_type = 'docstring_lines'
|
| + elif tok_type == tokenize.COMMENT:
|
| + line_type = 'comment_lines'
|
| + elif tok_type in JUNK:
|
| + pass
|
| + else:
|
| + line_type = 'code_lines'
|
| + i += 1
|
| + if line_type is None:
|
| + line_type = 'empty_lines'
|
| + elif i < len(tokens) and tok_type == tokenize.NEWLINE:
|
| + i += 1
|
| + return i, pos[0] - start[0] + 1, line_type
|
| +
|
| +
|
| +def register(linter):
|
| + """ required method to auto register this checker """
|
| + linter.register_checker(RawMetricsChecker(linter))
|
| +
|
|
|