class Sequins::Sequence

Constants

StepProxy

Attributes

klass[R]

Public Class Methods

new(klass) click to toggle source
# File lib/sequins/sequence.rb, line 7
def initialize(klass)
  @klass = klass
  @steps = {}
  @hooks = {}
end

Public Instance Methods

add_hook(stage, &block) click to toggle source
# File lib/sequins/sequence.rb, line 17
def add_hook(stage, &block)
  @hooks[stage] ||= []
  @hooks[stage] << StepProxy.new({}, block)
end
add_step(name, options={}, &block) click to toggle source
# File lib/sequins/sequence.rb, line 13
def add_step(name, options={}, &block)
  @steps[name] = StepProxy.new(options, block)
end
delay(duration, target, options) click to toggle source
# File lib/sequins/sequence.rb, line 55
def delay(duration, target, options)
  if target.respond_to?(:local_time_zone)
    zone = ActiveSupport::TimeZone[target.local_time_zone]
  else
    zone = ActiveSupport::TimeZone[Sequins.configuration.default_time_zone]
  end

  delay_until = zone.now + duration

  if options[:only] == :weekdays
    current_wday = delay_until.wday

    if current_wday == 0
      delay_until += 1.day
    elsif current_wday == 6
      delay_until += 2.days
    end
  end

  if !options[:at].nil?
    tod = Tod::TimeOfDay.parse(options[:at])
    delay_until = delay_until.to_date.at(tod, zone)
  end

  next_step = options[:then]

  Sequins.schedule_delay(delay_until, @klass, target, next_step)
end
prepend_hook(stage, &block) click to toggle source
# File lib/sequins/sequence.rb, line 22
def prepend_hook(stage, &block)
  @hooks[stage] ||= []
  @hooks[stage].unshift StepProxy.new({}, block)
end
run_hooks_for_target(stage, target, step_name) click to toggle source
# File lib/sequins/sequence.rb, line 46
def run_hooks_for_target(stage, target, step_name)
  return if @hooks[stage].nil? || @hooks[stage].empty?

  @hooks[stage].each do |hook|
    step = Docile.dsl_eval(Sequins::Step.new(target, self, step_name), &(hook.block))
    return false if step.sequence_ended?
  end        
end
run_step_for_target(step_name, target, *args) click to toggle source
# File lib/sequins/sequence.rb, line 27
def run_step_for_target(step_name, target, *args)
  proxy = @steps[step_name]
  raise UnknownStepError.new(step_name) if proxy.nil?

  unless run_hooks_for_target(:before_each_step, target, step_name)
    run_hooks_for_target(:after_sequence, target, :_after_sequence)
    return false
  end

  step = Docile.dsl_eval(Sequins::Step.new(target, self, step_name), args, &(proxy.block))

  ended_after_each = !run_hooks_for_target(:after_each_step, target, step_name)      

  if step.sequence_ended? || ended_after_each
    run_hooks_for_target(:after_sequence, target, :_after_sequence)
    return false
  end
end
trigger(target, *args) click to toggle source
# File lib/sequins/sequence.rb, line 84
def trigger(target, *args)
  options = {}
  if args.last.is_a?(Hash)
    options = args.pop
  end

  if options[:override_initial_step].present?
    step_name = options[:override_initial_step]
  else
    step_name, _ = @steps.detect { |_, s| s.options[:initial] }
  end

  raise NoInitialStepError.new unless step_name.present?

  unless run_hooks_for_target(:before_sequence, target, :_before_sequence)
    run_hooks_for_target(:after_sequence, target, :_after_sequence)
    return false
  end

  run_step_for_target(step_name, target, *args)
end