split 3.3.2 → 4.0.0.pre2
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/.eslintrc +1 -1
- data/.github/FUNDING.yml +1 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +24 -0
- data/.github/dependabot.yml +7 -0
- data/.github/workflows/ci.yml +61 -0
- data/.rspec +1 -0
- data/.rubocop.yml +71 -1044
- data/.rubocop_todo.yml +226 -0
- data/Appraisals +1 -1
- data/CHANGELOG.md +62 -0
- data/CODE_OF_CONDUCT.md +3 -3
- data/Gemfile +2 -0
- data/README.md +40 -18
- data/Rakefile +2 -0
- data/gemfiles/6.0.gemfile +1 -1
- data/lib/split/algorithms/block_randomization.rb +2 -0
- data/lib/split/algorithms/weighted_sample.rb +2 -1
- data/lib/split/algorithms/whiplash.rb +3 -2
- data/lib/split/alternative.rb +4 -3
- data/lib/split/cache.rb +28 -0
- data/lib/split/combined_experiments_helper.rb +2 -1
- data/lib/split/configuration.rb +13 -14
- data/lib/split/dashboard/helpers.rb +1 -0
- data/lib/split/dashboard/pagination_helpers.rb +3 -3
- data/lib/split/dashboard/paginator.rb +1 -0
- data/lib/split/dashboard/public/dashboard.js +10 -0
- data/lib/split/dashboard/public/style.css +5 -0
- data/lib/split/dashboard/views/_controls.erb +13 -0
- data/lib/split/dashboard/views/layout.erb +1 -1
- data/lib/split/dashboard.rb +19 -1
- data/lib/split/encapsulated_helper.rb +3 -2
- data/lib/split/engine.rb +7 -4
- data/lib/split/exceptions.rb +1 -0
- data/lib/split/experiment.rb +98 -65
- data/lib/split/experiment_catalog.rb +1 -3
- data/lib/split/extensions/string.rb +1 -0
- data/lib/split/goals_collection.rb +2 -0
- data/lib/split/helper.rb +28 -8
- data/lib/split/metric.rb +2 -1
- data/lib/split/persistence/cookie_adapter.rb +6 -1
- data/lib/split/persistence/dual_adapter.rb +54 -12
- data/lib/split/persistence/redis_adapter.rb +5 -0
- data/lib/split/persistence/session_adapter.rb +1 -0
- data/lib/split/persistence.rb +4 -2
- data/lib/split/redis_interface.rb +9 -28
- data/lib/split/trial.rb +21 -11
- data/lib/split/user.rb +20 -4
- data/lib/split/version.rb +2 -4
- data/lib/split/zscore.rb +1 -0
- data/lib/split.rb +9 -3
- data/spec/alternative_spec.rb +1 -1
- data/spec/cache_spec.rb +88 -0
- data/spec/configuration_spec.rb +17 -15
- data/spec/dashboard/pagination_helpers_spec.rb +3 -1
- data/spec/dashboard_helpers_spec.rb +2 -2
- data/spec/dashboard_spec.rb +78 -17
- data/spec/encapsulated_helper_spec.rb +2 -2
- data/spec/experiment_spec.rb +116 -12
- data/spec/goals_collection_spec.rb +1 -1
- data/spec/helper_spec.rb +186 -112
- data/spec/persistence/cookie_adapter_spec.rb +1 -1
- data/spec/persistence/dual_adapter_spec.rb +160 -68
- data/spec/persistence/redis_adapter_spec.rb +9 -0
- data/spec/redis_interface_spec.rb +0 -69
- data/spec/spec_helper.rb +5 -6
- data/spec/trial_spec.rb +45 -19
- data/spec/user_spec.rb +45 -3
- data/split.gemspec +8 -9
- metadata +28 -36
- data/.travis.yml +0 -66
- data/gemfiles/4.2.gemfile +0 -9
@@ -60,6 +60,15 @@ describe Split::Persistence::RedisAdapter do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
describe '#find' do
|
64
|
+
before { Split::Persistence::RedisAdapter.with_config(:lookup_by => proc{'frag'}, :namespace => 'a_namespace') }
|
65
|
+
|
66
|
+
it "should create and user from a given key" do
|
67
|
+
adapter = Split::Persistence::RedisAdapter.find(2)
|
68
|
+
expect(adapter.redis_key).to eq("a_namespace:2")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
63
72
|
context 'functional tests' do
|
64
73
|
before { Split::Persistence::RedisAdapter.with_config(:lookup_by => 'lookup') }
|
65
74
|
|
@@ -29,75 +29,6 @@ describe Split::RedisInterface do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
describe '#add_to_list' do
|
33
|
-
subject(:add_to_list) do
|
34
|
-
interface.add_to_list(list_name, 'y')
|
35
|
-
interface.add_to_list(list_name, 'z')
|
36
|
-
end
|
37
|
-
|
38
|
-
specify do
|
39
|
-
add_to_list
|
40
|
-
expect(Split.redis.lindex(list_name, 0)).to eq 'y'
|
41
|
-
expect(Split.redis.lindex(list_name, 1)).to eq 'z'
|
42
|
-
expect(Split.redis.llen(list_name)).to eq 2
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe '#set_list_index' do
|
47
|
-
subject(:set_list_index) do
|
48
|
-
interface.add_to_list(list_name, 'y')
|
49
|
-
interface.add_to_list(list_name, 'z')
|
50
|
-
interface.set_list_index(list_name, 0, 'a')
|
51
|
-
end
|
52
|
-
|
53
|
-
specify do
|
54
|
-
set_list_index
|
55
|
-
expect(Split.redis.lindex(list_name, 0)).to eq 'a'
|
56
|
-
expect(Split.redis.lindex(list_name, 1)).to eq 'z'
|
57
|
-
expect(Split.redis.llen(list_name)).to eq 2
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
describe '#list_length' do
|
62
|
-
subject(:list_length) do
|
63
|
-
interface.add_to_list(list_name, 'y')
|
64
|
-
interface.add_to_list(list_name, 'z')
|
65
|
-
interface.list_length(list_name)
|
66
|
-
end
|
67
|
-
|
68
|
-
specify do
|
69
|
-
expect(list_length).to eq 2
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe '#remove_last_item_from_list' do
|
74
|
-
subject(:remove_last_item_from_list) do
|
75
|
-
interface.add_to_list(list_name, 'y')
|
76
|
-
interface.add_to_list(list_name, 'z')
|
77
|
-
interface.remove_last_item_from_list(list_name)
|
78
|
-
end
|
79
|
-
|
80
|
-
specify do
|
81
|
-
remove_last_item_from_list
|
82
|
-
expect(Split.redis.lindex(list_name, 0)).to eq 'y'
|
83
|
-
expect(Split.redis.llen(list_name)).to eq 1
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
describe '#make_list_length' do
|
88
|
-
subject(:make_list_length) do
|
89
|
-
interface.add_to_list(list_name, 'y')
|
90
|
-
interface.add_to_list(list_name, 'z')
|
91
|
-
interface.make_list_length(list_name, 1)
|
92
|
-
end
|
93
|
-
|
94
|
-
specify do
|
95
|
-
make_list_length
|
96
|
-
expect(Split.redis.lindex(list_name, 0)).to eq 'y'
|
97
|
-
expect(Split.redis.llen(list_name)).to eq 1
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
32
|
describe '#add_to_set' do
|
102
33
|
subject(:add_to_set) do
|
103
34
|
interface.add_to_set(set_name, 'something')
|
data/spec/spec_helper.rb
CHANGED
@@ -13,17 +13,16 @@ require 'yaml'
|
|
13
13
|
|
14
14
|
Dir['./spec/support/*.rb'].each { |f| require f }
|
15
15
|
|
16
|
-
require "fakeredis"
|
17
|
-
|
18
|
-
G_fakeredis = Redis.new
|
19
|
-
|
20
16
|
module GlobalSharedContext
|
21
17
|
extend RSpec::SharedContext
|
22
18
|
let(:mock_user){ Split::User.new(double(session: {})) }
|
19
|
+
|
23
20
|
before(:each) do
|
24
21
|
Split.configuration = Split::Configuration.new
|
25
|
-
Split.redis =
|
26
|
-
Split.redis.
|
22
|
+
Split.redis = Redis.new
|
23
|
+
Split.redis.select(10)
|
24
|
+
Split.redis.flushdb
|
25
|
+
Split::Cache.clear
|
27
26
|
@ab_user = mock_user
|
28
27
|
params = nil
|
29
28
|
end
|
data/spec/trial_spec.rb
CHANGED
@@ -198,42 +198,68 @@ describe Split::Trial do
|
|
198
198
|
expect(trial.alternative.name).to_not be_empty
|
199
199
|
Split.configuration.on_trial_choose = nil
|
200
200
|
end
|
201
|
+
|
202
|
+
it "assigns user to an alternative" do
|
203
|
+
trial.choose! context
|
204
|
+
|
205
|
+
expect(alternatives).to include(user[experiment.name])
|
206
|
+
end
|
207
|
+
|
208
|
+
context "when cohorting is disabled" do
|
209
|
+
before(:each) { allow(experiment).to receive(:cohorting_disabled?).and_return(true) }
|
210
|
+
|
211
|
+
it "picks the control and does not run on_trial callbacks" do
|
212
|
+
Split.configuration.on_trial = :on_trial_callback
|
213
|
+
|
214
|
+
expect(experiment).to_not receive(:next_alternative)
|
215
|
+
expect(context).not_to receive(:on_trial_callback)
|
216
|
+
expect_alternative(trial, 'basket')
|
217
|
+
|
218
|
+
Split.configuration.enabled = true
|
219
|
+
Split.configuration.on_trial = nil
|
220
|
+
end
|
221
|
+
|
222
|
+
it "user is not assigned an alternative" do
|
223
|
+
trial.choose! context
|
224
|
+
|
225
|
+
expect(user[experiment]).to eq(nil)
|
226
|
+
end
|
227
|
+
end
|
201
228
|
end
|
202
229
|
end
|
203
230
|
|
204
231
|
describe "#complete!" do
|
205
|
-
let(:trial) { Split::Trial.new(:user => user, :experiment => experiment) }
|
206
232
|
context 'when there are no goals' do
|
233
|
+
let(:trial) { Split::Trial.new(:user => user, :experiment => experiment) }
|
207
234
|
it 'should complete the trial' do
|
208
235
|
trial.choose!
|
209
236
|
old_completed_count = trial.alternative.completed_count
|
210
237
|
trial.complete!
|
211
|
-
expect(trial.alternative.completed_count).to
|
238
|
+
expect(trial.alternative.completed_count).to eq(old_completed_count + 1)
|
212
239
|
end
|
213
240
|
end
|
214
241
|
|
215
|
-
context
|
216
|
-
let(:goals) { [
|
242
|
+
context "when there are many goals" do
|
243
|
+
let(:goals) { [ "goal1", "goal2" ] }
|
217
244
|
let(:trial) { Split::Trial.new(:user => user, :experiment => experiment, :goals => goals) }
|
218
|
-
shared_examples_for "goal completion" do
|
219
|
-
it 'should not complete the trial' do
|
220
|
-
trial.choose!
|
221
|
-
old_completed_count = trial.alternative.completed_count
|
222
|
-
trial.complete!(goal)
|
223
|
-
expect(trial.alternative.completed_count).to_not be(old_completed_count+1)
|
224
|
-
end
|
225
|
-
end
|
226
245
|
|
227
|
-
|
228
|
-
|
229
|
-
|
246
|
+
it "increments the completed count corresponding to the goals" do
|
247
|
+
trial.choose!
|
248
|
+
old_completed_counts = goals.map{ |goal| [goal, trial.alternative.completed_count(goal)] }.to_h
|
249
|
+
trial.complete!
|
250
|
+
goals.each { | goal | expect(trial.alternative.completed_count(goal)).to eq(old_completed_counts[goal] + 1) }
|
230
251
|
end
|
252
|
+
end
|
231
253
|
|
232
|
-
|
233
|
-
|
234
|
-
|
254
|
+
context "when there is 1 goal of type string" do
|
255
|
+
let(:goal) { "goal" }
|
256
|
+
let(:trial) { Split::Trial.new(:user => user, :experiment => experiment, :goals => goal) }
|
257
|
+
it "increments the completed count corresponding to the goal" do
|
258
|
+
trial.choose!
|
259
|
+
old_completed_count = trial.alternative.completed_count(goal)
|
260
|
+
trial.complete!
|
261
|
+
expect(trial.alternative.completed_count(goal)).to eq(old_completed_count + 1)
|
235
262
|
end
|
236
|
-
|
237
263
|
end
|
238
264
|
end
|
239
265
|
|
data/spec/user_spec.rb
CHANGED
@@ -17,11 +17,25 @@ describe Split::User do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
context '#cleanup_old_versions!' do
|
20
|
-
let(:
|
20
|
+
let(:experiment_version) { "#{experiment.name}:1" }
|
21
|
+
let(:second_experiment_version) { "#{experiment.name}_another:1" }
|
22
|
+
let(:third_experiment_version) { "variation_of_#{experiment.name}:1" }
|
23
|
+
let(:user_keys) do
|
24
|
+
{
|
25
|
+
experiment_version => 'blue',
|
26
|
+
second_experiment_version => 'red',
|
27
|
+
third_experiment_version => 'yellow'
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
before(:each) { @subject.cleanup_old_versions!(experiment) }
|
21
32
|
|
22
33
|
it 'removes key if old experiment is found' do
|
23
|
-
@subject.
|
24
|
-
|
34
|
+
expect(@subject.keys).not_to include(experiment_version)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'does not remove other keys' do
|
38
|
+
expect(@subject.keys).to include(second_experiment_version, third_experiment_version)
|
25
39
|
end
|
26
40
|
end
|
27
41
|
|
@@ -59,6 +73,34 @@ describe Split::User do
|
|
59
73
|
expect(@subject.keys).to include("link_color:finished")
|
60
74
|
end
|
61
75
|
end
|
76
|
+
|
77
|
+
context 'when already cleaned up' do
|
78
|
+
before do
|
79
|
+
@subject.cleanup_old_experiments!
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'does not clean up again' do
|
83
|
+
expect(@subject).to_not receive(:keys_without_finished)
|
84
|
+
@subject.cleanup_old_experiments!
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'allows user to be loaded from adapter' do
|
90
|
+
it 'loads user from adapter (RedisAdapter)' do
|
91
|
+
user = Split::Persistence::RedisAdapter.new(nil, 112233)
|
92
|
+
user['foo'] = 'bar'
|
93
|
+
|
94
|
+
ab_user = Split::User.find(112233, :redis)
|
95
|
+
|
96
|
+
expect(ab_user['foo']).to eql('bar')
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'returns nil if adapter does not implement a finder method' do
|
100
|
+
ab_user = Split::User.find(112233, :dual_adapter)
|
101
|
+
expect(ab_user).to be_nil
|
102
|
+
end
|
103
|
+
|
62
104
|
end
|
63
105
|
|
64
106
|
context "instantiated with custom adapter" do
|
data/split.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
$:.push File.expand_path("../lib", __FILE__)
|
3
5
|
require "split/version"
|
4
6
|
|
@@ -21,25 +23,22 @@ Gem::Specification.new do |s|
|
|
21
23
|
"mailing_list_uri" => "https://groups.google.com/d/forum/split-ruby"
|
22
24
|
}
|
23
25
|
|
24
|
-
s.required_ruby_version = '>=
|
26
|
+
s.required_ruby_version = '>= 2.5.0'
|
25
27
|
s.required_rubygems_version = '>= 2.0.0'
|
26
28
|
|
27
|
-
s.rubyforge_project = "split"
|
28
|
-
|
29
29
|
s.files = `git ls-files`.split("\n")
|
30
30
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
31
31
|
s.require_paths = ["lib"]
|
32
32
|
|
33
|
-
s.add_dependency 'redis', '>= 2
|
33
|
+
s.add_dependency 'redis', '>= 4.2'
|
34
34
|
s.add_dependency 'sinatra', '>= 1.2.6'
|
35
|
-
s.add_dependency '
|
35
|
+
s.add_dependency 'rubystats', '>= 0.3.0'
|
36
36
|
|
37
37
|
s.add_development_dependency 'bundler', '>= 1.17'
|
38
38
|
s.add_development_dependency 'simplecov', '~> 0.15'
|
39
|
-
s.add_development_dependency 'rack-test', '~>
|
40
|
-
s.add_development_dependency 'rake', '~>
|
39
|
+
s.add_development_dependency 'rack-test', '~> 1.1'
|
40
|
+
s.add_development_dependency 'rake', '~> 13'
|
41
41
|
s.add_development_dependency 'rspec', '~> 3.7'
|
42
42
|
s.add_development_dependency 'pry', '~> 0.10'
|
43
|
-
s.add_development_dependency '
|
44
|
-
s.add_development_dependency 'rails', '>= 4.2'
|
43
|
+
s.add_development_dependency 'rails', '>= 5.0'
|
45
44
|
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
|
+
version: 4.0.0.pre2
|
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: 2021-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '2
|
19
|
+
version: '4.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '2
|
26
|
+
version: '4.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sinatra
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,19 +39,19 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.2.6
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rubystats
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.3.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.3.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,28 +86,28 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '1.1'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '1.1'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '13'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '13'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rspec
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,35 +136,21 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0.10'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: fakeredis
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0.7'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0.7'
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
140
|
name: rails
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
156
142
|
requirements:
|
157
143
|
- - ">="
|
158
144
|
- !ruby/object:Gem::Version
|
159
|
-
version: '
|
145
|
+
version: '5.0'
|
160
146
|
type: :development
|
161
147
|
prerelease: false
|
162
148
|
version_requirements: !ruby/object:Gem::Requirement
|
163
149
|
requirements:
|
164
150
|
- - ">="
|
165
151
|
- !ruby/object:Gem::Version
|
166
|
-
version: '
|
167
|
-
description:
|
152
|
+
version: '5.0'
|
153
|
+
description:
|
168
154
|
email:
|
169
155
|
- andrewnez@gmail.com
|
170
156
|
executables: []
|
@@ -175,9 +161,14 @@ files:
|
|
175
161
|
- ".csslintrc"
|
176
162
|
- ".eslintignore"
|
177
163
|
- ".eslintrc"
|
164
|
+
- ".github/FUNDING.yml"
|
165
|
+
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
166
|
+
- ".github/dependabot.yml"
|
167
|
+
- ".github/workflows/ci.yml"
|
178
168
|
- ".gitignore"
|
169
|
+
- ".rspec"
|
179
170
|
- ".rubocop.yml"
|
180
|
-
- ".
|
171
|
+
- ".rubocop_todo.yml"
|
181
172
|
- Appraisals
|
182
173
|
- CHANGELOG.md
|
183
174
|
- CODE_OF_CONDUCT.md
|
@@ -186,7 +177,6 @@ files:
|
|
186
177
|
- LICENSE
|
187
178
|
- README.md
|
188
179
|
- Rakefile
|
189
|
-
- gemfiles/4.2.gemfile
|
190
180
|
- gemfiles/5.0.gemfile
|
191
181
|
- gemfiles/5.1.gemfile
|
192
182
|
- gemfiles/5.2.gemfile
|
@@ -196,6 +186,7 @@ files:
|
|
196
186
|
- lib/split/algorithms/weighted_sample.rb
|
197
187
|
- lib/split/algorithms/whiplash.rb
|
198
188
|
- lib/split/alternative.rb
|
189
|
+
- lib/split/cache.rb
|
199
190
|
- lib/split/combined_experiments_helper.rb
|
200
191
|
- lib/split/configuration.rb
|
201
192
|
- lib/split/dashboard.rb
|
@@ -235,6 +226,7 @@ files:
|
|
235
226
|
- spec/algorithms/weighted_sample_spec.rb
|
236
227
|
- spec/algorithms/whiplash_spec.rb
|
237
228
|
- spec/alternative_spec.rb
|
229
|
+
- spec/cache_spec.rb
|
238
230
|
- spec/combined_experiments_helper_spec.rb
|
239
231
|
- spec/configuration_spec.rb
|
240
232
|
- spec/dashboard/pagination_helpers_spec.rb
|
@@ -269,7 +261,7 @@ metadata:
|
|
269
261
|
bug_tracker_uri: https://github.com/splitrb/split/issues
|
270
262
|
wiki_uri: https://github.com/splitrb/split/wiki
|
271
263
|
mailing_list_uri: https://groups.google.com/d/forum/split-ruby
|
272
|
-
post_install_message:
|
264
|
+
post_install_message:
|
273
265
|
rdoc_options: []
|
274
266
|
require_paths:
|
275
267
|
- lib
|
@@ -277,16 +269,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
277
269
|
requirements:
|
278
270
|
- - ">="
|
279
271
|
- !ruby/object:Gem::Version
|
280
|
-
version:
|
272
|
+
version: 2.5.0
|
281
273
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
282
274
|
requirements:
|
283
275
|
- - ">="
|
284
276
|
- !ruby/object:Gem::Version
|
285
277
|
version: 2.0.0
|
286
278
|
requirements: []
|
287
|
-
|
288
|
-
|
289
|
-
signing_key:
|
279
|
+
rubygems_version: 3.1.4
|
280
|
+
signing_key:
|
290
281
|
specification_version: 4
|
291
282
|
summary: Rack based split testing framework
|
292
283
|
test_files:
|
@@ -294,6 +285,7 @@ test_files:
|
|
294
285
|
- spec/algorithms/weighted_sample_spec.rb
|
295
286
|
- spec/algorithms/whiplash_spec.rb
|
296
287
|
- spec/alternative_spec.rb
|
288
|
+
- spec/cache_spec.rb
|
297
289
|
- spec/combined_experiments_helper_spec.rb
|
298
290
|
- spec/configuration_spec.rb
|
299
291
|
- spec/dashboard/pagination_helpers_spec.rb
|
data/.travis.yml
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm:
|
3
|
-
- 1.9.3
|
4
|
-
- 2.0
|
5
|
-
- 2.1.10
|
6
|
-
- 2.2.0
|
7
|
-
- 2.2.2
|
8
|
-
- 2.4.5
|
9
|
-
- 2.5.3
|
10
|
-
- 2.6.0
|
11
|
-
|
12
|
-
gemfile:
|
13
|
-
- gemfiles/4.2.gemfile
|
14
|
-
- gemfiles/5.0.gemfile
|
15
|
-
- gemfiles/5.1.gemfile
|
16
|
-
- gemfiles/5.2.gemfile
|
17
|
-
- gemfiles/6.0.gemfile
|
18
|
-
|
19
|
-
|
20
|
-
matrix:
|
21
|
-
exclude:
|
22
|
-
- rvm: 1.9.3
|
23
|
-
gemfile: gemfiles/5.0.gemfile
|
24
|
-
- rvm: 1.9.3
|
25
|
-
gemfile: gemfiles/5.1.gemfile
|
26
|
-
- rvm: 1.9.3
|
27
|
-
gemfile: gemfiles/5.2.gemfile
|
28
|
-
- rvm: 1.9.3
|
29
|
-
gemfile: gemfiles/6.0.gemfile
|
30
|
-
- rvm: 2.0
|
31
|
-
gemfile: gemfiles/5.0.gemfile
|
32
|
-
- rvm: 2.0
|
33
|
-
gemfile: gemfiles/5.1.gemfile
|
34
|
-
- rvm: 2.0
|
35
|
-
gemfile: gemfiles/5.2.gemfile
|
36
|
-
- rvm: 2.0
|
37
|
-
gemfile: gemfiles/6.0.gemfile
|
38
|
-
- rvm: 2.1.10
|
39
|
-
gemfile: gemfiles/5.0.gemfile
|
40
|
-
- rvm: 2.1.10
|
41
|
-
gemfile: gemfiles/5.1.gemfile
|
42
|
-
- rvm: 2.1.10
|
43
|
-
gemfile: gemfiles/5.2.gemfile
|
44
|
-
- rvm: 2.1.10
|
45
|
-
gemfile: gemfiles/6.0.gemfile
|
46
|
-
- rvm: 2.2.0
|
47
|
-
gemfile: gemfiles/5.0.gemfile
|
48
|
-
- rvm: 2.2.0
|
49
|
-
gemfile: gemfiles/5.1.gemfile
|
50
|
-
- rvm: 2.2.0
|
51
|
-
gemfile: gemfiles/5.2.gemfile
|
52
|
-
- rvm: 2.2.0
|
53
|
-
gemfile: gemfiles/6.0.gemfile
|
54
|
-
- rvm: 2.2.2
|
55
|
-
gemfile: gemfiles/6.0.gemfile
|
56
|
-
- rvm: 2.4.5
|
57
|
-
gemfile: gemfiles/6.0.gemfile
|
58
|
-
|
59
|
-
before_install:
|
60
|
-
- gem install bundler --version=1.17.3
|
61
|
-
|
62
|
-
script:
|
63
|
-
- RAILS_ENV=test bundle exec rake spec && bundle exec codeclimate-test-reporter
|
64
|
-
|
65
|
-
cache: bundler
|
66
|
-
sudo: false
|