class OneshotCoverage::SimplecovReporter

Public Class Methods

new( log_path:, project_path: Dir.pwd, file_filter: DefaultFilter ) click to toggle source

@option log_path [String] oneshot coverage log generated by FileLogger or same scheme json file acceptable @option project_path [String] target project path. @option file_filter [Object] Object respond to call with return true | false. this filter used for coverage target. file_filter.call(path) return false, then path will not be included to report

# File lib/oneshot_coverage/simplecov_reporter.rb, line 22
def initialize(
  log_path:,
  project_path: Dir.pwd,
  file_filter: DefaultFilter
)
  @project_path = project_path.end_with?('/') ? project_path : "#{project_path}/"
  @log_path = log_path
  @file_filter = file_filter
end

Public Instance Methods

run() click to toggle source
# File lib/oneshot_coverage/simplecov_reporter.rb, line 32
def run
  raise "Please install & require 'simplecov' if you want to use this" unless defined? SimpleCov

  coverages = coverage_stubs
  fill_lines(coverages)
  gen_html(coverages)
end

Private Instance Methods

coverage_candidates() click to toggle source
# File lib/oneshot_coverage/simplecov_reporter.rb, line 42
def coverage_candidates
  @coverage_candidates ||=
    Find.find(@project_path).
      select { |fp| @file_filter.call(fp) }
      # map { |fp| fp.sub(@project_path, '') }
end
coverage_stubs() click to toggle source
# File lib/oneshot_coverage/simplecov_reporter.rb, line 49
def coverage_stubs
  {}.tap do |stubs|
    coverage_candidates.each do |filepath|
      stub = Coverage.line_stub(filepath)
      stubs[filepath] = stub
    end
  end
end
fill_lines(coverages) click to toggle source
# File lib/oneshot_coverage/simplecov_reporter.rb, line 69
def fill_lines(coverages)
  oneshot_coverage_logs.each do |filepath, linenums|
    linenums.each do |linenum|
      coverages[filepath][linenum - 1] = 1
    end
  end
end
format_data(coverages) click to toggle source
# File lib/oneshot_coverage/simplecov_reporter.rb, line 77
def format_data(coverages)
  coverages.transform_values do |lines|
    { "lines" => lines }
  end
end
gen_html(coverages) click to toggle source
# File lib/oneshot_coverage/simplecov_reporter.rb, line 83
def gen_html(coverages)
  coverages_for_simcov = format_data(coverages)
  SimpleCov.root(@project_path)
  result = SimpleCov::Result.from_hash({
    'oneshot' => {
      'coverage' => coverages_for_simcov,
      'timestamp' => Time.now.to_i
    }
  }).first
  SimpleCov::Formatter::HTMLFormatter.new.format(result)
end
oneshot_coverage_logs() click to toggle source
# File lib/oneshot_coverage/simplecov_reporter.rb, line 58
def oneshot_coverage_logs
  @oneshot_coverage_logs ||= begin
    raise "#{@log_path} isn't exist!" unless File.exist?(@log_path)

    JSON.parse(File.read(@log_path)).transform_keys do |filepath_with_md5_hash|
      *path_tokens, _md5_hash = filepath_with_md5_hash.split('-')
      "#{@project_path}#{path_tokens.join('-')}"
    end
  end
end