bullet 4.9.0 → 4.10.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.
- checksums.yaml +4 -4
- data/.rspec +1 -1
- data/.travis.yml +1 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile +1 -3
- data/Gemfile.mongoid +2 -3
- data/Gemfile.mongoid-2.4 +0 -3
- data/Gemfile.mongoid-2.5 +0 -3
- data/Gemfile.mongoid-2.6 +0 -3
- data/Gemfile.mongoid-2.7 +0 -3
- data/Gemfile.mongoid-2.8 +0 -3
- data/Gemfile.mongoid-3.0 +0 -3
- data/Gemfile.mongoid-3.1 +0 -3
- data/Gemfile.mongoid-4.0 +19 -0
- data/Gemfile.rails-3.0 +0 -2
- data/Gemfile.rails-3.1 +1 -3
- data/Gemfile.rails-3.2 +1 -3
- data/Gemfile.rails-4.0 +1 -3
- data/Gemfile.rails-4.1 +1 -3
- data/README.md +19 -2
- data/bullet.gemspec +4 -2
- data/lib/bullet.rb +39 -10
- data/lib/bullet/active_record3.rb +20 -2
- data/lib/bullet/active_record3x.rb +20 -2
- data/lib/bullet/active_record4.rb +20 -2
- data/lib/bullet/active_record41.rb +20 -2
- data/lib/bullet/detector/association.rb +14 -25
- data/lib/bullet/detector/base.rb +0 -6
- data/lib/bullet/detector/counter_cache.rb +10 -12
- data/lib/bullet/detector/n_plus_one_query.rb +12 -8
- data/lib/bullet/detector/unused_eager_loading.rb +5 -1
- data/lib/bullet/mongoid3x.rb +5 -4
- data/lib/bullet/mongoid4x.rb +5 -4
- data/lib/bullet/version.rb +1 -1
- data/spec/bullet/detector/association_spec.rb +0 -19
- data/spec/bullet/detector/base_spec.rb +0 -6
- data/spec/bullet/detector/counter_cache_spec.rb +0 -8
- data/spec/bullet/detector/n_plus_one_query_spec.rb +0 -6
- data/spec/bullet/detector/unused_eager_loading_spec.rb +0 -7
- data/spec/bullet/rack_spec.rb +1 -7
- data/spec/bullet/registry/object_spec.rb +0 -1
- data/spec/bullet_spec.rb +41 -0
- data/spec/integration/active_record3/association_spec.rb +18 -75
- data/spec/integration/active_record4/association_spec.rb +16 -75
- data/spec/integration/counter_cache_spec.rb +1 -1
- data/spec/integration/mongoid/association_spec.rb +0 -10
- data/spec/spec_helper.rb +17 -0
- data/spec/support/mongo_seed.rb +1 -1
- data/test.sh +1 -0
- metadata +7 -3
data/spec/bullet/rack_spec.rb
CHANGED
@@ -57,16 +57,10 @@ module Bullet
|
|
57
57
|
|
58
58
|
context "#call" do
|
59
59
|
context "when Bullet is enabled" do
|
60
|
-
it "should invoke Bullet.start_request and Bullet.end_request" do
|
61
|
-
expect(Bullet).to receive(:start_request)
|
62
|
-
expect(Bullet).to receive(:end_request)
|
63
|
-
middleware.call([])
|
64
|
-
end
|
65
|
-
|
66
60
|
it "should return original response body" do
|
67
61
|
expected_response = Support::ResponseDouble.new "Actual body"
|
68
62
|
app.response = expected_response
|
69
|
-
|
63
|
+
_, _, response = middleware.call([])
|
70
64
|
expect(response).to eq(expected_response)
|
71
65
|
end
|
72
66
|
|
data/spec/bullet_spec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bullet, focused: true do
|
4
|
+
subject { Bullet }
|
5
|
+
|
6
|
+
describe '#enable' do
|
7
|
+
|
8
|
+
context 'enable Bullet' do
|
9
|
+
before do
|
10
|
+
# Bullet.enable
|
11
|
+
# Do nothing. Bullet has already been enabled for the whole test suite.
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should be enabled' do
|
15
|
+
expect(subject).to be_enable
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'disable Bullet' do
|
19
|
+
before do
|
20
|
+
Bullet.enable = false
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should be disabled' do
|
24
|
+
expect(subject).to_not be_enable
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'enable Bullet again without patching again the orms' do
|
28
|
+
before do
|
29
|
+
Bullet::Mongoid.should_not_receive(:enable) if defined? Bullet::Mongoid
|
30
|
+
Bullet::ActiveRecord.should_not_receive(:enable) if defined? Bullet::ActiveRecord
|
31
|
+
Bullet.enable = true
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should be enabled again' do
|
35
|
+
expect(subject).to be_enable
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,16 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
if active_record3?
|
3
|
+
if !mongoid? && active_record3?
|
4
4
|
describe Bullet::Detector::Association, 'has_many' do
|
5
|
-
before(:each) do
|
6
|
-
Bullet.clear
|
7
|
-
Bullet.start_request
|
8
|
-
end
|
9
|
-
|
10
|
-
after(:each) do
|
11
|
-
Bullet.end_request
|
12
|
-
end
|
13
|
-
|
14
5
|
context "post => comments" do
|
15
6
|
it "should detect non preload post => comments" do
|
16
7
|
Post.all.each do |post|
|
@@ -101,6 +92,18 @@ if active_record3?
|
|
101
92
|
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
102
93
|
end
|
103
94
|
|
95
|
+
it "should detect preload with category => posts => comments with posts.id > 0" do
|
96
|
+
Category.includes({:posts => :comments}).where('posts.id > 0').each do |category|
|
97
|
+
category.posts.each do |post|
|
98
|
+
post.comments.map(&:name)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
102
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
103
|
+
|
104
|
+
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
105
|
+
end
|
106
|
+
|
104
107
|
it "should detect unused preload with category => posts => comments" do
|
105
108
|
Category.includes({:posts => :comments}).map(&:name)
|
106
109
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
@@ -207,6 +210,8 @@ if active_record3?
|
|
207
210
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
208
211
|
expect(Bullet::Detector::Association).not_to be_unused_preload_associations_for(Category, :posts)
|
209
212
|
expect(Bullet::Detector::Association).not_to be_unused_preload_associations_for(Post, :writer)
|
213
|
+
|
214
|
+
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
210
215
|
end
|
211
216
|
end
|
212
217
|
|
@@ -252,15 +257,6 @@ if active_record3?
|
|
252
257
|
end
|
253
258
|
|
254
259
|
describe Bullet::Detector::Association, 'belongs_to' do
|
255
|
-
before(:each) do
|
256
|
-
Bullet.clear
|
257
|
-
Bullet.start_request
|
258
|
-
end
|
259
|
-
|
260
|
-
after(:each) do
|
261
|
-
Bullet.end_request
|
262
|
-
end
|
263
|
-
|
264
260
|
context "comment => post" do
|
265
261
|
it "should detect non preload with comment => post" do
|
266
262
|
Comment.all.each do |comment|
|
@@ -340,8 +336,6 @@ if active_record3?
|
|
340
336
|
end
|
341
337
|
|
342
338
|
context "comment => author, post => writer" do
|
343
|
-
# this happens because the post isn't a possible object even though the writer is access through the post
|
344
|
-
# which leads to an 1+N queries
|
345
339
|
it "should detect non preloaded writer" do
|
346
340
|
Comment.includes([:author, :post]).where(["base_users.id = ?", BaseUser.first]).each do |comment|
|
347
341
|
comment.post.writer.name
|
@@ -352,32 +346,26 @@ if active_record3?
|
|
352
346
|
expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Post, :writer)
|
353
347
|
end
|
354
348
|
|
355
|
-
# this happens because the comment doesn't break down the hash into keys
|
356
|
-
# properly creating an association from comment to post
|
357
349
|
it "should detect unused preload with comment => author" do
|
358
350
|
Comment.includes([:author, {:post => :writer}]).where(["base_users.id = ?", BaseUser.first]).each do |comment|
|
359
351
|
comment.post.writer.name
|
360
352
|
end
|
361
353
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
362
|
-
expect(Bullet::Detector::Association).
|
354
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
363
355
|
|
364
356
|
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
365
357
|
end
|
366
358
|
|
367
|
-
# To flyerhzm: This does not detect that newspaper is unpreloaded. The association is
|
368
|
-
# not within possible objects, and thus cannot be detected as unpreloaded
|
369
359
|
it "should detect non preloading with writer => newspaper" do
|
370
360
|
Comment.all(:include => {:post => :writer}, :conditions => "posts.name like '%first%'").each do |comment|
|
371
361
|
comment.post.writer.newspaper.name
|
372
362
|
end
|
373
|
-
|
374
|
-
|
363
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
364
|
+
Bullet::Detector::Association.should_not be_has_unused_preload_associations
|
375
365
|
|
376
366
|
expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Writer, :newspaper)
|
377
367
|
end
|
378
368
|
|
379
|
-
# when we attempt to access category, there is an infinite overflow because load_target is hijacked leading to
|
380
|
-
# a repeating loop of calls in this test
|
381
369
|
it "should not raise a stack error from posts to category" do
|
382
370
|
expect {
|
383
371
|
Comment.includes({:post => :category}).each do |com|
|
@@ -389,15 +377,6 @@ if active_record3?
|
|
389
377
|
end
|
390
378
|
|
391
379
|
describe Bullet::Detector::Association, 'has_and_belongs_to_many' do
|
392
|
-
before(:each) do
|
393
|
-
Bullet.clear
|
394
|
-
Bullet.start_request
|
395
|
-
end
|
396
|
-
|
397
|
-
after(:each) do
|
398
|
-
Bullet.end_request
|
399
|
-
end
|
400
|
-
|
401
380
|
context "students <=> teachers" do
|
402
381
|
it "should detect non preload associations" do
|
403
382
|
Student.all.each do |student|
|
@@ -438,15 +417,6 @@ if active_record3?
|
|
438
417
|
end
|
439
418
|
|
440
419
|
describe Bullet::Detector::Association, 'has_many :through' do
|
441
|
-
before(:each) do
|
442
|
-
Bullet.clear
|
443
|
-
Bullet.start_request
|
444
|
-
end
|
445
|
-
|
446
|
-
after(:each) do
|
447
|
-
Bullet.end_request
|
448
|
-
end
|
449
|
-
|
450
420
|
context "firm => clients" do
|
451
421
|
it "should detect non preload associations" do
|
452
422
|
Firm.all.each do |firm|
|
@@ -487,15 +457,6 @@ if active_record3?
|
|
487
457
|
end
|
488
458
|
|
489
459
|
describe Bullet::Detector::Association, "has_one" do
|
490
|
-
before(:each) do
|
491
|
-
Bullet.clear
|
492
|
-
Bullet.start_request
|
493
|
-
end
|
494
|
-
|
495
|
-
after(:each) do
|
496
|
-
Bullet.end_request
|
497
|
-
end
|
498
|
-
|
499
460
|
context "company => address" do
|
500
461
|
it "should detect non preload association" do
|
501
462
|
Company.all.each do |company|
|
@@ -536,15 +497,6 @@ if active_record3?
|
|
536
497
|
end
|
537
498
|
|
538
499
|
describe Bullet::Detector::Association, "call one association that in possible objects" do
|
539
|
-
before(:each) do
|
540
|
-
Bullet.clear
|
541
|
-
Bullet.start_request
|
542
|
-
end
|
543
|
-
|
544
|
-
after(:each) do
|
545
|
-
Bullet.end_request
|
546
|
-
end
|
547
|
-
|
548
500
|
it "should not detect preload association" do
|
549
501
|
Post.all
|
550
502
|
Post.first.comments.map(&:name)
|
@@ -556,15 +508,6 @@ if active_record3?
|
|
556
508
|
end
|
557
509
|
|
558
510
|
describe Bullet::Detector::Association, "STI" do
|
559
|
-
before(:each) do
|
560
|
-
Bullet.clear
|
561
|
-
Bullet.start_request
|
562
|
-
end
|
563
|
-
|
564
|
-
after(:each) do
|
565
|
-
Bullet.end_request
|
566
|
-
end
|
567
|
-
|
568
511
|
context "page => author" do
|
569
512
|
it "should detect non preload associations" do
|
570
513
|
Page.all.each do |page|
|
@@ -1,16 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
if active_record4?
|
3
|
+
if !mongoid? && active_record4?
|
4
4
|
describe Bullet::Detector::Association, 'has_many' do
|
5
|
-
before(:each) do
|
6
|
-
Bullet.clear
|
7
|
-
Bullet.start_request
|
8
|
-
end
|
9
|
-
|
10
|
-
after(:each) do
|
11
|
-
Bullet.end_request
|
12
|
-
end
|
13
|
-
|
14
5
|
context "post => comments" do
|
15
6
|
it "should detect non preload post => comments" do
|
16
7
|
Post.all.each do |post|
|
@@ -101,6 +92,18 @@ if active_record4?
|
|
101
92
|
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
102
93
|
end
|
103
94
|
|
95
|
+
it "should detect preload with category => posts => comments with posts.id > 0" do
|
96
|
+
Category.includes({:posts => :comments}).where('posts.id > 0').references(:posts).each do |category|
|
97
|
+
category.posts.each do |post|
|
98
|
+
post.comments.map(&:name)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
102
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
103
|
+
|
104
|
+
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
105
|
+
end
|
106
|
+
|
104
107
|
it "should detect unused preload with category => posts => comments" do
|
105
108
|
Category.includes({:posts => :comments}).map(&:name)
|
106
109
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
@@ -252,15 +255,6 @@ if active_record4?
|
|
252
255
|
end
|
253
256
|
|
254
257
|
describe Bullet::Detector::Association, 'belongs_to' do
|
255
|
-
before(:each) do
|
256
|
-
Bullet.clear
|
257
|
-
Bullet.start_request
|
258
|
-
end
|
259
|
-
|
260
|
-
after(:each) do
|
261
|
-
Bullet.end_request
|
262
|
-
end
|
263
|
-
|
264
258
|
context "comment => post" do
|
265
259
|
it "should detect non preload with comment => post" do
|
266
260
|
Comment.all.each do |comment|
|
@@ -340,8 +334,6 @@ if active_record4?
|
|
340
334
|
end
|
341
335
|
|
342
336
|
context "comment => author, post => writer" do
|
343
|
-
# this happens because the post isn't a possible object even though the writer is access through the post
|
344
|
-
# which leads to an 1+N queries
|
345
337
|
it "should detect non preloaded writer" do
|
346
338
|
Comment.includes([:author, :post]).where(["base_users.id = ?", BaseUser.first]).references(:base_users).each do |comment|
|
347
339
|
comment.post.writer.name
|
@@ -352,32 +344,26 @@ if active_record4?
|
|
352
344
|
expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Post, :writer)
|
353
345
|
end
|
354
346
|
|
355
|
-
# this happens because the comment doesn't break down the hash into keys
|
356
|
-
# properly creating an association from comment to post
|
357
347
|
it "should detect unused preload with comment => author" do
|
358
348
|
Comment.includes([:author, {:post => :writer}]).where(["base_users.id = ?", BaseUser.first]).references(:base_users).each do |comment|
|
359
349
|
comment.post.writer.name
|
360
350
|
end
|
361
351
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
362
|
-
expect(Bullet::Detector::Association).
|
352
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
363
353
|
|
364
354
|
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
365
355
|
end
|
366
356
|
|
367
|
-
# To flyerhzm: This does not detect that newspaper is unpreloaded. The association is
|
368
|
-
# not within possible objects, and thus cannot be detected as unpreloaded
|
369
357
|
it "should detect non preloading with writer => newspaper" do
|
370
358
|
Comment.includes(:post => :writer).where("posts.name like '%first%'").references(:posts).each do |comment|
|
371
359
|
comment.post.writer.newspaper.name
|
372
360
|
end
|
373
|
-
|
374
|
-
|
361
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
362
|
+
Bullet::Detector::Association.should_not be_has_unused_preload_associations
|
375
363
|
|
376
364
|
expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Writer, :newspaper)
|
377
365
|
end
|
378
366
|
|
379
|
-
# when we attempt to access category, there is an infinite overflow because load_target is hijacked leading to
|
380
|
-
# a repeating loop of calls in this test
|
381
367
|
it "should not raise a stack error from posts to category" do
|
382
368
|
expect {
|
383
369
|
Comment.includes({:post => :category}).each do |com|
|
@@ -389,15 +375,6 @@ if active_record4?
|
|
389
375
|
end
|
390
376
|
|
391
377
|
describe Bullet::Detector::Association, 'has_and_belongs_to_many' do
|
392
|
-
before(:each) do
|
393
|
-
Bullet.clear
|
394
|
-
Bullet.start_request
|
395
|
-
end
|
396
|
-
|
397
|
-
after(:each) do
|
398
|
-
Bullet.end_request
|
399
|
-
end
|
400
|
-
|
401
378
|
context "students <=> teachers" do
|
402
379
|
it "should detect non preload associations" do
|
403
380
|
Student.all.each do |student|
|
@@ -438,15 +415,6 @@ if active_record4?
|
|
438
415
|
end
|
439
416
|
|
440
417
|
describe Bullet::Detector::Association, 'has_many :through' do
|
441
|
-
before(:each) do
|
442
|
-
Bullet.clear
|
443
|
-
Bullet.start_request
|
444
|
-
end
|
445
|
-
|
446
|
-
after(:each) do
|
447
|
-
Bullet.end_request
|
448
|
-
end
|
449
|
-
|
450
418
|
context "firm => clients" do
|
451
419
|
it "should detect non preload associations" do
|
452
420
|
Firm.all.each do |firm|
|
@@ -487,15 +455,6 @@ if active_record4?
|
|
487
455
|
end
|
488
456
|
|
489
457
|
describe Bullet::Detector::Association, "has_one" do
|
490
|
-
before(:each) do
|
491
|
-
Bullet.clear
|
492
|
-
Bullet.start_request
|
493
|
-
end
|
494
|
-
|
495
|
-
after(:each) do
|
496
|
-
Bullet.end_request
|
497
|
-
end
|
498
|
-
|
499
458
|
context "company => address" do
|
500
459
|
it "should detect non preload association" do
|
501
460
|
Company.all.each do |company|
|
@@ -536,15 +495,6 @@ if active_record4?
|
|
536
495
|
end
|
537
496
|
|
538
497
|
describe Bullet::Detector::Association, "call one association that in possible objects" do
|
539
|
-
before(:each) do
|
540
|
-
Bullet.clear
|
541
|
-
Bullet.start_request
|
542
|
-
end
|
543
|
-
|
544
|
-
after(:each) do
|
545
|
-
Bullet.end_request
|
546
|
-
end
|
547
|
-
|
548
498
|
it "should not detect preload association" do
|
549
499
|
Post.all
|
550
500
|
Post.first.comments.map(&:name)
|
@@ -556,15 +506,6 @@ if active_record4?
|
|
556
506
|
end
|
557
507
|
|
558
508
|
describe Bullet::Detector::Association, "STI" do
|
559
|
-
before(:each) do
|
560
|
-
Bullet.clear
|
561
|
-
Bullet.start_request
|
562
|
-
end
|
563
|
-
|
564
|
-
after(:each) do
|
565
|
-
Bullet.end_request
|
566
|
-
end
|
567
|
-
|
568
509
|
context "page => author" do
|
569
510
|
it "should detect non preload associations" do
|
570
511
|
Page.all.each do |page|
|
@@ -2,15 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
if mongoid?
|
4
4
|
describe Bullet::Detector::Association do
|
5
|
-
before(:each) do
|
6
|
-
Bullet.clear
|
7
|
-
Bullet.start_request
|
8
|
-
end
|
9
|
-
after(:each) do
|
10
|
-
Bullet.end_request
|
11
|
-
Mongoid::IdentityMap.clear
|
12
|
-
end
|
13
|
-
|
14
5
|
context 'embeds_many' do
|
15
6
|
context "posts => users" do
|
16
7
|
it "should detect nothing" do
|
@@ -213,7 +204,6 @@ if mongoid?
|
|
213
204
|
context "has_one" do
|
214
205
|
context "company => address" do
|
215
206
|
if Mongoid::VERSION !~ /\A3.0/
|
216
|
-
# mongodid 3.0.x doesn't set relation properly, it will query company for each address which causes n+1 query.
|
217
207
|
it "should detect non preload association" do
|
218
208
|
Mongoid::Company.all.each do |company|
|
219
209
|
company.address.name
|