Skip to content

Commit

Permalink
Add coverage formatter for GH action
Browse files Browse the repository at this point in the history
  • Loading branch information
Burgestrand committed Oct 10, 2024
1 parent a1c94a3 commit c7877e5
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 1 deletion.
1 change: 1 addition & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ jobs:
github_token: ${{ secrets.GITHUB_TOKEN }}
minimum_suite_coverage: 100
minimum_file_coverage: 100
coverage_json_path: coverage/simplecov-check-action.json

rubocop:
runs-on: ubuntu-latest
Expand Down
78 changes: 78 additions & 0 deletions spec/simple_cov_check_action_formatter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# frozen_string_literal: true

require "simplecov"
require "json"

class SimpleCovCheckActionFormatter
SourceFile = Data.define(:source_file) do
def covered_strength = source_file.covered_strength

def to_json(*)
{
filename: source_file.filename,
covered_percent: source_file.covered_percent,
coverage: source_file.coverage_data,
covered_strength: covered_strength.nan? ? 0.0 : covered_strength,
covered_lines: source_file.covered_lines.count,
lines_of_code: source_file.lines_of_code
}.to_json
end
end

Result = Data.define(:result) do
def included?(source_file) = result.filenames.include?(source_file.filename)

def files
result.files.filter_map do |source_file|
next unless result.filenames.include? source_file.filename

SourceFile.new(source_file)
end
end

def to_json(*) # rubocop:disable Metrics/AbcSize
{
timestamp: result.created_at.to_i,
command_name: result.command_name,
files: files,
metrics: {
covered_percent: result.covered_percent,
covered_strength: result.covered_strength.nan? ? 0.0 : result.covered_strength,
covered_lines: result.covered_lines,
total_lines: result.total_lines
}
}.to_json
end
end

FormatterWithOptions = Data.define(:formatter) do
def new = formatter
end

class << self
def with_options(...)
FormatterWithOptions.new(new(...))
end
end

def initialize(output_filename: "coverage.json", output_directory: SimpleCov.coverage_path)
@output_filename = output_filename
@output_directory = output_directory
end

attr_reader :output_filename, :output_directory

def output_filepath = File.join(output_directory, output_filename)

def format(result_data)
result = Result.new(result_data)
json = result.to_json
File.write(output_filepath, json)
puts output_message(result_data)
json
end

def output_message(result)
"Coverage report generated for #{result.command_name} to #{output_filepath}. #{result.covered_lines} / #{result.total_lines} LOC (#{result.covered_percent.round(2)}%) covered." # rubocop:disable Layout/LineLength
end
end
6 changes: 5 additions & 1 deletion spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@
if ENV["COVERAGE"]
require "simplecov"
require "simplecov_json_formatter"
require_relative "simple_cov_check_action_formatter"
SimpleCov.formatters = SimpleCov::Formatter::MultiFormatter.new([
SimpleCov::Formatter::HTMLFormatter,
SimpleCov::Formatter::JSONFormatter
SimpleCov::Formatter::JSONFormatter,
SimpleCovCheckActionFormatter.with_options(
output_filename: "simplecov-check-action.json"
)
])
SimpleCov.start do
add_filter "/spec/"
Expand Down

0 comments on commit c7877e5

Please sign in to comment.