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
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