switchman 1.1.0 → 1.2.0

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 (46) hide show
  1. checksums.yaml +8 -8
  2. data/app/models/switchman/shard.rb +10 -3
  3. data/lib/switchman/active_record/association.rb +36 -10
  4. data/lib/switchman/active_record/base.rb +9 -5
  5. data/lib/switchman/active_record/calculations.rb +12 -11
  6. data/lib/switchman/active_record/connection_handler.rb +102 -47
  7. data/lib/switchman/active_record/finder_methods.rb +1 -1
  8. data/lib/switchman/active_record/query_methods.rb +50 -25
  9. data/lib/switchman/active_record/relation.rb +4 -4
  10. data/lib/switchman/active_record/spawn_methods.rb +76 -29
  11. data/lib/switchman/connection_pool_proxy.rb +2 -1
  12. data/lib/switchman/database_server.rb +4 -2
  13. data/lib/switchman/engine.rb +1 -1
  14. data/lib/switchman/r_spec_helper.rb +14 -6
  15. data/lib/switchman/rails.rb +7 -9
  16. data/lib/switchman/test_helper.rb +4 -3
  17. data/lib/switchman/version.rb +1 -1
  18. data/spec/dummy/app/models/appendage.rb +2 -4
  19. data/spec/dummy/app/models/digit.rb +2 -4
  20. data/spec/dummy/app/models/feature.rb +0 -2
  21. data/spec/dummy/app/models/user.rb +0 -2
  22. data/spec/dummy/config/application.rb +0 -6
  23. data/spec/dummy/config/environments/development.rb +2 -9
  24. data/spec/dummy/config/environments/production.rb +2 -3
  25. data/spec/dummy/config/environments/test.rb +2 -11
  26. data/spec/dummy/config/routes.rb +2 -2
  27. data/spec/dummy/log/test.log +9947 -0
  28. data/spec/dummy/tmp/cache/375/530/shard%2F3200 +1 -0
  29. data/spec/dummy/tmp/cache/37A/590/shard%2F3214 +1 -0
  30. data/spec/dummy/tmp/cache/37E/620/shard%2F3182 +0 -0
  31. data/spec/dummy/tmp/cache/381/650/shard%2F3185 +1 -0
  32. data/spec/dummy/tmp/cache/382/650/shard%2F3177 +1 -0
  33. data/spec/dummy/tmp/cache/386/6B0/shard%2F3199 +1 -0
  34. data/spec/dummy/tmp/cache/3A6/F80/shard%2F13200 +1 -0
  35. data/spec/dummy/tmp/cache/3B0/080/shard%2F13183 +1 -0
  36. data/spec/dummy/tmp/cache/3B1/070/shard%2F13166 +1 -0
  37. data/spec/lib/active_record/association_spec.rb +21 -11
  38. data/spec/lib/active_record/finder_methods_spec.rb +1 -1
  39. data/spec/lib/active_record/query_cache_spec.rb +17 -17
  40. data/spec/lib/active_record/query_methods_spec.rb +6 -5
  41. data/spec/lib/active_record/relation_spec.rb +1 -1
  42. data/spec/lib/active_record/spawn_methods_spec.rb +5 -4
  43. data/spec/lib/connection_pool_proxy_spec.rb +2 -0
  44. data/spec/lib/database_server_spec.rb +12 -4
  45. data/spec/lib/shackles_spec.rb +8 -6
  46. metadata +61 -11
@@ -0,0 +1 @@
1
+ o: ActiveSupport::Cache::Entry: @value{ I"id:ETi� I" name;TI"switchman_test_shard_3200;TI"database_server_id;TI"1;TI" default;TF:@created_atf1395766435.695145:@expires_in0
@@ -0,0 +1 @@
1
+ o: ActiveSupport::Cache::Entry: @value:nil:@created_atf1395766435.522779:@expires_in0
@@ -0,0 +1 @@
1
+ o: ActiveSupport::Cache::Entry :@compressedF:@expires_in0:@created_atf1395766408.469534: @value" :nil
@@ -0,0 +1 @@
1
+ o: ActiveSupport::Cache::Entry :@compressedF:@expires_in0:@created_atf1395678017.3012779: @value" :nil
@@ -0,0 +1 @@
1
+ o: ActiveSupport::Cache::Entry: @value{ I"id:ETi I" name;TI"switchman_test_shard_3199;TI"database_server_id;TI" test;TI" default;TF:@created_atf1395766435.693439:@expires_in0
@@ -0,0 +1 @@
1
+ o: ActiveSupport::Cache::Entry: @value:nil:@created_atf1395766435.380675:@expires_in0
@@ -0,0 +1 @@
1
+ o: ActiveSupport::Cache::Entry :@compressedF:@expires_in0:@created_atf1395766408.394197: @value" :nil
@@ -0,0 +1 @@
1
+ o: ActiveSupport::Cache::Entry :@compressedF:@expires_in0:@created_atf1395678017.240988: @value" :nil
@@ -25,7 +25,8 @@ module Switchman
25
25
  end
26
26
 
27
27
  it "should set shard value to parent for association scope" do
28
- scope = @user1.appendages.scoped
28
+ scope = @user1.appendages
29
+ scope = ::Rails.version < '4' ? scope.scoped : scope.scope
29
30
  scope.shard_value.should == @user1
30
31
  scope.shard_source_value.should == :association
31
32
  end
@@ -39,9 +40,10 @@ module Switchman
39
40
 
40
41
  describe "transaction" do
41
42
  it "should activate the owner's shard and start the transaction on that shard" do
43
+ base_value = @user1.shard.activate { User.connection.open_transactions }
42
44
  @user1.appendages.transaction(:requires_new => true) do
43
45
  Shard.current.should == @shard1
44
- User.connection.open_transactions.should == 2
46
+ User.connection.open_transactions.should == base_value + 1
45
47
  end
46
48
  end
47
49
  end
@@ -66,7 +68,11 @@ module Switchman
66
68
  d1 = a1.digits.create!
67
69
  d1.shard.should == @shard1
68
70
 
69
- @user1.digits.scoped.shard_value.should == @user1
71
+ if ::Rails.version < '4'
72
+ @user1.digits.scoped.shard_value.should == @user1
73
+ else
74
+ @user1.digits.scope.shard_value.should == @user1
75
+ end
70
76
  @user1.digits.find(d1.id).should == d1
71
77
  end
72
78
 
@@ -99,9 +105,15 @@ module Switchman
99
105
  it "should properly set up a cross-shard-category query" do
100
106
  @shard1.activate(:mirror_universe) do
101
107
  mirror_user = MirrorUser.create!
102
- relation = mirror_user.association(:user).scoped
108
+ relation = mirror_user.association(:user)
109
+ relation = ::Rails.version < '4' ? relation.scoped : relation.scope
103
110
  relation.shard_value.should == Shard.default
104
- relation.where_values.first.right.should == mirror_user.global_id
111
+ if ::Rails.version < '4'
112
+ relation.where_values.first.right.should == mirror_user.global_id
113
+ else
114
+ relation.where_values.first.right.should be_a(Arel::Nodes::BindParam)
115
+ relation.bind_values.map(&:last).should == [mirror_user.global_id]
116
+ end
105
117
  end
106
118
  end
107
119
 
@@ -229,12 +241,10 @@ module Switchman
229
241
  user3 = User.create!
230
242
  user3.appendages.create!
231
243
 
232
- appendages = Appendage.all(:include => :user)
233
- appendages2 = Appendage.includes(:user).all
244
+ appendages = Appendage.includes(:user).to_a
234
245
  @user1.delete
235
246
 
236
247
  appendages.map(&:user).sort.should == [@user1, @user2, user3].sort
237
- appendages2.map(&:user).sort.should == [@user1, @user2, user3].sort
238
248
  end
239
249
 
240
250
  it "should preload belongs_to :through associations across shards" do
@@ -244,7 +254,7 @@ module Switchman
244
254
  a2 = @shard1.activate {Appendage.create!(:user => @user2) }
245
255
  d2 = Digit.create!(:appendage => a2)
246
256
 
247
- digits = Digit.includes(:user).all
257
+ digits = Digit.includes(:user).to_a
248
258
  @user1.delete
249
259
 
250
260
  digits.map(&:user).sort.should == [@user1, @user2].sort
@@ -258,7 +268,7 @@ module Switchman
258
268
  User.associated_shards_map = { @user1.global_id => [@shard1, @shard2] }
259
269
 
260
270
  begin
261
- users = User.where(:id => [@user1, @user2]).includes(:appendages).all
271
+ users = User.where(:id => [@user1, @user2]).includes(:appendages).to_a
262
272
  users.each {|u| u.appendages.loaded?.should be_true}
263
273
 
264
274
  u1 = users.detect {|u| u.id == @user1.id}
@@ -294,7 +304,7 @@ module Switchman
294
304
  Appendage.associated_shards_map = { a2.global_id => [@shard1, @shard2], a6.global_id => [@shard1] }
295
305
 
296
306
  begin
297
- users = User.where(:id => [@user1, @user2]).includes(:digits).all
307
+ users = User.where(:id => [@user1, @user2]).includes(:digits).to_a
298
308
  users.each {|u| u.digits.loaded?.should be_true}
299
309
 
300
310
  u1 = users.detect {|u| u.id == @user1.id}
@@ -43,7 +43,7 @@ module Switchman
43
43
 
44
44
  it "should work for a multi-shard scope" do
45
45
  user2 = @shard2.activate { User.create!(name: "multi-shard exists") }
46
- User.where(name: "multi-shard exists").shard(Shard.scoped).exists?.should be_true
46
+ User.where(name: "multi-shard exists").shard(::Rails.version < '4' ? Shard.scoped : Shard.all).exists?.should be_true
47
47
  end
48
48
  end
49
49
  end
@@ -52,7 +52,7 @@ module Switchman
52
52
  @shard3.activate do
53
53
  User.create!
54
54
  end
55
- @shard1.activate { User.all }.should_not == @shard3.activate { User.all }
55
+ @shard1.activate { User.all.to_a }.should_not == @shard3.activate { User.all.to_a }
56
56
  end
57
57
 
58
58
  describe "query_cache_enabled" do
@@ -167,13 +167,13 @@ module Switchman
167
167
  describe "select_all" do
168
168
  it "should cache when query cache enabled" do
169
169
  User.connection.enable_query_cache!
170
- User.all
170
+ User.all.to_a
171
171
  User.connection.query_cache.should_not be_empty
172
172
  end
173
173
 
174
174
  it "should not cache when query cache disabled" do
175
175
  User.connection.disable_query_cache!
176
- User.all
176
+ User.all.to_a
177
177
  User.connection.query_cache.should be_empty
178
178
  end
179
179
 
@@ -181,12 +181,12 @@ module Switchman
181
181
  User.connection.disable_query_cache!
182
182
  threaded(
183
183
  lambda{ |cc| User.connection.cache{ cc.call } },
184
- lambda{ User.all; User.connection.query_cache.should be_empty })
184
+ lambda{ User.all.to_a; User.connection.query_cache.should be_empty })
185
185
  end
186
186
 
187
187
  it "should not cache when query is locked" do
188
188
  User.connection.enable_query_cache!
189
- User.lock.all
189
+ User.lock.to_a
190
190
  User.connection.query_cache.should be_empty
191
191
  end
192
192
  end
@@ -194,14 +194,14 @@ module Switchman
194
194
  describe "insert" do
195
195
  it "should clear thread's query cache if enabled" do
196
196
  User.connection.enable_query_cache!
197
- User.all
197
+ User.all.to_a
198
198
  User.create!
199
199
  User.connection.query_cache.should be_empty
200
200
  end
201
201
 
202
202
  it "should not clear thread's query cache if disabled" do
203
203
  User.connection.enable_query_cache!
204
- User.all
204
+ User.all.to_a
205
205
  User.connection.disable_query_cache!
206
206
  User.create!
207
207
  User.connection.query_cache.should_not be_empty
@@ -209,7 +209,7 @@ module Switchman
209
209
 
210
210
  it "should not clear thread's query cache if disabled but other thread's enabled" do
211
211
  User.connection.enable_query_cache!
212
- User.all
212
+ User.all.to_a
213
213
  User.connection.disable_query_cache!
214
214
  threaded(
215
215
  lambda{ |cc| User.create!; cc.call },
@@ -218,7 +218,7 @@ module Switchman
218
218
 
219
219
  it "should not clear other thread's query cache" do
220
220
  User.connection.enable_query_cache!
221
- User.all
221
+ User.all.to_a
222
222
  User.connection.disable_query_cache!
223
223
  threaded(
224
224
  lambda{ |cc| User.create!; cc.call },
@@ -233,14 +233,14 @@ module Switchman
233
233
 
234
234
  it "should clear thread's query cache if enabled" do
235
235
  User.connection.enable_query_cache!
236
- User.all
236
+ User.all.to_a
237
237
  User.update_all(updated_at: Time.now)
238
238
  User.connection.query_cache.should be_empty
239
239
  end
240
240
 
241
241
  it "should not clear thread's query cache if disabled" do
242
242
  User.connection.enable_query_cache!
243
- User.all
243
+ User.all.to_a
244
244
  User.connection.disable_query_cache!
245
245
  User.update_all(updated_at: Time.now)
246
246
  User.connection.query_cache.should_not be_empty
@@ -257,7 +257,7 @@ module Switchman
257
257
 
258
258
  it "should not clear thread's query cache if disabled but other thread's enabled" do
259
259
  User.connection.enable_query_cache!
260
- User.all
260
+ User.all.to_a
261
261
  User.connection.disable_query_cache!
262
262
  threaded(
263
263
  lambda{ |cc| User.update_all(updated_at: Time.now); cc.call },
@@ -266,7 +266,7 @@ module Switchman
266
266
 
267
267
  it "should not clear other thread's query cache" do
268
268
  User.connection.enable_query_cache!
269
- User.all
269
+ User.all.to_a
270
270
  User.connection.disable_query_cache!
271
271
  threaded(
272
272
  lambda{ |cc| User.update_all(updated_at: Time.now); cc.call },
@@ -282,14 +282,14 @@ module Switchman
282
282
 
283
283
  it "should clear thread's query cache if enabled" do
284
284
  User.connection.enable_query_cache!
285
- User.all
285
+ User.all.to_a
286
286
  User.delete_all
287
287
  User.connection.query_cache.should be_empty
288
288
  end
289
289
 
290
290
  it "should not clear thread's query cache if disabled" do
291
291
  User.connection.enable_query_cache!
292
- User.all
292
+ User.all.to_a
293
293
  User.connection.disable_query_cache!
294
294
  User.delete_all
295
295
  User.connection.query_cache.should_not be_empty
@@ -306,7 +306,7 @@ module Switchman
306
306
 
307
307
  it "should not clear thread's query cache if disabled but other thread's enabled" do
308
308
  User.connection.enable_query_cache!
309
- User.all
309
+ User.all.to_a
310
310
  User.connection.disable_query_cache!
311
311
  threaded(
312
312
  lambda{ |cc| User.delete_all; cc.call },
@@ -315,7 +315,7 @@ module Switchman
315
315
 
316
316
  it "should not clear other thread's query cache" do
317
317
  User.connection.enable_query_cache!
318
- User.all
318
+ User.all.to_a
319
319
  User.connection.disable_query_cache!
320
320
  threaded(
321
321
  lambda{ |cc| User.delete_all; cc.call },
@@ -31,22 +31,22 @@ module Switchman
31
31
  end
32
32
 
33
33
  it "should be the default shard if it's a scope of Shard" do
34
- User.shard(Shard.scoped).primary_shard.should == Shard.default
34
+ User.shard(::Rails.version < '4' ? Shard.scoped : Shard.all).primary_shard.should == Shard.default
35
35
  @shard1.activate do
36
- User.shard(Shard.scoped).primary_shard.should == Shard.default
36
+ User.shard(::Rails.version < '4' ? Shard.scoped : Shard.all).primary_shard.should == Shard.default
37
37
  end
38
38
  end
39
39
  end
40
40
 
41
41
  it "should default to the current shard" do
42
- relation = User.scoped
42
+ relation = ::Rails.version < '4' ? User.scoped : User.all
43
43
  relation.shard_value.should == Shard.default
44
44
  relation.shard_source_value.should == :implicit
45
45
 
46
46
  @shard1.activate do
47
47
  relation.shard_value.should == Shard.default
48
48
 
49
- relation = User.scoped
49
+ relation = ::Rails.version < '4' ? User.scoped : User.all
50
50
  relation.shard_value.should == @shard1
51
51
  relation.shard_source_value.should == :implicit
52
52
  end
@@ -145,7 +145,8 @@ module Switchman
145
145
  grandchild = child.children.create!
146
146
  child.reload.parent.should == @user1
147
147
 
148
- relation = @user1.association(:grandchildren).scoped
148
+ relation = @user1.association(:grandchildren)
149
+ relation = ::Rails.version < '4' ? relation.scoped : relation.scope
149
150
 
150
151
  attribute = relation.where_values.first.left
151
152
  attribute.name.to_s.should == 'parent_id'
@@ -16,7 +16,7 @@ module Switchman
16
16
  end
17
17
 
18
18
  it "should activate multiple shards if necessary" do
19
- User.where(:id => [@user1.id, @user2.id]).all.sort_by(&:id).should == [@user1, @user2].sort_by(&:id)
19
+ User.where(:id => [@user1.id, @user2.id]).sort_by(&:id).should == [@user1, @user2].sort_by(&:id)
20
20
  end
21
21
  end
22
22
 
@@ -20,20 +20,21 @@ module Switchman
20
20
  end
21
21
 
22
22
  it "should ignore implicit shard value lhs" do
23
- result = User.scoped.merge(User.shard(@shard1))
23
+ scope = ::Rails.version < '4' ? User.scoped : User.all
24
+ result = scope.merge(User.shard(@shard1))
24
25
  result.shard_value.should == @shard1
25
26
  result.shard_source_value.should == :explicit
26
27
  end
27
28
 
28
29
  it "should ignore implicit shard value rhs" do
29
- result = User.shard(@shard1).merge(User.scoped)
30
+ result = User.shard(@shard1).merge(::Rails.version < '4' ? User.scoped : User.all)
30
31
  result.shard_value.should == @shard1
31
32
  result.shard_source_value.should == :explicit
32
33
  end
33
34
 
34
35
  it "should take lhs shard_value for double implicit" do
35
- scope1 = @shard2.activate { User.scoped }
36
- result = scope1.merge(User.scoped)
36
+ scope1 = @shard2.activate { ::Rails.version < '4' ? User.scoped : User.all }
37
+ result = scope1.merge(::Rails.version < '4' ? User.scoped : User.all)
37
38
  result.shard_value.should == @shard2
38
39
  result.shard_source_value.should == :implicit
39
40
  end
@@ -2,6 +2,8 @@ require "spec_helper"
2
2
 
3
3
  module Switchman
4
4
  describe ConnectionPoolProxy do
5
+ include RSpecHelper
6
+
5
7
  it "should not share connections for sqlite shards on the same db" do
6
8
  @db = DatabaseServer.create(:config => { :adapter => 'sqlite3', :database => ':memory:' })
7
9
  @sqlite_shard1 = @db.shards.create!
@@ -66,8 +66,12 @@ module Switchman
66
66
  end
67
67
 
68
68
  it "should be able to create a new sqlite shard from a given server" do
69
- @db = DatabaseServer.create(:config => { :adapter => 'sqlite3', :database => '%{shard_name}', :shard_name => ':memory:' })
70
- create_shard(@db)
69
+ db = DatabaseServer.create(:config => { :adapter => 'sqlite3', :database => '%{shard_name}', :shard_name => ':memory:' })
70
+ begin
71
+ create_shard(db)
72
+ ensure
73
+ db.destroy
74
+ end
71
75
  end
72
76
 
73
77
  context "non-transactional" do
@@ -83,8 +87,12 @@ module Switchman
83
87
  pending 'A "real" database"' unless %w{MySQL Mysql2 PostgreSQL}.include?(adapter)
84
88
 
85
89
  # So, it's really the same server, but we want separate connections
86
- server = DatabaseServer.create(:config => Shard.default.database_server.config)
87
- create_shard(server)
90
+ db = DatabaseServer.create(:config => Shard.default.database_server.config)
91
+ begin
92
+ create_shard(db)
93
+ ensure
94
+ db.destroy
95
+ end
88
96
  end
89
97
 
90
98
  class MyException < Exception; end
@@ -23,11 +23,13 @@ module Switchman
23
23
  end
24
24
 
25
25
  it "should correctly set up pools for sharding categories" do
26
- models = ::ActiveRecord::Base.connection_handler.connection_pools
27
- default_pools = Hash[models.map { |k, v| [k, v.current_pool] }]
26
+ models = ::ActiveRecord::Base.connection_handler.send(:class_to_pool)
27
+ default_pools = {}
28
+ models.each_pair { |k, v| default_pools[k] = v.current_pool }
28
29
  ::Shackles.activate(:slave_that_no_one_else_uses) do
29
- models = ::ActiveRecord::Base.connection_handler.connection_pools
30
- pools = Hash[models.map { |k, v| [k, v.current_pool] }]
30
+ models = ::ActiveRecord::Base.connection_handler.send(:class_to_pool)
31
+ pools = {}
32
+ models.each_pair { |k, v| pools[k] = v.current_pool }
31
33
  default_pools.keys.sort.should == pools.keys.sort
32
34
  default_pools.keys.each do |model|
33
35
  default_pools[model].should_not == pools[model]
@@ -71,7 +73,7 @@ module Switchman
71
73
 
72
74
  u = User.create!
73
75
  Shard.default.database_server.expects(:unshackle).once.returns([])
74
- User.scoped(lock: true).first
76
+ User.lock.first
75
77
  Shard.default.database_server.expects(:unshackle).once.returns([])
76
78
  lambda { u.lock! }.should raise_error(::ActiveRecord::RecordNotFound)
77
79
  ensure
@@ -143,7 +145,7 @@ module Switchman
143
145
  end
144
146
 
145
147
  def actual_connection_count
146
- ::ActiveRecord::Base.connection_pool.current_pool.instance_variable_get(:@reserved_connections).length
148
+ ::ActiveRecord::Base.connection_pool.current_pool.instance_variable_get(:@reserved_connections).size
147
149
  end
148
150
 
149
151
  it "should really return active connections to the pool in all envs" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: switchman
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cody Cutrer
@@ -10,36 +10,68 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-03-21 00:00:00.000000000 Z
13
+ date: 2014-03-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: rails
16
+ name: railties
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 3.2.13
21
+ version: '3.2'
22
+ - - <
23
+ - !ruby/object:Gem::Version
24
+ version: '4.1'
22
25
  type: :runtime
23
26
  prerelease: false
24
27
  version_requirements: !ruby/object:Gem::Requirement
25
28
  requirements:
26
- - - ~>
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '3.2'
32
+ - - <
27
33
  - !ruby/object:Gem::Version
28
- version: 3.2.13
34
+ version: '4.1'
35
+ - !ruby/object:Gem::Dependency
36
+ name: activerecord
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '3.2'
42
+ - - <
43
+ - !ruby/object:Gem::Version
44
+ version: '4.1'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: '3.2'
52
+ - - <
53
+ - !ruby/object:Gem::Version
54
+ version: '4.1'
29
55
  - !ruby/object:Gem::Dependency
30
56
  name: shackles
31
57
  requirement: !ruby/object:Gem::Requirement
32
58
  requirements:
33
- - - ~>
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.3
62
+ - - <
34
63
  - !ruby/object:Gem::Version
35
- version: 1.0.2
64
+ version: '2'
36
65
  type: :runtime
37
66
  prerelease: false
38
67
  version_requirements: !ruby/object:Gem::Requirement
39
68
  requirements:
40
- - - ~>
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: 1.0.3
72
+ - - <
41
73
  - !ruby/object:Gem::Version
42
- version: 1.0.2
74
+ version: '2'
43
75
  - !ruby/object:Gem::Dependency
44
76
  name: debugger
45
77
  requirement: !ruby/object:Gem::Requirement
@@ -383,6 +415,7 @@ files:
383
415
  - spec/dummy/tmp/cache/374/490/shard%2F1012
384
416
  - spec/dummy/tmp/cache/375/4C0/shard%2F2003
385
417
  - spec/dummy/tmp/cache/375/510/shard%2F1400
418
+ - spec/dummy/tmp/cache/375/530/shard%2F3200
386
419
  - spec/dummy/tmp/cache/376/4E0/shard%2F1041
387
420
  - spec/dummy/tmp/cache/376/4E0/shard%2F1203
388
421
  - spec/dummy/tmp/cache/376/4F0/shard%2F1212
@@ -449,6 +482,7 @@ files:
449
482
  - spec/dummy/tmp/cache/37A/580/shard%2F1261
450
483
  - spec/dummy/tmp/cache/37A/580/shard%2F3043
451
484
  - spec/dummy/tmp/cache/37A/590/shard%2F3052
485
+ - spec/dummy/tmp/cache/37A/590/shard%2F3214
452
486
  - spec/dummy/tmp/cache/37A/5A0/shard%2F3061
453
487
  - spec/dummy/tmp/cache/37A/5B0/shard%2F3070
454
488
  - spec/dummy/tmp/cache/37A/5C0/shard%2F1702
@@ -543,6 +577,7 @@ files:
543
577
  - spec/dummy/tmp/cache/37E/610/shard%2F2606
544
578
  - spec/dummy/tmp/cache/37E/620/shard%2F1805
545
579
  - spec/dummy/tmp/cache/37E/620/shard%2F2615
580
+ - spec/dummy/tmp/cache/37E/620/shard%2F3182
546
581
  - spec/dummy/tmp/cache/37E/630/shard%2F2624
547
582
  - spec/dummy/tmp/cache/37E/630/shard%2F2705
548
583
  - spec/dummy/tmp/cache/37E/640/shard%2F1661
@@ -614,6 +649,7 @@ files:
614
649
  - spec/dummy/tmp/cache/381/640/shard%2F2609
615
650
  - spec/dummy/tmp/cache/381/640/shard%2F3095
616
651
  - spec/dummy/tmp/cache/381/650/shard%2F1565
652
+ - spec/dummy/tmp/cache/381/650/shard%2F3185
617
653
  - spec/dummy/tmp/cache/381/660/shard%2F1493
618
654
  - spec/dummy/tmp/cache/381/660/shard%2F2627
619
655
  - spec/dummy/tmp/cache/381/670/shard%2F1745
@@ -637,6 +673,7 @@ files:
637
673
  - spec/dummy/tmp/cache/382/640/shard%2F2196
638
674
  - spec/dummy/tmp/cache/382/650/shard%2F1557
639
675
  - spec/dummy/tmp/cache/382/650/shard%2F3096
676
+ - spec/dummy/tmp/cache/382/650/shard%2F3177
640
677
  - spec/dummy/tmp/cache/382/660/shard%2F2376
641
678
  - spec/dummy/tmp/cache/382/670/shard%2F2628
642
679
  - spec/dummy/tmp/cache/382/690/shard%2F1674
@@ -681,6 +718,7 @@ files:
681
718
  - spec/dummy/tmp/cache/385/6F0/shard%2F2595
682
719
  - spec/dummy/tmp/cache/385/710/shard%2F2694
683
720
  - spec/dummy/tmp/cache/386/690/shard%2F1399
721
+ - spec/dummy/tmp/cache/386/6B0/shard%2F3199
684
722
  - spec/dummy/tmp/cache/386/6C0/shard%2F2479
685
723
  - spec/dummy/tmp/cache/386/6D0/shard%2F1759
686
724
  - spec/dummy/tmp/cache/386/6F0/shard%2F1858
@@ -700,6 +738,7 @@ files:
700
738
  - spec/dummy/tmp/cache/3A5/ED0/shard%2F10031
701
739
  - spec/dummy/tmp/cache/3A6/EB0/shard%2F10005
702
740
  - spec/dummy/tmp/cache/3A6/ED0/shard%2F10104
741
+ - spec/dummy/tmp/cache/3A6/F80/shard%2F13200
703
742
  - spec/dummy/tmp/cache/3A7/EC0/shard%2F10006
704
743
  - spec/dummy/tmp/cache/3A7/F10/shard%2F10051
705
744
  - spec/dummy/tmp/cache/3A8/F50/shard%2F10322
@@ -752,6 +791,7 @@ files:
752
791
  - spec/dummy/tmp/cache/3B0/010/shard%2F12229
753
792
  - spec/dummy/tmp/cache/3B0/040/shard%2F10636
754
793
  - spec/dummy/tmp/cache/3B0/060/shard%2F11626
794
+ - spec/dummy/tmp/cache/3B0/080/shard%2F13183
755
795
  - spec/dummy/tmp/cache/3B0/0A0/shard%2F12634
756
796
  - spec/dummy/tmp/cache/3B0/0B0/shard%2F10942
757
797
  - spec/dummy/tmp/cache/3B0/FC0/shard%2F10159
@@ -760,6 +800,7 @@ files:
760
800
  - spec/dummy/tmp/cache/3B1/050/shard%2F11609
761
801
  - spec/dummy/tmp/cache/3B1/070/shard%2F10574
762
802
  - spec/dummy/tmp/cache/3B1/070/shard%2F11465
803
+ - spec/dummy/tmp/cache/3B1/070/shard%2F13166
763
804
  - spec/dummy/tmp/cache/3B1/090/shard%2F12536
764
805
  - spec/dummy/tmp/cache/3B1/0A0/shard%2F11492
765
806
  - spec/dummy/tmp/cache/3B1/0A0/shard%2F11654
@@ -1212,6 +1253,7 @@ test_files:
1212
1253
  - spec/dummy/tmp/cache/374/490/shard%2F1012
1213
1254
  - spec/dummy/tmp/cache/375/4C0/shard%2F2003
1214
1255
  - spec/dummy/tmp/cache/375/510/shard%2F1400
1256
+ - spec/dummy/tmp/cache/375/530/shard%2F3200
1215
1257
  - spec/dummy/tmp/cache/376/4E0/shard%2F1041
1216
1258
  - spec/dummy/tmp/cache/376/4E0/shard%2F1203
1217
1259
  - spec/dummy/tmp/cache/376/4F0/shard%2F1212
@@ -1278,6 +1320,7 @@ test_files:
1278
1320
  - spec/dummy/tmp/cache/37A/580/shard%2F1261
1279
1321
  - spec/dummy/tmp/cache/37A/580/shard%2F3043
1280
1322
  - spec/dummy/tmp/cache/37A/590/shard%2F3052
1323
+ - spec/dummy/tmp/cache/37A/590/shard%2F3214
1281
1324
  - spec/dummy/tmp/cache/37A/5A0/shard%2F3061
1282
1325
  - spec/dummy/tmp/cache/37A/5B0/shard%2F3070
1283
1326
  - spec/dummy/tmp/cache/37A/5C0/shard%2F1702
@@ -1372,6 +1415,7 @@ test_files:
1372
1415
  - spec/dummy/tmp/cache/37E/610/shard%2F2606
1373
1416
  - spec/dummy/tmp/cache/37E/620/shard%2F1805
1374
1417
  - spec/dummy/tmp/cache/37E/620/shard%2F2615
1418
+ - spec/dummy/tmp/cache/37E/620/shard%2F3182
1375
1419
  - spec/dummy/tmp/cache/37E/630/shard%2F2624
1376
1420
  - spec/dummy/tmp/cache/37E/630/shard%2F2705
1377
1421
  - spec/dummy/tmp/cache/37E/640/shard%2F1661
@@ -1443,6 +1487,7 @@ test_files:
1443
1487
  - spec/dummy/tmp/cache/381/640/shard%2F2609
1444
1488
  - spec/dummy/tmp/cache/381/640/shard%2F3095
1445
1489
  - spec/dummy/tmp/cache/381/650/shard%2F1565
1490
+ - spec/dummy/tmp/cache/381/650/shard%2F3185
1446
1491
  - spec/dummy/tmp/cache/381/660/shard%2F1493
1447
1492
  - spec/dummy/tmp/cache/381/660/shard%2F2627
1448
1493
  - spec/dummy/tmp/cache/381/670/shard%2F1745
@@ -1466,6 +1511,7 @@ test_files:
1466
1511
  - spec/dummy/tmp/cache/382/640/shard%2F2196
1467
1512
  - spec/dummy/tmp/cache/382/650/shard%2F1557
1468
1513
  - spec/dummy/tmp/cache/382/650/shard%2F3096
1514
+ - spec/dummy/tmp/cache/382/650/shard%2F3177
1469
1515
  - spec/dummy/tmp/cache/382/660/shard%2F2376
1470
1516
  - spec/dummy/tmp/cache/382/670/shard%2F2628
1471
1517
  - spec/dummy/tmp/cache/382/690/shard%2F1674
@@ -1510,6 +1556,7 @@ test_files:
1510
1556
  - spec/dummy/tmp/cache/385/6F0/shard%2F2595
1511
1557
  - spec/dummy/tmp/cache/385/710/shard%2F2694
1512
1558
  - spec/dummy/tmp/cache/386/690/shard%2F1399
1559
+ - spec/dummy/tmp/cache/386/6B0/shard%2F3199
1513
1560
  - spec/dummy/tmp/cache/386/6C0/shard%2F2479
1514
1561
  - spec/dummy/tmp/cache/386/6D0/shard%2F1759
1515
1562
  - spec/dummy/tmp/cache/386/6F0/shard%2F1858
@@ -1529,6 +1576,7 @@ test_files:
1529
1576
  - spec/dummy/tmp/cache/3A5/ED0/shard%2F10031
1530
1577
  - spec/dummy/tmp/cache/3A6/EB0/shard%2F10005
1531
1578
  - spec/dummy/tmp/cache/3A6/ED0/shard%2F10104
1579
+ - spec/dummy/tmp/cache/3A6/F80/shard%2F13200
1532
1580
  - spec/dummy/tmp/cache/3A7/EC0/shard%2F10006
1533
1581
  - spec/dummy/tmp/cache/3A7/F10/shard%2F10051
1534
1582
  - spec/dummy/tmp/cache/3A8/F50/shard%2F10322
@@ -1581,6 +1629,7 @@ test_files:
1581
1629
  - spec/dummy/tmp/cache/3B0/010/shard%2F12229
1582
1630
  - spec/dummy/tmp/cache/3B0/040/shard%2F10636
1583
1631
  - spec/dummy/tmp/cache/3B0/060/shard%2F11626
1632
+ - spec/dummy/tmp/cache/3B0/080/shard%2F13183
1584
1633
  - spec/dummy/tmp/cache/3B0/0A0/shard%2F12634
1585
1634
  - spec/dummy/tmp/cache/3B0/0B0/shard%2F10942
1586
1635
  - spec/dummy/tmp/cache/3B0/FC0/shard%2F10159
@@ -1589,6 +1638,7 @@ test_files:
1589
1638
  - spec/dummy/tmp/cache/3B1/050/shard%2F11609
1590
1639
  - spec/dummy/tmp/cache/3B1/070/shard%2F10574
1591
1640
  - spec/dummy/tmp/cache/3B1/070/shard%2F11465
1641
+ - spec/dummy/tmp/cache/3B1/070/shard%2F13166
1592
1642
  - spec/dummy/tmp/cache/3B1/090/shard%2F12536
1593
1643
  - spec/dummy/tmp/cache/3B1/0A0/shard%2F11492
1594
1644
  - spec/dummy/tmp/cache/3B1/0A0/shard%2F11654