lib/generators/rcov.rb in metric_fu-1.5.1 vs lib/generators/rcov.rb in metric_fu-2.0.0

- old
+ new

@@ -46,13 +46,54 @@ @rcov = add_coverage_percentage(files) end 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 + + 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 = LineNumbers.new(file_contents) + rescue StandardError => e + raise e unless e.message =~ /you shouldn't be able to get here/ + 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 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") }