class Ablab::Run

Attributes

experiment[R]
request[R]
session_id[R]

Public Class Methods

new(experiment, session_id, request) click to toggle source
# File lib/ablab.rb, line 122
def initialize(experiment, session_id, request)
  @experiment, @session_id, @request = experiment, session_id, request
end

Public Instance Methods

draw() click to toggle source
# File lib/ablab.rb, line 153
def draw
  sid_hash = Digest::SHA1.hexdigest(session_id)[-8..-1].to_i(16)
  exp_hash = Digest::SHA1.hexdigest(experiment.name.to_s)[-8..-1].to_i(16)
  ((sid_hash ^ exp_hash) % 1000) / 10.0
end
group() click to toggle source
# File lib/ablab.rb, line 138
def group
  return @group unless @group.nil?
  if forced = forced_group
    return forced
  end
  d = draw / experiment.percentage_of_visitors
  return nil if d >= 1
  tot_weight = experiment.groups.map(&:weight).reduce(:+).to_f
  @group = experiment.groups.reduce(0) do |t, group|
    t += group.weight / tot_weight
    break group if d < t
    t
  end.try(:name)
end
in_group?(name) click to toggle source
# File lib/ablab.rb, line 126
def in_group?(name)
  group == name
end
perform_callbacks!(event) click to toggle source
# File lib/ablab.rb, line 159
def perform_callbacks!(event)
  experiment.callbacks.each do |cbk|
    cbk.call(event, experiment.name, group, session_id, request)
  end
  Ablab.callbacks.each do |cbk|
    cbk.call(event, experiment.name, group, session_id, request)
  end
rescue => e
  Ablab.tracking_exception_handler.call(e)
end
track_success!() click to toggle source
# File lib/ablab.rb, line 134
def track_success!
  track!(:success)
end
track_view!() click to toggle source
# File lib/ablab.rb, line 130
def track_view!
  track!(:view)
end

Private Instance Methods

allowed?(experiment_name, group, session_id, request) click to toggle source
# File lib/ablab.rb, line 197
        def allowed?(experiment_name, group, session_id, request)
  filter = Ablab.allow_tracking
  filter.call(experiment_name, group, session_id, request)
end
forced_group() click to toggle source
# File lib/ablab.rb, line 170
        def forced_group
  return nil unless request && request.respond_to?(:params)
  groups = parse_groups(request.params[:ablab_group])
  group  = groups[experiment.name.to_s]
  group.to_sym if group && experiment.groups.map { |g| g.name.to_s }.include?(group)
end
parse_groups(str) click to toggle source
# File lib/ablab.rb, line 177
        def parse_groups(str)
  return {} unless str
  hash = str.split(/\s*,\s*/).map do |s|
    exp_group = s.split(/\s*:\s*/).take(2)
    exp_group if exp_group.size == 2
  end.compact.to_h
end
track!(event) click to toggle source
# File lib/ablab.rb, line 185
        def track!(event)
  if allowed?(experiment.name, group, session_id, request)
    method = (event == :view) ? :track_view! : :track_success!
    Ablab.tracker.send(method, experiment.name, group, session_id)
    Thread.new do
      perform_callbacks!(event)
    end
  end
rescue => e
  Ablab.tracking_exception_handler.call(e)
end