Class: Reflekt::Action

Inherits:
Object
  • Object
show all
Includes:
LitCLI
Defined in:
lib/action.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(caller_object, method, config, db, stack, aggregator) ⇒ Action

Create Action.

Parameters:

  • object (Object)

    The calling object.

  • method (Symbol)

    The calling method.

  • reflect_amount (Integer)

    The number of experiments to create per action.

  • stack (ActionStack)

    The shadow action call stack.



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/action.rb', line 37

def initialize(caller_object, method, config, db, stack, aggregator)
  @time = Time.now.to_i
  @unique_id = @time + rand(1..99999)
  @base = nil
  @child = nil
  @parent = nil

  # Dependencies.
  @db = db
  @stack = stack
  @aggregator = aggregator

  # Caller.
  @caller_object = caller_object
  @caller_class = caller_object.class
  @caller_id = caller_object.object_id
  @klass = @caller_class.to_s.to_sym
  @method = method

  # Reflections.
  @control = nil
  @experiments = Array.new(config.reflect_amount)

  # State.
  @is_reflecting = false
  if @stack.peek() == nil
    @is_base = true
  else
    @is_base = false
    @base = @stack.base()
  end
end

Instance Attribute Details

#baseObject

Returns the value of attribute base.



20
21
22
# File 'lib/action.rb', line 20

def base
  @base
end

#caller_classObject

Returns the value of attribute caller_class.



17
18
19
# File 'lib/action.rb', line 17

def caller_class
  @caller_class
end

#caller_idObject

Returns the value of attribute caller_id.



16
17
18
# File 'lib/action.rb', line 16

def caller_id
  @caller_id
end

#caller_objectObject

Returns the value of attribute caller_object.



15
16
17
# File 'lib/action.rb', line 15

def caller_object
  @caller_object
end

#childObject

Returns the value of attribute child.



22
23
24
# File 'lib/action.rb', line 22

def child
  @child
end

#controlObject

Returns the value of attribute control.



23
24
25
# File 'lib/action.rb', line 23

def control
  @control
end

#experimentsObject

Returns the value of attribute experiments.



24
25
26
# File 'lib/action.rb', line 24

def experiments
  @experiments
end

#is_actionedObject

Returns the value of attribute is_actioned.



25
26
27
# File 'lib/action.rb', line 25

def is_actioned
  @is_actioned
end

#is_baseObject

Returns the value of attribute is_base.



27
28
29
# File 'lib/action.rb', line 27

def is_base
  @is_base
end

#is_reflectingObject

Returns the value of attribute is_reflecting.



26
27
28
# File 'lib/action.rb', line 26

def is_reflecting
  @is_reflecting
end

#klassObject

Returns the value of attribute klass.



18
19
20
# File 'lib/action.rb', line 18

def klass
  @klass
end

#methodObject

Returns the value of attribute method.



19
20
21
# File 'lib/action.rb', line 19

def method
  @method
end

#parentObject

Returns the value of attribute parent.



21
22
23
# File 'lib/action.rb', line 21

def parent
  @parent
end

#unique_idObject

Returns the value of attribute unique_id.



14
15
16
# File 'lib/action.rb', line 14

def unique_id
  @unique_id
end

Instance Method Details

#has_empty_experiments?Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/action.rb', line 115

def has_empty_experiments?
  @experiments.include? nil
end

#has_finished_loop?Boolean

Returns:

  • (Boolean)


119
120
121
122
123
124
125
# File 'lib/action.rb', line 119

def has_finished_loop?
  return false if is_actioned? == false
  return false if is_reflecting?
  return false if has_empty_experiments?

  true
end

#is_actioned?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/action.rb', line 106

def is_actioned?
  @is_actioned
end

#is_reflecting?Boolean

Is the action currently reflecting methods?

Returns:

  • (Boolean)


111
112
113
# File 'lib/action.rb', line 111

def is_reflecting?
  @is_reflecting
end

#reflect(*args) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/action.rb', line 70

def reflect(*args)

  🔥"^ Create control for #{@method}()", :info, :control, @klass
  @control = Control.new(self, 0, @aggregator)

  @control.reflect(*args)
  🔥"> Reflected control for #{@method}(): #{args}", @control.status, :result, @klass

  # Stop reflecting when control fails to execute.
  unless @control.status == :error

    # Save control.
    @db.get("controls").push(@control.serialize())
    @db.get("reflections").push(@control.serialize())

    # Multiple experiments per action.
    @experiments.each_with_index do |value, index|

      🔥"^ Create experiment ##{index + 1} for #{@method}()", :info, :experiment, @klass
      experiment = Experiment.new(self, index + 1, @aggregator)
      @experiments[index] = experiment

      # Reflect experiment.
      experiment.reflect(*args)
      Reflekt.increase_count(@caller_object, @method)
      🔥"> Reflected experiment ##{index + 1} for #{@method}()", experiment.status, :result, @klass

      # Save experiment.
      @db.get("reflections").push(experiment.serialize())
    end

    # Save results.
    @db.write()
  end
end