bullet 4.10.0 → 4.11.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/CHANGELOG.md +12 -0
- data/Gemfile +4 -4
- data/lib/bullet/active_record3.rb +6 -0
- data/lib/bullet/active_record3x.rb +6 -0
- data/lib/bullet/active_record4.rb +6 -0
- data/lib/bullet/active_record41.rb +6 -0
- data/lib/bullet/detector/association.rb +2 -0
- data/lib/bullet/detector/counter_cache.rb +4 -1
- data/lib/bullet/detector/n_plus_one_query.rb +4 -1
- data/lib/bullet/detector/unused_eager_loading.rb +1 -0
- data/lib/bullet/ext/object.rb +5 -1
- data/lib/bullet/rack.rb +10 -4
- data/lib/bullet/version.rb +1 -1
- data/spec/bullet/rack_spec.rb +2 -2
- data/spec/integration/active_record3/association_spec.rb +10 -0
- data/spec/integration/active_record4/association_spec.rb +10 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db6af7eda5d3f19441a8e60b5aae5bf09d4dd3f8
|
4
|
+
data.tar.gz: 94510322d9e3190c200e5b18351c9b11c255e19a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f1be7c449021b691ba83e2ea42c39d0701ce5c89f6517c9218dc563eaac0d6a18e626025e113470d30a7d8ce9c77ab7da784b030f983b32784079dba3312bd1
|
7
|
+
data.tar.gz: 0306d0092a4c164e5b650f7c3e5b42b4e3b16d3359bd82ff20e9b5b1cd2414af1e236f91a07a147ed374d4d9bf6d98a1eedb50b1dd4bf09e9922a222568bdfb1
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Next Release
|
2
2
|
|
3
|
+
## 4.11.0
|
4
|
+
|
5
|
+
* Support empty? call on ar associations
|
6
|
+
* Skip detecting if object is a new record
|
7
|
+
|
8
|
+
## 4.10.0 (06/06/2014)
|
9
|
+
|
10
|
+
* Handle join query smarter
|
11
|
+
* Support mongoid 4.0
|
12
|
+
* Thread safe
|
13
|
+
* Add debug mode
|
14
|
+
|
3
15
|
## 4.9.0 (04/30/2014)
|
4
16
|
|
5
17
|
* Add Bullet.stacktrace_includes option
|
data/Gemfile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
@@ -7,9 +7,9 @@ gem 'sqlite3', platforms: [:ruby]
|
|
7
7
|
gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
|
8
8
|
gem 'activerecord-import'
|
9
9
|
|
10
|
-
gem
|
11
|
-
gem
|
12
|
-
gem
|
10
|
+
gem 'rspec'
|
11
|
+
gem 'guard'
|
12
|
+
gem 'guard-rspec'
|
13
13
|
|
14
14
|
gem 'coveralls', require: false
|
15
15
|
|
@@ -97,6 +97,12 @@ module Bullet
|
|
97
97
|
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
98
98
|
origin_last(*args)
|
99
99
|
end
|
100
|
+
|
101
|
+
alias_method :origin_empty?, :empty?
|
102
|
+
def empty?
|
103
|
+
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
104
|
+
origin_empty?
|
105
|
+
end
|
100
106
|
end
|
101
107
|
|
102
108
|
::ActiveRecord::Associations::AssociationProxy.class_eval do
|
@@ -85,6 +85,12 @@ module Bullet
|
|
85
85
|
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
86
86
|
origin_load_target
|
87
87
|
end
|
88
|
+
|
89
|
+
alias_method :origin_empty?, :empty?
|
90
|
+
def empty?
|
91
|
+
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
92
|
+
origin_empty?
|
93
|
+
end
|
88
94
|
end
|
89
95
|
|
90
96
|
::ActiveRecord::Associations::SingularAssociation.class_eval do
|
@@ -85,6 +85,12 @@ module Bullet
|
|
85
85
|
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
86
86
|
origin_load_target
|
87
87
|
end
|
88
|
+
|
89
|
+
alias_method :origin_empty?, :empty?
|
90
|
+
def empty?
|
91
|
+
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
92
|
+
origin_empty?
|
93
|
+
end
|
88
94
|
end
|
89
95
|
|
90
96
|
::ActiveRecord::Associations::SingularAssociation.class_eval do
|
@@ -86,6 +86,12 @@ module Bullet
|
|
86
86
|
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) unless @inversed
|
87
87
|
origin_load_target
|
88
88
|
end
|
89
|
+
|
90
|
+
alias_method :origin_empty?, :empty?
|
91
|
+
def empty?
|
92
|
+
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
93
|
+
origin_empty?
|
94
|
+
end
|
89
95
|
end
|
90
96
|
|
91
97
|
::ActiveRecord::Associations::SingularAssociation.class_eval do
|
@@ -5,6 +5,7 @@ module Bullet
|
|
5
5
|
def add_object_associations(object, associations)
|
6
6
|
return unless Bullet.start?
|
7
7
|
return if !Bullet.n_plus_one_query_enable? && !Bullet.unused_eager_loading_enable?
|
8
|
+
return unless object.id
|
8
9
|
|
9
10
|
Bullet.debug("Detector::Association#add_object_associations", "object: #{object.bullet_ar_key}, associations: #{associations}")
|
10
11
|
object_associations.add(object.bullet_ar_key, associations)
|
@@ -13,6 +14,7 @@ module Bullet
|
|
13
14
|
def add_call_object_associations(object, associations)
|
14
15
|
return unless Bullet.start?
|
15
16
|
return if !Bullet.n_plus_one_query_enable? && !Bullet.unused_eager_loading_enable?
|
17
|
+
return unless object.id
|
16
18
|
|
17
19
|
Bullet.debug("Detector::Association#add_call_object_associations", "object: #{object.bullet_ar_key}, associations: #{associations}")
|
18
20
|
call_object_associations.add(object.bullet_ar_key, associations)
|
@@ -5,6 +5,7 @@ module Bullet
|
|
5
5
|
def add_counter_cache(object, associations)
|
6
6
|
return unless Bullet.start?
|
7
7
|
return unless Bullet.counter_cache_enable?
|
8
|
+
return unless object.id
|
8
9
|
|
9
10
|
Bullet.debug("Detector::CounterCache#add_counter_cache", "object: #{object.bullet_ar_key}, associations: #{associations}")
|
10
11
|
if conditions_met?(object.bullet_ar_key, associations)
|
@@ -15,8 +16,9 @@ module Bullet
|
|
15
16
|
def add_possible_objects(object_or_objects)
|
16
17
|
return unless Bullet.start?
|
17
18
|
return unless Bullet.counter_cache_enable?
|
18
|
-
|
19
19
|
objects = Array(object_or_objects)
|
20
|
+
return if objects.map(&:id).compact.empty?
|
21
|
+
|
20
22
|
Bullet.debug("Detector::CounterCache#add_possible_objects", "objects: #{objects.map(&:bullet_ar_key).join(', ')}")
|
21
23
|
objects.each { |object| possible_objects.add object.bullet_ar_key }
|
22
24
|
end
|
@@ -24,6 +26,7 @@ module Bullet
|
|
24
26
|
def add_impossible_object(object)
|
25
27
|
return unless Bullet.start?
|
26
28
|
return unless Bullet.counter_cache_enable?
|
29
|
+
return unless object.id
|
27
30
|
|
28
31
|
Bullet.debug("Detector::CounterCache#add_impossible_object", "object: #{object.bullet_ar_key}")
|
29
32
|
impossible_objects.add object.bullet_ar_key
|
@@ -10,6 +10,7 @@ module Bullet
|
|
10
10
|
# if it is, keeps this unpreload associations and caller.
|
11
11
|
def call_association(object, associations)
|
12
12
|
return unless Bullet.start?
|
13
|
+
return unless object.id
|
13
14
|
add_call_object_associations(object, associations)
|
14
15
|
|
15
16
|
Bullet.debug("Detector::NPlusOneQuery#call_association", "object: #{object.bullet_ar_key}, associations: #{associations}")
|
@@ -22,8 +23,9 @@ module Bullet
|
|
22
23
|
def add_possible_objects(object_or_objects)
|
23
24
|
return unless Bullet.start?
|
24
25
|
return unless Bullet.n_plus_one_query_enable?
|
25
|
-
|
26
26
|
objects = Array(object_or_objects)
|
27
|
+
return if objects.map(&:id).compact.empty?
|
28
|
+
|
27
29
|
Bullet.debug("Detector::NPlusOneQuery#add_possible_objects", "objects: #{objects.map(&:bullet_ar_key).join(', ')}")
|
28
30
|
objects.each { |object| possible_objects.add object.bullet_ar_key }
|
29
31
|
end
|
@@ -31,6 +33,7 @@ module Bullet
|
|
31
33
|
def add_impossible_object(object)
|
32
34
|
return unless Bullet.start?
|
33
35
|
return unless Bullet.n_plus_one_query_enable?
|
36
|
+
return unless object.id
|
34
37
|
|
35
38
|
Bullet.debug("Detector::NPlusOneQuery#add_impossible_object", "object: #{object.bullet_ar_key}")
|
36
39
|
impossible_objects.add object.bullet_ar_key
|
@@ -22,6 +22,7 @@ module Bullet
|
|
22
22
|
def add_eager_loadings(objects, associations)
|
23
23
|
return unless Bullet.start?
|
24
24
|
return unless Bullet.unused_eager_loading_enable?
|
25
|
+
return if objects.map(&:id).compact.empty?
|
25
26
|
|
26
27
|
Bullet.debug("Detector::UnusedEagerLoading#add_eager_loadings", "objects: #{objects.map(&:bullet_ar_key).join(', ')}, associations: #{associations}")
|
27
28
|
bullet_ar_keys = objects.map(&:bullet_ar_key)
|
data/lib/bullet/ext/object.rb
CHANGED
data/lib/bullet/rack.rb
CHANGED
@@ -10,7 +10,7 @@ module Bullet
|
|
10
10
|
return @app.call(env) unless Bullet.enable?
|
11
11
|
Bullet.start_request
|
12
12
|
status, headers, response = @app.call(env)
|
13
|
-
return [status, headers, response] if file?(headers) || empty?(response)
|
13
|
+
return [status, headers, response] if file?(headers) || sse?(response) || empty?(response)
|
14
14
|
|
15
15
|
response_body = nil
|
16
16
|
if Bullet.notification?
|
@@ -19,10 +19,13 @@ module Bullet
|
|
19
19
|
add_footer_note(response_body) if Bullet.add_footer
|
20
20
|
headers['Content-Length'] = response_body.bytesize.to_s
|
21
21
|
end
|
22
|
+
end
|
23
|
+
[status, headers, response_body ? [response_body] : response]
|
24
|
+
ensure
|
25
|
+
if Bullet.enable? && Bullet.notification?
|
22
26
|
Bullet.perform_out_of_channel_notifications(env)
|
23
27
|
end
|
24
28
|
Bullet.end_request
|
25
|
-
[status, headers, response_body ? [response_body] : response]
|
26
29
|
end
|
27
30
|
|
28
31
|
# fix issue if response's body is a Proc
|
@@ -43,11 +46,14 @@ module Bullet
|
|
43
46
|
response_body << "<div #{footer_div_style}>" + Bullet.footer_info.uniq.join("<br>") + "</div>"
|
44
47
|
end
|
45
48
|
|
46
|
-
# if send file?
|
47
49
|
def file?(headers)
|
48
50
|
headers["Content-Transfer-Encoding"] == "binary"
|
49
51
|
end
|
50
52
|
|
53
|
+
def sse?(response)
|
54
|
+
response.respond_to? :stream
|
55
|
+
end
|
56
|
+
|
51
57
|
def html_request?(headers, response)
|
52
58
|
headers['Content-Type'] && headers['Content-Type'].include?('text/html') && response_body(response).include?("<html")
|
53
59
|
end
|
@@ -67,7 +73,7 @@ style="position: fixed; bottom: 0pt; left: 0pt; cursor: pointer; border-style: s
|
|
67
73
|
-moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none;
|
68
74
|
-moz-border-left-colors: none; -moz-border-image: none; border-width: 2pt 2pt 0px 0px;
|
69
75
|
padding: 5px; border-radius: 0pt 10pt 0pt 0px; background: none repeat scroll 0% 0% rgba(200, 200, 200, 0.8);
|
70
|
-
color: rgb(119, 119, 119); font-size: 18px;"
|
76
|
+
color: rgb(119, 119, 119); font-size: 18px; font-family: 'Arial', sans-serif; z-index:9999;"
|
71
77
|
EOF
|
72
78
|
end
|
73
79
|
end
|
data/lib/bullet/version.rb
CHANGED
data/spec/bullet/rack_spec.rb
CHANGED
@@ -65,7 +65,7 @@ module Bullet
|
|
65
65
|
end
|
66
66
|
|
67
67
|
it "should change response body if notification is active" do
|
68
|
-
expect(Bullet).to receive(:notification?).and_return(true)
|
68
|
+
expect(Bullet).to receive(:notification?).and_return(true).twice
|
69
69
|
expect(Bullet).to receive(:gather_inline_notifications).and_return("<bullet></bullet>")
|
70
70
|
expect(Bullet).to receive(:perform_out_of_channel_notifications)
|
71
71
|
status, headers, response = middleware.call([200, {"Content-Type" => "text/html"}])
|
@@ -77,7 +77,7 @@ module Bullet
|
|
77
77
|
response = Support::ResponseDouble.new
|
78
78
|
response.body = "<html><head></head><body>é</body></html>"
|
79
79
|
app.response = response
|
80
|
-
expect(Bullet).to receive(:notification?).and_return(true)
|
80
|
+
expect(Bullet).to receive(:notification?).and_return(true).twice
|
81
81
|
expect(Bullet).to receive(:gather_inline_notifications).and_return("<bullet></bullet>")
|
82
82
|
status, headers, response = middleware.call([200, {"Content-Type" => "text/html"}])
|
83
83
|
expect(headers["Content-Length"]).to eq("58")
|
@@ -51,6 +51,16 @@ if !mongoid? && active_record3?
|
|
51
51
|
|
52
52
|
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
53
53
|
end
|
54
|
+
|
55
|
+
it "should detect non preload post => comments with empty?" do
|
56
|
+
Post.all.each do |post|
|
57
|
+
post.comments.empty?
|
58
|
+
end
|
59
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
60
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
61
|
+
|
62
|
+
expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Post, :comments)
|
63
|
+
end
|
54
64
|
end
|
55
65
|
|
56
66
|
context "category => posts => comments" do
|
@@ -51,6 +51,16 @@ if !mongoid? && active_record4?
|
|
51
51
|
|
52
52
|
expect(Bullet::Detector::Association).to be_completely_preloading_associations
|
53
53
|
end
|
54
|
+
|
55
|
+
it "should detect non preload post => comments with empty?" do
|
56
|
+
Post.all.each do |post|
|
57
|
+
post.comments.empty?
|
58
|
+
end
|
59
|
+
Bullet::Detector::UnusedEagerLoading.check_unused_preload_associations
|
60
|
+
expect(Bullet::Detector::Association).not_to be_has_unused_preload_associations
|
61
|
+
|
62
|
+
expect(Bullet::Detector::Association).to be_detecting_unpreloaded_association_for(Post, :comments)
|
63
|
+
end
|
54
64
|
end
|
55
65
|
|
56
66
|
context "category => posts => comments" do
|
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: 4.
|
4
|
+
version: 4.11.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: 2014-06-
|
11
|
+
date: 2014-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|