class MetricFu::Rcov

Constants

NEW_FILE_MARKER

Public Instance Methods

analyze() click to toggle source
# File lib/generators/rcov.rb, line 36
def analyze
  output_file = MetricFu.rcov[:external] ? MetricFu.rcov[:external] : MetricFu::Rcov.metric_directory + '/rcov.txt'
  output = File.open(output_file).read
  output = output.split(NEW_FILE_MARKER)

  output.shift # Throw away the first entry - it's the execution time etc.

  files = assemble_files(output)

  @global_total_lines = 0
  @global_total_lines_run = 0

  @rcov = add_coverage_percentage(files)
end
emit() click to toggle source
# File lib/generators/rcov.rb, line 21
def emit
  unless MetricFu.rcov[:external]
    FileUtils.rm_rf(MetricFu::Rcov.metric_directory, :verbose => false)
    Dir.mkdir(MetricFu::Rcov.metric_directory)
    test_files = FileList[*MetricFu.rcov[:test_files]].join(' ')
    rcov_opts = MetricFu.rcov[:rcov_opts].join(' ')
    output = ">> #{MetricFu::Rcov.metric_directory}/rcov.txt"
    mf_debug "** Running the specs/tests in the [#{MetricFu.rcov[:environment]}] environment"
    command = %Q(RAILS_ENV=#{MetricFu.rcov[:environment]} rcov #{test_files} #{rcov_opts} #{output})
    mf_debug "** #{command}"
    `#{command}`
  end
end
to_h() click to toggle source
# File lib/generators/rcov.rb, line 51
def to_h
  global_percent_run = ((@global_total_lines_run.to_f / @global_total_lines.to_f) * 100)
  add_method_data
  {:rcov => @rcov.merge({:global_percent_run => round_to_tenths(global_percent_run) })}
end

Private Instance Methods

add_coverage_percentage(files) click to toggle source
# File lib/generators/rcov.rb, line 113
def add_coverage_percentage(files)
  files.each_pair do |fname, content|
    lines = content[:lines]
    @global_total_lines_run += lines_run = lines.find_all {|line| line[:was_run] == true }.length
    @global_total_lines += total_lines = lines.length
    percent_run = ((lines_run.to_f / total_lines.to_f) * 100).round
    files[fname][:percent_run] = percent_run
  end
end
add_method_data() click to toggle source
# File lib/generators/rcov.rb, line 59
def add_method_data
  @rcov.each_pair do |file_path, info|
    file_contents = ""
    coverage = []

    info[:lines].each_with_index do |line, index|
      file_contents << "#{line[:content]}\n"
      coverage << line[:was_run]
    end

    begin
      line_numbers = MetricFu::LineNumbers.new(file_contents)
    rescue StandardError => e
      raise e unless e.message =~ /you shouldn't be able to get here/
      STDOUT.puts "ruby_parser blew up while trying to parse #{file_path}. You won't have method level Rcov information for this file."
      next
    end

    method_coverage_map = {}
    coverage.each_with_index do |covered, index|
      line_number = index + 1
      if line_numbers.in_method?(line_number)
        method_name = line_numbers.method_at_line(line_number)
        method_coverage_map[method_name] ||= {}
        method_coverage_map[method_name][:total] ||= 0
        method_coverage_map[method_name][:total] += 1
        method_coverage_map[method_name][:uncovered] ||= 0
        method_coverage_map[method_name][:uncovered] += 1 if !covered
      end
    end

    @rcov[file_path][:methods] = {}

    method_coverage_map.each do |method_name, coverage_data|
      @rcov[file_path][:methods][method_name] = (coverage_data[:uncovered] / coverage_data[:total].to_f) * 100.0
    end

  end
end
assemble_files(output) click to toggle source
# File lib/generators/rcov.rb, line 99
def assemble_files(output)
  files = {}
  output.each_slice(2) {|out| files[out.first.strip] = out.last}
  files.each_pair {|fname, content| files[fname] = content.split("\n") }
  files.each_pair do |fname, content|
    content.map! do |raw_line|
      line = Line.new(raw_line[3..-1], !raw_line.match(/^!!/)).to_h
    end
    content.reject! {|line| line[:content].blank? }
    files[fname] = {:lines => content}
  end
  files
end