split 3.4.0 → 4.0.1

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/dependabot.yml +7 -0
  4. data/.github/workflows/ci.yml +71 -0
  5. data/.rubocop.yml +177 -1
  6. data/.rubocop_todo.yml +40 -493
  7. data/CHANGELOG.md +41 -0
  8. data/Gemfile +1 -0
  9. data/README.md +26 -6
  10. data/Rakefile +1 -0
  11. data/gemfiles/{4.2.gemfile → 6.1.gemfile} +1 -1
  12. data/gemfiles/7.0.gemfile +9 -0
  13. data/lib/split/algorithms/block_randomization.rb +1 -0
  14. data/lib/split/algorithms/weighted_sample.rb +2 -1
  15. data/lib/split/algorithms/whiplash.rb +3 -2
  16. data/lib/split/alternative.rb +1 -0
  17. data/lib/split/cache.rb +28 -0
  18. data/lib/split/combined_experiments_helper.rb +1 -0
  19. data/lib/split/configuration.rb +8 -12
  20. data/lib/split/dashboard/helpers.rb +1 -0
  21. data/lib/split/dashboard/pagination_helpers.rb +1 -0
  22. data/lib/split/dashboard/paginator.rb +1 -0
  23. data/lib/split/dashboard/public/dashboard.js +10 -0
  24. data/lib/split/dashboard/public/style.css +5 -0
  25. data/lib/split/dashboard/views/_controls.erb +13 -0
  26. data/lib/split/dashboard.rb +17 -2
  27. data/lib/split/encapsulated_helper.rb +3 -2
  28. data/lib/split/engine.rb +5 -4
  29. data/lib/split/exceptions.rb +1 -0
  30. data/lib/split/experiment.rb +82 -60
  31. data/lib/split/experiment_catalog.rb +1 -3
  32. data/lib/split/extensions/string.rb +1 -0
  33. data/lib/split/goals_collection.rb +1 -0
  34. data/lib/split/helper.rb +26 -7
  35. data/lib/split/metric.rb +2 -1
  36. data/lib/split/persistence/cookie_adapter.rb +6 -1
  37. data/lib/split/persistence/redis_adapter.rb +5 -0
  38. data/lib/split/persistence/session_adapter.rb +1 -0
  39. data/lib/split/persistence.rb +4 -2
  40. data/lib/split/redis_interface.rb +8 -28
  41. data/lib/split/trial.rb +20 -10
  42. data/lib/split/user.rb +15 -3
  43. data/lib/split/version.rb +2 -4
  44. data/lib/split/zscore.rb +1 -0
  45. data/lib/split.rb +9 -3
  46. data/spec/alternative_spec.rb +1 -1
  47. data/spec/cache_spec.rb +88 -0
  48. data/spec/configuration_spec.rb +17 -15
  49. data/spec/dashboard_spec.rb +45 -5
  50. data/spec/encapsulated_helper_spec.rb +1 -1
  51. data/spec/experiment_spec.rb +78 -13
  52. data/spec/goals_collection_spec.rb +1 -1
  53. data/spec/helper_spec.rb +68 -32
  54. data/spec/persistence/cookie_adapter_spec.rb +1 -1
  55. data/spec/persistence/redis_adapter_spec.rb +9 -0
  56. data/spec/redis_interface_spec.rb +0 -69
  57. data/spec/spec_helper.rb +5 -6
  58. data/spec/trial_spec.rb +45 -19
  59. data/spec/user_spec.rb +34 -3
  60. data/split.gemspec +7 -7
  61. metadata +27 -35
  62. data/.travis.yml +0 -60
@@ -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 = G_fakeredis
26
- Split.redis.flushall
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 be(old_completed_count+1)
238
+ expect(trial.alternative.completed_count).to eq(old_completed_count + 1)
212
239
  end
213
240
  end
214
241
 
215
- context 'when there are many goals' do
216
- let(:goals) { ['first', 'second'] }
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
- describe 'Array of Goals' do
228
- let(:goal) { [goals.first] }
229
- it_behaves_like 'goal completion'
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
- describe 'String of Goal' do
233
- let(:goal) { goals.first }
234
- it_behaves_like 'goal completion'
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(:user_keys) { { 'link_color:1' => 'blue' } }
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.cleanup_old_versions!(experiment)
24
- expect(@subject.keys).to be_empty
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
 
@@ -72,6 +86,23 @@ describe Split::User do
72
86
  end
73
87
  end
74
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
+
104
+ end
105
+
75
106
  context "instantiated with custom adapter" do
76
107
  let(:custom_adapter) { double(:persistence_adapter) }
77
108
 
data/split.gemspec CHANGED
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
+
3
4
  $:.push File.expand_path("../lib", __FILE__)
4
5
  require "split/version"
5
6
 
@@ -22,23 +23,22 @@ Gem::Specification.new do |s|
22
23
  "mailing_list_uri" => "https://groups.google.com/d/forum/split-ruby"
23
24
  }
24
25
 
25
- s.required_ruby_version = '>= 1.9.3'
26
+ s.required_ruby_version = '>= 2.5.0'
26
27
  s.required_rubygems_version = '>= 2.0.0'
27
28
 
28
29
  s.files = `git ls-files`.split("\n")
29
30
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
30
31
  s.require_paths = ["lib"]
31
32
 
32
- s.add_dependency 'redis', '>= 2.1'
33
+ s.add_dependency 'redis', '>= 4.2'
33
34
  s.add_dependency 'sinatra', '>= 1.2.6'
34
- s.add_dependency 'simple-random', '>= 0.9.3'
35
+ s.add_dependency 'rubystats', '>= 0.3.0'
35
36
 
36
37
  s.add_development_dependency 'bundler', '>= 1.17'
37
38
  s.add_development_dependency 'simplecov', '~> 0.15'
38
- s.add_development_dependency 'rack-test', '~> 0.6'
39
- s.add_development_dependency 'rake', '~> 12'
39
+ s.add_development_dependency 'rack-test', '~> 1.1'
40
+ s.add_development_dependency 'rake', '~> 13'
40
41
  s.add_development_dependency 'rspec', '~> 3.7'
41
42
  s.add_development_dependency 'pry', '~> 0.10'
42
- s.add_development_dependency 'fakeredis', '~> 0.7'
43
- s.add_development_dependency 'rails', '>= 4.2'
43
+ s.add_development_dependency 'rails', '>= 5.0'
44
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: 3.4.0
4
+ version: 4.0.1
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: 2019-11-10 00:00:00.000000000 Z
11
+ date: 2021-12-30 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.1'
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.1'
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: simple-random
42
+ name: rubystats
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.9.3
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.9.3
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: '0.6'
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: '0.6'
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: '12'
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: '12'
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: '4.2'
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: '4.2'
167
- description:
152
+ version: '5.0'
153
+ description:
168
154
  email:
169
155
  - andrewnez@gmail.com
170
156
  executables: []
@@ -175,12 +161,14 @@ files:
175
161
  - ".csslintrc"
176
162
  - ".eslintignore"
177
163
  - ".eslintrc"
164
+ - ".github/FUNDING.yml"
178
165
  - ".github/ISSUE_TEMPLATE/bug_report.md"
166
+ - ".github/dependabot.yml"
167
+ - ".github/workflows/ci.yml"
179
168
  - ".gitignore"
180
169
  - ".rspec"
181
170
  - ".rubocop.yml"
182
171
  - ".rubocop_todo.yml"
183
- - ".travis.yml"
184
172
  - Appraisals
185
173
  - CHANGELOG.md
186
174
  - CODE_OF_CONDUCT.md
@@ -189,16 +177,18 @@ files:
189
177
  - LICENSE
190
178
  - README.md
191
179
  - Rakefile
192
- - gemfiles/4.2.gemfile
193
180
  - gemfiles/5.0.gemfile
194
181
  - gemfiles/5.1.gemfile
195
182
  - gemfiles/5.2.gemfile
196
183
  - gemfiles/6.0.gemfile
184
+ - gemfiles/6.1.gemfile
185
+ - gemfiles/7.0.gemfile
197
186
  - lib/split.rb
198
187
  - lib/split/algorithms/block_randomization.rb
199
188
  - lib/split/algorithms/weighted_sample.rb
200
189
  - lib/split/algorithms/whiplash.rb
201
190
  - lib/split/alternative.rb
191
+ - lib/split/cache.rb
202
192
  - lib/split/combined_experiments_helper.rb
203
193
  - lib/split/configuration.rb
204
194
  - lib/split/dashboard.rb
@@ -238,6 +228,7 @@ files:
238
228
  - spec/algorithms/weighted_sample_spec.rb
239
229
  - spec/algorithms/whiplash_spec.rb
240
230
  - spec/alternative_spec.rb
231
+ - spec/cache_spec.rb
241
232
  - spec/combined_experiments_helper_spec.rb
242
233
  - spec/configuration_spec.rb
243
234
  - spec/dashboard/pagination_helpers_spec.rb
@@ -272,7 +263,7 @@ metadata:
272
263
  bug_tracker_uri: https://github.com/splitrb/split/issues
273
264
  wiki_uri: https://github.com/splitrb/split/wiki
274
265
  mailing_list_uri: https://groups.google.com/d/forum/split-ruby
275
- post_install_message:
266
+ post_install_message:
276
267
  rdoc_options: []
277
268
  require_paths:
278
269
  - lib
@@ -280,15 +271,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
280
271
  requirements:
281
272
  - - ">="
282
273
  - !ruby/object:Gem::Version
283
- version: 1.9.3
274
+ version: 2.5.0
284
275
  required_rubygems_version: !ruby/object:Gem::Requirement
285
276
  requirements:
286
277
  - - ">="
287
278
  - !ruby/object:Gem::Version
288
279
  version: 2.0.0
289
280
  requirements: []
290
- rubygems_version: 3.0.3
291
- signing_key:
281
+ rubygems_version: 3.2.27
282
+ signing_key:
292
283
  specification_version: 4
293
284
  summary: Rack based split testing framework
294
285
  test_files:
@@ -296,6 +287,7 @@ test_files:
296
287
  - spec/algorithms/weighted_sample_spec.rb
297
288
  - spec/algorithms/whiplash_spec.rb
298
289
  - spec/alternative_spec.rb
290
+ - spec/cache_spec.rb
299
291
  - spec/combined_experiments_helper_spec.rb
300
292
  - spec/configuration_spec.rb
301
293
  - spec/dashboard/pagination_helpers_spec.rb
data/.travis.yml DELETED
@@ -1,60 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 1.9.3
4
- - 2.0
5
- - 2.1.10
6
- - 2.2.2
7
- - 2.3.8
8
- - 2.4.9
9
- - 2.5.7
10
- - 2.6.5
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
- matrix:
20
- exclude:
21
- - rvm: 1.9.3
22
- gemfile: gemfiles/5.0.gemfile
23
- - rvm: 1.9.3
24
- gemfile: gemfiles/5.1.gemfile
25
- - rvm: 1.9.3
26
- gemfile: gemfiles/5.2.gemfile
27
- - rvm: 1.9.3
28
- gemfile: gemfiles/6.0.gemfile
29
- - rvm: 2.0
30
- gemfile: gemfiles/5.0.gemfile
31
- - rvm: 2.0
32
- gemfile: gemfiles/5.1.gemfile
33
- - rvm: 2.0
34
- gemfile: gemfiles/5.2.gemfile
35
- - rvm: 2.0
36
- gemfile: gemfiles/6.0.gemfile
37
- - rvm: 2.1.10
38
- gemfile: gemfiles/5.0.gemfile
39
- - rvm: 2.1.10
40
- gemfile: gemfiles/5.1.gemfile
41
- - rvm: 2.1.10
42
- gemfile: gemfiles/5.2.gemfile
43
- - rvm: 2.1.10
44
- gemfile: gemfiles/6.0.gemfile
45
- - rvm: 2.2.2
46
- gemfile: gemfiles/6.0.gemfile
47
- - rvm: 2.3.8
48
- gemfile: gemfiles/6.0.gemfile
49
- - rvm: 2.4.9
50
- gemfile: gemfiles/6.0.gemfile
51
-
52
- before_install:
53
- - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
54
- - gem install bundler --version=1.17.3
55
-
56
- script:
57
- - RAILS_ENV=test bundle exec rake spec && bundle exec codeclimate-test-reporter
58
-
59
- cache: bundler
60
- sudo: false