bullet 5.5.1 → 5.6.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 +0 -5
- data/CHANGELOG.md +5 -2
- data/Gemfile +6 -1
- data/Gemfile.rails-5.0 +1 -1
- data/Gemfile.rails-5.1 +1 -1
- data/README.md +3 -12
- data/lib/bullet/active_record5.rb +44 -62
- data/lib/bullet/detector/association.rb +2 -2
- data/lib/bullet/detector/n_plus_one_query.rb +4 -4
- data/lib/bullet/ext/object.rb +1 -1
- data/lib/bullet/ext/string.rb +1 -1
- data/lib/bullet/notification/base.rb +1 -1
- data/lib/bullet/stack_trace_filter.rb +2 -1
- data/lib/bullet/version.rb +1 -1
- data/lib/generators/bullet/install_generator.rb +46 -0
- data/spec/bullet/detector/n_plus_one_query_spec.rb +11 -11
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 652f59b5a91224c16cace3931e368d0da02fa449
|
4
|
+
data.tar.gz: 9ef371969315cd308b194a9d230d1f19892a57e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed473ab951e1f168de703cf0615f203abc93e37ef896330d6f91c7b61d320cd0906e691e41245e13a11aa9e3aa3d059ea62b00b256fa96af0540c8ab35ebc2fb
|
7
|
+
data.tar.gz: f6c4456dfb56957b441fce1b56094baacc911186b59b48b43f22e41ad3bbed88c52aa16b4bc7247b7ca37a3c7d026bb45f5342ccc24b37bc47836cd63fb41a1c
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# Next Release
|
2
2
|
|
3
|
-
## 5.
|
3
|
+
## 5.6.0 (07/16/2017)
|
4
4
|
|
5
|
+
* Migrate alias_method to Module#prepend
|
6
|
+
* Add install generator
|
7
|
+
* Stack trace filter
|
8
|
+
* Fix rails 5.1 compatibility
|
5
9
|
* Fix inverse_of for rails 5
|
6
10
|
* Fix detect file attachment for rack #319
|
7
|
-
* Fix `ActiveRecord::Associations::SingularAssociation#reader` usage for Rails 5.1
|
8
11
|
|
9
12
|
## 5.5.0 (12/30/2016)
|
10
13
|
|
data/Gemfile
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
+
git_source(:github) do |repo_name|
|
4
|
+
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?('/')
|
5
|
+
"https://github.com/#{repo_name}.git"
|
6
|
+
end
|
7
|
+
|
3
8
|
gemspec
|
4
9
|
|
5
|
-
gem 'rails', github: 'rails
|
10
|
+
gem 'rails', github: 'rails'
|
6
11
|
gem 'sqlite3', platforms: [:ruby]
|
7
12
|
gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
|
8
13
|
gem 'activerecord-import'
|
data/Gemfile.rails-5.0
CHANGED
data/Gemfile.rails-5.1
CHANGED
data/README.md
CHANGED
@@ -303,19 +303,10 @@ And run
|
|
303
303
|
bundle install
|
304
304
|
```
|
305
305
|
|
306
|
-
6\. enable the Bullet gem
|
307
|
-
`config/environments/development.rb`
|
306
|
+
6\. enable the Bullet gem with generate command
|
308
307
|
|
309
|
-
```
|
310
|
-
|
311
|
-
Bullet.enable = true
|
312
|
-
Bullet.alert = true
|
313
|
-
Bullet.bullet_logger = true
|
314
|
-
Bullet.console = true
|
315
|
-
# Bullet.growl = true
|
316
|
-
Bullet.rails_logger = true
|
317
|
-
Bullet.add_footer = true
|
318
|
-
end
|
308
|
+
```
|
309
|
+
bundle exec rails g bullet:install
|
319
310
|
```
|
320
311
|
|
321
312
|
7\. Start the server
|
@@ -18,38 +18,34 @@ module Bullet
|
|
18
18
|
module ActiveRecord
|
19
19
|
def self.enable
|
20
20
|
require 'active_record'
|
21
|
-
::ActiveRecord::Base.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
result
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
|
33
|
-
Bullet::Detector::CounterCache.add_impossible_object(result.first)
|
34
|
-
end
|
35
|
-
elsif result.is_a? ::ActiveRecord::Base
|
36
|
-
Bullet::Detector::NPlusOneQuery.add_impossible_object(result)
|
37
|
-
Bullet::Detector::CounterCache.add_impossible_object(result)
|
21
|
+
::ActiveRecord::Base.extend(Module.new {
|
22
|
+
def find_by_sql(sql, binds = [], preparable: nil, &block)
|
23
|
+
result = super
|
24
|
+
if Bullet.start?
|
25
|
+
if result.is_a? Array
|
26
|
+
if result.size > 1
|
27
|
+
Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
|
28
|
+
Bullet::Detector::CounterCache.add_possible_objects(result)
|
29
|
+
elsif result.size == 1
|
30
|
+
Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
|
31
|
+
Bullet::Detector::CounterCache.add_impossible_object(result.first)
|
38
32
|
end
|
33
|
+
elsif result.is_a? ::ActiveRecord::Base
|
34
|
+
Bullet::Detector::NPlusOneQuery.add_impossible_object(result)
|
35
|
+
Bullet::Detector::CounterCache.add_impossible_object(result)
|
39
36
|
end
|
40
|
-
result
|
41
37
|
end
|
38
|
+
result
|
42
39
|
end
|
43
|
-
|
40
|
+
})
|
44
41
|
|
45
42
|
::ActiveRecord::Base.prepend(SaveWithBulletSupport)
|
46
43
|
|
47
|
-
::ActiveRecord::Relation.
|
48
|
-
alias_method :origin_records, :records
|
44
|
+
::ActiveRecord::Relation.prepend(Module.new {
|
49
45
|
# if select a collection of objects, then these objects have possible to cause N+1 query.
|
50
46
|
# if select only one object, then the only one object has impossible to cause N+1 query.
|
51
47
|
def records
|
52
|
-
result =
|
48
|
+
result = super
|
53
49
|
if Bullet.start?
|
54
50
|
if result.first.class.name !~ /^HABTM_/
|
55
51
|
if result.size > 1
|
@@ -63,11 +59,9 @@ module Bullet
|
|
63
59
|
end
|
64
60
|
result
|
65
61
|
end
|
66
|
-
|
67
|
-
|
68
|
-
::ActiveRecord::Associations::Preloader.class_eval do
|
69
|
-
alias_method :origin_preloaders_for_one, :preloaders_for_one
|
62
|
+
})
|
70
63
|
|
64
|
+
::ActiveRecord::Associations::Preloader.prepend(Module.new {
|
71
65
|
def preloaders_for_one(association, records, scope)
|
72
66
|
if Bullet.start?
|
73
67
|
records.compact!
|
@@ -78,16 +72,15 @@ module Bullet
|
|
78
72
|
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
|
79
73
|
end
|
80
74
|
end
|
81
|
-
|
75
|
+
super
|
82
76
|
end
|
83
|
-
|
77
|
+
})
|
84
78
|
|
85
|
-
::ActiveRecord::FinderMethods.
|
79
|
+
::ActiveRecord::FinderMethods.prepend(Module.new {
|
86
80
|
# add includes in scope
|
87
|
-
alias_method :origin_find_with_associations, :find_with_associations
|
88
81
|
def find_with_associations
|
89
|
-
return
|
90
|
-
records =
|
82
|
+
return super { |r| yield r } if block_given?
|
83
|
+
records = super
|
91
84
|
if Bullet.start?
|
92
85
|
associations = (eager_load_values + includes_values).uniq
|
93
86
|
records.each do |record|
|
@@ -97,16 +90,12 @@ module Bullet
|
|
97
90
|
end
|
98
91
|
records
|
99
92
|
end
|
100
|
-
|
101
|
-
|
102
|
-
::ActiveRecord::Associations::JoinDependency.class_eval do
|
103
|
-
alias_method :origin_instantiate, :instantiate
|
104
|
-
alias_method :origin_construct, :construct
|
105
|
-
alias_method :origin_construct_model, :construct_model
|
93
|
+
})
|
106
94
|
|
95
|
+
::ActiveRecord::Associations::JoinDependency.prepend(Module.new {
|
107
96
|
def instantiate(result_set, aliases)
|
108
97
|
@bullet_eager_loadings = {}
|
109
|
-
records =
|
98
|
+
records = super
|
110
99
|
|
111
100
|
if Bullet.start?
|
112
101
|
@bullet_eager_loadings.each do |klazz, eager_loadings_hash|
|
@@ -135,12 +124,12 @@ module Bullet
|
|
135
124
|
end
|
136
125
|
end
|
137
126
|
|
138
|
-
|
127
|
+
super
|
139
128
|
end
|
140
129
|
|
141
130
|
# call join associations
|
142
131
|
def construct_model(record, node, row, model_cache, id, aliases)
|
143
|
-
result =
|
132
|
+
result = super
|
144
133
|
|
145
134
|
if Bullet.start?
|
146
135
|
associations = node.reflection.name
|
@@ -153,13 +142,11 @@ module Bullet
|
|
153
142
|
|
154
143
|
result
|
155
144
|
end
|
156
|
-
|
145
|
+
})
|
157
146
|
|
158
|
-
::ActiveRecord::Associations::CollectionAssociation.
|
159
|
-
# call one to many associations
|
160
|
-
alias_method :origin_load_target, :load_target
|
147
|
+
::ActiveRecord::Associations::CollectionAssociation.prepend(Module.new {
|
161
148
|
def load_target
|
162
|
-
records =
|
149
|
+
records = super
|
163
150
|
|
164
151
|
if Bullet.start?
|
165
152
|
if self.is_a? ::ActiveRecord::Associations::ThroughAssociation
|
@@ -183,28 +170,25 @@ module Bullet
|
|
183
170
|
records
|
184
171
|
end
|
185
172
|
|
186
|
-
alias_method :origin_empty?, :empty?
|
187
173
|
def empty?
|
188
174
|
if Bullet.start? && !reflection.has_cached_counter?
|
189
175
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
|
190
176
|
end
|
191
|
-
|
177
|
+
super
|
192
178
|
end
|
193
179
|
|
194
|
-
alias_method :origin_include?, :include?
|
195
180
|
def include?(object)
|
196
181
|
if Bullet.start?
|
197
182
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
|
198
183
|
end
|
199
|
-
|
184
|
+
super
|
200
185
|
end
|
201
|
-
|
186
|
+
})
|
202
187
|
|
203
|
-
::ActiveRecord::Associations::SingularAssociation.
|
188
|
+
::ActiveRecord::Associations::SingularAssociation.prepend(Module.new {
|
204
189
|
# call has_one and belongs_to associations
|
205
|
-
|
206
|
-
|
207
|
-
result = force_reload ? force_reload_reader : origin_reader
|
190
|
+
def target
|
191
|
+
result = super()
|
208
192
|
if Bullet.start?
|
209
193
|
if owner.class.name !~ /^HABTM_/ && !@inversed
|
210
194
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
|
@@ -217,27 +201,25 @@ module Bullet
|
|
217
201
|
end
|
218
202
|
result
|
219
203
|
end
|
220
|
-
|
204
|
+
})
|
221
205
|
|
222
|
-
::ActiveRecord::Associations::HasManyAssociation.
|
223
|
-
alias_method :origin_many_empty?, :empty?
|
206
|
+
::ActiveRecord::Associations::HasManyAssociation.prepend(Module.new {
|
224
207
|
def empty?
|
225
|
-
result =
|
208
|
+
result = super
|
226
209
|
if Bullet.start? && !reflection.has_cached_counter?
|
227
210
|
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
|
228
211
|
end
|
229
212
|
result
|
230
213
|
end
|
231
214
|
|
232
|
-
alias_method :origin_count_records, :count_records
|
233
215
|
def count_records
|
234
216
|
result = reflection.has_cached_counter?
|
235
217
|
if Bullet.start? && !result && !self.is_a?(::ActiveRecord::Associations::ThroughAssociation)
|
236
218
|
Bullet::Detector::CounterCache.add_counter_cache(owner, reflection.name)
|
237
219
|
end
|
238
|
-
|
220
|
+
super
|
239
221
|
end
|
240
|
-
|
222
|
+
})
|
241
223
|
end
|
242
224
|
end
|
243
225
|
end
|
@@ -7,7 +7,7 @@ module Bullet
|
|
7
7
|
return if !Bullet.n_plus_one_query_enable? && !Bullet.unused_eager_loading_enable?
|
8
8
|
return unless object.primary_key_value
|
9
9
|
|
10
|
-
Bullet.debug("Detector::Association#add_object_associations", "object: #{object.bullet_key}, associations: #{associations}")
|
10
|
+
Bullet.debug("Detector::Association#add_object_associations".freeze, "object: #{object.bullet_key}, associations: #{associations}")
|
11
11
|
object_associations.add(object.bullet_key, associations)
|
12
12
|
end
|
13
13
|
|
@@ -16,7 +16,7 @@ module Bullet
|
|
16
16
|
return if !Bullet.n_plus_one_query_enable? && !Bullet.unused_eager_loading_enable?
|
17
17
|
return unless object.primary_key_value
|
18
18
|
|
19
|
-
Bullet.debug("Detector::Association#add_call_object_associations", "object: #{object.bullet_key}, associations: #{associations}")
|
19
|
+
Bullet.debug("Detector::Association#add_call_object_associations".freeze, "object: #{object.bullet_key}, associations: #{associations}")
|
20
20
|
call_object_associations.add(object.bullet_key, associations)
|
21
21
|
end
|
22
22
|
|
@@ -16,7 +16,7 @@ module Bullet
|
|
16
16
|
return if inversed_objects.include?(object.bullet_key, associations)
|
17
17
|
add_call_object_associations(object, associations)
|
18
18
|
|
19
|
-
Bullet.debug("Detector::NPlusOneQuery#call_association", "object: #{object.bullet_key}, associations: #{associations}")
|
19
|
+
Bullet.debug("Detector::NPlusOneQuery#call_association".freeze, "object: #{object.bullet_key}, associations: #{associations}")
|
20
20
|
if !excluded_stacktrace_path? && conditions_met?(object, associations)
|
21
21
|
Bullet.debug("detect n + 1 query", "object: #{object.bullet_key}, associations: #{associations}")
|
22
22
|
create_notification caller_in_project, object.class.to_s, associations
|
@@ -29,7 +29,7 @@ module Bullet
|
|
29
29
|
objects = Array(object_or_objects)
|
30
30
|
return if objects.map(&:primary_key_value).compact.empty?
|
31
31
|
|
32
|
-
Bullet.debug("Detector::NPlusOneQuery#add_possible_objects", "objects: #{objects.map(&:bullet_key).join(', ')}")
|
32
|
+
Bullet.debug("Detector::NPlusOneQuery#add_possible_objects".freeze, "objects: #{objects.map(&:bullet_key).join(', '.freeze)}")
|
33
33
|
objects.each { |object| possible_objects.add object.bullet_key }
|
34
34
|
end
|
35
35
|
|
@@ -38,7 +38,7 @@ module Bullet
|
|
38
38
|
return unless Bullet.n_plus_one_query_enable?
|
39
39
|
return unless object.primary_key_value
|
40
40
|
|
41
|
-
Bullet.debug("Detector::NPlusOneQuery#add_impossible_object", "object: #{object.bullet_key}")
|
41
|
+
Bullet.debug("Detector::NPlusOneQuery#add_impossible_object".freeze, "object: #{object.bullet_key}")
|
42
42
|
impossible_objects.add object.bullet_key
|
43
43
|
end
|
44
44
|
|
@@ -47,7 +47,7 @@ module Bullet
|
|
47
47
|
return unless Bullet.n_plus_one_query_enable?
|
48
48
|
return unless object.primary_key_value
|
49
49
|
|
50
|
-
Bullet.debug("Detector::NPlusOneQuery#add_inversed_object", "object: #{object.bullet_key}, association: #{association}")
|
50
|
+
Bullet.debug("Detector::NPlusOneQuery#add_inversed_object".freeze, "object: #{object.bullet_key}, association: #{association}")
|
51
51
|
inversed_objects.add object.bullet_key, association
|
52
52
|
end
|
53
53
|
|
data/lib/bullet/ext/object.rb
CHANGED
@@ -5,7 +5,7 @@ class Object
|
|
5
5
|
|
6
6
|
def primary_key_value
|
7
7
|
if self.class.respond_to?(:primary_keys) && self.class.primary_keys
|
8
|
-
self.class.primary_keys.map { |primary_key| self.send primary_key }.join(',')
|
8
|
+
self.class.primary_keys.map { |primary_key| self.send primary_key }.join(','.freeze)
|
9
9
|
elsif self.class.respond_to?(:primary_key) && self.class.primary_key
|
10
10
|
self.send self.class.primary_key
|
11
11
|
else
|
data/lib/bullet/ext/string.rb
CHANGED
@@ -5,7 +5,8 @@ module Bullet
|
|
5
5
|
def caller_in_project
|
6
6
|
app_root = rails? ? Rails.root.to_s : Dir.pwd
|
7
7
|
vendor_root = app_root + VENDOR_PATH
|
8
|
-
|
8
|
+
caller_locations.select do |location|
|
9
|
+
caller_path = location.absolute_path
|
9
10
|
caller_path.include?(app_root) && !caller_path.include?(vendor_root) ||
|
10
11
|
Bullet.stacktrace_includes.any? do |include_pattern|
|
11
12
|
case include_pattern
|
data/lib/bullet/version.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
module Bullet
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < ::Rails::Generators::Base
|
4
|
+
desc <<-DESC
|
5
|
+
Description:
|
6
|
+
Enable bullet in development/test for your application.
|
7
|
+
DESC
|
8
|
+
|
9
|
+
def enable_in_development
|
10
|
+
environment(nil, env: "development") do
|
11
|
+
<<-"FILE".strip
|
12
|
+
|
13
|
+
config.after_initialize do
|
14
|
+
Bullet.enable = true
|
15
|
+
Bullet.alert = true
|
16
|
+
Bullet.bullet_logger = true
|
17
|
+
Bullet.console = true
|
18
|
+
# Bullet.growl = true
|
19
|
+
Bullet.rails_logger = true
|
20
|
+
Bullet.add_footer = true
|
21
|
+
end
|
22
|
+
FILE
|
23
|
+
end
|
24
|
+
|
25
|
+
say "Enabled bullet in config/environments/development.rb"
|
26
|
+
end
|
27
|
+
|
28
|
+
def enable_in_test
|
29
|
+
if yes?("Would you like to enable bullet in test environment? (y/n)")
|
30
|
+
environment(nil, env: "test") do
|
31
|
+
<<-"FILE".strip
|
32
|
+
|
33
|
+
config.after_initialize do
|
34
|
+
Bullet.enable = true
|
35
|
+
Bullet.bullet_logger = true
|
36
|
+
Bullet.raise = true # raise an error if n+1 query occurs
|
37
|
+
end
|
38
|
+
FILE
|
39
|
+
end
|
40
|
+
|
41
|
+
say "Enabled bullet in config/environments/test.rb"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -91,11 +91,11 @@ module Bullet
|
|
91
91
|
after { Bullet.stacktrace_excludes = nil }
|
92
92
|
|
93
93
|
it "should not create notification when stacktrace contains paths that are in the exclude list" do
|
94
|
-
in_project = File.join(Dir.pwd, 'abc', 'abc.rb')
|
95
|
-
included_path = '/ghi/ghi.rb'
|
96
|
-
excluded_path = '/def/def.rb'
|
94
|
+
in_project = OpenStruct.new(:absolute_path => File.join(Dir.pwd, 'abc', 'abc.rb'))
|
95
|
+
included_path = OpenStruct.new(:absolute_path => '/ghi/ghi.rb')
|
96
|
+
excluded_path = OpenStruct.new(:absolute_path => '/def/def.rb')
|
97
97
|
|
98
|
-
expect(NPlusOneQuery).to receive(:
|
98
|
+
expect(NPlusOneQuery).to receive(:caller_locations).and_return([in_project, included_path, excluded_path])
|
99
99
|
expect(NPlusOneQuery).to_not receive(:create_notification)
|
100
100
|
NPlusOneQuery.call_association(@post, :association)
|
101
101
|
end
|
@@ -104,10 +104,10 @@ module Bullet
|
|
104
104
|
|
105
105
|
context ".caller_in_project" do
|
106
106
|
it "should include only paths that are in the project" do
|
107
|
-
in_project = File.join(Dir.pwd, 'abc', 'abc.rb')
|
108
|
-
not_in_project = '/def/def.rb'
|
107
|
+
in_project = OpenStruct.new(:absolute_path => File.join(Dir.pwd, 'abc', 'abc.rb'))
|
108
|
+
not_in_project = OpenStruct.new(:absolute_path => '/def/def.rb')
|
109
109
|
|
110
|
-
expect(NPlusOneQuery).to receive(:
|
110
|
+
expect(NPlusOneQuery).to receive(:caller_locations).and_return([in_project, not_in_project])
|
111
111
|
expect(NPlusOneQuery).to receive(:conditions_met?).with(@post, :association).and_return(true)
|
112
112
|
expect(NPlusOneQuery).to receive(:create_notification).with([in_project], "Post", :association)
|
113
113
|
NPlusOneQuery.call_association(@post, :association)
|
@@ -118,11 +118,11 @@ module Bullet
|
|
118
118
|
after { Bullet.stacktrace_includes = nil }
|
119
119
|
|
120
120
|
it "should include paths that are in the stacktrace_include list" do
|
121
|
-
in_project = File.join(Dir.pwd, 'abc', 'abc.rb')
|
122
|
-
included_gems = ['/def/def.rb', 'xyz/xyz.rb']
|
123
|
-
excluded_gem = '/ghi/ghi.rb'
|
121
|
+
in_project = OpenStruct.new(:absolute_path => File.join(Dir.pwd, 'abc', 'abc.rb'))
|
122
|
+
included_gems = [OpenStruct.new(:absolute_path => '/def/def.rb'), OpenStruct.new(:absolute_path => 'xyz/xyz.rb')]
|
123
|
+
excluded_gem = OpenStruct.new(:absolute_path => '/ghi/ghi.rb')
|
124
124
|
|
125
|
-
expect(NPlusOneQuery).to receive(:
|
125
|
+
expect(NPlusOneQuery).to receive(:caller_locations).and_return([in_project, *included_gems, excluded_gem])
|
126
126
|
expect(NPlusOneQuery).to receive(:conditions_met?).with(@post, :association).and_return(true)
|
127
127
|
expect(NPlusOneQuery).to receive(:create_notification).with([in_project, *included_gems], "Post", :association)
|
128
128
|
NPlusOneQuery.call_association(@post, :association)
|
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.
|
4
|
+
version: 5.6.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: 2017-
|
11
|
+
date: 2017-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- lib/bullet/registry/object.rb
|
96
96
|
- lib/bullet/stack_trace_filter.rb
|
97
97
|
- lib/bullet/version.rb
|
98
|
+
- lib/generators/bullet/install_generator.rb
|
98
99
|
- perf/benchmark.rb
|
99
100
|
- rails/init.rb
|
100
101
|
- spec/bullet/detector/association_spec.rb
|
@@ -177,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
178
|
version: 1.3.6
|
178
179
|
requirements: []
|
179
180
|
rubyforge_project:
|
180
|
-
rubygems_version: 2.
|
181
|
+
rubygems_version: 2.6.12
|
181
182
|
signing_key:
|
182
183
|
specification_version: 4
|
183
184
|
summary: help to kill N+1 queries and unused eager loading.
|