Remove CLI::Builder registry
This commit is contained in:
parent
32d3a461d3
commit
ad82b0fc4f
9 changed files with 84 additions and 94 deletions
|
@ -61,7 +61,7 @@ module Mutant
|
|||
debug: @debug,
|
||||
matcher: matcher,
|
||||
subject_predicate: @subject_predicate.output,
|
||||
strategy: @strategy.output,
|
||||
strategy: @strategy || Strategy::Null.new,
|
||||
fail_fast: @fail_fast,
|
||||
reporter: reporter
|
||||
)
|
||||
|
@ -167,10 +167,8 @@ module Mutant
|
|||
parser.separator(EMPTY_STRING)
|
||||
parser.separator('Strategies:')
|
||||
|
||||
Builder::REGISTRY.each do |builder, instance_variable_name|
|
||||
builder = builder.new(@cache, parser)
|
||||
instance_variable_set(instance_variable_name, builder)
|
||||
end
|
||||
builder = Builder::Predicate::Subject.new(@cache, parser)
|
||||
@subject_predicate = builder
|
||||
end
|
||||
|
||||
# Add environmental options
|
||||
|
@ -191,6 +189,22 @@ module Mutant
|
|||
end
|
||||
end
|
||||
|
||||
# Add runner
|
||||
#
|
||||
# @param [String] runner_name
|
||||
#
|
||||
# @return [undefined]
|
||||
#
|
||||
# @api private
|
||||
#
|
||||
def set_strategy(name)
|
||||
require "mutant/#{name}"
|
||||
@strategy = Strategy.lookup(name).new
|
||||
rescue LoadError
|
||||
$stderr.puts("Cannot load strategy: #{name.inspect}")
|
||||
raise
|
||||
end
|
||||
|
||||
# Add options
|
||||
#
|
||||
# @param [Object] opts
|
||||
|
@ -203,6 +217,10 @@ module Mutant
|
|||
opts.separator ''
|
||||
opts.separator 'Options:'
|
||||
|
||||
opts.on('--via STRATEGY', 'Use STRATEGY for killing mutations') do |runner|
|
||||
set_strategy(runner)
|
||||
end
|
||||
|
||||
opts.on('--version', 'Print mutants version') do |name|
|
||||
puts("mutant-#{Mutant::VERSION}")
|
||||
Kernel.exit(0)
|
||||
|
|
|
@ -6,18 +6,6 @@ module Mutant
|
|||
class Builder
|
||||
include AbstractType
|
||||
|
||||
REGISTRY = {}
|
||||
|
||||
# Register builder
|
||||
#
|
||||
# @return [undefined]
|
||||
#
|
||||
# @api private
|
||||
#
|
||||
def self.register(instance_variable_name)
|
||||
REGISTRY[self] = instance_variable_name
|
||||
end
|
||||
|
||||
# Return cache
|
||||
#
|
||||
# @return [Cache]
|
||||
|
@ -71,8 +59,6 @@ module Mutant
|
|||
# Bubject predicate builder
|
||||
class Subject < self
|
||||
|
||||
register :@subject_predicate
|
||||
|
||||
# Initialize object
|
||||
#
|
||||
# @api private
|
||||
|
|
|
@ -99,5 +99,25 @@ module Mutant
|
|||
#
|
||||
abstract_method :run
|
||||
|
||||
# Null killer that never kills a mutation
|
||||
class Null < self
|
||||
|
||||
private
|
||||
|
||||
# Run killer
|
||||
#
|
||||
# @return [true]
|
||||
# when mutant was killed
|
||||
#
|
||||
# @return [false]
|
||||
# otherwise
|
||||
#
|
||||
# @api private
|
||||
#
|
||||
def run
|
||||
false
|
||||
end
|
||||
|
||||
end
|
||||
end # Killer
|
||||
end # Mutant
|
||||
|
|
|
@ -2,7 +2,6 @@ require 'rspec'
|
|||
|
||||
require 'mutant/rspec/killer'
|
||||
require 'mutant/rspec/strategy'
|
||||
require 'mutant/rspec/builder'
|
||||
|
||||
module Mutant
|
||||
module Rspec
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
module Mutant
|
||||
module Rspec
|
||||
# Rspec strategy builder
|
||||
class Builder < CLI::Builder
|
||||
|
||||
register :@strategy
|
||||
|
||||
# Initialize object
|
||||
#
|
||||
# @return [undefined]
|
||||
#
|
||||
# @api private
|
||||
#
|
||||
def initialize(*)
|
||||
@rspec = false
|
||||
super
|
||||
end
|
||||
|
||||
# Return strategy
|
||||
#
|
||||
# @return [Strategy::Rspec]
|
||||
#
|
||||
# @api private
|
||||
#
|
||||
def output
|
||||
unless @rspec
|
||||
raise Error, 'No strategy given'
|
||||
end
|
||||
|
||||
Strategy.new
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Add cli options
|
||||
#
|
||||
# @param [OptionParser] parser
|
||||
#
|
||||
# @return [undefined]
|
||||
#
|
||||
# @api private
|
||||
#
|
||||
def add_options
|
||||
parser.on('--rspec', 'kills mutations with rspec') do
|
||||
@rspec = true
|
||||
end
|
||||
end
|
||||
|
||||
end # Builder
|
||||
end # Rspec
|
||||
end # Mutant
|
|
@ -4,7 +4,8 @@ module Mutant
|
|||
module Rspec
|
||||
# Rspec killer strategy
|
||||
class Strategy < Mutant::Strategy
|
||||
include Equalizer.new
|
||||
|
||||
register 'rspec'
|
||||
|
||||
KILLER = Killer::Forking.new(Rspec::Killer)
|
||||
|
||||
|
|
|
@ -6,6 +6,34 @@ module Mutant
|
|||
class Strategy
|
||||
include AbstractType, Adamantium::Flat
|
||||
|
||||
REGISTRY = {}
|
||||
|
||||
# Lookup strategy for name
|
||||
#
|
||||
# @param [String] name
|
||||
#
|
||||
# @return [Strategy]
|
||||
# if found
|
||||
#
|
||||
# @api private
|
||||
#
|
||||
def self.lookup(name)
|
||||
REGISTRY.fetch(name)
|
||||
end
|
||||
|
||||
# Register strategy
|
||||
#
|
||||
# @param [String] name
|
||||
#
|
||||
# @return [undefined]
|
||||
#
|
||||
# @api private
|
||||
#
|
||||
def self.register(name)
|
||||
REGISTRY[name] = self
|
||||
end
|
||||
private_class_method :register
|
||||
|
||||
# Perform strategy setup
|
||||
#
|
||||
# @return [self]
|
||||
|
@ -50,5 +78,15 @@ module Mutant
|
|||
self.class::KILLER
|
||||
end
|
||||
|
||||
# Null strategy that never kills a mutation
|
||||
class Null < self
|
||||
|
||||
register 'null'
|
||||
|
||||
KILLER = Killer::Null
|
||||
|
||||
end # Null
|
||||
|
||||
end # Strategy
|
||||
|
||||
end # Mutant
|
||||
|
|
|
@ -10,7 +10,7 @@ describe Mutant, 'rspec integration' do
|
|||
end
|
||||
end
|
||||
|
||||
let(:base_cmd) { 'bundle exec mutant -I lib --require test_app --rspec' }
|
||||
let(:base_cmd) { 'bundle exec mutant -I lib --require test_app --via rspec' }
|
||||
|
||||
specify 'it allows to kill mutations' do
|
||||
Kernel.system("#{base_cmd} ::TestApp::Literal#string").should be(true)
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
# encoding: utf-8
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
describe Mutant::Rspec::Builder do
|
||||
|
||||
let(:option_parser) { OptionParser.new }
|
||||
|
||||
let(:cache) { Mutant::Cache.new }
|
||||
let(:object) { described_class.new(cache, option_parser) }
|
||||
|
||||
let(:default_strategy) do
|
||||
Mutant::Rspec::Strategy.new
|
||||
end
|
||||
|
||||
specify do
|
||||
object
|
||||
option_parser.parse!(%w[--rspec])
|
||||
expect(object.output).to eql(default_strategy)
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue