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)) |
+ |