Module: TrailGuide::Experiments::Lifecycle::ClassMethods

Defined in:
lib/trail_guide/experiments/lifecycle.rb

Instance Method Summary collapse

Instance Method Details

#calibrating?Boolean

Returns:

  • (Boolean)


87
88
89
# File 'lib/trail_guide/experiments/lifecycle.rb', line 87

def calibrating?
  enable_calibration? && start_manually? && !started?
end

#clear_winner!Object



103
104
105
# File 'lib/trail_guide/experiments/lifecycle.rb', line 103

def clear_winner!
  adapter.delete(:winner)
end

#declare_winner!(variant, context = nil) ⇒ Object



95
96
97
98
99
100
101
# File 'lib/trail_guide/experiments/lifecycle.rb', line 95

def declare_winner!(variant, context=nil)
  variant = variants.find { |var| var == variant } unless variant.is_a?(Variant)
  return false unless variant.present? && variant.experiment == self
  run_callbacks(:on_winner, variant, context)
  adapter.set(:winner, variant.name)
  variant
end

#fresh?Boolean

Returns:

  • (Boolean)


91
92
93
# File 'lib/trail_guide/experiments/lifecycle.rb', line 91

def fresh?
  !started? && !scheduled? && !winner?
end

#pause!(context = nil) ⇒ Object



27
28
29
30
31
32
# File 'lib/trail_guide/experiments/lifecycle.rb', line 27

def pause!(context=nil)
  return false unless running? && configuration.can_resume?
  paused = adapter.set(:paused_at, Time.now.to_i)
  run_callbacks(:on_pause, context)
  paused
end

#paused?Boolean

Returns:

  • (Boolean)


73
74
75
76
# File 'lib/trail_guide/experiments/lifecycle.rb', line 73

def paused?
  time = paused_at
  time && time <= Time.now
end

#paused_atObject



53
54
55
56
# File 'lib/trail_guide/experiments/lifecycle.rb', line 53

def paused_at
  paused = adapter.get(:paused_at)
  return Time.at(paused.to_i) if paused
end

#resume!(context = nil) ⇒ Object



41
42
43
44
45
46
# File 'lib/trail_guide/experiments/lifecycle.rb', line 41

def resume!(context=nil)
  return false unless paused? && configuration.can_resume?
  resumed = adapter.delete(:paused_at)
  run_callbacks(:on_resume, context)
  !!resumed
end

#run_callbacks(hook, *args) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/trail_guide/experiments/lifecycle.rb', line 115

def run_callbacks(hook, *args)
  return unless callbacks[hook]
  return args[0] if hook == :rollout_winner # TODO do we need to account for this case here at the class level?
  args.unshift(self)
  callbacks[hook].each do |callback|
    if callback.respond_to?(:call)
      callback.call(*args)
    else
      send(callback, *args)
    end
  end
end

#running?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/trail_guide/experiments/lifecycle.rb', line 83

def running?
  started? && !paused? && !stopped?
end

#schedule!(start_at, stop_at = nil, context = nil) ⇒ Object



18
19
20
21
22
23
24
25
# File 'lib/trail_guide/experiments/lifecycle.rb', line 18

def schedule!(start_at, stop_at=nil, context=nil)
  return false if started?
  save! unless persisted?
  scheduled = adapter.set(:started_at, start_at.to_i)
  adapter.set(:stopped_at, stop_at.to_i) if stop_at
  run_callbacks(:on_schedule, start_at, stop_at, context)
  scheduled
end

#scheduled?Boolean

Returns:

  • (Boolean)


68
69
70
71
# File 'lib/trail_guide/experiments/lifecycle.rb', line 68

def scheduled?
  time = started_at
  time && time > Time.now
end

#start!(context = nil) ⇒ Object



10
11
12
13
14
15
16
# File 'lib/trail_guide/experiments/lifecycle.rb', line 10

def start!(context=nil)
  return false if started?
  save! unless persisted?
  started = adapter.set(:started_at, Time.now.to_i)
  run_callbacks(:on_start, context)
  started
end

#started?Boolean

Returns:

  • (Boolean)


63
64
65
66
# File 'lib/trail_guide/experiments/lifecycle.rb', line 63

def started?
  time = started_at
  time && time <= Time.now
end

#started_atObject



48
49
50
51
# File 'lib/trail_guide/experiments/lifecycle.rb', line 48

def started_at
  started = adapter.get(:started_at)
  return Time.at(started.to_i) if started
end

#stop!(context = nil) ⇒ Object



34
35
36
37
38
39
# File 'lib/trail_guide/experiments/lifecycle.rb', line 34

def stop!(context=nil)
  return false unless started? && !stopped?
  stopped = adapter.set(:stopped_at, Time.now.to_i)
  run_callbacks(:on_stop, context)
  stopped
end

#stopped?Boolean

Returns:

  • (Boolean)


78
79
80
81
# File 'lib/trail_guide/experiments/lifecycle.rb', line 78

def stopped?
  time = stopped_at
  time && time <= Time.now
end

#stopped_atObject



58
59
60
61
# File 'lib/trail_guide/experiments/lifecycle.rb', line 58

def stopped_at
  stopped = adapter.get(:stopped_at)
  return Time.at(stopped.to_i) if stopped
end

#winner?Boolean

Returns:

  • (Boolean)


107
108
109
110
111
112
113
# File 'lib/trail_guide/experiments/lifecycle.rb', line 107

def winner?
  if combined?
    combined.all? { |combo| TrailGuide.catalog.find(combo).winner? }
  else
    adapter.exists?(:winner)
  end
end