| Index: third_party/pylint/checkers/similar.py
|
| diff --git a/third_party/pylint/checkers/similar.py b/third_party/pylint/checkers/similar.py
|
| index e5c930038c8f57eb1b09244f5b8b87ad3271f1ad..013f1b0f698b4cc0e4e1a3c8e7b8be7bfaa6290f 100644
|
| --- a/third_party/pylint/checkers/similar.py
|
| +++ b/third_party/pylint/checkers/similar.py
|
| @@ -16,14 +16,18 @@
|
| # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
| """a similarities / code duplication command line tool and pylint checker
|
| """
|
| +from __future__ import print_function
|
| import sys
|
| -from itertools import izip
|
| +from collections import defaultdict
|
|
|
| from logilab.common.ureports import Table
|
|
|
| from pylint.interfaces import IRawChecker
|
| from pylint.checkers import BaseChecker, table_lines_from_stats
|
|
|
| +import six
|
| +from six.moves import zip
|
| +
|
|
|
| class Similar(object):
|
| """finds copy-pasted lines of code in a project"""
|
| @@ -58,9 +62,9 @@ class Similar(object):
|
|
|
| def _compute_sims(self):
|
| """compute similarities in appended files"""
|
| - no_duplicates = {}
|
| + no_duplicates = defaultdict(list)
|
| for num, lineset1, idx1, lineset2, idx2 in self._iter_sims():
|
| - duplicate = no_duplicates.setdefault(num, [])
|
| + duplicate = no_duplicates[num]
|
| for couples in duplicate:
|
| if (lineset1, idx1) in couples or (lineset2, idx2) in couples:
|
| couples.add((lineset1, idx1))
|
| @@ -69,7 +73,7 @@ class Similar(object):
|
| else:
|
| duplicate.append(set([(lineset1, idx1), (lineset2, idx2)]))
|
| sims = []
|
| - for num, ensembles in no_duplicates.iteritems():
|
| + for num, ensembles in six.iteritems(no_duplicates):
|
| for couples in ensembles:
|
| sims.append((num, couples))
|
| sims.sort()
|
| @@ -80,19 +84,19 @@ class Similar(object):
|
| """display computed similarities on stdout"""
|
| nb_lignes_dupliquees = 0
|
| for num, couples in sims:
|
| - print
|
| - print num, "similar lines in", len(couples), "files"
|
| + print()
|
| + print(num, "similar lines in", len(couples), "files")
|
| couples = sorted(couples)
|
| for lineset, idx in couples:
|
| - print "==%s:%s" % (lineset.name, idx)
|
| + print("==%s:%s" % (lineset.name, idx))
|
| # pylint: disable=W0631
|
| for line in lineset._real_lines[idx:idx+num]:
|
| - print " ", line.rstrip()
|
| + print(" ", line.rstrip())
|
| nb_lignes_dupliquees += num * (len(couples)-1)
|
| nb_total_lignes = sum([len(lineset) for lineset in self.linesets])
|
| - print "TOTAL lines=%s duplicates=%s percent=%.2f" \
|
| + print("TOTAL lines=%s duplicates=%s percent=%.2f" \
|
| % (nb_total_lignes, nb_lignes_dupliquees,
|
| - nb_lignes_dupliquees*100. / nb_total_lignes)
|
| + nb_lignes_dupliquees*100. / nb_total_lignes))
|
|
|
| def _find_common(self, lineset1, lineset2):
|
| """find similarities in the two given linesets"""
|
| @@ -107,7 +111,7 @@ class Similar(object):
|
| for index2 in find(lineset1[index1]):
|
| non_blank = 0
|
| for num, ((_, line1), (_, line2)) in enumerate(
|
| - izip(lines1(index1), lines2(index2))):
|
| + zip(lines1(index1), lines2(index2))):
|
| if line1 != line2:
|
| if non_blank > min_lines:
|
| yield num, lineset1, index1, lineset2, index2
|
| @@ -207,10 +211,10 @@ class LineSet(object):
|
|
|
| def _mk_index(self):
|
| """create the index for this set"""
|
| - index = {}
|
| + index = defaultdict(list)
|
| for line_no, line in enumerate(self._stripped_lines):
|
| if line:
|
| - index.setdefault(line, []).append(line_no)
|
| + index[line].append(line_no)
|
| return index
|
|
|
|
|
| @@ -323,10 +327,10 @@ def register(linter):
|
|
|
| def usage(status=0):
|
| """display command line usage information"""
|
| - print "finds copy pasted blocks in a set of files"
|
| - print
|
| - print 'Usage: symilar [-d|--duplicates min_duplicated_lines] \
|
| -[-i|--ignore-comments] [--ignore-docstrings] [--ignore-imports] file1...'
|
| + print("finds copy pasted blocks in a set of files")
|
| + print()
|
| + print('Usage: symilar [-d|--duplicates min_duplicated_lines] \
|
| +[-i|--ignore-comments] [--ignore-docstrings] [--ignore-imports] file1...')
|
| sys.exit(status)
|
|
|
| def Run(argv=None):
|
|
|