module Line
Constants
- BEAUTYSPACE_REGEX
- COVERAGE_INVALID
- JARO_SIMILARITY_THRESHOLD
- MAX_LENGTH_SIMILARITY_THRESHOLD
- MAX_MEANING_LENGTH
- MEANINGLESS_KEYWORDS
- MIN_LENGTH_SIMILARITY_THRESHOLD
- NOT_WHITESPACE_REGEX
- TOKEN_SPLIT_REGEX
Public Class Methods
beauty?(a_line, b_line)
click to toggle source
# File lib/line.rb, line 113 def Line.beauty?(a_line, b_line) a_start = a_line[:text].index(NOT_WHITESPACE_REGEX) b_start = b_line[:text].index(NOT_WHITESPACE_REGEX) a_start == b_start && a_line[:text].gsub(BEAUTYSPACE_REGEX, "") == b_line[:text].gsub(BEAUTYSPACE_REGEX, "") end
change!(old_line, line)
click to toggle source
TODO: Don't move/change lines twice.
# File lib/line.rb, line 51 def Line.change!(old_line, line) past_revisions = old_line.delete(:revisions) || [] { text: line[:text], coverage: line[:coverage], commit: line[:commit], issues: line[:issues], errors: line[:errors], bugs: line[:bugs], revisions: line[:revisions] + [old_line] + past_revisions } end
meaningless?(text)
click to toggle source
# File lib/line.rb, line 90 def Line.meaningless?(text) MEANINGLESS_KEYWORDS[text] == true || text.length > MAX_MEANING_LENGTH || text.split(TOKEN_SPLIT_REGEX).length <= 1 end
merge_error!(line, error, depth)
click to toggle source
# File lib/line.rb, line 68 def Line.merge_error!(line, error, depth) return if line[:errors].any? { |line_error| line_error[:error_id] == error[:error_id] } line[:errors].unshift({ error_id: error[:error_id], depth: depth }) end
move!(old_line, line)
click to toggle source
# File lib/line.rb, line 64 def Line.move!(old_line, line) Line.change!(old_line, line) end
new_line(text, file_name, line_num, commit)
click to toggle source
TODO: return line_id only.
# File lib/line.rb, line 37 def Line.new_line(text, file_name, line_num, commit) line = { text: text, coverage: COVERAGE_INVALID, commit: commit.id, issues: commit.issue_id.blank? ? [] : [commit.issue_id], bugs: commit.bug_id.blank? ? [] : [commit.bug_id], errors: [], revisions: [] } line end
relevant?(line)
click to toggle source
# File lib/line.rb, line 77 def Line.relevant?(line) MEANINGLESS_KEYWORDS[line[:text].strip()].nil? end
relevant_change?(line)
click to toggle source
# File lib/line.rb, line 81 def Line.relevant_change?(line) return false if not relevant?(line) if line.has_key?(:change) a_line = {text: line.dig(:change, :change_text)} return trailing?(line, a_line) || beauty?(line, a_line) end return true end
score(line)
click to toggle source
# File lib/line.rb, line 103 def Line.score(line) score = 0 line[:errors].each { |error| score += 2.0 / (error[:depth] + 1) } score += 3 * line[:bugs].count score += 0.75 * line[:revisions].count score += 3 if line[:coverage] == 0 score += 1.5 if line[:coverage].nil? score end
similar?(text_a, text_b)
click to toggle source
# File lib/line.rb, line 96 def Line.similar?(text_a, text_b) length_similarity = text_a.length.to_f / text_b.length.to_f length_similarity > MIN_LENGTH_SIMILARITY_THRESHOLD && length_similarity < MAX_LENGTH_SIMILARITY_THRESHOLD && text_a.jarowinkler_similar(text_b) > JARO_SIMILARITY_THRESHOLD end
trailing?(a_line, b_line)
click to toggle source
# File lib/line.rb, line 121 def Line.trailing?(a_line, b_line) a_line[:text].rstrip == b_line[:text].rstrip end