bullet 6.0.0 → 6.1.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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +20 -1
  3. data/CHANGELOG.md +17 -1
  4. data/Gemfile.rails-6.0 +1 -1
  5. data/README.md +23 -9
  6. data/lib/bullet.rb +26 -16
  7. data/lib/bullet/active_job.rb +9 -0
  8. data/lib/bullet/active_record4.rb +9 -24
  9. data/lib/bullet/active_record41.rb +7 -19
  10. data/lib/bullet/active_record42.rb +8 -16
  11. data/lib/bullet/active_record5.rb +188 -170
  12. data/lib/bullet/active_record52.rb +176 -161
  13. data/lib/bullet/active_record60.rb +193 -171
  14. data/lib/bullet/bullet_xhr.js +20 -15
  15. data/lib/bullet/dependency.rb +36 -34
  16. data/lib/bullet/detector/association.rb +24 -18
  17. data/lib/bullet/detector/base.rb +1 -2
  18. data/lib/bullet/detector/counter_cache.rb +10 -6
  19. data/lib/bullet/detector/n_plus_one_query.rb +18 -8
  20. data/lib/bullet/detector/unused_eager_loading.rb +5 -2
  21. data/lib/bullet/mongoid4x.rb +2 -6
  22. data/lib/bullet/mongoid5x.rb +2 -6
  23. data/lib/bullet/mongoid6x.rb +2 -6
  24. data/lib/bullet/mongoid7x.rb +2 -6
  25. data/lib/bullet/notification/base.rb +14 -18
  26. data/lib/bullet/notification/n_plus_one_query.rb +2 -4
  27. data/lib/bullet/notification/unused_eager_loading.rb +2 -4
  28. data/lib/bullet/rack.rb +5 -3
  29. data/lib/bullet/stack_trace_filter.rb +5 -10
  30. data/lib/bullet/version.rb +1 -1
  31. data/lib/generators/bullet/install_generator.rb +4 -2
  32. data/perf/benchmark.rb +8 -14
  33. data/spec/bullet/detector/counter_cache_spec.rb +5 -5
  34. data/spec/bullet/detector/n_plus_one_query_spec.rb +7 -3
  35. data/spec/bullet/detector/unused_eager_loading_spec.rb +29 -12
  36. data/spec/bullet/notification/base_spec.rb +1 -3
  37. data/spec/bullet/notification/n_plus_one_query_spec.rb +18 -3
  38. data/spec/bullet/notification/unused_eager_loading_spec.rb +5 -1
  39. data/spec/bullet/rack_spec.rb +20 -5
  40. data/spec/bullet/registry/association_spec.rb +2 -2
  41. data/spec/bullet/registry/base_spec.rb +1 -1
  42. data/spec/bullet_spec.rb +10 -29
  43. data/spec/integration/active_record/association_spec.rb +42 -122
  44. data/spec/integration/counter_cache_spec.rb +10 -30
  45. data/spec/integration/mongoid/association_spec.rb +18 -32
  46. data/spec/models/folder.rb +1 -2
  47. data/spec/models/group.rb +1 -2
  48. data/spec/models/page.rb +1 -2
  49. data/spec/models/writer.rb +1 -2
  50. data/spec/spec_helper.rb +6 -10
  51. data/spec/support/bullet_ext.rb +8 -9
  52. data/spec/support/mongo_seed.rb +2 -16
  53. metadata +3 -2
@@ -7,9 +7,7 @@ if mongoid?
7
7
  context 'embeds_many' do
8
8
  context 'posts => users' do
9
9
  it 'should detect nothing' do
10
- Mongoid::Post.all.each do |post|
11
- post.users.map(&:name)
12
- end
10
+ Mongoid::Post.all.each { |post| post.users.map(&:name) }
13
11
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
14
12
  expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
15
13
 
@@ -21,9 +19,7 @@ if mongoid?
21
19
  context 'has_many' do
22
20
  context 'posts => comments' do
23
21
  it 'should detect non preload posts => comments' do
24
- Mongoid::Post.all.each do |post|
25
- post.comments.map(&:name)
26
- end
22
+ Mongoid::Post.all.each { |post| post.comments.map(&:name) }
27
23
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
28
24
  expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
29
25
 
@@ -31,9 +27,7 @@ if mongoid?
31
27
  end
32
28
 
33
29
  it 'should detect preload post => comments' do
34
- Mongoid::Post.includes(:comments).each do |post|
35
- post.comments.map(&:name)
36
- end
30
+ Mongoid::Post.includes(:comments).each { |post| post.comments.map(&:name) }
37
31
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
38
32
  expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
39
33
 
@@ -78,7 +72,10 @@ if mongoid?
78
72
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
79
73
  expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
80
74
 
81
- expect(Bullet::Detector::Association).not_to be_detecting_unpreloaded_association_for(Mongoid::Category, :posts)
75
+ expect(Bullet::Detector::Association).not_to be_detecting_unpreloaded_association_for(
76
+ Mongoid::Category,
77
+ :posts
78
+ )
82
79
  expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Mongoid::Category, :entries)
83
80
  end
84
81
 
@@ -103,9 +100,7 @@ if mongoid?
103
100
  end
104
101
 
105
102
  it 'should detect unused preload with category => entries, but not with category => posts' do
106
- Mongoid::Category.includes(:posts, :entries).each do |category|
107
- category.posts.map(&:name)
108
- end
103
+ Mongoid::Category.includes(:posts, :entries).each { |category| category.posts.map(&:name) }
109
104
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
110
105
  expect(Bullet::Detector::Association).not_to be_unused_preload_associations_for(Mongoid::Category, :posts)
111
106
  expect(Bullet::Detector::Association).to be_unused_preload_associations_for(Mongoid::Category, :entries)
@@ -116,9 +111,7 @@ if mongoid?
116
111
 
117
112
  context 'post => comment' do
118
113
  it 'should detect unused preload with post => comments' do
119
- Mongoid::Post.includes(:comments).each do |post|
120
- post.comments.first.name
121
- end
114
+ Mongoid::Post.includes(:comments).each { |post| post.comments.first.name }
122
115
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
123
116
  expect(Bullet::Detector::Association).not_to be_unused_preload_associations_for(Mongoid::Post, :comments)
124
117
 
@@ -136,9 +129,7 @@ if mongoid?
136
129
 
137
130
  context 'scope preload_comments' do
138
131
  it 'should detect preload post => comments with scope' do
139
- Mongoid::Post.preload_comments.each do |post|
140
- post.comments.map(&:name)
141
- end
132
+ Mongoid::Post.preload_comments.each { |post| post.comments.map(&:name) }
142
133
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
143
134
  expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
144
135
 
@@ -158,9 +149,7 @@ if mongoid?
158
149
  context 'belongs_to' do
159
150
  context 'comment => post' do
160
151
  it 'should detect non preload with comment => post' do
161
- Mongoid::Comment.all.each do |comment|
162
- comment.post.name
163
- end
152
+ Mongoid::Comment.all.each { |comment| comment.post.name }
164
153
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
165
154
  expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
166
155
 
@@ -176,9 +165,7 @@ if mongoid?
176
165
  end
177
166
 
178
167
  it 'should detect preload with comment => post' do
179
- Mongoid::Comment.includes(:post).each do |comment|
180
- comment.post.name
181
- end
168
+ Mongoid::Comment.includes(:post).each { |comment| comment.post.name }
182
169
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
183
170
  expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
184
171
 
@@ -207,20 +194,19 @@ if mongoid?
207
194
  context 'company => address' do
208
195
  if Mongoid::VERSION !~ /\A3.0/
209
196
  it 'should detect non preload association' do
210
- Mongoid::Company.all.each do |company|
211
- company.address.name
212
- end
197
+ Mongoid::Company.all.each { |company| company.address.name }
213
198
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
214
199
  expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
215
200
 
216
- expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Mongoid::Company, :address)
201
+ expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(
202
+ Mongoid::Company,
203
+ :address
204
+ )
217
205
  end
218
206
  end
219
207
 
220
208
  it 'should detect preload association' do
221
- Mongoid::Company.includes(:address).each do |company|
222
- company.address.name
223
- end
209
+ Mongoid::Company.includes(:address).each { |company| company.address.name }
224
210
  Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
225
211
  expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
226
212
 
@@ -1,4 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Folder < Document
4
- end
3
+ class Folder < Document; end
@@ -1,4 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Group < ActiveRecord::Base
4
- end
3
+ class Group < ActiveRecord::Base; end
@@ -1,4 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Page < Document
4
- end
3
+ class Page < Document; end
@@ -1,4 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Writer < BaseUser
4
- end
3
+ class Writer < BaseUser; end
@@ -4,14 +4,16 @@ require 'rspec'
4
4
  begin
5
5
  require 'active_record'
6
6
  rescue LoadError
7
+
7
8
  end
8
9
  begin
9
10
  require 'mongoid'
10
11
  rescue LoadError
12
+
11
13
  end
12
14
 
13
15
  module Rails
14
- class <<self
16
+ class << self
15
17
  def root
16
18
  File.expand_path(__FILE__).split('/')[0..-3].join('/')
17
19
  end
@@ -60,9 +62,7 @@ if active_record?
60
62
  Bullet.enable = true
61
63
  end
62
64
 
63
- config.after(:example) do
64
- Bullet.end_request
65
- end
65
+ config.after(:example) { Bullet.end_request }
66
66
  end
67
67
 
68
68
  if ENV['BULLET_LOG']
@@ -87,13 +87,9 @@ if mongoid?
87
87
  Support::MongoSeed.teardown_db
88
88
  end
89
89
 
90
- config.before(:each) do
91
- Bullet.start_request
92
- end
90
+ config.before(:each) { Bullet.start_request }
93
91
 
94
- config.after(:each) do
95
- Bullet.end_request
96
- end
92
+ config.after(:each) { Bullet.end_request }
97
93
  end
98
94
 
99
95
  if ENV['BULLET_LOG']
@@ -2,9 +2,7 @@
2
2
 
3
3
  module Bullet
4
4
  def self.collected_notifications_of_class(notification_class)
5
- Bullet.notification_collector.collection.select do |notification|
6
- notification.is_a? notification_class
7
- end
5
+ Bullet.notification_collector.collection.select { |notification| notification.is_a? notification_class }
8
6
  end
9
7
 
10
8
  def self.collected_counter_cache_notifications
@@ -23,7 +21,7 @@ end
23
21
  module Bullet
24
22
  module Detector
25
23
  class Association
26
- class <<self
24
+ class << self
27
25
  # returns true if all associations are preloaded
28
26
  def completely_preloading_associations?
29
27
  Bullet.collected_n_plus_one_query_notifications.empty?
@@ -35,21 +33,22 @@ module Bullet
35
33
 
36
34
  # returns true if a given object has a specific association
37
35
  def creating_object_association_for?(object, association)
38
- object_associations[object.bullet_key].present? && object_associations[object.bullet_key].include?(association)
36
+ object_associations[object.bullet_key].present? &&
37
+ object_associations[object.bullet_key].include?(association)
39
38
  end
40
39
 
41
40
  # returns true if a given class includes the specific unpreloaded association
42
41
  def detecting_unpreloaded_association_for?(klass, association)
43
- Bullet.collected_n_plus_one_query_notifications.select { |notification|
42
+ Bullet.collected_n_plus_one_query_notifications.select do |notification|
44
43
  notification.base_class == klass.to_s && notification.associations.include?(association)
45
- }.present?
44
+ end.present?
46
45
  end
47
46
 
48
47
  # returns true if the given class includes the specific unused preloaded association
49
48
  def unused_preload_associations_for?(klass, association)
50
- Bullet.collected_unused_eager_association_notifications.select { |notification|
49
+ Bullet.collected_unused_eager_association_notifications.select do |notification|
51
50
  notification.base_class == klass.to_s && notification.associations.include?(association)
52
- }.present?
51
+ end.present?
53
52
  end
54
53
  end
55
54
  end
@@ -39,25 +39,11 @@ module Support
39
39
  def setup_db
40
40
  if Mongoid::VERSION =~ /\A4/
41
41
  Mongoid.configure do |config|
42
- config.load_configuration(
43
- sessions: {
44
- default: {
45
- database: 'bullet',
46
- hosts: ['localhost:27017']
47
- }
48
- }
49
- )
42
+ config.load_configuration(sessions: { default: { database: 'bullet', hosts: %w[localhost:27017] } })
50
43
  end
51
44
  else
52
45
  Mongoid.configure do |config|
53
- config.load_configuration(
54
- clients: {
55
- default: {
56
- database: 'bullet',
57
- hosts: ['localhost:27017']
58
- }
59
- }
60
- )
46
+ config.load_configuration(clients: { default: { database: 'bullet', hosts: %w[localhost:27017] } })
61
47
  end
62
48
  # Increase the level from DEBUG in order to avoid excessive logging to the screen
63
49
  Mongo::Logger.logger.level = Logger::WARN
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullet
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0
4
+ version: 6.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Huang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-25 00:00:00.000000000 Z
11
+ date: 2019-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -69,6 +69,7 @@ files:
69
69
  - Rakefile
70
70
  - bullet.gemspec
71
71
  - lib/bullet.rb
72
+ - lib/bullet/active_job.rb
72
73
  - lib/bullet/active_record4.rb
73
74
  - lib/bullet/active_record41.rb
74
75
  - lib/bullet/active_record42.rb