gitlab-experiment 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b1a2f81e8680cffda06d116655200c055dbb74a42a52a7fa8adcb84c720fb01
4
- data.tar.gz: 715ea6dd8494457c169ef3147ca2edf2fc6e4c63571801e1f5b22814182ebb56
3
+ metadata.gz: 81476752521c6ead83308324fdcf360db7b8182bab340c9ffe7ad4eec21b998e
4
+ data.tar.gz: 006d94ff92104bef820be7d6c7c9638b20a6e0a4a533439fca056b4cba31a0bc
5
5
  SHA512:
6
- metadata.gz: 7eec246157542ff0897f9af9f3135272d4d7fea31049443519fb550d5ca9cb3ad2d073ae8594104256d353b8042132f7ae5cba399bb44c38d7d5332154d5b849
7
- data.tar.gz: ff4145fbe06fad2de4ef6295f4a0715c71c9ef4165308452d9dacd0c02a0df94d2152d138a6945c583c68d6c5966e1bb1e200fd79a7d9668382ee7c1d68861ea
6
+ metadata.gz: a5644f3cf6798ddc27034b8857cf03bb77904b3b5c8a80b84c398134ad143b919e16ddc23746a58e63b71d0464c92ec5cce682ddb2039e471b55cfeb42e3cd4a
7
+ data.tar.gz: 2dd2adf62427f96a9745d9681ee87b5621acf43fc4dae33ffefdadfad5af6ec3a0ad1e79e601a4d6260e61fa64faf635af9ae753e3fb474e033af7d2d7d55381
data/README.md CHANGED
@@ -341,7 +341,7 @@ Gitlab::Experiment.configure do |config|
341
341
  end
342
342
  ```
343
343
 
344
- More examples for configuration are available in the provided [rails initializer](lib/generators/gitlab/experiment/install/templates/initializer.rb).
344
+ More examples for configuration are available in the provided [rails initializer](lib/generators/gitlab/experiment/install/templates/initializer.rb.tt).
345
345
 
346
346
  ### Client layer / JavaScript
347
347
 
@@ -30,7 +30,7 @@ module Gitlab
30
30
  raise ArgumentError, 'name is required' if name.nil? && base?
31
31
 
32
32
  instance = constantize(name).new(name, variant_name, **context, &block)
33
- return instance unless block_given?
33
+ return instance unless block
34
34
 
35
35
  instance.context.frozen? ? instance.run : instance.tap(&:run)
36
36
  end
@@ -58,9 +58,9 @@ module Gitlab
58
58
  raise ArgumentError, 'name is required' if name.blank? && self.class.base?
59
59
 
60
60
  @name = self.class.experiment_name(name, suffix: false)
61
- @variant_name = variant_name
62
61
  @excluded = []
63
62
  @context = Context.new(self, **context)
63
+ @variant_name = cache_variant(variant_name) { nil } if variant_name.present?
64
64
 
65
65
  exclude { !@context.trackable? }
66
66
  compare { false }
@@ -102,11 +102,7 @@ module Gitlab
102
102
  @result ||= begin
103
103
  variant_name = variant(variant_name).name
104
104
  run_callbacks(variant_assigned? ? :unsegmented_run : :segmented_run) do
105
- if respond_to?((behavior_name = "#{variant_name}_behavior"))
106
- behaviors[variant_name] ||= -> { send(behavior_name) } # rubocop:disable GitlabSecurity/PublicSend
107
- end
108
-
109
- super(@variant_name = variant_name)
105
+ super(@variant_name ||= variant_name)
110
106
  end
111
107
  end
112
108
  end
@@ -129,6 +125,20 @@ module Gitlab
129
125
  @variant_names ||= behaviors.keys.map(&:to_sym) - [:control]
130
126
  end
131
127
 
128
+ def behaviors
129
+ @behaviors ||= public_methods.each_with_object(super) do |name, behaviors|
130
+ next unless name.end_with?('_behavior')
131
+
132
+ behavior_name = name.to_s.sub(/_behavior$/, '')
133
+ behaviors[behavior_name] ||= -> { send(name) } # rubocop:disable GitlabSecurity/PublicSend
134
+ end
135
+ end
136
+
137
+ def try(name = nil, &block)
138
+ name = (name || 'candidate').to_s
139
+ behaviors[name] = block
140
+ end
141
+
132
142
  def signature
133
143
  { variant: variant.name, experiment: name }.merge(context.signature)
134
144
  end
@@ -7,31 +7,20 @@ module Gitlab
7
7
  include ActiveSupport::Callbacks
8
8
 
9
9
  included do
10
- define_callbacks(
11
- :unsegmented_run,
12
- skip_after_callbacks_if_terminated: true
13
- )
14
-
15
- define_callbacks(
16
- :segmented_run,
17
- skip_after_callbacks_if_terminated: false,
18
- terminator: lambda do |target, result_lambda|
19
- result_lambda.call
20
- target.variant_assigned?
21
- end
22
- )
10
+ define_callbacks(:unsegmented_run)
11
+ define_callbacks(:segmented_run)
23
12
  end
24
13
 
25
14
  class_methods do
26
15
  def segment(*filter_list, variant:, **options, &block)
27
16
  filters = filter_list.unshift(block).compact.map do |filter|
28
17
  result_lambda = ActiveSupport::Callbacks::CallTemplate.build(filter, self).make_lambda
29
- ->(target) { target.variant(variant) if result_lambda.call(target, nil) }
18
+ ->(target) { target.variant(variant) if !target.variant_assigned? && result_lambda.call(target, nil) }
30
19
  end
31
20
 
32
21
  raise ArgumentError, 'no filters provided' if filters.empty?
33
22
 
34
- set_callback(:segmented_run, :before, *filters, options, &block)
23
+ set_callback(:segmented_run, :before, *filters, options)
35
24
  end
36
25
  end
37
26
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Gitlab
4
4
  class Experiment
5
- VERSION = '0.4.4'
5
+ VERSION = '0.4.5'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-experiment
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-15 00:00:00.000000000 Z
11
+ date: 2021-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport