module Tzu::Sequence
Attributes
result_block[R]
steps[R]
Public Class Methods
included(base)
click to toggle source
# File lib/tzu/sequence.rb, line 3 def self.included(base) base.class_eval do include Hooks class << self attr_reader :steps, :result_block def run(*params) new(*params).run end def type @type ||= :take_last end def result(type = nil, &block) return @result_block = block if block @type = type end def step(klass, &block) @steps = [] unless @steps step = Step.new(klass) step.instance_eval(&block) if block @steps << step end end def initialize(*params) @params = params @last_outcome = nil @prior_results = {} end def run results = sequence_results return mutated_result(results) if self.class.result_block return @last_outcome if self.class.type == :take_last Outcome.new(true, results) end def sequence_results with_hooks(@params) do |params| self.class.steps.reduce({}) do |prior_results, step| @last_outcome = step.run(*params, prior_results) break if last_outcome_is_failure? merge_last_outcome_into_prior_results(step, prior_results) end end end private def last_outcome_is_failure? return true if (@last_outcome.respond_to?(:failure?) && @last_outcome.failure?) false end def merge_last_outcome_into_prior_results(step, prior_results) result = @last_outcome.respond_to?(:result) ? @last_outcome.result : @last_outcome prior_results.merge(step.name => result) end def mutated_result(results) Outcome.new(true, instance_exec(@params, results, &self.class.result_block)) end end end
new(*params)
click to toggle source
# File lib/tzu/sequence.rb, line 33 def initialize(*params) @params = params @last_outcome = nil @prior_results = {} end
result(type = nil, &block)
click to toggle source
# File lib/tzu/sequence.rb, line 18 def result(type = nil, &block) return @result_block = block if block @type = type end
run(*params)
click to toggle source
# File lib/tzu/sequence.rb, line 10 def run(*params) new(*params).run end
step(klass, &block)
click to toggle source
# File lib/tzu/sequence.rb, line 23 def step(klass, &block) @steps = [] unless @steps step = Step.new(klass) step.instance_eval(&block) if block @steps << step end
type()
click to toggle source
# File lib/tzu/sequence.rb, line 14 def type @type ||= :take_last end
Public Instance Methods
last_outcome_is_failure?()
click to toggle source
# File lib/tzu/sequence.rb, line 58 def last_outcome_is_failure? return true if (@last_outcome.respond_to?(:failure?) && @last_outcome.failure?) false end
merge_last_outcome_into_prior_results(step, prior_results)
click to toggle source
# File lib/tzu/sequence.rb, line 63 def merge_last_outcome_into_prior_results(step, prior_results) result = @last_outcome.respond_to?(:result) ? @last_outcome.result : @last_outcome prior_results.merge(step.name => result) end
mutated_result(results)
click to toggle source
# File lib/tzu/sequence.rb, line 68 def mutated_result(results) Outcome.new(true, instance_exec(@params, results, &self.class.result_block)) end
run()
click to toggle source
# File lib/tzu/sequence.rb, line 39 def run results = sequence_results return mutated_result(results) if self.class.result_block return @last_outcome if self.class.type == :take_last Outcome.new(true, results) end
sequence_results()
click to toggle source
# File lib/tzu/sequence.rb, line 46 def sequence_results with_hooks(@params) do |params| self.class.steps.reduce({}) do |prior_results, step| @last_outcome = step.run(*params, prior_results) break if last_outcome_is_failure? merge_last_outcome_into_prior_results(step, prior_results) end end end