class Flayer

Public Class Methods

new(path) click to toggle source
# File lib/merge_reviewer/flayer.rb, line 4
def initialize(path)
  files = Flay.expand_dirs_to_files(path)
  flay = Flay.new
  flay.process(*files)
  file = Tempfile.new('flay-output')
  flay.report(file)
  file.rewind
  @results = build_file_flog_score(file)
end

Public Instance Methods

build_file_flog_score(file) click to toggle source
# File lib/merge_reviewer/flayer.rb, line 75
def build_file_flog_score(file)
  results_by_duplication_number = parse_file_to_hash(file)
  duplication_number_hash_to_files(results_by_duplication_number)
end
duplication_number_hash_to_files(hsh) click to toggle source
# File lib/merge_reviewer/flayer.rb, line 54
def duplication_number_hash_to_files(hsh)
  result = {}
  hsh.each do |number, match|
    similar_combinations(match[:similarities]).each do |raw_line, similar_to|
      next if result.has_key?(raw_line)
      result[raw_line] ||= {
        match: match[:match],
        type: match[:type],
        score: match[:score],
        similar_to: similar_to
      }
      similar_to.each do |similar_item|
        unless result[raw_line][:similar_to].include?(similar_item)
          result[raw_line][:similar_to] << similar_item 
        end
      end
    end
  end
  result
end
parse_file_dup_line(line) click to toggle source
# File lib/merge_reviewer/flayer.rb, line 21
def parse_file_dup_line(line)
  if line.match(/(.+):(\d+)/)
    return {method_path: $1, line_number: $2, raw_line: line}
  end
  raise "invalid line: #{line.inspect}"
end
parse_file_to_hash(file) click to toggle source
# File lib/merge_reviewer/flayer.rb, line 28
def parse_file_to_hash(file)
  result = {}
  current_number = ''
  file.each_line do |line|
    line.strip!
    next if line.empty?
    if line.match(/^(\d+)/)
      #puts line
      current_number, result[current_number] = parse_summary_line(line)
    elsif line.match(/Total score/)
      next
    else
      result[current_number][:similarities] << parse_file_dup_line(line)
    end
  end
  result
end
parse_summary_line(line) click to toggle source
# File lib/merge_reviewer/flayer.rb, line 14
def parse_summary_line(line)
  if line.match(/^(\d+)\)\s([a-z]+)\s.+(:[a-z]+)\s.+=\s(\d+)/i)
    return [$1, {match: $2, type: $3, score: $4, similarities: []}]
  end
  raise "invalid line: #{line.inspect}"
end
similar_combinations(arr) click to toggle source
# File lib/merge_reviewer/flayer.rb, line 46
def similar_combinations(arr)
  rtn = {}
  arr.each do |item|
    rtn[item[:raw_line]] = arr.select{|i| i[:raw_line] != item[:raw_line]}
  end
  rtn
end