Module: Gitlab::Experiment::BaseInterface

Extended by:
ActiveSupport::Concern
Includes:
Scientist::Experiment
Included in:
Gitlab::Experiment
Defined in:
lib/gitlab/experiment/base_interface.rb

Instance Method Summary collapse

Instance Method Details

#behaviorsObject



67
68
69
70
71
72
73
74
# 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

#flipper_idObject



59
60
61
# File 'lib/gitlab/experiment/base_interface.rb', line 59

def flipper_id
  "Experiment;#{id}"
end

#idObject Also known as: session_id, to_param



53
54
55
# File 'lib/gitlab/experiment/base_interface.rb', line 53

def id
  "#{name}:#{context.key}"
end

#initialize(name = nil, variant_name = nil, **context) {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:

Raises:

  • (ArgumentError)


37
38
39
40
41
42
43
44
45
46
47
# 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

#inspectObject



49
50
51
# 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_namesObject



63
64
65
# File 'lib/gitlab/experiment/base_interface.rb', line 63

def variant_names
  @variant_names ||= behaviors.keys.map(&:to_sym) - [:control]
end