Module: Trebuchet::Strategy::Experimentable

Included in:
Experiment, VisitorExperiment
Defined in:
lib/trebuchet/strategy.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#bucketObject (readonly)

Returns the value of attribute bucket.



236
237
238
# File 'lib/trebuchet/strategy.rb', line 236

def bucket
  @bucket
end

#experiment_nameObject (readonly)

Returns the value of attribute experiment_name.



236
237
238
# File 'lib/trebuchet/strategy.rb', line 236

def experiment_name
  @experiment_name
end

#total_bucketsObject (readonly)

Returns the value of attribute total_buckets.



236
237
238
# File 'lib/trebuchet/strategy.rb', line 236

def total_buckets
  @total_buckets
end

Instance Method Details

#as_json(options = {}) ⇒ Object



263
264
265
266
267
268
269
270
# File 'lib/trebuchet/strategy.rb', line 263

def as_json(options = {})
  {
    :name => experiment_name,
    :bucket => bucket,
    :total_buckets => total_buckets,
    :type => self.type
  }
end

#exportObject



277
278
279
# File 'lib/trebuchet/strategy.rb', line 277

def export
  super :name => experiment_name, :bucket => bucket, :total_buckets => total_buckets
end

#initialize_experiment(options) ⇒ Object



238
239
240
241
242
243
# File 'lib/trebuchet/strategy.rb', line 238

def initialize_experiment(options)
  options.keys.each {|k| options[k.to_sym] = options.delete(k)} # cheap symbolize_keys
  @experiment_name = options[:name]
  @bucket = [ options[:bucket] ].flatten # always treat as an array
  @total_buckets = options[:total_buckets] || 5
end

#inspectObject



281
282
283
# File 'lib/trebuchet/strategy.rb', line 281

def inspect
  "#<#{self.class.name} #{self}>"
end

#to_sObject



272
273
274
275
# File 'lib/trebuchet/strategy.rb', line 272

def to_s
  str = "buckets (#{bucket.join(', ')}) of total: #{total_buckets}"
  str << " for #{self.type} experiment: #{experiment_name}"
end

#typeObject



259
260
261
# File 'lib/trebuchet/strategy.rb', line 259

def type
  "#{name == :experiment ? "user" : "visitor"} experiment"
end

#valid?Boolean

Returns:

  • (Boolean)


253
254
255
256
257
# File 'lib/trebuchet/strategy.rb', line 253

def valid?
  experiment_name && total_buckets > 0 && bucket.max <= total_buckets && (1..total_buckets).include?(bucket.min)
rescue
  false
end

#value_in_bucket?(value) ⇒ Boolean

Returns:

  • (Boolean)


245
246
247
248
249
250
251
# File 'lib/trebuchet/strategy.rb', line 245

def value_in_bucket?(value)
  return false if value == nil || !value.is_a?(Numeric)
  return false unless self.valid?
  # must hash feature name and value together to ensure uniform distribution
  b = Trebuchet::SHA1.hexdigest("experiment: #{@experiment_name.downcase} user: #{value}").to_i(16) % total_buckets
  !!@bucket.include?(b + 1) # is user in this bucket?
end