Class: Eye::Trigger

Inherits:
Object show all
Includes:
Dsl::Validation
Defined in:
lib/eye/trigger.rb

Direct Known Subclasses

Custom, Flapping, StopChildren, Transition

Defined Under Namespace

Classes: Custom, Flapping, StopChildren, Transition

Constant Summary collapse

TYPES =
{:flapping => 'Flapping', :transition => 'Transition', :stop_children => 'StopChildren'}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Dsl::Validation

included

Constructor Details

#initialize(process, options = {}) ⇒ Trigger

Returns a new instance of Trigger.



43
44
45
46
47
48
49
# File 'lib/eye/trigger.rb', line 43

def initialize(process, options = {})
  @options = options
  @process = process
  @full_name = @process.full_name if @process

  debug "add #{options}"
end

Instance Attribute Details

#messageObject (readonly)

Returns the value of attribute message.



10
11
12
# File 'lib/eye/trigger.rb', line 10

def message
  @message
end

#optionsObject (readonly)

Returns the value of attribute options.



10
11
12
# File 'lib/eye/trigger.rb', line 10

def options
  @options
end

#processObject (readonly)

Returns the value of attribute process.



10
11
12
# File 'lib/eye/trigger.rb', line 10

def process
  @process
end

Class Method Details

.create(process, options = {}) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/eye/trigger.rb', line 31

def self.create(process, options = {})
  get_class(options[:type]).new(process, options)

rescue Exception, Timeout::Error => ex
  log_ex(ex)
  nil
end

.depends_onObject



105
106
# File 'lib/eye/trigger.rb', line 105

def self.depends_on
end

.get_class(type) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/eye/trigger.rb', line 22

def self.get_class(type)
  klass = eval("Eye::Trigger::#{TYPES[type]}") rescue nil
  raise "unknown trigger #{type}" unless klass
  if deps = klass.depends_on
    Array(deps).each { |d| require d }
  end
  klass
end

.name_and_class(type) ⇒ Object



12
13
14
15
16
17
18
19
20
# File 'lib/eye/trigger.rb', line 12

def self.name_and_class(type)
  type = type.to_sym
  return {:name => type, :type => type} if TYPES[type]

  if type =~ /\A(.*?)_?[0-9]+\z/
    ctype = $1.to_sym
    return {:name => type, :type => ctype} if TYPES[ctype]
  end
end

.register(base) ⇒ Object



98
99
100
101
102
103
# File 'lib/eye/trigger.rb', line 98

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

.validate!(options = {}) ⇒ Object



39
40
41
# File 'lib/eye/trigger.rb', line 39

def self.validate!(options = {})
  get_class(options[:type]).validate(options)
end

Instance Method Details

#check(transition) ⇒ Object

Raises:

  • (NotImplementedError)


86
87
88
# File 'lib/eye/trigger.rb', line 86

def check(transition)
  raise NotImplementedError
end

#defer(&block) ⇒ Object



94
95
96
# File 'lib/eye/trigger.rb', line 94

def defer(&block)
  Celluloid::Future.new(&block).value
end

#filter_transition(trans) ⇒ Object



78
79
80
81
82
83
84
# File 'lib/eye/trigger.rb', line 78

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

#inspectObject



51
52
53
# File 'lib/eye/trigger.rb', line 51

def inspect
  "<#{self.class} @process='#{@full_name}' @options=#{@options}>"
end

#logger_sub_tagObject



59
60
61
# File 'lib/eye/trigger.rb', line 59

def logger_sub_tag
  "trigger(#{@options[:type]})"
end

#logger_tagObject



55
56
57
# File 'lib/eye/trigger.rb', line 55

def logger_tag
  @process.logger.prefix
end

#notify(transition, reason) ⇒ Object



63
64
65
66
67
68
69
70
71
72
# File 'lib/eye/trigger.rb', line 63

def notify(transition, reason)
  debug "check (:#{transition.event}) :#{transition.from} => :#{transition.to}"
  @reason = reason
  @transition = transition

  check(transition) if filter_transition(transition)

rescue Exception, Timeout::Error => ex
  log_ex(ex)
end

#run_in_process_context(p) ⇒ Object



90
91
92
# File 'lib/eye/trigger.rb', line 90

def run_in_process_context(p)
  process.instance_exec(&p) if process.alive?
end