diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5a1d0dfe..c8bc1998 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -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 diff --git a/spec/simple_cov_check_action_formatter.rb b/spec/simple_cov_check_action_formatter.rb new file mode 100644 index 00000000..28b2b237 --- /dev/null +++ b/spec/simple_cov_check_action_formatter.rb @@ -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 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index cfa8c4a4..4b932571 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -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/"