class Gitlab::Experiment::Context

Constants

DNT_REGEXP

Public Class Methods

new(experiment, **initial_value) click to toggle source
# File lib/gitlab/experiment/context.rb, line 12
def initialize(experiment, **initial_value)
  @experiment = experiment
  @value = {}
  @migrations = { merged: [], unmerged: [] }

  value(initial_value)
end

Public Instance Methods

freeze() click to toggle source
Calls superclass method
# File lib/gitlab/experiment/context.rb, line 44
def freeze
  signature # finalize before freezing
  super
end
key(key = nil) click to toggle source
# File lib/gitlab/experiment/context.rb, line 34
def key(key = nil)
  return @key || @experiment.key_for(value) if key.nil?

  @key = key
end
method_missing(method_name, *) click to toggle source
Calls superclass method
# File lib/gitlab/experiment/context.rb, line 53
def method_missing(method_name, *)
  @value.include?(method_name.to_sym) ? @value[method_name.to_sym] : super
end
reinitialize(request) click to toggle source
# File lib/gitlab/experiment/context.rb, line 20
def reinitialize(request)
  @signature = nil # clear memoization
  @request = request if request.respond_to?(:headers) && request.respond_to?(:cookie_jar)
end
respond_to_missing?(method_name, *) click to toggle source
Calls superclass method
# File lib/gitlab/experiment/context.rb, line 57
def respond_to_missing?(method_name, *)
  @value.include?(method_name.to_sym) ? true : super
end
signature() click to toggle source
# File lib/gitlab/experiment/context.rb, line 49
def signature
  @signature ||= { key: key, migration_keys: migration_keys }.compact
end
trackable?() click to toggle source
# File lib/gitlab/experiment/context.rb, line 40
def trackable?
  !(@request && @request.headers['DNT'].to_s.match?(DNT_REGEXP))
end
value(value = nil) click to toggle source
# File lib/gitlab/experiment/context.rb, line 25
def value(value = nil)
  return @value if value.nil?

  value = value.dup # dup so we don't mutate
  reinitialize(value.delete(:request))

  @value.merge!(process_migrations(value))
end

Private Instance Methods

add_merged_migration(value = {}) click to toggle source
# File lib/gitlab/experiment/context.rb, line 74
def add_merged_migration(value = {})
  @migrations[:merged] << value if value.is_a?(Hash)
end
add_unmerged_migration(value = {}) click to toggle source
# File lib/gitlab/experiment/context.rb, line 70
def add_unmerged_migration(value = {})
  @migrations[:unmerged] << value if value.is_a?(Hash)
end
migration_keys() click to toggle source
# File lib/gitlab/experiment/context.rb, line 78
def migration_keys
  return nil if @migrations[:unmerged].empty? && @migrations[:merged].empty?

  @migrations[:unmerged].map { |m| @experiment.key_for(m) } +
    @migrations[:merged].map { |m| @experiment.key_for(@value.merge(m)) }
end
process_migrations(value) click to toggle source
# File lib/gitlab/experiment/context.rb, line 63
def process_migrations(value)
  add_unmerged_migration(value.delete(:migrated_from))
  add_merged_migration(value.delete(:migrated_with))

  migrate_cookie(value, "#{@experiment.name}_id")
end