Class: TrailGuide::ExperimentConfig

Inherits:
Canfig::Config
  • Object
show all
Defined in:
lib/trail_guide/experiment_config.rb

Constant Summary collapse

ENGINE_CONFIG_KEYS =
[
  :start_manually, :reset_manually, :store_override, :track_override,
  :algorithm, :allow_multiple_conversions, :allow_multiple_goals
].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(experiment, *args, **opts, &block) ⇒ ExperimentConfig

Returns a new instance of ExperimentConfig.



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

def initialize(experiment, *args, **opts, &block)
  @experiment = experiment
  opts = opts.merge(self.class.engine_config)
  opts = opts.merge(self.class.default_config)
  opts = opts.merge(self.class.callbacks_config)
  super(*args, **opts, &block)
end

Instance Attribute Details

#experimentObject (readonly)

Returns the value of attribute experiment.



32
33
34
# File 'lib/trail_guide/experiment_config.rb', line 32

def experiment
  @experiment
end

Class Method Details

.callbacks_configObject



18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/trail_guide/experiment_config.rb', line 18

def self.callbacks_config
  {
    callbacks: {
      on_choose:   [TrailGuide.configuration.on_experiment_choose].flatten.compact,
      on_use:      [TrailGuide.configuration.on_experiment_use].flatten.compact,
      on_convert:  [TrailGuide.configuration.on_experiment_convert].flatten.compact,
      on_start:    [TrailGuide.configuration.on_experiment_start].flatten.compact,
      on_stop:     [TrailGuide.configuration.on_experiment_stop].flatten.compact,
      on_reset:    [TrailGuide.configuration.on_experiment_reset].flatten.compact,
      on_delete:   [TrailGuide.configuration.on_experiment_delete].flatten.compact,
    }
  }
end

.default_configObject



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

def self.default_config
  { name: nil, metric: nil, variants: [], goals: [] }
end

.engine_configObject



8
9
10
11
12
# File 'lib/trail_guide/experiment_config.rb', line 8

def self.engine_config
  ENGINE_CONFIG_KEYS.map do |key|
    [key, TrailGuide.configuration.send(key.to_sym)]
  end.to_h
end

Instance Method Details

#algorithmObject



62
63
64
# File 'lib/trail_guide/experiment_config.rb', line 62

def algorithm
  @algorithm ||= TrailGuide::Algorithms.algorithm(self[:algorithm])
end

#allow_multiple_conversions?Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/trail_guide/experiment_config.rb', line 46

def allow_multiple_conversions?
  allow_multiple_conversions
end

#allow_multiple_goals?Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/trail_guide/experiment_config.rb', line 50

def allow_multiple_goals?
  allow_multiple_goals
end

#controlObject



75
76
77
# File 'lib/trail_guide/experiment_config.rb', line 75

def control
  return variants.find { |var| var.control? } || variants.first
end

#control=(name) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/trail_guide/experiment_config.rb', line 79

def control=(name)
  variants.each(&:variant!)
  var_idx = variants.index { |var| var == name }

  if var_idx.nil?
    variant = Variant.new(experiment, name, control: true)
  else
    variant = variants.slice!(var_idx, 1)[0]
    variant.control!
  end

  variants.unshift(variant)
  variant
end

#goal(name) ⇒ Object Also known as: funnel



94
95
96
# File 'lib/trail_guide/experiment_config.rb', line 94

def goal(name)
  goals << name.to_s.underscore.to_sym
end

#goalsObject Also known as: funnels



99
100
101
# File 'lib/trail_guide/experiment_config.rb', line 99

def goals
  self[:goals]
end

#metricObject



58
59
60
# File 'lib/trail_guide/experiment_config.rb', line 58

def metric
  @metric ||= (self[:metric] || name).try(:to_s).try(:underscore).try(:to_sym)
end

#nameObject



54
55
56
# File 'lib/trail_guide/experiment_config.rb', line 54

def name
  @name ||= (self[:name] || experiment.name).try(:to_s).try(:underscore).try(:to_sym)
end

#on_choose(meth = nil, &block) ⇒ Object



104
105
106
# File 'lib/trail_guide/experiment_config.rb', line 104

def on_choose(meth=nil, &block)
  callbacks[:on_choose] << (meth || block)
end

#on_convert(meth = nil, &block) ⇒ Object



112
113
114
# File 'lib/trail_guide/experiment_config.rb', line 112

def on_convert(meth=nil, &block)
  callbacks[:on_convert] << (meth || block)
end

#on_delete(meth = nil, &block) ⇒ Object



128
129
130
# File 'lib/trail_guide/experiment_config.rb', line 128

def on_delete(meth=nil, &block)
  callbacks[:on_delete] << (meth || block)
end

#on_reset(meth = nil, &block) ⇒ Object



124
125
126
# File 'lib/trail_guide/experiment_config.rb', line 124

def on_reset(meth=nil, &block)
  callbacks[:on_reset] << (meth || block)
end

#on_start(meth = nil, &block) ⇒ Object



116
117
118
# File 'lib/trail_guide/experiment_config.rb', line 116

def on_start(meth=nil, &block)
  callbacks[:on_start] << (meth || block)
end

#on_stop(meth = nil, &block) ⇒ Object



120
121
122
# File 'lib/trail_guide/experiment_config.rb', line 120

def on_stop(meth=nil, &block)
  callbacks[:on_stop] << (meth || block)
end

#on_use(meth = nil, &block) ⇒ Object



108
109
110
# File 'lib/trail_guide/experiment_config.rb', line 108

def on_use(meth=nil, &block)
  callbacks[:on_use] << (meth || block)
end

#resettable?Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/trail_guide/experiment_config.rb', line 42

def resettable?
  !reset_manually
end

#variant(varname, metadata: {}, weight: 1, control: false) ⇒ Object

Raises:

  • (ArgumentError)


66
67
68
69
70
71
72
73
# File 'lib/trail_guide/experiment_config.rb', line 66

def variant(varname, metadata: {}, weight: 1, control: false)
  raise ArgumentError, "The variant `#{varname}` already exists in the experiment `#{name}`" if variants.any? { |var| var == varname }
  control = true if variants.empty?
  variants.each(&:variant!) if control
  variant = Variant.new(experiment, varname, metadata: , weight: weight, control: control)
  variants << variant
  variant
end