split 4.0.3 → 4.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -1
- data/lib/split/encapsulated_helper.rb +8 -0
- data/lib/split/helper.rb +15 -7
- data/lib/split/version.rb +1 -1
- data/spec/encapsulated_helper_spec.rb +38 -12
- data/spec/persistence/cookie_adapter_spec.rb +3 -3
- data/spec/spec_helper.rb +16 -7
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80d095f07432d336e773b30c3c5a873b554dd682f65ace33886d1a83697d447a
|
4
|
+
data.tar.gz: 9a504a3c9d4c67391528e1640c2c7eac3cfcafe91305cadb901e48541726f04c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68e5919618103f315fa9f4f0d18384392c02c01c680c13d50a77cfa0507bd19a1c01fb5c1db66619329c1ef38013c3ebe90e880f6af5c9bac9ba2d1a76b3963a
|
7
|
+
data.tar.gz: 1ae5fe0187e16b4bb3efc14a0e0ded4df98527fbc530dab4a89c544d133b1a7e8cd0adc6579f0f43ea3c84aa6899a2d123e97c5af105ce158e804a5ac8286728
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
-
# 4.0.
|
1
|
+
# 4.0.4 (March 3rd, 2024)
|
2
|
+
|
3
|
+
Bugfixes:
|
4
|
+
- Better integration for EncapsulatedHelper when needing params/request info (@henrique-ft, #721 and #723)
|
5
|
+
|
6
|
+
Misc:
|
7
|
+
- Make specs compatible with newer Rack versions (@andrehjr, #722)
|
8
|
+
|
9
|
+
# 4.0.3 (November 15th, 2023)
|
2
10
|
|
3
11
|
Bugfixes:
|
4
12
|
- Do not throw error if alternativas have data that can lead to negative numbers for probability calculation (@andrehjr, #703)
|
@@ -23,6 +23,14 @@ module Split
|
|
23
23
|
@context = context
|
24
24
|
end
|
25
25
|
|
26
|
+
def params
|
27
|
+
request.params if request && request.respond_to?(:params)
|
28
|
+
end
|
29
|
+
|
30
|
+
def request
|
31
|
+
@context.request if @context.respond_to?(:request)
|
32
|
+
end
|
33
|
+
|
26
34
|
def ab_user
|
27
35
|
@ab_user ||= Split::User.new(@context)
|
28
36
|
end
|
data/lib/split/helper.rb
CHANGED
@@ -121,11 +121,11 @@ module Split
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def override_alternative_by_params(experiment_name)
|
124
|
-
|
124
|
+
params_present? && params[OVERRIDE_PARAM_NAME] && params[OVERRIDE_PARAM_NAME][experiment_name]
|
125
125
|
end
|
126
126
|
|
127
127
|
def override_alternative_by_cookies(experiment_name)
|
128
|
-
return unless
|
128
|
+
return unless request_present?
|
129
129
|
|
130
130
|
if request.cookies && request.cookies.key?("split_override")
|
131
131
|
experiments = JSON.parse(request.cookies["split_override"]) rescue {}
|
@@ -134,7 +134,7 @@ module Split
|
|
134
134
|
end
|
135
135
|
|
136
136
|
def split_generically_disabled?
|
137
|
-
|
137
|
+
params_present? && params["SPLIT_DISABLE"]
|
138
138
|
end
|
139
139
|
|
140
140
|
def ab_user
|
@@ -142,26 +142,34 @@ module Split
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def exclude_visitor?
|
145
|
-
|
145
|
+
request_present? && (instance_exec(request, &Split.configuration.ignore_filter) || is_ignored_ip_address? || is_robot? || is_preview?)
|
146
146
|
end
|
147
147
|
|
148
148
|
def is_robot?
|
149
|
-
|
149
|
+
request_present? && request.user_agent =~ Split.configuration.robot_regex
|
150
150
|
end
|
151
151
|
|
152
152
|
def is_preview?
|
153
|
-
|
153
|
+
request_present? && defined?(request.headers) && request.headers["x-purpose"] == "preview"
|
154
154
|
end
|
155
155
|
|
156
156
|
def is_ignored_ip_address?
|
157
157
|
return false if Split.configuration.ignore_ip_addresses.empty?
|
158
158
|
|
159
159
|
Split.configuration.ignore_ip_addresses.each do |ip|
|
160
|
-
return true if
|
160
|
+
return true if request_present? && (request.ip == ip || (ip.class == Regexp && request.ip =~ ip))
|
161
161
|
end
|
162
162
|
false
|
163
163
|
end
|
164
164
|
|
165
|
+
def params_present?
|
166
|
+
defined?(params) && params
|
167
|
+
end
|
168
|
+
|
169
|
+
def request_present?
|
170
|
+
defined?(request) && request
|
171
|
+
end
|
172
|
+
|
165
173
|
def active_experiments
|
166
174
|
ab_user.active_experiments
|
167
175
|
end
|
data/lib/split/version.rb
CHANGED
@@ -3,11 +3,7 @@
|
|
3
3
|
require "spec_helper"
|
4
4
|
|
5
5
|
describe Split::EncapsulatedHelper do
|
6
|
-
|
7
|
-
|
8
|
-
def params
|
9
|
-
raise NoMethodError, "This method is not really defined"
|
10
|
-
end
|
6
|
+
let(:context_shim) { Split::EncapsulatedHelper::ContextShim.new(double(request: request)) }
|
11
7
|
|
12
8
|
describe "ab_test" do
|
13
9
|
before do
|
@@ -15,20 +11,15 @@ describe Split::EncapsulatedHelper do
|
|
15
11
|
.and_return(mock_user)
|
16
12
|
end
|
17
13
|
|
18
|
-
it "should not raise an error when params raises an error" do
|
19
|
-
expect { params }.to raise_error(NoMethodError)
|
20
|
-
expect { ab_test("link_color", "blue", "red") }.not_to raise_error
|
21
|
-
end
|
22
|
-
|
23
14
|
it "calls the block with selected alternative" do
|
24
|
-
expect { |block| ab_test("link_color", "red", "red", &block) }.to yield_with_args("red", {})
|
15
|
+
expect { |block| context_shim.ab_test("link_color", "red", "red", &block) }.to yield_with_args("red", {})
|
25
16
|
end
|
26
17
|
|
27
18
|
context "inside a view" do
|
28
19
|
it "works inside ERB" do
|
29
20
|
require "erb"
|
30
21
|
template = ERB.new(<<-ERB.split(/\s+/s).map(&:strip).join(" "), nil, "%")
|
31
|
-
foo <% ab_test(:foo, '1', '2') do |alt, meta| %>
|
22
|
+
foo <% context_shim.ab_test(:foo, '1', '2') do |alt, meta| %>
|
32
23
|
static <%= alt %>
|
33
24
|
<% end %>
|
34
25
|
ERB
|
@@ -43,8 +34,43 @@ describe Split::EncapsulatedHelper do
|
|
43
34
|
include Split::EncapsulatedHelper
|
44
35
|
public :session
|
45
36
|
}.new
|
37
|
+
|
46
38
|
expect(ctx).to receive(:session) { {} }
|
47
39
|
expect { ctx.ab_test("link_color", "blue", "red") }.not_to raise_error
|
48
40
|
end
|
41
|
+
|
42
|
+
context "when request is defined in context of ContextShim" do
|
43
|
+
context "when overriding by params" do
|
44
|
+
it do
|
45
|
+
ctx = Class.new {
|
46
|
+
public :session
|
47
|
+
def request
|
48
|
+
build_request(params: {
|
49
|
+
"ab_test" => { "link_color" => "blue" }
|
50
|
+
})
|
51
|
+
end
|
52
|
+
}.new
|
53
|
+
|
54
|
+
context_shim = Split::EncapsulatedHelper::ContextShim.new(ctx)
|
55
|
+
expect(context_shim.ab_test("link_color", "blue", "red")).to be("blue")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "when overriding by cookies" do
|
60
|
+
it do
|
61
|
+
ctx = Class.new {
|
62
|
+
public :session
|
63
|
+
def request
|
64
|
+
build_request(cookies: {
|
65
|
+
"split_override" => '{ "link_color": "red" }'
|
66
|
+
})
|
67
|
+
end
|
68
|
+
}.new
|
69
|
+
|
70
|
+
context_shim = Split::EncapsulatedHelper::ContextShim.new(ctx)
|
71
|
+
expect(context_shim.ab_test("link_color", "blue", "red")).to be("red")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
49
75
|
end
|
50
76
|
end
|
@@ -67,14 +67,14 @@ describe Split::Persistence::CookieAdapter do
|
|
67
67
|
it "puts multiple experiments in a single cookie" do
|
68
68
|
subject["foo"] = "FOO"
|
69
69
|
subject["bar"] = "BAR"
|
70
|
-
expect(context.response.headers["Set-Cookie"]).to
|
70
|
+
expect(Array(context.response.headers["Set-Cookie"])).to include(/\Asplit=%7B%22foo%22%3A%22FOO%22%2C%22bar%22%3A%22BAR%22%7D; path=\/; expires=[a-zA-Z]{3}, \d{2} [a-zA-Z]{3} \d{4} \d{2}:\d{2}:\d{2} [A-Z]{3}\Z/)
|
71
71
|
end
|
72
72
|
|
73
73
|
it "ensure other added cookies are not overriden" do
|
74
74
|
context.response.set_cookie "dummy", "wow"
|
75
75
|
subject["foo"] = "FOO"
|
76
|
-
expect(context.response.headers["Set-Cookie"]).to include(
|
77
|
-
expect(context.response.headers["Set-Cookie"]).to include(
|
76
|
+
expect(Array(context.response.headers["Set-Cookie"])).to include(/dummy=wow/)
|
77
|
+
expect(Array(context.response.headers["Set-Cookie"])).to include(/split=/)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
data/spec/spec_helper.rb
CHANGED
@@ -44,11 +44,20 @@ def params
|
|
44
44
|
@params ||= {}
|
45
45
|
end
|
46
46
|
|
47
|
-
def request
|
48
|
-
@request ||=
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
47
|
+
def request
|
48
|
+
@request ||= build_request
|
49
|
+
end
|
50
|
+
|
51
|
+
def build_request(
|
52
|
+
ua: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27",
|
53
|
+
ip: "192.168.1.1",
|
54
|
+
params: {},
|
55
|
+
cookies: {}
|
56
|
+
)
|
57
|
+
r = OpenStruct.new
|
58
|
+
r.user_agent = ua
|
59
|
+
r.ip = ip
|
60
|
+
r.params = params
|
61
|
+
r.cookies = cookies
|
62
|
+
r
|
54
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: split
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Nesbitt
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -164,7 +164,7 @@ dependencies:
|
|
164
164
|
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '5.0'
|
167
|
-
description:
|
167
|
+
description:
|
168
168
|
email:
|
169
169
|
- andrewnez@gmail.com
|
170
170
|
executables: []
|
@@ -274,7 +274,7 @@ metadata:
|
|
274
274
|
bug_tracker_uri: https://github.com/splitrb/split/issues
|
275
275
|
wiki_uri: https://github.com/splitrb/split/wiki
|
276
276
|
mailing_list_uri: https://groups.google.com/d/forum/split-ruby
|
277
|
-
post_install_message:
|
277
|
+
post_install_message:
|
278
278
|
rdoc_options: []
|
279
279
|
require_paths:
|
280
280
|
- lib
|
@@ -289,8 +289,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
289
289
|
- !ruby/object:Gem::Version
|
290
290
|
version: 2.0.0
|
291
291
|
requirements: []
|
292
|
-
rubygems_version: 3.
|
293
|
-
signing_key:
|
292
|
+
rubygems_version: 3.5.3
|
293
|
+
signing_key:
|
294
294
|
specification_version: 4
|
295
295
|
summary: Rack based split testing framework
|
296
296
|
test_files:
|