Skip to content

Commit

Permalink
✨ Code coverage
Browse files Browse the repository at this point in the history
Signed-off-by: Peter Boling <peter.boling@gmail.com>
  • Loading branch information
pboling committed Jun 30, 2022
1 parent c0a4222 commit 7c54c34
Show file tree
Hide file tree
Showing 5 changed files with 253 additions and 11 deletions.
114 changes: 114 additions & 0 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
name: Code Coverage

env:
CI_CODECOV: true
COVER_ALL: true

on:
push:
branches:
- 'main'
- '*-maintenance'
- '*-dev'
- '*-stable'
tags:
- '!*' # Do not execute on tags
pull_request:
branches:
- '*'
# Allow manually triggering the workflow.
workflow_dispatch:

# Cancels all previous workflow runs for the same branch that have not yet completed.
concurrency:
# The concurrency group contains the workflow name and the branch name.
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
name: Specs with Coverage - Ruby ${{ matrix.ruby }} ${{ matrix.name_extra || '' }}
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
strategy:
fail-fast: false
matrix:
experimental: [false]
rubygems:
- latest
bundler:
- latest
ruby:
- "2.7"

runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
steps:
- uses: amancevice/setup-code-climate@v0
name: CodeClimate Install
if: matrix.ruby == '2.7' && github.event_name != 'pull_request' && always()
with:
cc_test_reporter_id: ${{ secrets.CC_TEST_REPORTER_ID }}

- name: Checkout
uses: actions/checkout@v3

- name: Setup Ruby & Bundle
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
bundler: ${{ matrix.bundler }}
bundler-cache: true

- name: CodeClimate Pre-build Notification
run: cc-test-reporter before-build
if: matrix.ruby == '2.7' && github.event_name != 'pull_request' && always()
continue-on-error: ${{ matrix.experimental != 'false' }}

- name: Run tests
run: bundle exec rake test

- name: CodeClimate Post-build Notification
run: cc-test-reporter after-build
if: matrix.ruby == '2.7' && github.event_name != 'pull_request' && always()
continue-on-error: ${{ matrix.experimental != 'false' }}

- name: Code Coverage Summary Report
uses: irongut/CodeCoverageSummary@v1.2.0
with:
filename: ./coverage/coverage.xml
badge: true
fail_below_min: true
format: markdown
hide_branch_rate: true
hide_complexity: true
indicators: true
output: both
thresholds: '95 97'
continue-on-error: ${{ matrix.experimental != 'false' }}

- name: Add Coverage PR Comment
uses: marocchino/sticky-pull-request-comment@v2
if: matrix.ruby == '2.7' && always()
with:
recreate: true
path: code-coverage-results.md
continue-on-error: ${{ matrix.experimental != 'false' }}

- name: Coveralls
uses: coverallsapp/github-action@master
if: matrix.ruby == '2.7' && github.event_name != 'pull_request' && always()
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
continue-on-error: ${{ matrix.experimental != 'false' }}

# Using the codecov gem instead.
# - name: CodeCov
# uses: codecov/codecov-action@v2
# if: matrix.ruby == '2.7' && github.event_name != 'pull_request' && always()
# with:
# files: ./coverage/coverage.xml
# flags: unittests
# name: codecov-upload
# fail_ci_if_error: true
# continue-on-error: ${{ matrix.experimental != 'false' }}
33 changes: 33 additions & 0 deletions .simplecov
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# frozen_string_literal: true

# To get coverage
# On Local, default (HTML) output, it just works, coverage is turned on:
# bundle exec rspec spec
# On Local, all output formats:
# COVER_ALL=true bundle exec rspec spec
#
# On CI, all output formats, the ENV variables CI is always set,
# and COVER_ALL, and CI_CODECOV, are set in the coverage.yml workflow only,
# so coverage only runs in that workflow, and outputs all formats.
#

if RUN_COVERAGE
SimpleCov.start do
enable_coverage :branch
primary_coverage :branch
add_filter "spec"
add_filter "lib/gitmoji/regex/version.rb"
add_filter "src/regex.rb"
track_files "**/*.rb"

if ALL_FORMATTERS
command_name "#{ENV["GITHUB_WORKFLOW"]} Job #{ENV["GITHUB_RUN_ID"]}:#{ENV["GITHUB_RUN_NUMBER"]}"
else
formatter SimpleCov::Formatter::HTMLFormatter
end

minimum_coverage(100)
end
else
puts "Not running coverage on #{RUBY_ENGINE} #{RUBY_VERSION}"
end
49 changes: 48 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,52 @@

source "https://rubygems.org"

# Specify your gem's dependencies in service_actor-promptable.gemspec
# Specify your gem's dependencies in gitmoji-regex.gemspec
gemspec

git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }

gem "rake", "~> 13.0"

gem "rspec", "~> 3.0"

ruby_version = Gem::Version.new(RUBY_VERSION)
minimum_version = ->(version, engine = "ruby") { ruby_version >= Gem::Version.new(version) && RUBY_ENGINE == engine }
coverage = minimum_version.call("2.6")
linting = minimum_version.call("2.7")
debugging = minimum_version.call("2.7")

gem "overcommit", "~> 0.58" if linting

gem "pry", platforms: %i[mri jruby]

platforms :mri do
if linting
# Danger is incompatible with Faraday 2 (for now)
# see: https://github.com/danger/danger/issues/1349
# gem 'danger', '~> 8.4'
gem "rubocop-md", "~> 1.0", require: false
gem "rubocop-packaging", "~> 0.5", require: false
gem "rubocop-performance", "~> 1.11", require: false
gem "rubocop-rake", "~> 0.6", require: false
gem "rubocop-rspec", require: false
gem "rubocop-thread_safety", "~> 0.4", require: false
end
if coverage
gem "codecov", "~> 0.6" # For CodeCov
gem "simplecov", "~> 0.21", require: false
gem "simplecov-cobertura" # XML for Jenkins
gem "simplecov-json" # For CodeClimate
gem "simplecov-lcov", "~> 0.8", require: false
end
if debugging
# Add `byebug` to your code where you want to drop to REPL
gem "byebug"
gem "pry-byebug"
end
end

platforms :jruby do
# Add `binding.pry` to your code where you want to drop to REPL
gem "pry-debugger-jruby"
end
13 changes: 13 additions & 0 deletions spec/config/rspec/rspec_core.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

RSpec.configure do |config|
# Enable flags like --only-failures and --next-failure
config.example_status_persistence_file_path = ".rspec_status"

# Disable RSpec exposing methods globally on `Module` and `main`
config.disable_monkey_patching!

config.expect_with :rspec do |c|
c.syntax = :expect
end
end
55 changes: 45 additions & 10 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,54 @@
require "pry"
require "version_gem/rspec"

# This library
require "service_actor/promptable"
DEBUG = ENV["DEBUG"] == "true"

Dir["./spec/examples/*"].sort.each { |f| require f }
ruby_version = Gem::Version.new(RUBY_VERSION)
minimum_version = ->(version, engine = "ruby") { ruby_version >= Gem::Version.new(version) && RUBY_ENGINE == engine }
actual_version = lambda do |major, minor|
actual = Gem::Version.new(ruby_version)
major == actual.segments[0] && minor == actual.segments[1] && RUBY_ENGINE == "ruby"
end
debugging = minimum_version.call("2.7") && DEBUG
RUN_COVERAGE = minimum_version.call("2.6") && (ENV["COVER_ALL"] || ENV["CI_CODECOV"] || ENV["CI"].nil?)
ALL_FORMATTERS = actual_version.call(2, 7) && (ENV["COVER_ALL"] || ENV["CI_CODECOV"] || ENV["CI"])

RSpec.configure do |config|
# Enable flags like --only-failures and --next-failure
config.example_status_persistence_file_path = ".rspec_status"
if DEBUG
if debugging
require "byebug"
elsif minimum_version.call("2.7", "jruby")
require "pry-debugger-jruby"
end
end

# Disable RSpec exposing methods globally on `Module` and `main`
config.disable_monkey_patching!
if RUN_COVERAGE
require "simplecov" # Config file `.simplecov` is run immediately when simplecov loads
require "codecov"
require "simplecov-json"
require "simplecov-lcov"
require "simplecov-cobertura"
# This will override any formatter set in .simplecov
if ALL_FORMATTERS
SimpleCov::Formatter::LcovFormatter.config do |c|
c.report_with_single_file = true
c.single_report_path = "coverage/lcov.info"
end

config.expect_with :rspec do |c|
c.syntax = :expect
SimpleCov.formatters = [
SimpleCov::Formatter::HTMLFormatter,
SimpleCov::Formatter::CoberturaFormatter, # XML for Jenkins
SimpleCov::Formatter::LcovFormatter,
SimpleCov::Formatter::JSONFormatter, # For CodeClimate
SimpleCov::Formatter::Codecov # For CodeCov
]
end
end

# This library
require "service_actor/promptable"

# Examples
Dir["./spec/examples/*"].sort.each { |f| require f }

# RSpec Configs
require "config/rspec/rspec_core"

0 comments on commit 7c54c34

Please sign in to comment.