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