bullet 6.0.2 → 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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -1
  3. data/CHANGELOG.md +7 -0
  4. data/README.md +4 -2
  5. data/lib/bullet.rb +25 -16
  6. data/lib/bullet/active_job.rb +1 -7
  7. data/lib/bullet/active_record4.rb +9 -23
  8. data/lib/bullet/active_record41.rb +7 -19
  9. data/lib/bullet/active_record42.rb +8 -16
  10. data/lib/bullet/active_record5.rb +188 -170
  11. data/lib/bullet/active_record52.rb +176 -161
  12. data/lib/bullet/active_record60.rb +183 -175
  13. data/lib/bullet/bullet_xhr.js +3 -9
  14. data/lib/bullet/dependency.rb +36 -34
  15. data/lib/bullet/detector/association.rb +24 -18
  16. data/lib/bullet/detector/base.rb +1 -2
  17. data/lib/bullet/detector/counter_cache.rb +10 -6
  18. data/lib/bullet/detector/n_plus_one_query.rb +18 -8
  19. data/lib/bullet/detector/unused_eager_loading.rb +5 -2
  20. data/lib/bullet/mongoid4x.rb +2 -6
  21. data/lib/bullet/mongoid5x.rb +2 -6
  22. data/lib/bullet/mongoid6x.rb +2 -6
  23. data/lib/bullet/mongoid7x.rb +2 -6
  24. data/lib/bullet/notification/base.rb +14 -18
  25. data/lib/bullet/notification/n_plus_one_query.rb +2 -4
  26. data/lib/bullet/notification/unused_eager_loading.rb +2 -4
  27. data/lib/bullet/rack.rb +5 -3
  28. data/lib/bullet/stack_trace_filter.rb +5 -10
  29. data/lib/bullet/version.rb +1 -1
  30. data/lib/generators/bullet/install_generator.rb +4 -2
  31. data/perf/benchmark.rb +8 -14
  32. data/spec/bullet/detector/counter_cache_spec.rb +5 -5
  33. data/spec/bullet/detector/n_plus_one_query_spec.rb +7 -3
  34. data/spec/bullet/detector/unused_eager_loading_spec.rb +29 -12
  35. data/spec/bullet/notification/base_spec.rb +1 -3
  36. data/spec/bullet/notification/n_plus_one_query_spec.rb +18 -3
  37. data/spec/bullet/notification/unused_eager_loading_spec.rb +5 -1
  38. data/spec/bullet/rack_spec.rb +20 -5
  39. data/spec/bullet/registry/association_spec.rb +2 -2
  40. data/spec/bullet/registry/base_spec.rb +1 -1
  41. data/spec/bullet_spec.rb +10 -29
  42. data/spec/integration/active_record/association_spec.rb +42 -122
  43. data/spec/integration/counter_cache_spec.rb +10 -30
  44. data/spec/integration/mongoid/association_spec.rb +18 -32
  45. data/spec/models/folder.rb +1 -2
  46. data/spec/models/group.rb +1 -2
  47. data/spec/models/page.rb +1 -2
  48. data/spec/models/writer.rb +1 -2
  49. data/spec/spec_helper.rb +6 -10
  50. data/spec/support/bullet_ext.rb +8 -9
  51. data/spec/support/mongo_seed.rb +2 -16
  52. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 152296ae0c6092687f600a52f129bfa88688b6d5a96db52dd554dbe5db848b11
4
- data.tar.gz: 65967b8561c27febdab5112572bd5bec8ea7e4d948028eefed843988cedcef99
3
+ metadata.gz: dd668fdfd675ea8437eee0242974d7cb1cfacc0479be4cc5f3f58ee7d05a6d63
4
+ data.tar.gz: 3d841fb8471fe18b66135fa087ee3d1874f412c114d09ba05ba150e2daaf9775
5
5
  SHA512:
6
- metadata.gz: 011db6a9187cbb7d1ce77f249e041b8dda64e8c5cae0ff528081878a3b117cd2180b28c394333504479572eed14701feeba0d4ffa565c235f2fda401b85bd1a0
7
- data.tar.gz: 332e755d1304b832ccbb4da6c7d05109a11cd62056c0ec911d1346b04e49475cce35c93e8174ca80d5850fbfa8cecc2d6dc630f713d7e681c16d24fb9fac51bc
6
+ metadata.gz: 714c614f2cf44f332f4f9996638c10dca565c92a2279316509256fefba2ca824fc9c71d2a3c3e4ca28edfc45849f76b61e521158e0051c365f5b8a81f41e9d8d
7
+ data.tar.gz: a3b1a7e58b6e5554a641aa4b8edf16dbb4983b2f7a072c5b7275ee04a7251e4d095fed37f82d2945ef759603c8aeaf8a394d9e7fcf9f70a723e6235ab5f3e646
@@ -1,4 +1,3 @@
1
- sudo: false
2
1
  language: ruby
3
2
  rvm:
4
3
  - 2.3.0
@@ -29,3 +28,6 @@ matrix:
29
28
  gemfile: Gemfile.rails-4.0
30
29
  env:
31
30
  - DB=sqlite
31
+ before_install:
32
+ - "find /home/travis/.rvm/rubies -wholename '*default/bundler-*.gemspec' -delete"
33
+ - gem install bundler -v '< 2'
@@ -1,5 +1,12 @@
1
1
  ## Next Release
2
2
 
3
+ ## 6.1.0 (12/28/2019)
4
+
5
+ * Add skip_html_injection flag
6
+ * Remove writer hack in active_record6
7
+ * Use modern includes syntax in warnings
8
+ * Fix warning: The last argument is used as the keyword parameter
9
+
3
10
  ## 6.0.2 (08/20/2019)
4
11
 
5
12
  * Fully support Rails 6.0
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Bullet
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/bullet.png)](http://badge.fury.io/rb/bullet)
4
- [![Build Status](https://secure.travis-ci.org/flyerhzm/bullet.png)](http://travis-ci.org/flyerhzm/bullet)
3
+ [![Gem Version](https://badge.fury.io/rb/bullet.svg)](http://badge.fury.io/rb/bullet)
4
+ [![Build Status](https://secure.travis-ci.org/flyerhzm/bullet.svg)](http://travis-ci.org/flyerhzm/bullet)
5
5
  [![AwesomeCode Status for flyerhzm/bullet](https://awesomecode.io/projects/6755235b-e2c1-459e-bf92-b8b13d0c0472/status)](https://awesomecode.io/repos/flyerhzm/bullet)
6
6
  [![Coderwall Endorse](http://api.coderwall.com/flyerhzm/endorsecount.png)](http://coderwall.com/flyerhzm)
7
7
 
@@ -63,6 +63,7 @@ config.after_initialize do
63
63
  Bullet.airbrake = true
64
64
  Bullet.rollbar = true
65
65
  Bullet.add_footer = true
66
+ Bullet.skip_html_injection = false
66
67
  Bullet.stacktrace_includes = [ 'your_gem', 'your_middleware' ]
67
68
  Bullet.stacktrace_excludes = [ 'their_gem', 'their_middleware', ['my_file.rb', 'my_method'], ['my_file.rb', 16..20] ]
68
69
  Bullet.slack = { webhook_url: 'http://some.slack.url', channel: '#default', username: 'notifier' }
@@ -85,6 +86,7 @@ The code above will enable all of the Bullet notification systems:
85
86
  * `Bullet.rollbar`: add notifications to rollbar
86
87
  * `Bullet.sentry`: add notifications to sentry
87
88
  * `Bullet.add_footer`: adds the details in the bottom left corner of the page. Double click the footer or use close button to hide footer.
89
+ * `Bullet.skip_html_injection`: prevents Bullet from injecting XHR into the returned HTML. This must be false for receiving alerts or console logging.
88
90
  * `Bullet.stacktrace_includes`: include paths with any of these substrings in the stack trace, even if they are not in your main app
89
91
  * `Bullet.stacktrace_excludes`: ignore paths with any of these substrings in the stack trace, even if they are not in your main app.
90
92
  Each item can be a string (match substring), a regex, or an array where the first item is a path to match, and the second
@@ -23,7 +23,7 @@ module Bullet
23
23
  BULLET_DEBUG = 'BULLET_DEBUG'
24
24
  TRUE = 'true'
25
25
 
26
- if defined? Rails::Railtie
26
+ if defined?(Rails::Railtie)
27
27
  class BulletRailtie < Rails::Railtie
28
28
  initializer 'bullet.configure_rails_initialization' do |app|
29
29
  app.middleware.use Bullet::Rack
@@ -32,28 +32,36 @@ module Bullet
32
32
  end
33
33
 
34
34
  class << self
35
- attr_writer :n_plus_one_query_enable, :unused_eager_loading_enable, :counter_cache_enable, :stacktrace_includes, :stacktrace_excludes
35
+ attr_writer :n_plus_one_query_enable,
36
+ :unused_eager_loading_enable,
37
+ :counter_cache_enable,
38
+ :stacktrace_includes,
39
+ :stacktrace_excludes,
40
+ :skip_html_injection
36
41
  attr_reader :whitelist
37
- attr_accessor :add_footer, :orm_pathches_applied
42
+ attr_accessor :add_footer, :orm_patches_applied
38
43
 
39
44
  available_notifiers = UniformNotifier::AVAILABLE_NOTIFIERS.map { |notifier| "#{notifier}=" }
40
- available_notifiers << { to: UniformNotifier }
41
- delegate(*available_notifiers)
45
+ available_notifiers_options = { to: UniformNotifier }
46
+ delegate(*available_notifiers, **available_notifiers_options)
42
47
 
43
48
  def raise=(should_raise)
44
49
  UniformNotifier.raise = (should_raise ? Notification::UnoptimizedQueryError : false)
45
50
  end
46
51
 
47
- DETECTORS = [Bullet::Detector::NPlusOneQuery,
48
- Bullet::Detector::UnusedEagerLoading,
49
- Bullet::Detector::CounterCache].freeze
52
+ DETECTORS = [
53
+ Bullet::Detector::NPlusOneQuery,
54
+ Bullet::Detector::UnusedEagerLoading,
55
+ Bullet::Detector::CounterCache
56
+ ].freeze
50
57
 
51
58
  def enable=(enable)
52
59
  @enable = @n_plus_one_query_enable = @unused_eager_loading_enable = @counter_cache_enable = enable
60
+
53
61
  if enable?
54
62
  reset_whitelist
55
- unless orm_pathches_applied
56
- self.orm_pathches_applied = true
63
+ unless orm_patches_applied
64
+ self.orm_patches_applied = true
57
65
  Bullet::Mongoid.enable if mongoid?
58
66
  Bullet::ActiveRecord.enable if active_record?
59
67
  end
@@ -174,9 +182,7 @@ module Bullet
174
182
 
175
183
  def gather_inline_notifications
176
184
  responses = []
177
- for_each_active_notifier_with_notification do |notification|
178
- responses << notification.notify_inline
179
- end
185
+ for_each_active_notifier_with_notification { |notification| responses << notification.notify_inline }
180
186
  responses.join("\n")
181
187
  end
182
188
 
@@ -190,9 +196,7 @@ module Bullet
190
196
 
191
197
  def footer_info
192
198
  info = []
193
- notification_collector.collection.each do |notification|
194
- info << notification.short_notice
195
- end
199
+ notification_collector.collection.each { |notification| info << notification.short_notice }
196
200
  info
197
201
  end
198
202
 
@@ -214,6 +218,7 @@ module Bullet
214
218
 
215
219
  def profile
216
220
  return_value = nil
221
+
217
222
  if Bullet.enable?
218
223
  begin
219
224
  Bullet.start_request
@@ -235,6 +240,10 @@ module Bullet
235
240
  UniformNotifier.active_notifiers.include?(UniformNotifier::JavascriptConsole)
236
241
  end
237
242
 
243
+ def skip_html_injection?
244
+ @skip_html_injection || false
245
+ end
246
+
238
247
  private
239
248
 
240
249
  def for_each_active_notifier_with_notification
@@ -3,13 +3,7 @@
3
3
  module Bullet
4
4
  module ActiveJob
5
5
  def self.included(base)
6
- base.class_eval do
7
- around_perform do |_job, block|
8
- Bullet.profile do
9
- block.call
10
- end
11
- end
12
- end
6
+ base.class_eval { around_perform { |_job, block| Bullet.profile { block.call } } }
13
7
  end
14
8
  end
15
9
  end
@@ -5,7 +5,7 @@ module Bullet
5
5
  def self.enable
6
6
  require 'active_record'
7
7
  ::ActiveRecord::Base.class_eval do
8
- class <<self
8
+ class << self
9
9
  alias_method :origin_find_by_sql, :find_by_sql
10
10
  def find_by_sql(sql, binds = [])
11
11
  result = origin_find_by_sql(sql, binds)
@@ -49,9 +49,7 @@ module Bullet
49
49
 
50
50
  ::ActiveRecord::Persistence.class_eval do
51
51
  def _create_record_with_bullet(*args)
52
- _create_record_without_bullet(*args).tap do
53
- Bullet::Detector::NPlusOneQuery.add_impossible_object(self)
54
- end
52
+ _create_record_without_bullet(*args).tap { Bullet::Detector::NPlusOneQuery.add_impossible_object(self) }
55
53
  end
56
54
  alias_method_chain :_create_record, :bullet
57
55
  end
@@ -62,13 +60,12 @@ module Bullet
62
60
  alias_method :origin_initialize, :initialize
63
61
  def initialize(records, associations, preload_scope = nil)
64
62
  origin_initialize(records, associations, preload_scope)
63
+
65
64
  if Bullet.start?
66
65
  records = [records].flatten.compact.uniq
67
66
  return if records.empty?
68
67
 
69
- records.each do |record|
70
- Bullet::Detector::Association.add_object_associations(record, associations)
71
- end
68
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, associations) }
72
69
  Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
73
70
  end
74
71
  end
@@ -81,9 +78,7 @@ module Bullet
81
78
  records = origin_find_with_associations
82
79
  if Bullet.start?
83
80
  associations = (eager_load_values + includes_values).uniq
84
- records.each do |record|
85
- Bullet::Detector::Association.add_object_associations(record, associations)
86
- end
81
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, associations) }
87
82
  Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
88
83
  end
89
84
  records
@@ -128,17 +123,13 @@ module Bullet
128
123
  # call one to many associations
129
124
  alias_method :origin_load_target, :load_target
130
125
  def load_target
131
- if Bullet.start?
132
- Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
133
- end
126
+ Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start?
134
127
  origin_load_target
135
128
  end
136
129
 
137
130
  alias_method :origin_include?, :include?
138
131
  def include?(object)
139
- if Bullet.start?
140
- Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
141
- end
132
+ Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start?
142
133
  origin_include?(object)
143
134
  end
144
135
  end
@@ -156,9 +147,7 @@ module Bullet
156
147
  ::ActiveRecord::Associations::HasAndBelongsToManyAssociation.class_eval do
157
148
  alias_method :origin_empty?, :empty?
158
149
  def empty?
159
- if Bullet.start? && !loaded?
160
- Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
161
- end
150
+ Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start? && !loaded?
162
151
  origin_empty?
163
152
  end
164
153
  end
@@ -183,12 +172,9 @@ module Bullet
183
172
 
184
173
  def has_cached_counter?(reflection = reflection())
185
174
  result = origin_has_cached_counter?(reflection)
186
- if Bullet.start? && !result
187
- Bullet::Detector::CounterCache.add_counter_cache(owner, reflection.name)
188
- end
175
+ Bullet::Detector::CounterCache.add_counter_cache(owner, reflection.name) if Bullet.start? && !result
189
176
  result
190
177
  end
191
-
192
178
  end
193
179
  end
194
180
  end
@@ -5,7 +5,7 @@ module Bullet
5
5
  def self.enable
6
6
  require 'active_record'
7
7
  ::ActiveRecord::Base.class_eval do
8
- class <<self
8
+ class << self
9
9
  alias_method :origin_find_by_sql, :find_by_sql
10
10
  def find_by_sql(sql, binds = [])
11
11
  result = origin_find_by_sql(sql, binds)
@@ -51,9 +51,7 @@ module Bullet
51
51
 
52
52
  ::ActiveRecord::Persistence.class_eval do
53
53
  def _create_record_with_bullet(*args)
54
- _create_record_without_bullet(*args).tap do
55
- Bullet::Detector::NPlusOneQuery.add_impossible_object(self)
56
- end
54
+ _create_record_without_bullet(*args).tap { Bullet::Detector::NPlusOneQuery.add_impossible_object(self) }
57
55
  end
58
56
  alias_method_chain :_create_record, :bullet
59
57
  end
@@ -65,9 +63,7 @@ module Bullet
65
63
  if Bullet.start?
66
64
  records.compact!
67
65
  if records.first.class.name !~ /^HABTM_/
68
- records.each do |record|
69
- Bullet::Detector::Association.add_object_associations(record, association)
70
- end
66
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, association) }
71
67
  Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
72
68
  end
73
69
  end
@@ -84,9 +80,7 @@ module Bullet
84
80
  records = origin_find_with_associations
85
81
  if Bullet.start?
86
82
  associations = (eager_load_values + includes_values).uniq
87
- records.each do |record|
88
- Bullet::Detector::Association.add_object_associations(record, associations)
89
- end
83
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, associations) }
90
84
  Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
91
85
  end
92
86
  records
@@ -131,9 +125,7 @@ module Bullet
131
125
  # call one to many associations
132
126
  alias_method :origin_load_target, :load_target
133
127
  def load_target
134
- if Bullet.start?
135
- Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) unless @inversed
136
- end
128
+ Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start? && !@inversed
137
129
  origin_load_target
138
130
  end
139
131
 
@@ -147,9 +139,7 @@ module Bullet
147
139
 
148
140
  alias_method :origin_include?, :include?
149
141
  def include?(object)
150
- if Bullet.start?
151
- Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
152
- end
142
+ Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start?
153
143
  origin_include?(object)
154
144
  end
155
145
  end
@@ -173,9 +163,7 @@ module Bullet
173
163
  alias_method :origin_count_records, :count_records
174
164
  def count_records
175
165
  result = has_cached_counter?
176
- if Bullet.start? && !result
177
- Bullet::Detector::CounterCache.add_counter_cache(@owner, @reflection.name)
178
- end
166
+ Bullet::Detector::CounterCache.add_counter_cache(@owner, @reflection.name) if Bullet.start? && !result
179
167
  origin_count_records
180
168
  end
181
169
  end
@@ -5,7 +5,7 @@ module Bullet
5
5
  def self.enable
6
6
  require 'active_record'
7
7
  ::ActiveRecord::Base.class_eval do
8
- class <<self
8
+ class << self
9
9
  alias_method :origin_find, :find
10
10
  def find(*args)
11
11
  result = origin_find(*args)
@@ -45,9 +45,7 @@ module Bullet
45
45
 
46
46
  ::ActiveRecord::Persistence.class_eval do
47
47
  def _create_record_with_bullet(*args)
48
- _create_record_without_bullet(*args).tap do
49
- Bullet::Detector::NPlusOneQuery.add_impossible_object(self)
50
- end
48
+ _create_record_without_bullet(*args).tap { Bullet::Detector::NPlusOneQuery.add_impossible_object(self) }
51
49
  end
52
50
  alias_method_chain :_create_record, :bullet
53
51
  end
@@ -80,9 +78,7 @@ module Bullet
80
78
  if Bullet.start?
81
79
  records.compact!
82
80
  if records.first.class.name !~ /^HABTM_/
83
- records.each do |record|
84
- Bullet::Detector::Association.add_object_associations(record, association)
85
- end
81
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, association) }
86
82
  Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
87
83
  end
88
84
  end
@@ -99,9 +95,7 @@ module Bullet
99
95
  records = origin_find_with_associations
100
96
  if Bullet.start?
101
97
  associations = (eager_load_values + includes_values).uniq
102
- records.each do |record|
103
- Bullet::Detector::Association.add_object_associations(record, associations)
104
- end
98
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, associations) }
105
99
  Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
106
100
  end
107
101
  records
@@ -195,9 +189,7 @@ module Bullet
195
189
 
196
190
  alias_method :origin_include?, :include?
197
191
  def include?(object)
198
- if Bullet.start?
199
- Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
200
- end
192
+ Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start?
201
193
  origin_include?(object)
202
194
  end
203
195
  end
@@ -207,9 +199,11 @@ module Bullet
207
199
  alias_method :origin_reader, :reader
208
200
  def reader(force_reload = false)
209
201
  result = origin_reader(force_reload)
202
+
210
203
  if Bullet.start?
211
204
  if @owner.class.name !~ /^HABTM_/ && !@inversed
212
205
  Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
206
+
213
207
  if Bullet::Detector::NPlusOneQuery.impossible?(@owner)
214
208
  Bullet::Detector::NPlusOneQuery.add_impossible_object(result) if result
215
209
  else
@@ -234,9 +228,7 @@ module Bullet
234
228
  alias_method :origin_count_records, :count_records
235
229
  def count_records
236
230
  result = has_cached_counter?
237
- if Bullet.start? && !result
238
- Bullet::Detector::CounterCache.add_counter_cache(@owner, @reflection.name)
239
- end
231
+ Bullet::Detector::CounterCache.add_counter_cache(@owner, @reflection.name) if Bullet.start? && !result
240
232
  origin_count_records
241
233
  end
242
234
  end
@@ -13,233 +13,251 @@ module Bullet
13
13
  module ActiveRecord
14
14
  def self.enable
15
15
  require 'active_record'
16
- ::ActiveRecord::Base.extend(Module.new do
17
- def find_by_sql(sql, binds = [], preparable: nil, &block)
18
- result = super
19
- if Bullet.start?
20
- if result.is_a? Array
21
- if result.size > 1
22
- Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
23
- Bullet::Detector::CounterCache.add_possible_objects(result)
24
- elsif result.size == 1
25
- Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
26
- Bullet::Detector::CounterCache.add_impossible_object(result.first)
16
+ ::ActiveRecord::Base.extend(
17
+ Module.new do
18
+ def find_by_sql(sql, binds = [], preparable: nil, &block)
19
+ result = super
20
+ if Bullet.start?
21
+ if result.is_a? Array
22
+ if result.size > 1
23
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
24
+ Bullet::Detector::CounterCache.add_possible_objects(result)
25
+ elsif result.size == 1
26
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
27
+ Bullet::Detector::CounterCache.add_impossible_object(result.first)
28
+ end
29
+ elsif result.is_a? ::ActiveRecord::Base
30
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result)
31
+ Bullet::Detector::CounterCache.add_impossible_object(result)
27
32
  end
28
- elsif result.is_a? ::ActiveRecord::Base
29
- Bullet::Detector::NPlusOneQuery.add_impossible_object(result)
30
- Bullet::Detector::CounterCache.add_impossible_object(result)
31
33
  end
34
+ result
32
35
  end
33
- result
34
36
  end
35
- end)
37
+ )
36
38
 
37
39
  ::ActiveRecord::Base.prepend(SaveWithBulletSupport)
38
40
 
39
- ::ActiveRecord::Relation.prepend(Module.new do
40
- # if select a collection of objects, then these objects have possible to cause N+1 query.
41
- # if select only one object, then the only one object has impossible to cause N+1 query.
42
- def records
43
- result = super
44
- if Bullet.start?
45
- if result.first.class.name !~ /^HABTM_/
46
- if result.size > 1
47
- Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
48
- Bullet::Detector::CounterCache.add_possible_objects(result)
49
- elsif result.size == 1
50
- Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
51
- Bullet::Detector::CounterCache.add_impossible_object(result.first)
41
+ ::ActiveRecord::Relation.prepend(
42
+ Module.new do
43
+ # if select a collection of objects, then these objects have possible to cause N+1 query.
44
+ # if select only one object, then the only one object has impossible to cause N+1 query.
45
+ def records
46
+ result = super
47
+ if Bullet.start?
48
+ if result.first.class.name !~ /^HABTM_/
49
+ if result.size > 1
50
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
51
+ Bullet::Detector::CounterCache.add_possible_objects(result)
52
+ elsif result.size == 1
53
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
54
+ Bullet::Detector::CounterCache.add_impossible_object(result.first)
55
+ end
52
56
  end
53
57
  end
58
+ result
54
59
  end
55
- result
56
60
  end
57
- end)
58
-
59
- ::ActiveRecord::Associations::Preloader.prepend(Module.new do
60
- def preloaders_for_one(association, records, scope)
61
- if Bullet.start?
62
- records.compact!
63
- if records.first.class.name !~ /^HABTM_/
64
- records.each do |record|
65
- Bullet::Detector::Association.add_object_associations(record, association)
61
+ )
62
+
63
+ ::ActiveRecord::Associations::Preloader.prepend(
64
+ Module.new do
65
+ def preloaders_for_one(association, records, scope)
66
+ if Bullet.start?
67
+ records.compact!
68
+ if records.first.class.name !~ /^HABTM_/
69
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, association) }
70
+ Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
66
71
  end
67
- Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
68
72
  end
73
+ super
69
74
  end
70
- super
71
75
  end
72
- end)
76
+ )
73
77
 
74
- ::ActiveRecord::FinderMethods.prepend(Module.new do
75
- # add includes in scope
76
- def find_with_associations
77
- return super { |r| yield r } if block_given?
78
+ ::ActiveRecord::FinderMethods.prepend(
79
+ Module.new do
80
+ # add includes in scope
81
+ def find_with_associations
82
+ return super { |r| yield r } if block_given?
78
83
 
79
- records = super
80
- if Bullet.start?
81
- associations = (eager_load_values + includes_values).uniq
82
- records.each do |record|
83
- Bullet::Detector::Association.add_object_associations(record, associations)
84
+ records = super
85
+ if Bullet.start?
86
+ associations = (eager_load_values + includes_values).uniq
87
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, associations) }
88
+ Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
84
89
  end
85
- Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
90
+ records
86
91
  end
87
- records
88
92
  end
89
- end)
93
+ )
90
94
 
91
- ::ActiveRecord::Associations::JoinDependency.prepend(Module.new do
92
- if ::ActiveRecord::Associations::JoinDependency.instance_method(:instantiate).parameters.last[0] == :block
93
- # ActiveRecord >= 5.1.5
94
- def instantiate(result_set, &block)
95
- @bullet_eager_loadings = {}
96
- records = super
95
+ ::ActiveRecord::Associations::JoinDependency.prepend(
96
+ Module.new do
97
+ if ::ActiveRecord::Associations::JoinDependency.instance_method(:instantiate).parameters.last[0] == :block
98
+ # ActiveRecord >= 5.1.5
99
+ def instantiate(result_set, &block)
100
+ @bullet_eager_loadings = {}
101
+ records = super
97
102
 
98
- if Bullet.start?
99
- @bullet_eager_loadings.each do |_klazz, eager_loadings_hash|
100
- objects = eager_loadings_hash.keys
101
- Bullet::Detector::UnusedEagerLoading.add_eager_loadings(objects, eager_loadings_hash[objects.first].to_a)
103
+ if Bullet.start?
104
+ @bullet_eager_loadings.each do |_klazz, eager_loadings_hash|
105
+ objects = eager_loadings_hash.keys
106
+ Bullet::Detector::UnusedEagerLoading.add_eager_loadings(
107
+ objects,
108
+ eager_loadings_hash[objects.first].to_a
109
+ )
110
+ end
102
111
  end
112
+ records
103
113
  end
104
- records
105
- end
106
- else
107
- # ActiveRecord <= 5.1.4
108
- def instantiate(result_set, aliases)
109
- @bullet_eager_loadings = {}
110
- records = super
114
+ else
115
+ # ActiveRecord <= 5.1.4
116
+ def instantiate(result_set, aliases)
117
+ @bullet_eager_loadings = {}
118
+ records = super
111
119
 
112
- if Bullet.start?
113
- @bullet_eager_loadings.each do |_klazz, eager_loadings_hash|
114
- objects = eager_loadings_hash.keys
115
- Bullet::Detector::UnusedEagerLoading.add_eager_loadings(objects, eager_loadings_hash[objects.first].to_a)
120
+ if Bullet.start?
121
+ @bullet_eager_loadings.each do |_klazz, eager_loadings_hash|
122
+ objects = eager_loadings_hash.keys
123
+ Bullet::Detector::UnusedEagerLoading.add_eager_loadings(
124
+ objects,
125
+ eager_loadings_hash[objects.first].to_a
126
+ )
127
+ end
116
128
  end
129
+ records
117
130
  end
118
- records
119
131
  end
120
- end
121
132
 
122
- def construct(ar_parent, parent, row, rs, seen, model_cache, aliases)
123
- if Bullet.start?
124
- unless ar_parent.nil?
125
- parent.children.each do |node|
126
- key = aliases.column_alias(node, node.primary_key)
127
- id = row[key]
128
- next unless id.nil?
129
-
130
- associations = node.reflection.name
131
- Bullet::Detector::Association.add_object_associations(ar_parent, associations)
132
- Bullet::Detector::NPlusOneQuery.call_association(ar_parent, associations)
133
- @bullet_eager_loadings[ar_parent.class] ||= {}
134
- @bullet_eager_loadings[ar_parent.class][ar_parent] ||= Set.new
135
- @bullet_eager_loadings[ar_parent.class][ar_parent] << associations
133
+ def construct(ar_parent, parent, row, rs, seen, model_cache, aliases)
134
+ if Bullet.start?
135
+ unless ar_parent.nil?
136
+ parent.children.each do |node|
137
+ key = aliases.column_alias(node, node.primary_key)
138
+ id = row[key]
139
+ next unless id.nil?
140
+
141
+ associations = node.reflection.name
142
+ Bullet::Detector::Association.add_object_associations(ar_parent, associations)
143
+ Bullet::Detector::NPlusOneQuery.call_association(ar_parent, associations)
144
+ @bullet_eager_loadings[ar_parent.class] ||= {}
145
+ @bullet_eager_loadings[ar_parent.class][ar_parent] ||= Set.new
146
+ @bullet_eager_loadings[ar_parent.class][ar_parent] << associations
147
+ end
136
148
  end
137
149
  end
150
+
151
+ super
138
152
  end
139
153
 
140
- super
141
- end
154
+ # call join associations
155
+ def construct_model(record, node, row, model_cache, id, aliases)
156
+ result = super
142
157
 
143
- # call join associations
144
- def construct_model(record, node, row, model_cache, id, aliases)
145
- result = super
146
-
147
- if Bullet.start?
148
- associations = node.reflection.name
149
- Bullet::Detector::Association.add_object_associations(record, associations)
150
- Bullet::Detector::NPlusOneQuery.call_association(record, associations)
151
- @bullet_eager_loadings[record.class] ||= {}
152
- @bullet_eager_loadings[record.class][record] ||= Set.new
153
- @bullet_eager_loadings[record.class][record] << associations
154
- end
158
+ if Bullet.start?
159
+ associations = node.reflection.name
160
+ Bullet::Detector::Association.add_object_associations(record, associations)
161
+ Bullet::Detector::NPlusOneQuery.call_association(record, associations)
162
+ @bullet_eager_loadings[record.class] ||= {}
163
+ @bullet_eager_loadings[record.class][record] ||= Set.new
164
+ @bullet_eager_loadings[record.class][record] << associations
165
+ end
155
166
 
156
- result
167
+ result
168
+ end
157
169
  end
158
- end)
159
-
160
- ::ActiveRecord::Associations::CollectionAssociation.prepend(Module.new do
161
- def load_target
162
- records = super
163
-
164
- if Bullet.start?
165
- if is_a? ::ActiveRecord::Associations::ThroughAssociation
166
- refl = reflection.through_reflection
167
- Bullet::Detector::NPlusOneQuery.call_association(owner, refl.name)
168
- association = owner.association refl.name
169
- Array(association.target).each do |through_record|
170
- Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
171
- end
170
+ )
172
171
 
173
- if refl.through_reflection?
174
- refl = refl.through_reflection while refl.through_reflection?
172
+ ::ActiveRecord::Associations::CollectionAssociation.prepend(
173
+ Module.new do
174
+ def load_target
175
+ records = super
175
176
 
177
+ if Bullet.start?
178
+ if is_a? ::ActiveRecord::Associations::ThroughAssociation
179
+ refl = reflection.through_reflection
176
180
  Bullet::Detector::NPlusOneQuery.call_association(owner, refl.name)
181
+ association = owner.association refl.name
182
+ Array(association.target).each do |through_record|
183
+ Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
184
+ end
185
+
186
+ if refl.through_reflection?
187
+ refl = refl.through_reflection while refl.through_reflection?
188
+
189
+ Bullet::Detector::NPlusOneQuery.call_association(owner, refl.name)
190
+ end
177
191
  end
178
- end
179
- Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name) unless @inversed
180
- if records.first.class.name !~ /^HABTM_/
181
- if records.size > 1
182
- Bullet::Detector::NPlusOneQuery.add_possible_objects(records)
183
- Bullet::Detector::CounterCache.add_possible_objects(records)
184
- elsif records.size == 1
185
- Bullet::Detector::NPlusOneQuery.add_impossible_object(records.first)
186
- Bullet::Detector::CounterCache.add_impossible_object(records.first)
192
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name) unless @inversed
193
+ if records.first.class.name !~ /^HABTM_/
194
+ if records.size > 1
195
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(records)
196
+ Bullet::Detector::CounterCache.add_possible_objects(records)
197
+ elsif records.size == 1
198
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(records.first)
199
+ Bullet::Detector::CounterCache.add_impossible_object(records.first)
200
+ end
187
201
  end
188
202
  end
203
+ records
189
204
  end
190
- records
191
- end
192
205
 
193
- def empty?
194
- if Bullet.start? && !reflection.has_cached_counter?
195
- Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
206
+ def empty?
207
+ if Bullet.start? && !reflection.has_cached_counter?
208
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
209
+ end
210
+ super
196
211
  end
197
- super
198
- end
199
212
 
200
- def include?(object)
201
- if Bullet.start?
202
- Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
213
+ def include?(object)
214
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name) if Bullet.start?
215
+ super
203
216
  end
204
- super
205
217
  end
206
- end)
207
-
208
- ::ActiveRecord::Associations::SingularAssociation.prepend(Module.new do
209
- # call has_one and belongs_to associations
210
- def target
211
- result = super()
212
- if Bullet.start?
213
- if owner.class.name !~ /^HABTM_/ && !@inversed
214
- Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
215
- if Bullet::Detector::NPlusOneQuery.impossible?(owner)
216
- Bullet::Detector::NPlusOneQuery.add_impossible_object(result) if result
217
- else
218
- Bullet::Detector::NPlusOneQuery.add_possible_objects(result) if result
218
+ )
219
+
220
+ ::ActiveRecord::Associations::SingularAssociation.prepend(
221
+ Module.new do
222
+ # call has_one and belongs_to associations
223
+ def target
224
+ result = super()
225
+
226
+ if Bullet.start?
227
+ if owner.class.name !~ /^HABTM_/ && !@inversed
228
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
229
+
230
+ if Bullet::Detector::NPlusOneQuery.impossible?(owner)
231
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result) if result
232
+ else
233
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(result) if result
234
+ end
219
235
  end
220
236
  end
237
+ result
221
238
  end
222
- result
223
239
  end
224
- end)
240
+ )
225
241
 
226
- ::ActiveRecord::Associations::HasManyAssociation.prepend(Module.new do
227
- def empty?
228
- result = super
229
- if Bullet.start? && !reflection.has_cached_counter?
230
- Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
242
+ ::ActiveRecord::Associations::HasManyAssociation.prepend(
243
+ Module.new do
244
+ def empty?
245
+ result = super
246
+ if Bullet.start? && !reflection.has_cached_counter?
247
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
248
+ end
249
+ result
231
250
  end
232
- result
233
- end
234
251
 
235
- def count_records
236
- result = reflection.has_cached_counter?
237
- if Bullet.start? && !result && !is_a?(::ActiveRecord::Associations::ThroughAssociation)
238
- Bullet::Detector::CounterCache.add_counter_cache(owner, reflection.name)
252
+ def count_records
253
+ result = reflection.has_cached_counter?
254
+ if Bullet.start? && !result && !is_a?(::ActiveRecord::Associations::ThroughAssociation)
255
+ Bullet::Detector::CounterCache.add_counter_cache(owner, reflection.name)
256
+ end
257
+ super
239
258
  end
240
- super
241
259
  end
242
- end)
260
+ )
243
261
  end
244
262
  end
245
263
  end