class TrailGuide::Experiments::Config

Constants

CALLBACK_KEYS
DEFAULT_KEYS

Attributes

experiment[R]

Public Class Methods

new(experiment, *args, **opts, &block) click to toggle source
Calls superclass method
# File lib/trail_guide/experiments/config.rb, line 33
def initialize(experiment, *args, **opts, &block)
  @experiment = experiment
  opts = default_config.merge(opts)
  ancestor = opts.delete(:inherit)
  if ancestor.present?
    keys = opts.keys.dup.concat(args).concat(DEFAULT_KEYS).concat(CALLBACK_KEYS).uniq
    opts = opts.merge(ancestor.to_h.slice(*keys))
    opts[:name] = nil
    opts[:goals] = ancestor.goals.dup
    opts[:combined] = ancestor.combined.dup
    opts[:variants] = ancestor.variants.dup(experiment)
    opts = opts.merge(ancestor.callbacks.map { |k,v| [k,[v].flatten.compact] }.to_h)
  end
  super(*args, **opts, &block)
end

Public Instance Methods

algorithm() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 89
def algorithm
  if self[:algorithm].is_a?(Array) && self[:algorithm].last.respond_to?(:call)
    @algorithm ||= TrailGuide::Algorithms.algorithm(self[:algorithm].first).new(&self[:algorithm].last)
  else
    @algorithm ||= TrailGuide::Algorithms.algorithm(self[:algorithm])
  end
end
allow_conversion(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 294
def allow_conversion(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:allow_conversion] ||= []
  self[:allow_conversion] << (meth || block)
end
allow_multiple_conversions?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 61
def allow_multiple_conversions?
  !!allow_multiple_conversions
end
allow_multiple_goals?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 65
def allow_multiple_goals?
  !!allow_multiple_goals
end
allow_participation(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 288
def allow_participation(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:allow_participation] ||= []
  self[:allow_participation] << (meth || block)
end
callback_config() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 25
def callback_config
  CALLBACK_KEYS.map do |key|
    [key, []]
  end.to_h
end
callbacks() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 212
def callbacks
  to_h.slice(*CALLBACK_KEYS).map { |k,v| [k, [v].flatten.compact] }.to_h
end
can_resume?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 77
def can_resume?
  !!can_resume
end
combined() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 200
def combined
  self[:combined] ||= []
end
combined?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 204
def combined?
  !combined.empty?
end
control() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 110
def control
  return variants.find { |var| var.control? } || variants.first
end
control=(name) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 114
def control=(name)
  variants.each(&:variant!)
  var_idx = variants.index { |var| var == name }

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

  variant
end
default_config() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 19
def default_config
  DEFAULT_KEYS.map do |key|
    [key, nil]
  end.to_h.merge(callback_config)
end
enable_calibration?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 81
def enable_calibration?
  !!enable_calibration
end
funnel(name, **config, &block)
Alias for: goal
funnel=(name)
Alias for: goal=
funnels(*names, **config, &block)
Alias for: goals
funnels=(*names)
Alias for: goals=
goal(name, **config, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 155
def goal(name, **config, &block)
  goals << Metrics::Goal.new(experiment, name, **config, &block)
end
Also aliased as: funnel
goal=(name) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 160
def goal=(name)
  goals << Metrics::Goal.new(experiment, name)
end
Also aliased as: funnel=
goals(*names, **config, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 170
def goals(*names, **config, &block)
  self[:goals] ||= []
  self[:goals] = self[:goals].map { |g| g.is_a?(Metrics::Goal) ? g : Metrics::Goal.new(experiment, g) }
  unless names.empty?
    self[:goals] = self[:goals].concat([names].flatten.map { |g| Metrics::Goal.new(experiment, g, **config, &block) })
  end
  self[:goals]
end
Also aliased as: funnels
goals=(*names) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 165
def goals=(*names)
  self[:goals] = [names].flatten.map { |g| Metrics::Goal.new(experiment, g) }
end
Also aliased as: funnels=
group(grp=nil) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 142
def group(grp=nil)
  unless grp.nil?
    groups << grp.to_s.underscore.to_sym
    return groups.last
  end
  groups.first
end
group=(grp) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 150
def group=(grp)
  groups.unshift(grp.to_s.underscore.to_sym)
  groups.first
end
groups(*grps) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 129
def groups(*grps)
  self[:groups] ||= []
  self[:groups] = self[:groups].map { |g| g.to_s.underscore.to_sym }
  unless grps.empty?
    self[:groups] = self[:groups].concat([grps].flatten.map { |g| g.to_s.underscore.to_sym })
  end
  self[:groups]
end
groups=(*grps) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 138
def groups=(*grps)
  self[:groups] = [grps].flatten.map { |g| g.to_s.underscore.to_sym }
end
metric(name, **config, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 180
def metric(name, **config, &block)
  group(name)
  goal(name, **config, &block)
end
metric=(name) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 185
def metric=(name)
  self.group = name
  self.goal = name
end
metrics(*names, **config, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 190
def metrics(*names, **config, &block)
  groups(*names)
  goals(*names, **config, &block)
end
metrics=(*names) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 195
def metrics=(*names)
  self.send(:groups=, *names.flatten)
  self.send(:goals=, *names.flatten)
end
name() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 85
def name
  @name ||= (self[:name] || experiment.name).try(:to_s).try(:underscore).try(:to_sym)
end
on_choose(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 216
def on_choose(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_choose] ||= []
  self[:on_choose] << (meth || block)
end
on_convert(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 228
def on_convert(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_convert] ||= []
  self[:on_convert] << (meth || block)
end
on_delete(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 276
def on_delete(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_delete] ||= []
  self[:on_delete] << (meth || block)
end
on_pause(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 252
def on_pause(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_pause] ||= []
  self[:on_pause] << (meth || block)
end
on_redis_failover(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 282
def on_redis_failover(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_redis_failover] ||= []
  self[:on_redis_failover] << (meth || block)
end
on_reset(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 270
def on_reset(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_reset] ||= []
  self[:on_reset] << (meth || block)
end
on_resume(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 258
def on_resume(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_resume] ||= []
  self[:on_resume] << (meth || block)
end
on_schedule(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 240
def on_schedule(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_schedule] ||= []
  self[:on_schedule] << (meth || block)
end
on_start(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 234
def on_start(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_start] ||= []
  self[:on_start] << (meth || block)
end
on_stop(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 246
def on_stop(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_stop] ||= []
  self[:on_stop] << (meth || block)
end
on_use(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 222
def on_use(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_use] ||= []
  self[:on_use] << (meth || block)
end
on_winner(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 264
def on_winner(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:on_winner] ||= []
  self[:on_winner] << (meth || block)
end
preview_url?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 208
def preview_url?
  !!preview_url
end
reset_manually?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 53
def reset_manually?
  !!reset_manually
end
rollout_winner(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 306
def rollout_winner(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:rollout_winner] ||= []
  self[:rollout_winner] << (meth || block)
end
skip_request_filter?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 73
def skip_request_filter?
  !!skip_request_filter
end
start_manually?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 49
def start_manually?
  !!start_manually
end
sticky_assignment?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 57
def sticky_assignment?
  !!sticky_assignment
end
track_participation(meth=nil, &block) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 300
def track_participation(meth=nil, &block)
  raise ArgumentError if meth.nil? && !block_given?
  self[:track_participation] ||= []
  self[:track_participation] << (meth || block)
end
track_winner_conversions?() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 69
def track_winner_conversions?
  !!track_winner_conversions
end
variant(varname, metadata: {}, weight: 1, control: false) click to toggle source
# File lib/trail_guide/experiments/config.rb, line 101
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: metadata, weight: weight, control: control)
  variants << variant
  variant
end
variants() click to toggle source
# File lib/trail_guide/experiments/config.rb, line 97
def variants
  self[:variants] ||= TrailGuide::Variants.new
end