bullet 5.2.0 → 5.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dbcef4cb1e9b0db722674cc600a456767eb5d2dd
4
- data.tar.gz: 27107041da317defb0433329dc55375b305cc7b8
3
+ metadata.gz: 9c06cf9b6f47c5e634fc97060ca54c2921435d2d
4
+ data.tar.gz: ad3f7ac0141cf94446805db9495c06db19bf5073
5
5
  SHA512:
6
- metadata.gz: ea8208a3a4f1a1ef3f4f247667f9485b951a00ba5036cc87b8049005813e8f7452a5d340c1fdb09ea525fd5996b0050587a758afc8ff2a421f93acb21424f605
7
- data.tar.gz: 456466364914301c30c4622bba947888bd16d92dad0603759c8b1108c4bc11ed417a8fca5a8ee2c983f119fa16e587cc140498393d2ec31f1a79c410082f1874
6
+ metadata.gz: 323e475243dc0416bc4d0e5c884642685e05d54ed7681de6406a168326846e4e5b220c53ea41b1bcb814ca5159f1d22a75e54baba4e51877cea631f47e8e4398
7
+ data.tar.gz: b84c10f9be778b1db9577857c39261669fd64889190b2aecaee5dbaf80b07542c75a3a1b976c5b132075875a008338d744ad370437ffdecbc0246b0a802026f1
@@ -1,5 +1,11 @@
1
1
  # Next Release
2
2
 
3
+ ## 5.2.1
4
+
5
+ * Fix env REQUEST_URI
6
+ * Fix false alert on through association with join sql #301
7
+ * Fix association.target in through_association can be singular #302
8
+
3
9
  ## 5.2.0 (07/26/2016)
4
10
 
5
11
  * Fix `has_cached_counter?` is not defined in HABTM #297
@@ -166,8 +166,9 @@ module Bullet
166
166
  end
167
167
 
168
168
  def perform_out_of_channel_notifications(env = {})
169
+ request_uri = env['REQUEST_URI'] || build_request_uri(env)
169
170
  for_each_active_notifier_with_notification do |notification|
170
- notification.url = env['REQUEST_URI']
171
+ notification.url = request_uri
171
172
  notification.notify_out_of_channel
172
173
  end
173
174
  end
@@ -217,5 +218,13 @@ module Bullet
217
218
  end
218
219
  end
219
220
  end
221
+
222
+ def build_request_uri(env)
223
+ if env['QUERY_STRING'].present?
224
+ "#{env['PATH_INFO']}?#{env['QUERY_STRING']}"
225
+ else
226
+ env['PATH_INFO']
227
+ end
228
+ end
220
229
  end
221
230
  end
@@ -96,6 +96,7 @@ module Bullet
96
96
 
97
97
  ::ActiveRecord::Associations::JoinDependency.class_eval do
98
98
  alias_method :origin_instantiate, :instantiate
99
+ alias_method :origin_construct, :construct
99
100
  alias_method :origin_construct_model, :construct_model
100
101
 
101
102
  def instantiate(result_set, aliases)
@@ -111,6 +112,27 @@ module Bullet
111
112
  records
112
113
  end
113
114
 
115
+ def construct(ar_parent, parent, row, rs, seen, model_cache, aliases)
116
+ if Bullet.start?
117
+ unless ar_parent.nil?
118
+ parent.children.each do |node|
119
+ key = aliases.column_alias(node, node.primary_key)
120
+ id = row[key]
121
+ if id.nil?
122
+ associations = node.reflection.name
123
+ Bullet::Detector::Association.add_object_associations(ar_parent, associations)
124
+ Bullet::Detector::NPlusOneQuery.call_association(ar_parent, associations)
125
+ @bullet_eager_loadings[ar_parent.class] ||= {}
126
+ @bullet_eager_loadings[ar_parent.class][ar_parent] ||= Set.new
127
+ @bullet_eager_loadings[ar_parent.class][ar_parent] << associations
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ origin_construct(ar_parent, parent, row, rs, seen, model_cache, aliases)
134
+ end
135
+
114
136
  # call join associations
115
137
  def construct_model(record, node, row, model_cache, id, aliases)
116
138
  result = origin_construct_model(record, node, row, model_cache, id, aliases)
@@ -135,9 +157,7 @@ module Bullet
135
157
  records = origin_load_target
136
158
 
137
159
  if Bullet.start?
138
- if records.size > 1
139
- Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) unless @inversed
140
- end
160
+ Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) unless @inversed
141
161
  if records.first.class.name !~ /^HABTM_/
142
162
  if records.size > 1
143
163
  Bullet::Detector::NPlusOneQuery.add_possible_objects(records)
@@ -96,6 +96,7 @@ module Bullet
96
96
 
97
97
  ::ActiveRecord::Associations::JoinDependency.class_eval do
98
98
  alias_method :origin_instantiate, :instantiate
99
+ alias_method :origin_construct, :construct
99
100
  alias_method :origin_construct_model, :construct_model
100
101
 
101
102
  def instantiate(result_set, aliases)
@@ -111,6 +112,27 @@ module Bullet
111
112
  records
112
113
  end
113
114
 
115
+ def construct(ar_parent, parent, row, rs, seen, model_cache, aliases)
116
+ if Bullet.start?
117
+ unless ar_parent.nil?
118
+ parent.children.each do |node|
119
+ key = aliases.column_alias(node, node.primary_key)
120
+ id = row[key]
121
+ if id.nil?
122
+ associations = node.reflection.name
123
+ Bullet::Detector::Association.add_object_associations(ar_parent, associations)
124
+ Bullet::Detector::NPlusOneQuery.call_association(ar_parent, associations)
125
+ @bullet_eager_loadings[ar_parent.class] ||= {}
126
+ @bullet_eager_loadings[ar_parent.class][ar_parent] ||= Set.new
127
+ @bullet_eager_loadings[ar_parent.class][ar_parent] << associations
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ origin_construct(ar_parent, parent, row, rs, seen, model_cache, aliases)
134
+ end
135
+
114
136
  # call join associations
115
137
  def construct_model(record, node, row, model_cache, id, aliases)
116
138
  result = origin_construct_model(record, node, row, model_cache, id, aliases)
@@ -135,16 +157,14 @@ module Bullet
135
157
  records = origin_load_target
136
158
 
137
159
  if Bullet.start?
138
- if records.size > 1
139
- if self.is_a? ::ActiveRecord::Associations::ThroughAssociation
140
- Bullet::Detector::NPlusOneQuery.call_association(owner, through_reflection.name)
141
- association = self.owner.association self.through_reflection.name
142
- association.target.each do |through_record|
143
- Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
144
- end
160
+ if self.is_a? ::ActiveRecord::Associations::ThroughAssociation
161
+ Bullet::Detector::NPlusOneQuery.call_association(owner, through_reflection.name)
162
+ association = self.owner.association self.through_reflection.name
163
+ Array(association.target).each do |through_record|
164
+ Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
145
165
  end
146
- Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name) unless @inversed
147
166
  end
167
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name) unless @inversed
148
168
  if records.first.class.name !~ /^HABTM_/
149
169
  if records.size > 1
150
170
  Bullet::Detector::NPlusOneQuery.add_possible_objects(records)
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Bullet
3
- VERSION = "5.2.0"
3
+ VERSION = "5.2.1"
4
4
  end
@@ -60,7 +60,7 @@ module Bullet
60
60
  it "should return original response body" do
61
61
  expected_response = Support::ResponseDouble.new "Actual body"
62
62
  app.response = expected_response
63
- _, _, response = middleware.call([])
63
+ _, _, response = middleware.call({})
64
64
  expect(response).to eq(expected_response)
65
65
  end
66
66
 
@@ -68,7 +68,7 @@ module Bullet
68
68
  expect(Bullet).to receive(:notification?).and_return(true)
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
- status, headers, response = middleware.call([200, {"Content-Type" => "text/html"}])
71
+ status, headers, response = middleware.call({"Content-Type" => "text/html"})
72
72
  expect(headers["Content-Length"]).to eq("56")
73
73
  expect(response).to eq(["<html><head></head><body><bullet></bullet></body></html>"])
74
74
  end
@@ -79,7 +79,7 @@ module Bullet
79
79
  app.response = response
80
80
  expect(Bullet).to receive(:notification?).and_return(true)
81
81
  expect(Bullet).to receive(:gather_inline_notifications).and_return("<bullet></bullet>")
82
- status, headers, response = middleware.call([200, {"Content-Type" => "text/html"}])
82
+ status, headers, response = middleware.call({"Content-Type" => "text/html"})
83
83
  expect(headers["Content-Length"]).to eq("58")
84
84
  end
85
85
  end
@@ -89,7 +89,7 @@ module Bullet
89
89
 
90
90
  it "should not call Bullet.start_request" do
91
91
  expect(Bullet).not_to receive(:start_request)
92
- middleware.call([])
92
+ middleware.call({})
93
93
  end
94
94
  end
95
95
  end
@@ -94,4 +94,47 @@ describe Bullet, focused: true do
94
94
  end
95
95
  end
96
96
  end
97
+
98
+ describe '#perform_out_of_channel_notifications' do
99
+ let(:notification) { double }
100
+
101
+ before do
102
+ allow(Bullet).to receive(:for_each_active_notifier_with_notification).and_yield(notification)
103
+ allow(notification).to receive(:notify_out_of_channel)
104
+ end
105
+
106
+ context 'when called with no args' do
107
+ it 'should notification.url is nil' do
108
+ expect(notification).to receive(:url=).with(nil)
109
+ Bullet.perform_out_of_channel_notifications
110
+ end
111
+ end
112
+
113
+ context 'when called with Rack environment hash' do
114
+ let(:env) {
115
+ {
116
+ 'PATH_INFO' => '/path',
117
+ 'QUERY_STRING' => 'foo=bar',
118
+ }
119
+ }
120
+
121
+ context "when env['REQUEST_URI'] is nil" do
122
+ before { env['REQUEST_URI'] = nil }
123
+
124
+ it 'should notification.url is built' do
125
+ expect(notification).to receive(:url=).with('/path?foo=bar')
126
+ Bullet.perform_out_of_channel_notifications(env)
127
+ end
128
+ end
129
+
130
+ context "when env['REQUEST_URI'] is present" do
131
+ before { env['REQUEST_URI'] = 'http://example.com/path' }
132
+
133
+ it "should notification.url is env['REQUEST_URI']" do
134
+ expect(notification).to receive(:url=).with(env['REQUEST_URI'])
135
+ Bullet.perform_out_of_channel_notifications(env)
136
+ end
137
+ end
138
+ end
139
+ end
97
140
  end
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: 5.2.0
4
+ version: 5.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Huang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-26 00:00:00.000000000 Z
11
+ date: 2016-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport