Class: Gitlab::Experiment
- Inherits:
-
Object
- Object
- Gitlab::Experiment
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.
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
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
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
103
104
105
|
# File 'lib/gitlab/experiment.rb', line 103
def excluded?
@excluded.any? { |exclude| exclude.call(self) }
end
|
#flipper_id ⇒ Object
112
113
114
|
# File 'lib/gitlab/experiment.rb', line 112
def flipper_id
"Experiment;#{id}"
end
|
#id ⇒ Object
Also known as:
session_id
107
108
109
|
# File 'lib/gitlab/experiment.rb', line 107
def id
"#{name}:#{signature[:key]}"
end
|
#publish(result) ⇒ Object
#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
|
#signature ⇒ Object
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_names ⇒ Object
91
92
93
|
# File 'lib/gitlab/experiment.rb', line 91
def variant_names
@variant_names ||= behaviors.keys.map(&:to_sym) - [:control]
end
|