def rate_diffs(thresholds, l_diff, r_diff):
filename_compare = best_string_mapping(thresholds.filename, l_diff.patches.keys(), r_diff.patches.keys())
levenshteins = []
def compare_hunks(left, right):
# This case happens for example, if both hunks remove empty newlines
if left == right:
return 100
return fuzz.token_sort_ratio(left, right)
for l_filename, r_filename in filename_compare:
l_hunks = l_diff.patches[l_filename]
r_hunks = r_diff.patches[r_filename]
levenshtein = []
hunk_compare = best_string_mapping(thresholds.heading,
l_hunks.keys(), r_hunks.keys())
for l_hunk_heading, r_hunk_heading in hunk_compare:
lhunk = l_hunks[l_hunk_heading]
rhunk = r_hunks[r_hunk_heading]
if lhunk.deletions and rhunk.deletions:
levenshtein.append(compare_hunks(lhunk.deletions,
rhunk.deletions))
if lhunk.insertions and rhunk.insertions:
levenshtein.append(compare_hunks(lhunk.insertions,
rhunk.insertions))
if levenshtein:
levenshteins.append(mean(levenshtein))
if not levenshteins:
levenshteins = [0]
diff_rating = mean(levenshteins) / 100
return diff_rating
评论列表
文章目录