class Eye::Trigger

Constants

TYPES

Attributes

message[R]
options[R]
process[R]

Public Class Methods

create(process, options = {}) click to toggle source
# File lib/eye/trigger.rb, line 36
def self.create(process, options = {})
  get_class(options[:type]).new(process, options)

rescue Object => ex
  log_ex(ex)
  nil
end
get_class(type) click to toggle source
# File lib/eye/trigger.rb, line 27
def self.get_class(type)
  klass = eval("Eye::Trigger::#{TYPES[type]}") rescue nil
  raise "unknown trigger #{type}" unless klass
  if deps = klass.requires
    Array(deps).each { |d| require d }
  end
  klass
end
name_and_class(type) click to toggle source
# File lib/eye/trigger.rb, line 17
def self.name_and_class(type)
  type = type.to_sym
  return { name: type, type: type } if TYPES[type]

  if type =~ %r[\A(.*?)_?[0-9]+\z]
    ctype = Regexp.last_match(1).to_sym
    return { name: type, type: ctype } if TYPES[ctype]
  end
end
new(process, options = {}) click to toggle source
# File lib/eye/trigger.rb, line 48
def initialize(process, options = {})
  @options = options
  @process = process
  @full_name = @process.full_name if @process

  debug { "add #{options}" }
end
register(base) click to toggle source
# File lib/eye/trigger.rb, line 115
def self.register(base)
  name = base.to_s.gsub('Eye::Trigger::', '')
  type = name.underscore.to_sym
  Eye::Trigger::TYPES[type] = name
  Eye::Trigger.const_set(name, base)
end
requires() click to toggle source
# File lib/eye/trigger.rb, line 122
def self.requires; end
validate!(options = {}) click to toggle source
# File lib/eye/trigger.rb, line 44
def self.validate!(options = {})
  get_class(options[:type]).validate(options)
end

Public Instance Methods

check(_transition) click to toggle source
# File lib/eye/trigger.rb, line 92
def check(_transition)
  raise NotImplementedError
end
defer(&block) click to toggle source
# File lib/eye/trigger.rb, line 111
def defer(&block)
  Celluloid::Future.new(&block).value
end
exec_proc(name = :do) click to toggle source
# File lib/eye/trigger.rb, line 100
def exec_proc(name = :do)
  act = @options[name]
  if act
    res = instance_exec(&@options[name]) if act.is_a?(Proc)
    res = send(act, process) if act.is_a?(Symbol)
    res
  else
    true
  end
end
filter_transition(trans) click to toggle source
# File lib/eye/trigger.rb, line 84
def filter_transition(trans)
  return true unless to || from || event

  compare_state(trans.to_name, to) &&
    compare_state(trans.from_name, from) &&
    compare_state(trans.event, event)
end
inspect() click to toggle source
# File lib/eye/trigger.rb, line 56
def inspect
  "<#{self.class} @process='#{@full_name}' @options=#{@options}>"
end
logger_sub_tag() click to toggle source
# File lib/eye/trigger.rb, line 64
def logger_sub_tag
  "trigger(#{@options[:type]})"
end
logger_tag() click to toggle source
# File lib/eye/trigger.rb, line 60
def logger_tag
  @process.logger.prefix
end
notify(transition, state_call) click to toggle source
# File lib/eye/trigger.rb, line 68
def notify(transition, state_call)
  debug { "check (:#{transition.event}) :#{transition.from} => :#{transition.to}" }
  @state_call = state_call
  @transition = transition

  check(transition) if filter_transition(transition)

rescue Object => ex
  raise ex if ex.class == Eye::Process::StateError || ex.class == Celluloid::TaskTerminated
  log_ex(ex)
end
run_in_process_context(p) click to toggle source
# File lib/eye/trigger.rb, line 96
def run_in_process_context(p)
  process.instance_exec(&p) if process.alive?
end

Private Instance Methods

compare_state(state_name, condition) click to toggle source
# File lib/eye/trigger.rb, line 135
def compare_state(state_name, condition)
  case condition
    when Symbol
      state_name == condition
    when Array
      condition.include?(state_name)
    else
      true
  end
end