thoughtbot--shoulda-matchers/custom_plan.rb

112 lines
2.3 KiB
Ruby

require 'zeus'
require 'zeus/plan'
require_relative 'spec/support/tests/current_bundle'
class CouldNotBootZeusError < StandardError
def self.create(underlying_error:)
new(<<-MESSAGE)
Couldn't boot Zeus.
Bundler tried to load a gem that has already been loaded (but the
versions are different).
Note that Appraisal requires Rake, and so you'll want to make sure that
the Gemfile is pointing to the same version of Rake that you have
installed locally.
The original message is as follows:
#{underlying_error.message}
MESSAGE
end
end
class CustomPlan < Zeus::Plan
def boot
ENV['BUNDLE_GEMFILE'] = File.expand_path(
"../gemfiles/#{latest_appraisal}.gemfile",
__FILE__,
)
require 'bundler/setup'
$LOAD_PATH << File.expand_path('lib', __dir__)
$LOAD_PATH << File.expand_path('spec', __dir__)
# Fix Zeus for Pry 0.13.0+
Pry::Pager.class_eval do
def best_available
Pry::Pager::NullPager.new(pry_instance.output)
end
end
require_relative 'spec/support/unit/load_environment'
rescue Gem::LoadError => e
raise CouldNotBootZeusError.create(underlying_error: e)
end
def after_fork
end
def test_environment
require_relative 'spec/unit_spec_helper'
end
def rspec
ARGV.replace(file_paths_to_run)
RSpec::Core::Runner.invoke
end
private
def latest_appraisal
current_bundle.latest_appraisal
end
def current_bundle
Tests::CurrentBundle.instance
end
def file_paths_to_run
if given_file_paths.empty?
['spec/unit']
else
given_file_paths.map do |given_path|
determine_file_path_to_run(given_path)
end
end
end
def determine_file_path_to_run(given_rspec_argument)
expanded_file_path, location =
expand_rspec_argument(given_rspec_argument)
if File.exist?(expanded_file_path)
if location
expanded_file_path + location
else
expanded_file_path
end
else
given_rspec_argument
end
end
def expand_rspec_argument(rspec_argument)
match = rspec_argument.match(/\A(.+?)(:\d+|\[[\d:]+\])?\Z/)
file_path, location = match.captures
expanded_file_path = File.expand_path(
"../spec/unit/shoulda/matchers/#{file_path}",
__FILE__,
)
[expanded_file_path, location]
end
def given_file_paths
ARGV
end
end
Zeus.plan = CustomPlan.new