split 3.4.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
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