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.
- checksums.yaml +4 -4
- data/.travis.yml +20 -1
- data/CHANGELOG.md +17 -1
- data/Gemfile.rails-6.0 +1 -1
- data/README.md +23 -9
- data/lib/bullet.rb +26 -16
- data/lib/bullet/active_job.rb +9 -0
- data/lib/bullet/active_record4.rb +9 -24
- data/lib/bullet/active_record41.rb +7 -19
- data/lib/bullet/active_record42.rb +8 -16
- data/lib/bullet/active_record5.rb +188 -170
- data/lib/bullet/active_record52.rb +176 -161
- data/lib/bullet/active_record60.rb +193 -171
- data/lib/bullet/bullet_xhr.js +20 -15
- data/lib/bullet/dependency.rb +36 -34
- data/lib/bullet/detector/association.rb +24 -18
- data/lib/bullet/detector/base.rb +1 -2
- data/lib/bullet/detector/counter_cache.rb +10 -6
- data/lib/bullet/detector/n_plus_one_query.rb +18 -8
- data/lib/bullet/detector/unused_eager_loading.rb +5 -2
- data/lib/bullet/mongoid4x.rb +2 -6
- data/lib/bullet/mongoid5x.rb +2 -6
- data/lib/bullet/mongoid6x.rb +2 -6
- data/lib/bullet/mongoid7x.rb +2 -6
- 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/rack.rb +5 -3
- data/lib/bullet/stack_trace_filter.rb +5 -10
- data/lib/bullet/version.rb +1 -1
- data/lib/generators/bullet/install_generator.rb +4 -2
- data/perf/benchmark.rb +8 -14
- data/spec/bullet/detector/counter_cache_spec.rb +5 -5
- data/spec/bullet/detector/n_plus_one_query_spec.rb +7 -3
- data/spec/bullet/detector/unused_eager_loading_spec.rb +29 -12
- data/spec/bullet/notification/base_spec.rb +1 -3
- data/spec/bullet/notification/n_plus_one_query_spec.rb +18 -3
- data/spec/bullet/notification/unused_eager_loading_spec.rb +5 -1
- data/spec/bullet/rack_spec.rb +20 -5
- data/spec/bullet/registry/association_spec.rb +2 -2
- data/spec/bullet/registry/base_spec.rb +1 -1
- data/spec/bullet_spec.rb +10 -29
- data/spec/integration/active_record/association_spec.rb +42 -122
- data/spec/integration/counter_cache_spec.rb +10 -30
- data/spec/integration/mongoid/association_spec.rb +18 -32
- data/spec/models/folder.rb +1 -2
- data/spec/models/group.rb +1 -2
- data/spec/models/page.rb +1 -2
- data/spec/models/writer.rb +1 -2
- data/spec/spec_helper.rb +6 -10
- data/spec/support/bullet_ext.rb +8 -9
- data/spec/support/mongo_seed.rb +2 -16
- 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
|
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
|
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
|
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(
|
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
|
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
|
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
|
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
|
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
|
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
|
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(
|
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
|
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
|
|
data/spec/models/folder.rb
CHANGED
data/spec/models/group.rb
CHANGED
data/spec/models/page.rb
CHANGED
data/spec/models/writer.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -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)
|
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)
|
91
|
-
Bullet.start_request
|
92
|
-
end
|
90
|
+
config.before(:each) { Bullet.start_request }
|
93
91
|
|
94
|
-
config.after(:each)
|
95
|
-
Bullet.end_request
|
96
|
-
end
|
92
|
+
config.after(:each) { Bullet.end_request }
|
97
93
|
end
|
98
94
|
|
99
95
|
if ENV['BULLET_LOG']
|
data/spec/support/bullet_ext.rb
CHANGED
@@ -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
|
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? &&
|
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
|
42
|
+
Bullet.collected_n_plus_one_query_notifications.select do |notification|
|
44
43
|
notification.base_class == klass.to_s && notification.associations.include?(association)
|
45
|
-
|
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
|
49
|
+
Bullet.collected_unused_eager_association_notifications.select do |notification|
|
51
50
|
notification.base_class == klass.to_s && notification.associations.include?(association)
|
52
|
-
|
51
|
+
end.present?
|
53
52
|
end
|
54
53
|
end
|
55
54
|
end
|
data/spec/support/mongo_seed.rb
CHANGED
@@ -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.
|
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-
|
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
|