Appraisal::Matrix

Sometimes our gems are using dependencies which have consistent major/minor versions released with breaking changes, and we want to ensure compatibility by explicitly testing against the array of versions.

Appraisal::Matrix provides an interface for testing against that entire array without repetition in the Appraisals file.

Installation

TODO: Replace UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.

Install the gem and add to the application's Gemfile by executing:

$ bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG

If bundler is not being used to manage dependencies, install the gem by executing:

$ gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG

Usage

Single gem usage

The most common use-case is wanting to test compatibility with all supported versions of Rails.

# Appraisals
# frozen_string_literal: true

require "appraisal/matrix"

appraisal_matrix(activesupport: "6.1")

Then run

$ bundle exec appraisal install

A gemfile like the one below will be created for each major/minor version of activesupport starting with 6.1.

# activesupport_6_1.gemfile
# This file was generated by Appraisal

gem "activesupport", "~> 6.1.0"

Passing blocks to Appraisal

Any block passed to appraisal_matrix will be run in each individual appraisal. For example, if you rely on removing gems using appraisal you can pass the exact same block to appraisal_matrix.

appraisal_matrix(activesupport: "6.1") do
  remove_gem 'test_after_commit'
end

Block arguments

If you would like to setup conditional logic based off of the versions of the gems in the matrix, you can pass a block with arguments to appraisal_matrix.

appraisal_matrix(activesupport: "6.1") do |activesupport:|
  # activesupport <Gem::Version>
  if activesupport < "7"
    remove_gem 'test_after_commit'
  end
end

Appraising more than one Gem

You can also pass more than one gem to appraisal_matrix to create a matrix of all combinations of the specified gems.

appraisal_matrix(activesupport: "6.1", sidekiq: "7.0")

Version argument options

In addition to specifying the minimum requested version, users will be able to make additional version requests.

Additional version restrictions

Include additional version boundaries. Either include the requirement strings as an array or pass the versions key to the options hash.

appraisal_matrix(activesupport: [">= 6.1", "< 7.1"])
appraisal_matrix(activesupport: ["~> 6.0", "!= 6.1.0"])
appraisal_matrix(activesupport: { versions: ["> 6.1.1"] })

Version step

The default operation is to test against each minor version. You can choose to be more or less inclusive when necessary.

Only test the latest release of each major version.

appraisal_matrix(activesupport: { versions: [">= 6.1", "< 7.1"], step: :major })

Or include all patch releases

appraisal_matrix(activesupport: { versions: [">= 6.1", "< 7.1"], step: :patch })

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/invoca/appraisal-matrix.

License

The gem is available as open source under the terms of the MIT License.