bullet 6.0.2 → 7.0.3
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/.github/workflows/main.yml +82 -0
- data/CHANGELOG.md +52 -0
- data/Gemfile.rails-6.0 +1 -1
- data/Gemfile.rails-6.1 +15 -0
- data/Gemfile.rails-7.0 +10 -0
- data/README.md +39 -25
- data/lib/bullet/active_job.rb +1 -3
- data/lib/bullet/active_record4.rb +9 -23
- data/lib/bullet/active_record41.rb +8 -19
- data/lib/bullet/active_record42.rb +9 -16
- data/lib/bullet/active_record5.rb +188 -170
- data/lib/bullet/active_record52.rb +182 -162
- data/lib/bullet/active_record60.rb +191 -178
- data/lib/bullet/active_record61.rb +272 -0
- data/lib/bullet/active_record70.rb +275 -0
- data/lib/bullet/bullet_xhr.js +18 -23
- data/lib/bullet/dependency.rb +52 -34
- data/lib/bullet/detector/association.rb +24 -18
- data/lib/bullet/detector/counter_cache.rb +12 -8
- data/lib/bullet/detector/n_plus_one_query.rb +20 -10
- data/lib/bullet/detector/unused_eager_loading.rb +7 -4
- data/lib/bullet/mongoid4x.rb +3 -7
- data/lib/bullet/mongoid5x.rb +3 -7
- data/lib/bullet/mongoid6x.rb +3 -7
- data/lib/bullet/mongoid7x.rb +26 -13
- data/lib/bullet/notification/base.rb +14 -18
- data/lib/bullet/notification/n_plus_one_query.rb +2 -4
- data/lib/bullet/notification/unused_eager_loading.rb +2 -4
- data/lib/bullet/notification.rb +2 -1
- data/lib/bullet/rack.rb +28 -17
- data/lib/bullet/stack_trace_filter.rb +10 -17
- data/lib/bullet/version.rb +1 -1
- data/lib/bullet.rb +52 -42
- data/lib/generators/bullet/install_generator.rb +22 -23
- data/perf/benchmark.rb +11 -14
- data/spec/bullet/detector/counter_cache_spec.rb +6 -6
- data/spec/bullet/detector/n_plus_one_query_spec.rb +8 -4
- data/spec/bullet/detector/unused_eager_loading_spec.rb +25 -8
- data/spec/bullet/ext/object_spec.rb +1 -1
- data/spec/bullet/notification/base_spec.rb +5 -7
- data/spec/bullet/notification/n_plus_one_query_spec.rb +16 -3
- data/spec/bullet/notification/unused_eager_loading_spec.rb +5 -1
- data/spec/bullet/rack_spec.rb +154 -13
- data/spec/bullet/registry/association_spec.rb +2 -2
- data/spec/bullet/registry/base_spec.rb +1 -1
- data/spec/bullet_spec.rb +25 -44
- data/spec/integration/active_record/association_spec.rb +104 -130
- data/spec/integration/counter_cache_spec.rb +14 -34
- data/spec/integration/mongoid/association_spec.rb +19 -33
- data/spec/models/attachment.rb +5 -0
- data/spec/models/deal.rb +5 -0
- data/spec/models/post.rb +2 -0
- data/spec/models/role.rb +7 -0
- data/spec/models/submission.rb +1 -0
- data/spec/models/user.rb +2 -0
- data/spec/spec_helper.rb +4 -10
- data/spec/support/bullet_ext.rb +8 -9
- data/spec/support/mongo_seed.rb +3 -16
- data/spec/support/sqlite_seed.rb +38 -0
- data/test.sh +2 -0
- metadata +17 -7
- data/.travis.yml +0 -31
@@ -6,9 +6,7 @@ if active_record?
|
|
6
6
|
describe Bullet::Detector::Association, 'has_many' do
|
7
7
|
context 'post => comments' do
|
8
8
|
it 'should detect non preload post => comments' do
|
9
|
-
Post.all.each
|
10
|
-
post.comments.map(&:name)
|
11
|
-
end
|
9
|
+
Post.all.each { |post| post.comments.map(&:name) }
|
12
10
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
13
11
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
14
12
|
|
@@ -16,9 +14,7 @@ if active_record?
|
|
16
14
|
end
|
17
15
|
|
18
16
|
it 'should detect non preload post => comments for find_by_sql' do
|
19
|
-
Post.find_by_sql('SELECT * FROM posts').each
|
20
|
-
post.comments.map(&:name)
|
21
|
-
end
|
17
|
+
Post.find_by_sql('SELECT * FROM posts').each { |post| post.comments.map(&:name) }
|
22
18
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
23
19
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
24
20
|
|
@@ -26,9 +22,7 @@ if active_record?
|
|
26
22
|
end
|
27
23
|
|
28
24
|
it 'should detect preload with post => comments' do
|
29
|
-
Post.includes(:comments).each
|
30
|
-
post.comments.map(&:name)
|
31
|
-
end
|
25
|
+
Post.includes(:comments).each { |post| post.comments.map(&:name) }
|
32
26
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
33
27
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
34
28
|
|
@@ -65,9 +59,7 @@ if active_record?
|
|
65
59
|
end
|
66
60
|
|
67
61
|
it 'should detect non preload post => comments with empty?' do
|
68
|
-
Post.all.each
|
69
|
-
post.comments.empty?
|
70
|
-
end
|
62
|
+
Post.all.each { |post| post.comments.empty? }
|
71
63
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
72
64
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
73
65
|
|
@@ -76,9 +68,7 @@ if active_record?
|
|
76
68
|
|
77
69
|
it 'should detect non preload post => comments with include?' do
|
78
70
|
comment = Comment.last
|
79
|
-
Post.all.each
|
80
|
-
post.comments.include?(comment)
|
81
|
-
end
|
71
|
+
Post.all.each { |post| post.comments.include?(comment) }
|
82
72
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
83
73
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
84
74
|
|
@@ -86,9 +76,7 @@ if active_record?
|
|
86
76
|
end
|
87
77
|
|
88
78
|
it 'should not detect unused preload person => pets with empty?' do
|
89
|
-
Person.all.each
|
90
|
-
person.pets.empty?
|
91
|
-
end
|
79
|
+
Person.all.each { |person| person.pets.empty? }
|
92
80
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
93
81
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
94
82
|
|
@@ -98,11 +86,7 @@ if active_record?
|
|
98
86
|
|
99
87
|
context 'category => posts => comments' do
|
100
88
|
it 'should detect non preload category => posts => comments' do
|
101
|
-
Category.all.each
|
102
|
-
category.posts.each do |post|
|
103
|
-
post.comments.map(&:name)
|
104
|
-
end
|
105
|
-
end
|
89
|
+
Category.all.each { |category| category.posts.each { |post| post.comments.map(&:name) } }
|
106
90
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
107
91
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
108
92
|
|
@@ -111,11 +95,7 @@ if active_record?
|
|
111
95
|
end
|
112
96
|
|
113
97
|
it 'should detect preload category => posts, but no post => comments' do
|
114
|
-
Category.includes(:posts).each
|
115
|
-
category.posts.each do |post|
|
116
|
-
post.comments.map(&:name)
|
117
|
-
end
|
118
|
-
end
|
98
|
+
Category.includes(:posts).each { |category| category.posts.each { |post| post.comments.map(&:name) } }
|
119
99
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
120
100
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
121
101
|
|
@@ -124,11 +104,7 @@ if active_record?
|
|
124
104
|
end
|
125
105
|
|
126
106
|
it 'should detect preload with category => posts => comments' do
|
127
|
-
Category.includes(posts: :comments).each
|
128
|
-
category.posts.each do |post|
|
129
|
-
post.comments.map(&:name)
|
130
|
-
end
|
131
|
-
end
|
107
|
+
Category.includes(posts: :comments).each { |category| category.posts.each { |post| post.comments.map(&:name) } }
|
132
108
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
133
109
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
134
110
|
|
@@ -137,9 +113,7 @@ if active_record?
|
|
137
113
|
|
138
114
|
it 'should detect preload with category => posts => comments with posts.id > 0' do
|
139
115
|
Category.includes(posts: :comments).where('posts.id > 0').references(:posts).each do |category|
|
140
|
-
category.posts.each
|
141
|
-
post.comments.map(&:name)
|
142
|
-
end
|
116
|
+
category.posts.each { |post| post.comments.map(&:name) }
|
143
117
|
end
|
144
118
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
145
119
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
@@ -155,10 +129,8 @@ if active_record?
|
|
155
129
|
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
156
130
|
end
|
157
131
|
|
158
|
-
it 'should detect unused preload with post =>
|
159
|
-
Category.includes(posts: :comments).each
|
160
|
-
category.posts.map(&:name)
|
161
|
-
end
|
132
|
+
it 'should detect unused preload with post => comments, no category => posts' do
|
133
|
+
Category.includes(posts: :comments).each { |category| category.posts.map(&:name) }
|
162
134
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
163
135
|
expect(Bullet::Detector::Association).to be_unused_preload_associations_for(Post, :comments)
|
164
136
|
|
@@ -212,9 +184,7 @@ if active_record?
|
|
212
184
|
end
|
213
185
|
|
214
186
|
it 'should detect unused preload with category => entries, but not with category => posts' do
|
215
|
-
Category.includes(%i[posts entries]).each
|
216
|
-
category.posts.map(&:name)
|
217
|
-
end
|
187
|
+
Category.includes(%i[posts entries]).each { |category| category.posts.map(&:name) }
|
218
188
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
219
189
|
expect(Bullet::Detector::Association).not_to be_unused_preload_associations_for(Category, :posts)
|
220
190
|
expect(Bullet::Detector::Association).to be_unused_preload_associations_for(Category, :entries)
|
@@ -225,16 +195,14 @@ if active_record?
|
|
225
195
|
|
226
196
|
context 'post => comment' do
|
227
197
|
it 'should detect unused preload with post => comments' do
|
228
|
-
Post.includes(:comments).each
|
229
|
-
post.comments.first&.name
|
230
|
-
end
|
198
|
+
Post.includes(:comments).each { |post| post.comments.first&.name }
|
231
199
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
232
200
|
expect(Bullet::Detector::Association).not_to be_unused_preload_associations_for(Post, :comments)
|
233
201
|
|
234
202
|
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
235
203
|
end
|
236
204
|
|
237
|
-
it 'should detect preload with post =>
|
205
|
+
it 'should detect preload with post => comments' do
|
238
206
|
Post.first.comments.map(&:name)
|
239
207
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
240
208
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
@@ -272,9 +240,7 @@ if active_record?
|
|
272
240
|
|
273
241
|
context 'scope for_category_name' do
|
274
242
|
it 'should detect preload with post => category' do
|
275
|
-
Post.in_category_name('first').references(:categories).each
|
276
|
-
post.category.name
|
277
|
-
end
|
243
|
+
Post.in_category_name('first').references(:categories).each { |post| post.category.name }
|
278
244
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
279
245
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
280
246
|
|
@@ -292,9 +258,7 @@ if active_record?
|
|
292
258
|
|
293
259
|
context 'scope preload_comments' do
|
294
260
|
it 'should detect preload post => comments with scope' do
|
295
|
-
Post.preload_comments.each
|
296
|
-
post.comments.map(&:name)
|
297
|
-
end
|
261
|
+
Post.preload_comments.each { |post| post.comments.map(&:name) }
|
298
262
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
299
263
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
300
264
|
|
@@ -314,9 +278,7 @@ if active_record?
|
|
314
278
|
describe Bullet::Detector::Association, 'belongs_to' do
|
315
279
|
context 'comment => post' do
|
316
280
|
it 'should detect non preload with comment => post' do
|
317
|
-
Comment.all.each
|
318
|
-
comment.post.name
|
319
|
-
end
|
281
|
+
Comment.all.each { |comment| comment.post.name }
|
320
282
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
321
283
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
322
284
|
|
@@ -332,9 +294,7 @@ if active_record?
|
|
332
294
|
end
|
333
295
|
|
334
296
|
it 'should detect preload with comment => post' do
|
335
|
-
Comment.includes(:post).each
|
336
|
-
comment.post.name
|
337
|
-
end
|
297
|
+
Comment.includes(:post).each { |comment| comment.post.name }
|
338
298
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
339
299
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
340
300
|
|
@@ -371,9 +331,7 @@ if active_record?
|
|
371
331
|
|
372
332
|
context 'comment => post => category' do
|
373
333
|
it 'should detect non preload association with comment => post' do
|
374
|
-
Comment.all.each
|
375
|
-
comment.post.category.name
|
376
|
-
end
|
334
|
+
Comment.all.each { |comment| comment.post.category.name }
|
377
335
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
378
336
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
379
337
|
|
@@ -390,9 +348,7 @@ if active_record?
|
|
390
348
|
end
|
391
349
|
|
392
350
|
it 'should detect non preload association with post => category' do
|
393
|
-
Comment.includes(:post).each
|
394
|
-
comment.post.category.name
|
395
|
-
end
|
351
|
+
Comment.includes(:post).each { |comment| comment.post.category.name }
|
396
352
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
397
353
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
398
354
|
|
@@ -400,9 +356,7 @@ if active_record?
|
|
400
356
|
end
|
401
357
|
|
402
358
|
it 'should not detect unpreload association' do
|
403
|
-
Comment.includes(post: :category).each
|
404
|
-
comment.post.category.name
|
405
|
-
end
|
359
|
+
Comment.includes(post: :category).each { |comment| comment.post.category.name }
|
406
360
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
407
361
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
408
362
|
|
@@ -412,9 +366,8 @@ if active_record?
|
|
412
366
|
|
413
367
|
context 'comment => author, post => writer' do
|
414
368
|
it 'should detect non preloaded writer' do
|
415
|
-
Comment.includes(%i[author post]).where(['base_users.id = ?', BaseUser.first]).references(:base_users)
|
416
|
-
comment.post.writer.name
|
417
|
-
end
|
369
|
+
Comment.includes(%i[author post]).where(['base_users.id = ?', BaseUser.first]).references(:base_users)
|
370
|
+
.each { |comment| comment.post.writer.name }
|
418
371
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
419
372
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
420
373
|
|
@@ -422,9 +375,9 @@ if active_record?
|
|
422
375
|
end
|
423
376
|
|
424
377
|
it 'should detect unused preload with comment => author' do
|
425
|
-
Comment.includes([:author, { post: :writer }]).where(['base_users.id = ?', BaseUser.first]).references(
|
426
|
-
|
427
|
-
|
378
|
+
Comment.includes([:author, { post: :writer }]).where(['base_users.id = ?', BaseUser.first]).references(
|
379
|
+
:base_users
|
380
|
+
).each { |comment| comment.post.writer.name }
|
428
381
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
429
382
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
430
383
|
|
@@ -442,21 +395,24 @@ if active_record?
|
|
442
395
|
end
|
443
396
|
|
444
397
|
it 'should not raise a stack error from posts to category' do
|
445
|
-
expect {
|
446
|
-
Comment.includes(post: :category).each do |com|
|
447
|
-
com.post.category
|
448
|
-
end
|
449
|
-
}.not_to raise_error
|
398
|
+
expect { Comment.includes(post: :category).each { |com| com.post.category } }.not_to raise_error
|
450
399
|
end
|
451
400
|
end
|
452
401
|
end
|
453
402
|
|
454
403
|
describe Bullet::Detector::Association, 'has_and_belongs_to_many' do
|
404
|
+
context 'posts <=> deals' do
|
405
|
+
it 'should detect preload associations with join tables that have identifier' do
|
406
|
+
Post.includes(:deals).each { |post| post.deals.map(&:name) }
|
407
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
408
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
409
|
+
|
410
|
+
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
411
|
+
end
|
412
|
+
end
|
455
413
|
context 'students <=> teachers' do
|
456
414
|
it 'should detect non preload associations' do
|
457
|
-
Student.all.each
|
458
|
-
student.teachers.map(&:name)
|
459
|
-
end
|
415
|
+
Student.all.each { |student| student.teachers.map(&:name) }
|
460
416
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
461
417
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
462
418
|
|
@@ -464,9 +420,7 @@ if active_record?
|
|
464
420
|
end
|
465
421
|
|
466
422
|
it 'should detect preload associations' do
|
467
|
-
Student.includes(:teachers).each
|
468
|
-
student.teachers.map(&:name)
|
469
|
-
end
|
423
|
+
Student.includes(:teachers).each { |student| student.teachers.map(&:name) }
|
470
424
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
471
425
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
472
426
|
|
@@ -490,23 +444,29 @@ if active_record?
|
|
490
444
|
end
|
491
445
|
|
492
446
|
it 'should detect non preload student => teachers with empty?' do
|
493
|
-
Student.all.each
|
494
|
-
student.teachers.empty?
|
495
|
-
end
|
447
|
+
Student.all.each { |student| student.teachers.empty? }
|
496
448
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
497
449
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
498
450
|
|
499
451
|
expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Student, :teachers)
|
500
452
|
end
|
501
453
|
end
|
454
|
+
|
455
|
+
context 'user => roles' do
|
456
|
+
it 'should detect preload associations' do
|
457
|
+
User.first.roles.includes(:resource).each { |role| role.resource }
|
458
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
459
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
460
|
+
|
461
|
+
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
462
|
+
end
|
463
|
+
end
|
502
464
|
end
|
503
465
|
|
504
466
|
describe Bullet::Detector::Association, 'has_many :through' do
|
505
467
|
context 'firm => clients' do
|
506
468
|
it 'should detect non preload associations' do
|
507
|
-
Firm.all.each
|
508
|
-
firm.clients.map(&:name)
|
509
|
-
end
|
469
|
+
Firm.all.each { |firm| firm.clients.map(&:name) }
|
510
470
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
511
471
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
512
472
|
|
@@ -514,9 +474,7 @@ if active_record?
|
|
514
474
|
end
|
515
475
|
|
516
476
|
it 'should detect preload associations' do
|
517
|
-
Firm.includes(:clients).each
|
518
|
-
firm.clients.map(&:name)
|
519
|
-
end
|
477
|
+
Firm.includes(:clients).each { |firm| firm.clients.map(&:name) }
|
520
478
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
521
479
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
522
480
|
|
@@ -542,9 +500,7 @@ if active_record?
|
|
542
500
|
|
543
501
|
context 'firm => clients => groups' do
|
544
502
|
it 'should detect non preload associations' do
|
545
|
-
Firm.all.each
|
546
|
-
firm.groups.map(&:name)
|
547
|
-
end
|
503
|
+
Firm.all.each { |firm| firm.groups.map(&:name) }
|
548
504
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
549
505
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
550
506
|
|
@@ -552,9 +508,7 @@ if active_record?
|
|
552
508
|
end
|
553
509
|
|
554
510
|
it 'should detect preload associations' do
|
555
|
-
Firm.includes(:groups).each
|
556
|
-
firm.groups.map(&:name)
|
557
|
-
end
|
511
|
+
Firm.includes(:groups).each { |firm| firm.groups.map(&:name) }
|
558
512
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
559
513
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
560
514
|
|
@@ -582,9 +536,7 @@ if active_record?
|
|
582
536
|
describe Bullet::Detector::Association, 'has_one' do
|
583
537
|
context 'company => address' do
|
584
538
|
it 'should detect non preload association' do
|
585
|
-
Company.all.each
|
586
|
-
company.address.name
|
587
|
-
end
|
539
|
+
Company.all.each { |company| company.address.name }
|
588
540
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
589
541
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
590
542
|
|
@@ -592,9 +544,7 @@ if active_record?
|
|
592
544
|
end
|
593
545
|
|
594
546
|
it 'should detect preload association' do
|
595
|
-
Company.includes(:address).each
|
596
|
-
company.address.name
|
597
|
-
end
|
547
|
+
Company.includes(:address).each { |company| company.address.name }
|
598
548
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
599
549
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
600
550
|
|
@@ -630,6 +580,42 @@ if active_record?
|
|
630
580
|
end
|
631
581
|
end
|
632
582
|
|
583
|
+
describe Bullet::Detector::Association, 'has_one :through' do
|
584
|
+
context 'user => attachment' do
|
585
|
+
it 'should detect non preload associations' do
|
586
|
+
User.all.each { |user| user.submission_attachment.file_name }
|
587
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
588
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
589
|
+
|
590
|
+
expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(User, :submission_attachment)
|
591
|
+
end
|
592
|
+
|
593
|
+
it 'should detect preload associations' do
|
594
|
+
User.includes(:submission_attachment).each { |user| user.submission_attachment.file_name }
|
595
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
596
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
597
|
+
|
598
|
+
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
599
|
+
end
|
600
|
+
|
601
|
+
it 'should not detect preload associations' do
|
602
|
+
User.all.map(&:name)
|
603
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
604
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
605
|
+
|
606
|
+
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
607
|
+
end
|
608
|
+
|
609
|
+
it 'should detect unused preload associations' do
|
610
|
+
User.includes(:submission_attachment).map(&:name)
|
611
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
612
|
+
expect(Bullet::Detector::Association).to be_unused_preload_associations_for(User, :submission_attachment)
|
613
|
+
|
614
|
+
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
615
|
+
end
|
616
|
+
end
|
617
|
+
end
|
618
|
+
|
633
619
|
describe Bullet::Detector::Association, 'call one association that in possible objects' do
|
634
620
|
it 'should not detect preload association' do
|
635
621
|
Post.all
|
@@ -688,9 +674,7 @@ if active_record?
|
|
688
674
|
describe Bullet::Detector::Association, 'STI' do
|
689
675
|
context 'page => author' do
|
690
676
|
it 'should detect non preload associations' do
|
691
|
-
Page.all.each
|
692
|
-
page.author.name
|
693
|
-
end
|
677
|
+
Page.all.each { |page| page.author.name }
|
694
678
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
695
679
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
696
680
|
|
@@ -698,9 +682,7 @@ if active_record?
|
|
698
682
|
end
|
699
683
|
|
700
684
|
it 'should detect preload associations' do
|
701
|
-
Page.includes(:author).each
|
702
|
-
page.author.name
|
703
|
-
end
|
685
|
+
Page.includes(:author).each { |page| page.author.name }
|
704
686
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
705
687
|
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
706
688
|
|
@@ -729,9 +711,7 @@ if active_record?
|
|
729
711
|
after { Bullet.n_plus_one_query_enable = true }
|
730
712
|
|
731
713
|
it 'should not detect n plus one query' do
|
732
|
-
Post.all.each
|
733
|
-
post.comments.map(&:name)
|
734
|
-
end
|
714
|
+
Post.all.each { |post| post.comments.map(&:name) }
|
735
715
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
736
716
|
|
737
717
|
expect(Bullet::Detector::Association).not_to be_detecting_unpreloaded_association_for(Post, :comments)
|
@@ -760,9 +740,7 @@ if active_record?
|
|
760
740
|
end
|
761
741
|
|
762
742
|
it 'should still detect n plus one query' do
|
763
|
-
Post.all.each
|
764
|
-
post.comments.map(&:name)
|
765
|
-
end
|
743
|
+
Post.all.each { |post| post.comments.map(&:name) }
|
766
744
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
767
745
|
|
768
746
|
expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Post, :comments)
|
@@ -770,14 +748,12 @@ if active_record?
|
|
770
748
|
end
|
771
749
|
end
|
772
750
|
|
773
|
-
context '
|
774
|
-
before { Bullet.
|
775
|
-
after { Bullet.
|
751
|
+
context 'add n plus one query to safelist' do
|
752
|
+
before { Bullet.add_safelist type: :n_plus_one_query, class_name: 'Post', association: :comments }
|
753
|
+
after { Bullet.clear_safelist }
|
776
754
|
|
777
755
|
it 'should not detect n plus one query' do
|
778
|
-
Post.all.each
|
779
|
-
post.comments.map(&:name)
|
780
|
-
end
|
756
|
+
Post.all.each { |post| post.comments.map(&:name) }
|
781
757
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
782
758
|
|
783
759
|
expect(Bullet::Detector::Association).not_to be_detecting_unpreloaded_association_for(Post, :comments)
|
@@ -793,9 +769,9 @@ if active_record?
|
|
793
769
|
end
|
794
770
|
end
|
795
771
|
|
796
|
-
context '
|
797
|
-
before { Bullet.
|
798
|
-
after { Bullet.
|
772
|
+
context 'add unused eager loading to safelist' do
|
773
|
+
before { Bullet.add_safelist type: :unused_eager_loading, class_name: 'Post', association: :comments }
|
774
|
+
after { Bullet.clear_safelist }
|
799
775
|
|
800
776
|
it 'should not detect unused eager loading' do
|
801
777
|
Post.includes(:comments).map(&:name)
|
@@ -806,9 +782,7 @@ if active_record?
|
|
806
782
|
end
|
807
783
|
|
808
784
|
it 'should still detect n plus one query' do
|
809
|
-
Post.all.each
|
810
|
-
post.comments.map(&:name)
|
811
|
-
end
|
785
|
+
Post.all.each { |post| post.comments.map(&:name) }
|
812
786
|
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
813
787
|
|
814
788
|
expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Post, :comments)
|
@@ -4,25 +4,17 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
if !mongoid? && active_record?
|
6
6
|
describe Bullet::Detector::CounterCache do
|
7
|
-
before(:each)
|
8
|
-
Bullet.start_request
|
9
|
-
end
|
7
|
+
before(:each) { Bullet.start_request }
|
10
8
|
|
11
|
-
after(:each)
|
12
|
-
Bullet.end_request
|
13
|
-
end
|
9
|
+
after(:each) { Bullet.end_request }
|
14
10
|
|
15
11
|
it 'should need counter cache with all cities' do
|
16
|
-
Country.all.each
|
17
|
-
country.cities.size
|
18
|
-
end
|
12
|
+
Country.all.each { |country| country.cities.size }
|
19
13
|
expect(Bullet.collected_counter_cache_notifications).not_to be_empty
|
20
14
|
end
|
21
15
|
|
22
16
|
it 'should not need counter cache if already define counter_cache' do
|
23
|
-
Person.all.each
|
24
|
-
person.pets.size
|
25
|
-
end
|
17
|
+
Person.all.each { |person| person.pets.size }
|
26
18
|
expect(Bullet.collected_counter_cache_notifications).to be_empty
|
27
19
|
end
|
28
20
|
|
@@ -32,32 +24,24 @@ if !mongoid? && active_record?
|
|
32
24
|
end
|
33
25
|
|
34
26
|
it 'should not need counter cache without size' do
|
35
|
-
Country.includes(:cities).each
|
36
|
-
country.cities.empty?
|
37
|
-
end
|
27
|
+
Country.includes(:cities).each { |country| country.cities.empty? }
|
38
28
|
expect(Bullet.collected_counter_cache_notifications).to be_empty
|
39
29
|
end
|
40
30
|
|
41
|
-
if
|
31
|
+
if ActiveRecord::VERSION::MAJOR > 4
|
42
32
|
it 'should not need counter cache for has_many through' do
|
43
|
-
Client.all.each
|
44
|
-
client.firms.size
|
45
|
-
end
|
33
|
+
Client.all.each { |client| client.firms.size }
|
46
34
|
expect(Bullet.collected_counter_cache_notifications).to be_empty
|
47
35
|
end
|
48
36
|
else
|
49
37
|
it 'should need counter cache for has_many through' do
|
50
|
-
Client.all.each
|
51
|
-
client.firms.size
|
52
|
-
end
|
38
|
+
Client.all.each { |client| client.firms.size }
|
53
39
|
expect(Bullet.collected_counter_cache_notifications).not_to be_empty
|
54
40
|
end
|
55
41
|
end
|
56
42
|
|
57
43
|
it 'should not need counter cache with part of cities' do
|
58
|
-
Country.all.each
|
59
|
-
country.cities.where(name: 'first').size
|
60
|
-
end
|
44
|
+
Country.all.each { |country| country.cities.where(name: 'first').size }
|
61
45
|
expect(Bullet.collected_counter_cache_notifications).to be_empty
|
62
46
|
end
|
63
47
|
|
@@ -66,21 +50,17 @@ if !mongoid? && active_record?
|
|
66
50
|
after { Bullet.counter_cache_enable = true }
|
67
51
|
|
68
52
|
it 'should not detect counter cache' do
|
69
|
-
Country.all.each
|
70
|
-
country.cities.size
|
71
|
-
end
|
53
|
+
Country.all.each { |country| country.cities.size }
|
72
54
|
expect(Bullet.collected_counter_cache_notifications).to be_empty
|
73
55
|
end
|
74
56
|
end
|
75
57
|
|
76
|
-
context '
|
77
|
-
before { Bullet.
|
78
|
-
after { Bullet.
|
58
|
+
context 'safelist' do
|
59
|
+
before { Bullet.add_safelist type: :counter_cache, class_name: 'Country', association: :cities }
|
60
|
+
after { Bullet.clear_safelist }
|
79
61
|
|
80
62
|
it 'should not detect counter cache' do
|
81
|
-
Country.all.each
|
82
|
-
country.cities.size
|
83
|
-
end
|
63
|
+
Country.all.each { |country| country.cities.size }
|
84
64
|
expect(Bullet.collected_counter_cache_notifications).to be_empty
|
85
65
|
end
|
86
66
|
end
|