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