bullet 7.0.1 → 7.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +18 -15
- data/lib/bullet/active_record5.rb +1 -1
- data/lib/bullet/active_record52.rb +2 -2
- data/lib/bullet/active_record60.rb +2 -2
- data/lib/bullet/active_record61.rb +2 -2
- data/lib/bullet/active_record70.rb +2 -2
- data/lib/bullet/bullet_xhr.js +3 -3
- data/lib/bullet/detector/counter_cache.rb +2 -2
- data/lib/bullet/detector/n_plus_one_query.rb +3 -3
- data/lib/bullet/detector/unused_eager_loading.rb +2 -2
- data/lib/bullet/rack.rb +1 -1
- data/lib/bullet/version.rb +1 -1
- data/lib/bullet.rb +1 -1
- data/lib/generators/bullet/install_generator.rb +0 -1
- data/spec/bullet/detector/n_plus_one_query_spec.rb +1 -1
- data/spec/bullet/notification/base_spec.rb +4 -4
- data/spec/bullet/rack_spec.rb +0 -6
- data/spec/support/sqlite_seed.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad1f81292cc89778a41c6dd178bbfb6342fe1b69c4e57c3fdad0d8003d97b525
|
4
|
+
data.tar.gz: 5c1c8113f6e03ecdb449bce5e12273b969f29c323a5bb802c13c0539ea439a69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f0d4d73910f96ab8c6ae5b6b1bc58de547c2c32a7c689c2984778465dae29d2c2cae81c23699b3848d2eaef30223db66bcca6ccb421b9078d5616f497421d45
|
7
|
+
data.tar.gz: 3b9001966918da22bfe7b2960526ac0db471a75e79e7939b099bebe3dde1fb27ea69b1afbdec0fcc98a6cb4260b845b5551a1a07cec036207c885be4e14ef7b9
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
## Next Release
|
2
2
|
|
3
|
+
## 7.0.3 (08/13/2022)
|
4
|
+
|
5
|
+
* Replace `Array()` with `Array.wrap()`
|
6
|
+
|
7
|
+
## 7.0.2 (05/31/2022)
|
8
|
+
|
9
|
+
* Drop growl support
|
10
|
+
* Do not check html tag in Bullet::Rack anymore
|
11
|
+
|
3
12
|
## 7.0.1 (01/15/2022)
|
4
13
|
|
5
14
|
* Get rid of *_whitelist methods
|
data/README.md
CHANGED
@@ -49,7 +49,7 @@ mongoid.
|
|
49
49
|
|
50
50
|
## Configuration
|
51
51
|
|
52
|
-
Bullet won't
|
52
|
+
Bullet won't enable any notification systems unless you tell it to explicitly. Append to
|
53
53
|
`config/environments/development.rb` initializer with the following code:
|
54
54
|
|
55
55
|
```ruby
|
@@ -59,7 +59,6 @@ config.after_initialize do
|
|
59
59
|
Bullet.alert = true
|
60
60
|
Bullet.bullet_logger = true
|
61
61
|
Bullet.console = true
|
62
|
-
Bullet.growl = true
|
63
62
|
Bullet.xmpp = { :account => 'bullets_account@jabber.org',
|
64
63
|
:password => 'bullets_password_for_jabber',
|
65
64
|
:receiver => 'your_account@jabber.org',
|
@@ -85,7 +84,6 @@ The code above will enable all of the Bullet notification systems:
|
|
85
84
|
* `Bullet.alert`: pop up a JavaScript alert in the browser
|
86
85
|
* `Bullet.bullet_logger`: log to the Bullet log file (Rails.root/log/bullet.log)
|
87
86
|
* `Bullet.console`: log warnings to your browser's console.log (Safari/Webkit browsers or Firefox w/Firebug installed)
|
88
|
-
* `Bullet.growl`: pop up Growl warnings if your system has Growl installed. Requires a little bit of configuration
|
89
87
|
* `Bullet.xmpp`: send XMPP/Jabber notifications to the receiver indicated. Note that the code will currently not handle the adding of contacts, so you will need to make both accounts indicated know each other manually before you will receive any notifications. If you restart the development server frequently, the 'coming online' sound for the Bullet account may start to annoy - in this case set :show_online_status to false; you will still get notifications, but the Bullet account won't announce it's online status anymore.
|
90
88
|
* `Bullet.rails_logger`: add warnings directly to the Rails log
|
91
89
|
* `Bullet.honeybadger`: add notifications to Honeybadger
|
@@ -156,25 +154,26 @@ The Bullet log `log/bullet.log` will look something like this:
|
|
156
154
|
* N+1 Query:
|
157
155
|
|
158
156
|
```
|
159
|
-
2009-08-25 20:40:17[INFO]
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
/Users/richard/Downloads/test/app/views/posts/index.html.erb:8:in `each'
|
164
|
-
/Users/richard/Downloads/test/app/
|
165
|
-
/Users/richard/Downloads/test/app/controllers/posts_controller.rb:7:in `index'
|
157
|
+
2009-08-25 20:40:17[INFO] USE eager loading detected:
|
158
|
+
Post => [:comments]·
|
159
|
+
Add to your query: .includes([:comments])
|
160
|
+
2009-08-25 20:40:17[INFO] Call stack
|
161
|
+
/Users/richard/Downloads/test/app/views/posts/index.html.erb:8:in `each'
|
162
|
+
/Users/richard/Downloads/test/app/controllers/posts_controller.rb:7:in `index'
|
166
163
|
```
|
167
164
|
|
168
|
-
The first
|
165
|
+
The first log entry is a notification that N+1 queries have been encountered. The remaining entry is a stack trace so you can find exactly where the queries were invoked in your code, and fix them.
|
169
166
|
|
170
167
|
* Unused eager loading:
|
171
168
|
|
172
169
|
```
|
173
|
-
2009-08-25 20:53:56[INFO]
|
174
|
-
|
170
|
+
2009-08-25 20:53:56[INFO] AVOID eager loading detected
|
171
|
+
Post => [:comments]·
|
172
|
+
Remove from your query: .includes([:comments])
|
173
|
+
2009-08-25 20:53:56[INFO] Call stack
|
175
174
|
```
|
176
175
|
|
177
|
-
These
|
176
|
+
These lines are notifications that unused eager loadings have been encountered.
|
178
177
|
|
179
178
|
* Need counter cache:
|
180
179
|
|
@@ -183,10 +182,14 @@ These two lines are notifications that unused eager loadings have been encounter
|
|
183
182
|
Post => [:comments]
|
184
183
|
```
|
185
184
|
|
186
|
-
##
|
185
|
+
## XMPP/Jabber and Airbrake Support
|
187
186
|
|
188
187
|
see [https://github.com/flyerhzm/uniform_notifier](https://github.com/flyerhzm/uniform_notifier)
|
189
188
|
|
189
|
+
## Growl Support
|
190
|
+
|
191
|
+
Growl support is dropped from uniform_notifier 1.16.0, if you still want it, please use uniform_notifier 1.15.0.
|
192
|
+
|
190
193
|
## Important
|
191
194
|
|
192
195
|
If you find Bullet does not work for you, *please disable your browser's cache*.
|
@@ -179,7 +179,7 @@ module Bullet
|
|
179
179
|
refl = reflection.through_reflection
|
180
180
|
Bullet::Detector::NPlusOneQuery.call_association(owner, refl.name)
|
181
181
|
association = owner.association refl.name
|
182
|
-
Array(association.target).each do |through_record|
|
182
|
+
Array.wrap(association.target).each do |through_record|
|
183
183
|
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
184
184
|
end
|
185
185
|
|
@@ -152,7 +152,7 @@ module Bullet
|
|
152
152
|
if is_a? ::ActiveRecord::Associations::ThroughAssociation
|
153
153
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
|
154
154
|
association = owner.association reflection.through_reflection.name
|
155
|
-
Array(association.target).each do |through_record|
|
155
|
+
Array.wrap(association.target).each do |through_record|
|
156
156
|
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
157
157
|
end
|
158
158
|
|
@@ -199,7 +199,7 @@ module Bullet
|
|
199
199
|
if is_a? ::ActiveRecord::Associations::ThroughAssociation
|
200
200
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
|
201
201
|
association = owner.association reflection.through_reflection.name
|
202
|
-
Array(association.target).each do |through_record|
|
202
|
+
Array.wrap(association.target).each do |through_record|
|
203
203
|
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
204
204
|
end
|
205
205
|
|
@@ -179,7 +179,7 @@ module Bullet
|
|
179
179
|
if is_a? ::ActiveRecord::Associations::ThroughAssociation
|
180
180
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
|
181
181
|
association = owner.association(reflection.through_reflection.name)
|
182
|
-
Array(association.target).each do |through_record|
|
182
|
+
Array.wrap(association.target).each do |through_record|
|
183
183
|
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
184
184
|
end
|
185
185
|
|
@@ -226,7 +226,7 @@ module Bullet
|
|
226
226
|
if is_a? ::ActiveRecord::Associations::ThroughAssociation
|
227
227
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
|
228
228
|
association = owner.association(reflection.through_reflection.name)
|
229
|
-
Array(association.target).each do |through_record|
|
229
|
+
Array.wrap(association.target).each do |through_record|
|
230
230
|
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
231
231
|
end
|
232
232
|
|
@@ -179,7 +179,7 @@ module Bullet
|
|
179
179
|
if is_a? ::ActiveRecord::Associations::ThroughAssociation
|
180
180
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
|
181
181
|
association = owner.association(reflection.through_reflection.name)
|
182
|
-
Array(association.target).each do |through_record|
|
182
|
+
Array.wrap(association.target).each do |through_record|
|
183
183
|
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
184
184
|
end
|
185
185
|
|
@@ -226,7 +226,7 @@ module Bullet
|
|
226
226
|
if is_a? ::ActiveRecord::Associations::ThroughAssociation
|
227
227
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
|
228
228
|
association = owner.association(reflection.through_reflection.name)
|
229
|
-
Array(association.target).each do |through_record|
|
229
|
+
Array.wrap(association.target).each do |through_record|
|
230
230
|
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
231
231
|
end
|
232
232
|
|
@@ -182,7 +182,7 @@ module Bullet
|
|
182
182
|
if is_a? ::ActiveRecord::Associations::ThroughAssociation
|
183
183
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
|
184
184
|
association = owner.association(reflection.through_reflection.name)
|
185
|
-
Array(association.target).each do |through_record|
|
185
|
+
Array.wrap(association.target).each do |through_record|
|
186
186
|
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
187
187
|
end
|
188
188
|
|
@@ -229,7 +229,7 @@ module Bullet
|
|
229
229
|
if is_a? ::ActiveRecord::Associations::ThroughAssociation
|
230
230
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
|
231
231
|
association = owner.association(reflection.through_reflection.name)
|
232
|
-
Array(association.target).each do |through_record|
|
232
|
+
Array.wrap(association.target).each do |through_record|
|
233
233
|
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
234
234
|
end
|
235
235
|
|
data/lib/bullet/bullet_xhr.js
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
if (this.onload) {
|
21
21
|
this._storedOnload = this.onload;
|
22
22
|
}
|
23
|
-
this.onload = null
|
23
|
+
this.onload = null;
|
24
24
|
this.addEventListener("load", bulletXHROnload);
|
25
25
|
return Reflect.apply(oldSend, this, arguments);
|
26
26
|
}
|
@@ -31,7 +31,7 @@
|
|
31
31
|
) {
|
32
32
|
var bulletFooterText = this.getResponseHeader("X-bullet-footer-text");
|
33
33
|
if (bulletFooterText) {
|
34
|
-
setTimeout(function() {
|
34
|
+
setTimeout(function () {
|
35
35
|
var oldHtml = document.querySelector("#bullet-footer").innerHTML.split("<br>");
|
36
36
|
var header = oldHtml[0];
|
37
37
|
oldHtml = oldHtml.slice(1, oldHtml.length);
|
@@ -42,7 +42,7 @@
|
|
42
42
|
}
|
43
43
|
var bulletConsoleText = this.getResponseHeader("X-bullet-console-text");
|
44
44
|
if (bulletConsoleText && typeof console !== "undefined" && console.log) {
|
45
|
-
setTimeout(function() {
|
45
|
+
setTimeout(function () {
|
46
46
|
JSON.parse(bulletConsoleText).forEach((message) => {
|
47
47
|
if (console.groupCollapsed && console.groupEnd) {
|
48
48
|
console.groupCollapsed("Uniform Notifier");
|
@@ -20,7 +20,7 @@ module Bullet
|
|
20
20
|
return unless Bullet.start?
|
21
21
|
return unless Bullet.counter_cache_enable?
|
22
22
|
|
23
|
-
objects = Array(object_or_objects)
|
23
|
+
objects = Array.wrap(object_or_objects)
|
24
24
|
return if objects.map(&:bullet_primary_key_value).compact.empty?
|
25
25
|
|
26
26
|
Bullet.debug(
|
@@ -54,7 +54,7 @@ module Bullet
|
|
54
54
|
private
|
55
55
|
|
56
56
|
def create_notification(klazz, associations)
|
57
|
-
notify_associations = Array(associations) - Bullet.get_safelist_associations(:counter_cache, klazz)
|
57
|
+
notify_associations = Array.wrap(associations) - Bullet.get_safelist_associations(:counter_cache, klazz)
|
58
58
|
|
59
59
|
if notify_associations.present?
|
60
60
|
notice = Bullet::Notification::CounterCache.new klazz, notify_associations
|
@@ -7,7 +7,7 @@ module Bullet
|
|
7
7
|
extend StackTraceFilter
|
8
8
|
|
9
9
|
class << self
|
10
|
-
# executed when object.
|
10
|
+
# executed when object.associations is called.
|
11
11
|
# first, it keeps this method call for object.association.
|
12
12
|
# then, it checks if this associations call is unpreload.
|
13
13
|
# if it is, keeps this unpreload associations and caller.
|
@@ -33,7 +33,7 @@ module Bullet
|
|
33
33
|
return unless Bullet.start?
|
34
34
|
return unless Bullet.n_plus_one_query_enable?
|
35
35
|
|
36
|
-
objects = Array(object_or_objects)
|
36
|
+
objects = Array.wrap(object_or_objects)
|
37
37
|
return if objects.map(&:bullet_primary_key_value).compact.empty?
|
38
38
|
return if objects.all? { |obj| obj.class.name =~ /^HABTM_/ }
|
39
39
|
|
@@ -95,7 +95,7 @@ module Bullet
|
|
95
95
|
private
|
96
96
|
|
97
97
|
def create_notification(callers, klazz, associations)
|
98
|
-
notify_associations = Array(associations) - Bullet.get_safelist_associations(:n_plus_one_query, klazz)
|
98
|
+
notify_associations = Array.wrap(associations) - Bullet.get_safelist_associations(:n_plus_one_query, klazz)
|
99
99
|
|
100
100
|
if notify_associations.present?
|
101
101
|
notice = Bullet::Notification::NPlusOneQuery.new(callers, klazz, notify_associations)
|
@@ -10,7 +10,7 @@ module Bullet
|
|
10
10
|
# check if there are unused preload associations.
|
11
11
|
# get related_objects from eager_loadings associated with object and associations
|
12
12
|
# get call_object_association from associations of call_object_associations whose object is in related_objects
|
13
|
-
# if association not in call_object_association, then the object => association - call_object_association is ununsed preload
|
13
|
+
# if association not in call_object_association, then the object => association - call_object_association is ununsed preload associations
|
14
14
|
def check_unused_preload_associations
|
15
15
|
return unless Bullet.start?
|
16
16
|
return unless Bullet.unused_eager_loading_enable?
|
@@ -65,7 +65,7 @@ module Bullet
|
|
65
65
|
private
|
66
66
|
|
67
67
|
def create_notification(callers, klazz, associations)
|
68
|
-
notify_associations = Array(associations) - Bullet.get_safelist_associations(:unused_eager_loading, klazz)
|
68
|
+
notify_associations = Array.wrap(associations) - Bullet.get_safelist_associations(:unused_eager_loading, klazz)
|
69
69
|
|
70
70
|
if notify_associations.present?
|
71
71
|
notice = Bullet::Notification::UnusedEagerLoading.new(callers, klazz, notify_associations)
|
data/lib/bullet/rack.rb
CHANGED
data/lib/bullet/version.rb
CHANGED
data/lib/bullet.rb
CHANGED
@@ -39,7 +39,7 @@ module Bullet
|
|
39
39
|
|
40
40
|
it 'should be false if object, association pair is not existed' do
|
41
41
|
NPlusOneQuery.add_object_associations(@post, :association1)
|
42
|
-
expect(NPlusOneQuery.association?(@post, :
|
42
|
+
expect(NPlusOneQuery.association?(@post, :association2)).to eq false
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -74,8 +74,8 @@ module Bullet
|
|
74
74
|
it 'should send full_notice to notifier' do
|
75
75
|
notifier = double
|
76
76
|
allow(subject).to receive(:notifier).and_return(notifier)
|
77
|
-
allow(subject).to receive(:notification_data).and_return(foo: :bar)
|
78
|
-
expect(notifier).to receive(:inline_notify).with(foo: :bar)
|
77
|
+
allow(subject).to receive(:notification_data).and_return({ foo: :bar })
|
78
|
+
expect(notifier).to receive(:inline_notify).with({ foo: :bar })
|
79
79
|
subject.notify_inline
|
80
80
|
end
|
81
81
|
end
|
@@ -84,8 +84,8 @@ module Bullet
|
|
84
84
|
it 'should send full_out_of_channel to notifier' do
|
85
85
|
notifier = double
|
86
86
|
allow(subject).to receive(:notifier).and_return(notifier)
|
87
|
-
allow(subject).to receive(:notification_data).and_return(foo: :bar)
|
88
|
-
expect(notifier).to receive(:out_of_channel_notify).with(foo: :bar)
|
87
|
+
allow(subject).to receive(:notification_data).and_return({ foo: :bar })
|
88
|
+
expect(notifier).to receive(:out_of_channel_notify).with({ foo: :bar })
|
89
89
|
subject.notify_out_of_channel
|
90
90
|
end
|
91
91
|
end
|
data/spec/bullet/rack_spec.rb
CHANGED
@@ -31,12 +31,6 @@ module Bullet
|
|
31
31
|
response = double(body: '<html><head></head><body></body></html>')
|
32
32
|
expect(middleware).not_to be_html_request(headers, response)
|
33
33
|
end
|
34
|
-
|
35
|
-
it "should be false if response body doesn't contain html tag" do
|
36
|
-
headers = { 'Content-Type' => 'text/html' }
|
37
|
-
response = double(body: '<div>Partial</div>')
|
38
|
-
expect(middleware).not_to be_html_request(headers, response)
|
39
|
-
end
|
40
34
|
end
|
41
35
|
|
42
36
|
context 'empty?' do
|
data/spec/support/sqlite_seed.rb
CHANGED
@@ -92,7 +92,7 @@ module Support
|
|
92
92
|
page3 = Page.create(name: 'page3', parent_id: folder2.id, author_id: author2.id)
|
93
93
|
page4 = Page.create(name: 'page4', parent_id: folder2.id, author_id: author2.id)
|
94
94
|
|
95
|
-
role1 = Role.create(name: '
|
95
|
+
role1 = Role.create(name: 'Admin')
|
96
96
|
role2 = Role.create(name: 'User')
|
97
97
|
|
98
98
|
user1 = User.create(name: 'user1', category: category1)
|
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: 7.0.
|
4
|
+
version: 7.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -195,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
195
195
|
- !ruby/object:Gem::Version
|
196
196
|
version: 1.3.6
|
197
197
|
requirements: []
|
198
|
-
rubygems_version: 3.
|
198
|
+
rubygems_version: 3.3.7
|
199
199
|
signing_key:
|
200
200
|
specification_version: 4
|
201
201
|
summary: help to kill N+1 queries and unused eager loading.
|