Class: Gitlab::Experiment

Inherits:
Object
  • Object
show all
Includes:
Caching, Scientist::Experiment
Defined in:
lib/gitlab/experiment.rb,
lib/gitlab/experiment/dsl.rb,
lib/gitlab/experiment/engine.rb,
lib/gitlab/experiment/caching.rb,
lib/gitlab/experiment/context.rb,
lib/gitlab/experiment/cookies.rb,
lib/gitlab/experiment/variant.rb,
lib/gitlab/experiment/version.rb,
lib/gitlab/experiment/configuration.rb

Defined Under Namespace

Modules: Caching, Cookies, Dsl Classes: Configuration, Context, Engine, Variant

Constant Summary collapse

VERSION =
'0.3.1'

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Caching

#cache

Constructor Details

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

Returns a new instance of Experiment.

Yields:

  • (_self)

Yield Parameters:



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/gitlab/experiment.rb', line 38

def initialize(name, variant_name = nil, **context)
  @name = name
  @variant_name = variant_name
  @excluded = []
  @context = Context.new(self, context)

  exclude { !@context.trackable? }
  compare { false }

  yield self if block_given?
end

Class Method Details

.configure {|Configuration| ... } ⇒ Object

Yields:



20
21
22
# File 'lib/gitlab/experiment.rb', line 20

def configure
  yield Configuration
end

.constantize(name) ⇒ Object



31
32
33
34
35
# File 'lib/gitlab/experiment.rb', line 31

def constantize(name)
  name = "#{name}_experiment"
  klass = name.respond_to?(:classify) ? name.classify.safe_constantize : nil
  klass || self
end

.run(name, variant_name = nil, **context, &block) ⇒ Object



24
25
26
27
28
29
# File 'lib/gitlab/experiment.rb', line 24

def run(name, variant_name = nil, **context, &block)
  instance = constantize(name).new(name, variant_name, **context, &block)
  return instance unless block_given?

  instance.context.frozen? ? instance.run : instance.tap(&:run)
end

Instance Method Details

#context(value = nil) ⇒ Object



50
51
52
53
54
55
# File 'lib/gitlab/experiment.rb', line 50

def context(value = nil)
  return @context if value.nil?

  @context.value(value)
  @context
end

#enabled?Boolean

Returns:

  • (Boolean)


99
100
101
# File 'lib/gitlab/experiment.rb', line 99

def enabled?
  true
end

#exclude(&block) ⇒ Object



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

def exclude(&block)
  @excluded << block
end

#excluded?Boolean

Returns:

  • (Boolean)


103
104
105
# File 'lib/gitlab/experiment.rb', line 103

def excluded?
  @excluded.any? { |exclude| exclude.call(self) }
end

#flipper_idObject



112
113
114
# File 'lib/gitlab/experiment.rb', line 112

def flipper_id
  "Experiment;#{id}"
end

#idObject Also known as: session_id



107
108
109
# File 'lib/gitlab/experiment.rb', line 107

def id
  "#{name}:#{signature[:key]}"
end

#nameObject



87
88
89
# File 'lib/gitlab/experiment.rb', line 87

def name
  [Configuration.name_prefix, @name].compact.join('_')
end

#publish(result) ⇒ Object



77
78
79
# File 'lib/gitlab/experiment.rb', line 77

def publish(result)
  instance_exec(result, &Configuration.publishing_behavior)
end

#run(variant_name = nil) ⇒ Object



68
69
70
71
72
73
74
75
# File 'lib/gitlab/experiment.rb', line 68

def run(variant_name = nil)
  @result ||= begin
    @variant_name = variant_name unless variant_name.nil?
    @variant_name ||= :control if excluded?

    super(cache { variant.name })
  end
end

#signatureObject



95
96
97
# File 'lib/gitlab/experiment.rb', line 95

def signature
  { variant: variant.name, experiment: name }.merge(context.signature)
end

#track(action, **event_args) ⇒ Object



81
82
83
84
85
# File 'lib/gitlab/experiment.rb', line 81

def track(action, **event_args)
  return if excluded?

  instance_exec(action, event_args, &Configuration.tracking_behavior)
end

#variant(value = nil) ⇒ Object



57
58
59
60
61
62
# File 'lib/gitlab/experiment.rb', line 57

def variant(value = nil)
  return @variant_name = value unless value.nil?

  result = instance_exec(@variant_name, &Configuration.variant_resolver)
  result.respond_to?(:name) ? result : Variant.new(name: result.to_s)
end

#variant_namesObject



91
92
93
# File 'lib/gitlab/experiment.rb', line 91

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