class RiskAnalyzer

Public Instance Methods

analyze(file_manager, commit) click to toggle source

TODO: Add config to match test files

# File lib/risk_analyzer.rb, line 7
def analyze(file_manager, commit)
  return if commit.nil?

  files = files_for_diff(commit.file_diffs, file_manager)

  CommitStats.link_mutations!(files, commit.changes, :change)
  CommitStats.link_mutations!(files, commit.movements, :movement)
  line_diffs = CommitStats.link_diffs!(files, commit.file_diffs)

  score(line_diffs)
end
score(line_diffs) click to toggle source

TODO: Maybe include function score per line.

# File lib/risk_analyzer.rb, line 20
def score(line_diffs)
  (line_diffs[:insertions] + line_diffs[:deletions])
    .reduce(0) do |acc, line|
      penalty = Line.relevant_change?(line) ? Line.score(line) : 0
      penalty /= 3 if line.has_key?(:movement)
      acc += penalty
      acc
    end
end

Private Instance Methods

files_for_diff(file_diffs, file_manager) click to toggle source
# File lib/risk_analyzer.rb, line 32
def files_for_diff(file_diffs, file_manager)
  file_diffs.reduce({a: {}, b: {}}) do |acc, (b_path, file_diff)|
    file = {
      a_file: file_manager.vfs[file_diff.a_file_name] || load_file(file_diff),
      b_file: file_manager.vfs[file_diff.b_file_name],
      a_path: file_diff.a_file_name,
      b_path: file_diff.b_file_name,
      changes: [],
      movements: []
    }
    acc[:a][file[:a_path]] = file
    acc[:b][file[:b_path]] = file
    acc
  end
end
load_file(file_diff) click to toggle source
# File lib/risk_analyzer.rb, line 48
def load_file(file_diff)
  Cache
    .read_object(file_diff.a_file_id)
    .deep_symbolize_keys
end