module Gitlab::Experiment::BaseInterface

Public Class Methods

new(name = nil, variant_name = nil, **context) { |self| ... } click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 37
def initialize(name = nil, variant_name = nil, **context)
  raise ArgumentError, 'name is required' if name.blank? && self.class.base?

  @name = self.class.experiment_name(name, suffix: false)
  @context = Context.new(self, **context)
  @variant_name = cache_variant(variant_name) { nil } if variant_name.present?

  compare { false }

  yield self if block_given?
end

Public Instance Methods

base?() click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 20
def base?
  self == Gitlab::Experiment || name == Configuration.base_class
end
behaviors() click to toggle source
Calls superclass method
# File lib/gitlab/experiment/base_interface.rb, line 67
def behaviors
  @behaviors ||= public_methods.each_with_object(super) do |name, behaviors|
    next unless name.end_with?('_behavior')

    behavior_name = name.to_s.sub(/_behavior$/, '')
    behaviors[behavior_name] ||= -> { send(name) } # rubocop:disable GitlabSecurity/PublicSend
  end
end
configure() { |Configuration| ... } click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 10
def configure
  yield Configuration
end
constantize(name = nil) click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 24
def constantize(name = nil)
  return self if name.nil?

  experiment_name(name).classify.safe_constantize || Configuration.base_class.constantize
end
experiment_name(name = nil, suffix: true, suffix_word: 'experiment') click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 14
def experiment_name(name = nil, suffix: true, suffix_word: 'experiment')
  name = (name.presence || self.name).to_s.underscore.sub(%r{(?<char>[_/]|)#{suffix_word}$}, '')
  name = "#{name}#{Regexp.last_match(:char) || '_'}#{suffix_word}"
  suffix ? name : name.sub(/_#{suffix_word}$/, '')
end
flipper_id() click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 59
def flipper_id
  "Experiment;#{id}"
end
from_param(id) click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 30
def from_param(id)
  %r{/?(?<name>.*):(?<key>.*)$} =~ id
  name = CGI.unescape(name) if name
  constantize(name).new(name).tap { |e| e.context.key(key) }
end
id() click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 53
def id
  "#{name}:#{context.key}"
end
Also aliased as: session_id, to_param
inspect() click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 49
def inspect
  "#<#{self.class.name || 'AnonymousClass'}:#{format('0x%016X', __id__)} @name=#{name} @context=#{context.value}>"
end
session_id()
Alias for: id
to_param()
Alias for: id
variant_names() click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 63
def variant_names
  @variant_names ||= behaviors.keys.map(&:to_sym) - [:control]
end

Protected Instance Methods

cached_variant_resolver(provided_variant) click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 82
def cached_variant_resolver(provided_variant)
  return :control if excluded?

  result = cache_variant(provided_variant) { resolve_variant_name }
  result.to_sym if result.present?
end
generate_result(variant_name) click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 89
def generate_result(variant_name)
  observation = Scientist::Observation.new(variant_name, self, &behaviors[variant_name])
  Scientist::Result.new(self, [observation], observation)
end
raise_on_mismatches?() click to toggle source
# File lib/gitlab/experiment/base_interface.rb, line 78
def raise_on_mismatches?
  false
end