bullet 5.5.0 → 5.8.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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -5
  3. data/CHANGELOG.md +31 -1
  4. data/Gemfile +6 -1
  5. data/Gemfile.rails-5.0 +1 -1
  6. data/Gemfile.rails-5.1 +15 -0
  7. data/Gemfile.rails-5.2 +15 -0
  8. data/Guardfile +2 -2
  9. data/Hacking.md +1 -1
  10. data/README.md +20 -23
  11. data/Rakefile +20 -21
  12. data/bullet.gemspec +20 -15
  13. data/lib/bullet/active_record4.rb +18 -14
  14. data/lib/bullet/active_record41.rb +16 -14
  15. data/lib/bullet/active_record42.rb +24 -22
  16. data/lib/bullet/active_record5.rb +102 -91
  17. data/lib/bullet/active_record52.rb +232 -0
  18. data/lib/bullet/dependency.rb +9 -1
  19. data/lib/bullet/detector/association.rb +17 -14
  20. data/lib/bullet/detector/base.rb +2 -0
  21. data/lib/bullet/detector/counter_cache.rb +14 -10
  22. data/lib/bullet/detector/n_plus_one_query.rb +21 -17
  23. data/lib/bullet/detector/unused_eager_loading.rb +30 -24
  24. data/lib/bullet/detector.rb +2 -0
  25. data/lib/bullet/ext/object.rb +6 -4
  26. data/lib/bullet/ext/string.rb +3 -1
  27. data/lib/bullet/mongoid4x.rb +7 -2
  28. data/lib/bullet/mongoid5x.rb +7 -2
  29. data/lib/bullet/mongoid6x.rb +11 -6
  30. data/lib/bullet/notification/base.rb +26 -19
  31. data/lib/bullet/notification/counter_cache.rb +3 -1
  32. data/lib/bullet/notification/n_plus_one_query.rb +7 -4
  33. data/lib/bullet/notification/unused_eager_loading.rb +7 -4
  34. data/lib/bullet/notification.rb +2 -0
  35. data/lib/bullet/notification_collector.rb +2 -1
  36. data/lib/bullet/rack.rb +22 -18
  37. data/lib/bullet/registry/association.rb +2 -0
  38. data/lib/bullet/registry/base.rb +2 -0
  39. data/lib/bullet/registry/object.rb +2 -0
  40. data/lib/bullet/registry.rb +2 -0
  41. data/lib/bullet/stack_trace_filter.rb +56 -18
  42. data/lib/bullet/version.rb +3 -2
  43. data/lib/bullet.rb +43 -33
  44. data/lib/generators/bullet/install_generator.rb +48 -0
  45. data/perf/benchmark.rb +12 -12
  46. data/rails/init.rb +2 -0
  47. data/spec/bullet/detector/association_spec.rb +6 -4
  48. data/spec/bullet/detector/base_spec.rb +2 -0
  49. data/spec/bullet/detector/counter_cache_spec.rb +13 -11
  50. data/spec/bullet/detector/n_plus_one_query_spec.rb +71 -46
  51. data/spec/bullet/detector/unused_eager_loading_spec.rb +21 -19
  52. data/spec/bullet/ext/object_spec.rb +10 -8
  53. data/spec/bullet/ext/string_spec.rb +7 -5
  54. data/spec/bullet/notification/base_spec.rb +39 -38
  55. data/spec/bullet/notification/counter_cache_spec.rb +5 -3
  56. data/spec/bullet/notification/n_plus_one_query_spec.rb +5 -3
  57. data/spec/bullet/notification/unused_eager_loading_spec.rb +4 -2
  58. data/spec/bullet/notification_collector_spec.rb +12 -10
  59. data/spec/bullet/rack_spec.rb +48 -47
  60. data/spec/bullet/registry/association_spec.rb +12 -10
  61. data/spec/bullet/registry/base_spec.rb +22 -20
  62. data/spec/bullet/registry/object_spec.rb +6 -4
  63. data/spec/bullet_spec.rb +24 -3
  64. data/spec/integration/{active_record4 → active_record}/association_spec.rb +176 -114
  65. data/spec/integration/counter_cache_spec.rb +15 -13
  66. data/spec/integration/mongoid/association_spec.rb +35 -33
  67. data/spec/models/address.rb +2 -0
  68. data/spec/models/author.rb +2 -0
  69. data/spec/models/base_user.rb +2 -0
  70. data/spec/models/category.rb +2 -0
  71. data/spec/models/city.rb +2 -0
  72. data/spec/models/client.rb +4 -0
  73. data/spec/models/comment.rb +3 -1
  74. data/spec/models/company.rb +2 -0
  75. data/spec/models/country.rb +2 -0
  76. data/spec/models/document.rb +4 -2
  77. data/spec/models/entry.rb +2 -0
  78. data/spec/models/firm.rb +3 -0
  79. data/spec/models/folder.rb +2 -0
  80. data/spec/models/group.rb +4 -0
  81. data/spec/models/mongoid/address.rb +3 -1
  82. data/spec/models/mongoid/category.rb +4 -2
  83. data/spec/models/mongoid/comment.rb +3 -1
  84. data/spec/models/mongoid/company.rb +3 -1
  85. data/spec/models/mongoid/entry.rb +3 -1
  86. data/spec/models/mongoid/post.rb +6 -4
  87. data/spec/models/mongoid/user.rb +2 -0
  88. data/spec/models/newspaper.rb +3 -1
  89. data/spec/models/page.rb +2 -0
  90. data/spec/models/person.rb +2 -0
  91. data/spec/models/pet.rb +2 -0
  92. data/spec/models/post.rb +17 -0
  93. data/spec/models/relationship.rb +2 -0
  94. data/spec/models/reply.rb +2 -0
  95. data/spec/models/student.rb +2 -0
  96. data/spec/models/submission.rb +2 -0
  97. data/spec/models/teacher.rb +2 -0
  98. data/spec/models/user.rb +2 -0
  99. data/spec/models/writer.rb +2 -0
  100. data/spec/spec_helper.rb +15 -13
  101. data/spec/support/bullet_ext.rb +2 -0
  102. data/spec/support/mongo_seed.rb +36 -42
  103. data/spec/support/rack_double.rb +13 -19
  104. data/spec/support/sqlite_seed.rb +84 -76
  105. data/tasks/bullet_tasks.rake +4 -2
  106. data/test.sh +2 -0
  107. data/update.sh +2 -0
  108. metadata +17 -11
  109. data/spec/integration/active_record5/association_spec.rb +0 -768
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rspec'
2
4
  begin
3
5
  require 'active_record'
@@ -15,25 +17,25 @@ module Rails
15
17
  end
16
18
 
17
19
  def env
18
- "test"
20
+ 'test'
19
21
  end
20
22
  end
21
23
  end
22
24
 
23
- $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
25
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
24
26
  require 'bullet'
25
27
  extend Bullet::Dependency
26
28
  Bullet.enable = true
27
29
 
28
- MODELS = File.join(File.dirname(__FILE__), "models")
30
+ MODELS = File.join(File.dirname(__FILE__), 'models')
29
31
  $LOAD_PATH.unshift(MODELS)
30
- SUPPORT = File.join(File.dirname(__FILE__), "support")
31
- Dir[ File.join(SUPPORT, "*.rb") ].reject { |filename| filename =~ /_seed.rb$/ }.sort.each { |file| require file }
32
+ SUPPORT = File.join(File.dirname(__FILE__), 'support')
33
+ Dir[File.join(SUPPORT, '*.rb')].reject { |filename| filename =~ /_seed.rb$/ }.sort.each { |file| require file }
32
34
 
33
35
  RSpec.configure do |config|
34
36
  config.extend Bullet::Dependency
35
37
 
36
- config.filter_run :focus => true
38
+ config.filter_run focus: true
37
39
  config.run_all_when_everything_filtered = true
38
40
  end
39
41
 
@@ -41,11 +43,11 @@ if active_record?
41
43
  ActiveRecord::Migration.verbose = false
42
44
 
43
45
  # Autoload every active_record model for the test suite that sits in spec/models.
44
- Dir[ File.join(MODELS, "*.rb") ].sort.each do |filename|
45
- name = File.basename(filename, ".rb")
46
+ Dir[File.join(MODELS, '*.rb')].sort.each do |filename|
47
+ name = File.basename(filename, '.rb')
46
48
  autoload name.camelize.to_sym, name
47
49
  end
48
- require File.join(SUPPORT, "sqlite_seed.rb")
50
+ require File.join(SUPPORT, 'sqlite_seed.rb')
49
51
 
50
52
  RSpec.configure do |config|
51
53
  config.before(:suite) do
@@ -63,7 +65,7 @@ if active_record?
63
65
  end
64
66
  end
65
67
 
66
- if ENV["BULLET_LOG"]
68
+ if ENV['BULLET_LOG']
67
69
  require 'logger'
68
70
  ActiveRecord::Base.logger = Logger.new(STDOUT)
69
71
  end
@@ -71,8 +73,8 @@ end
71
73
 
72
74
  if mongoid?
73
75
  # Autoload every mongoid model for the test suite that sits in spec/models.
74
- Dir[ File.join(MODELS, "mongoid", "*.rb") ].sort.each { |file| require file }
75
- require File.join(SUPPORT, "mongo_seed.rb")
76
+ Dir[File.join(MODELS, 'mongoid', '*.rb')].sort.each { |file| require file }
77
+ require File.join(SUPPORT, 'mongo_seed.rb')
76
78
 
77
79
  RSpec.configure do |config|
78
80
  config.before(:suite) do
@@ -94,7 +96,7 @@ if mongoid?
94
96
  end
95
97
  end
96
98
 
97
- if ENV["BULLET_LOG"]
99
+ if ENV['BULLET_LOG']
98
100
  Mongoid.logger = Logger.new(STDOUT)
99
101
  Moped.logger = Logger.new(STDOUT)
100
102
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bullet
2
4
  def self.collected_notifications_of_class(notification_class)
3
5
  Bullet.notification_collector.collection.select do |notification|
@@ -1,66 +1,62 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Support
2
4
  module MongoSeed
5
+ module_function
6
+
3
7
  def seed_db
4
- category1 = Mongoid::Category.create(:name => 'first')
5
- category2 = Mongoid::Category.create(:name => 'second')
8
+ category1 = Mongoid::Category.create(name: 'first')
9
+ category2 = Mongoid::Category.create(name: 'second')
6
10
 
7
- post1 = category1.posts.create(:name => 'first')
8
- post1a = category1.posts.create(:name => 'like first')
9
- post2 = category2.posts.create(:name => 'second')
11
+ post1 = category1.posts.create(name: 'first')
12
+ post1a = category1.posts.create(name: 'like first')
13
+ post2 = category2.posts.create(name: 'second')
10
14
 
11
- post1.users << Mongoid::User.create(:name => 'first')
12
- post1.users << Mongoid::User.create(:name => 'another')
13
- post2.users << Mongoid::User.create(:name => 'second')
15
+ post1.users << Mongoid::User.create(name: 'first')
16
+ post1.users << Mongoid::User.create(name: 'another')
17
+ post2.users << Mongoid::User.create(name: 'second')
14
18
 
15
- comment1 = post1.comments.create(:name => 'first')
16
- comment2 = post1.comments.create(:name => 'first2')
17
- comment3 = post1.comments.create(:name => 'first3')
18
- comment4 = post1.comments.create(:name => 'second')
19
- comment8 = post1a.comments.create(:name => "like first 1")
20
- comment9 = post1a.comments.create(:name => "like first 2")
21
- comment5 = post2.comments.create(:name => 'third')
22
- comment6 = post2.comments.create(:name => 'fourth')
23
- comment7 = post2.comments.create(:name => 'fourth')
19
+ comment1 = post1.comments.create(name: 'first')
20
+ comment2 = post1.comments.create(name: 'first2')
21
+ comment3 = post1.comments.create(name: 'first3')
22
+ comment4 = post1.comments.create(name: 'second')
23
+ comment8 = post1a.comments.create(name: 'like first 1')
24
+ comment9 = post1a.comments.create(name: 'like first 2')
25
+ comment5 = post2.comments.create(name: 'third')
26
+ comment6 = post2.comments.create(name: 'fourth')
27
+ comment7 = post2.comments.create(name: 'fourth')
24
28
 
25
- entry1 = category1.entries.create(:name => 'first')
26
- entry2 = category1.entries.create(:name => 'second')
29
+ entry1 = category1.entries.create(name: 'first')
30
+ entry2 = category1.entries.create(name: 'second')
27
31
 
28
- company1 = Mongoid::Company.create(:name => 'first')
29
- company2 = Mongoid::Company.create(:name => 'second')
32
+ company1 = Mongoid::Company.create(name: 'first')
33
+ company2 = Mongoid::Company.create(name: 'second')
30
34
 
31
- Mongoid::Address.create(:name => 'first', :company => company1)
32
- Mongoid::Address.create(:name => 'second', :company => company2)
35
+ Mongoid::Address.create(name: 'first', company: company1)
36
+ Mongoid::Address.create(name: 'second', company: company2)
33
37
  end
34
38
 
35
39
  def setup_db
36
- if Mongoid::VERSION =~ /\A2\.[4-8]/
37
- Mongoid.configure do |config|
38
- config.master = Mongo::Connection.new.db("bullet")
39
- end
40
- elsif Mongoid::VERSION =~ /\A3/
41
- Mongoid.configure do |config|
42
- config.connect_to("bullet")
43
- end
44
- elsif Mongoid::VERSION =~ /\A4/
40
+ if Mongoid::VERSION =~ /\A4/
45
41
  Mongoid.configure do |config|
46
42
  config.load_configuration(
47
43
  sessions: {
48
44
  default: {
49
- database: "bullet",
50
- hosts: [ "localhost:27017" ]
45
+ database: 'bullet',
46
+ hosts: ['localhost:27017']
51
47
  }
52
48
  }
53
49
  )
54
50
  end
55
- elsif Mongoid::VERSION =~ /\A5/
51
+ else
56
52
  Mongoid.configure do |config|
57
53
  config.load_configuration(
58
- clients: {
59
- default: {
60
- database: "bullet",
61
- hosts: [ "localhost:27017" ]
62
- }
54
+ clients: {
55
+ default: {
56
+ database: 'bullet',
57
+ hosts: ['localhost:27017']
63
58
  }
59
+ }
64
60
  )
65
61
  end
66
62
  # Increase the level from DEBUG in order to avoid excessive logging to the screen
@@ -72,7 +68,5 @@ module Support
72
68
  Mongoid.purge!
73
69
  Mongoid::IdentityMap.clear if Mongoid.const_defined?(:IdentityMap)
74
70
  end
75
-
76
- extend self
77
71
  end
78
72
  end
@@ -1,28 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Support
2
4
  class AppDouble
3
- def call env
5
+ def call(_env)
4
6
  env = @env
5
- [ status, headers, response ]
7
+ [status, headers, response]
6
8
  end
7
9
 
8
- def status= status
9
- @status = status
10
- end
10
+ attr_writer :status
11
11
 
12
- def headers= headers
13
- @headers = headers
14
- end
12
+ attr_writer :headers
15
13
 
16
14
  def headers
17
- @headers ||= {"Content-Type" => "text/html"}
15
+ @headers ||= { 'Content-Type' => 'text/html' }
18
16
  @headers
19
17
  end
20
18
 
21
- def response= response
22
- @response = response
23
- end
19
+ attr_writer :response
24
20
 
25
21
  private
22
+
26
23
  def status
27
24
  @status || 200
28
25
  end
@@ -33,23 +30,20 @@ module Support
33
30
  end
34
31
 
35
32
  class ResponseDouble
36
- def initialize actual_body = nil
33
+ def initialize(actual_body = nil)
37
34
  @actual_body = actual_body
38
35
  end
39
36
 
40
37
  def body
41
- @body ||= "<html><head></head><body></body></html>"
38
+ @body ||= '<html><head></head><body></body></html>'
42
39
  end
43
40
 
44
- def body= body
45
- @body = body
46
- end
41
+ attr_writer :body
47
42
 
48
43
  def each
49
44
  yield body
50
45
  end
51
46
 
52
- def close
53
- end
47
+ def close; end
54
48
  end
55
49
  end
@@ -1,101 +1,106 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Support
2
4
  module SqliteSeed
5
+ module_function
6
+
3
7
  def seed_db
4
- newspaper1 = Newspaper.create(:name => "First Newspaper")
5
- newspaper2 = Newspaper.create(:name => "Second Newspaper")
6
-
7
- writer1 = Writer.create(:name => 'first', :newspaper => newspaper1)
8
- writer2 = Writer.create(:name => 'second', :newspaper => newspaper2)
9
- user1 = BaseUser.create(:name => 'third', :newspaper => newspaper1)
10
- user2 = BaseUser.create(:name => 'fourth', :newspaper => newspaper2)
11
-
12
-
13
- category1 = Category.create(:name => 'first')
14
- category2 = Category.create(:name => 'second')
15
-
16
- post1 = category1.posts.create(:name => 'first', :writer => writer1)
17
- post1a = category1.posts.create(:name => 'like first', :writer => writer2, active: false)
18
- post2 = category2.posts.create(:name => 'second', :writer => writer2)
19
- post3 = category2.posts.create(:name => 'third', :writer => writer2)
20
-
21
- comment1 = post1.comments.create(:name => 'first', :author => writer1)
22
- comment2 = post1.comments.create(:name => 'first2', :author => writer1)
23
- comment3 = post1.comments.create(:name => 'first3', :author => writer1)
24
- comment4 = post1.comments.create(:name => 'second', :author => writer2)
25
- comment8 = post1a.comments.create(:name => "like first 1", :author => writer1)
26
- comment9 = post1a.comments.create(:name => "like first 2", :author => writer2)
27
- comment5 = post2.comments.create(:name => 'third', :author => user1)
28
- comment6 = post2.comments.create(:name => 'fourth', :author => user2)
29
- comment7 = post2.comments.create(:name => 'fourth', :author => writer1)
30
-
31
- entry1 = category1.entries.create(:name => 'first')
32
- entry2 = category1.entries.create(:name => 'second')
33
-
34
- student1 = Student.create(:name => 'first')
35
- student2 = Student.create(:name => 'second')
36
- teacher1 = Teacher.create(:name => 'first')
37
- teacher2 = Teacher.create(:name => 'second')
8
+ newspaper1 = Newspaper.create(name: 'First Newspaper')
9
+ newspaper2 = Newspaper.create(name: 'Second Newspaper')
10
+
11
+ writer1 = Writer.create(name: 'first', newspaper: newspaper1)
12
+ writer2 = Writer.create(name: 'second', newspaper: newspaper2)
13
+ user1 = BaseUser.create(name: 'third', newspaper: newspaper1)
14
+ user2 = BaseUser.create(name: 'fourth', newspaper: newspaper2)
15
+
16
+ category1 = Category.create(name: 'first')
17
+ category2 = Category.create(name: 'second')
18
+
19
+ post1 = category1.posts.create(name: 'first', writer: writer1)
20
+ post1a = category1.posts.create(name: 'like first', writer: writer2, active: false)
21
+ post2 = category2.posts.create(name: 'second', writer: writer2)
22
+ post3 = category2.posts.create(name: 'third', writer: writer2)
23
+
24
+ comment1 = post1.comments.create(name: 'first', author: writer1)
25
+ comment2 = post1.comments.create(name: 'first2', author: writer1)
26
+ comment3 = post1.comments.create(name: 'first3', author: writer1)
27
+ comment4 = post1.comments.create(name: 'second', author: writer2)
28
+ comment8 = post1a.comments.create(name: 'like first 1', author: writer1)
29
+ comment9 = post1a.comments.create(name: 'like first 2', author: writer2)
30
+ comment5 = post2.comments.create(name: 'third', author: user1)
31
+ comment6 = post2.comments.create(name: 'fourth', author: user2)
32
+ comment7 = post2.comments.create(name: 'fourth', author: writer1)
33
+
34
+ entry1 = category1.entries.create(name: 'first')
35
+ entry2 = category1.entries.create(name: 'second')
36
+
37
+ student1 = Student.create(name: 'first')
38
+ student2 = Student.create(name: 'second')
39
+ teacher1 = Teacher.create(name: 'first')
40
+ teacher2 = Teacher.create(name: 'second')
38
41
  student1.teachers = [teacher1, teacher2]
39
42
  student2.teachers = [teacher1, teacher2]
40
43
  teacher1.students << student1
41
44
  teacher2.students << student2
42
45
 
43
- firm1 = Firm.create(:name => 'first')
44
- firm2 = Firm.create(:name => 'second')
45
- client1 = Client.create(:name => 'first')
46
- client2 = Client.create(:name => 'second')
46
+ firm1 = Firm.create(name: 'first')
47
+ firm2 = Firm.create(name: 'second')
48
+ group1 = Group.create(name: 'first')
49
+ group2 = Group.create(name: 'second')
50
+ client1 = Client.create(name: 'first', group: group1)
51
+ client2 = Client.create(name: 'second', group: group2)
47
52
  firm1.clients = [client1, client2]
48
53
  firm2.clients = [client1, client2]
49
54
  client1.firms << firm1
50
55
  client2.firms << firm2
51
56
 
52
- company1 = Company.create(:name => 'first')
53
- company2 = Company.create(:name => 'second')
57
+ company1 = Company.create(name: 'first')
58
+ company2 = Company.create(name: 'second')
54
59
 
55
- Address.create(:name => 'first', :company => company1)
56
- Address.create(:name => 'second', :company => company2)
60
+ Address.create(name: 'first', company: company1)
61
+ Address.create(name: 'second', company: company2)
57
62
 
58
- country1 = Country.create(:name => 'first')
59
- country2 = Country.create(:name => 'second')
63
+ country1 = Country.create(name: 'first')
64
+ country2 = Country.create(name: 'second')
60
65
 
61
- country1.cities.create(:name => 'first')
62
- country1.cities.create(:name => 'second')
63
- country2.cities.create(:name => 'third')
64
- country2.cities.create(:name => 'fourth')
66
+ country1.cities.create(name: 'first')
67
+ country1.cities.create(name: 'second')
68
+ country2.cities.create(name: 'third')
69
+ country2.cities.create(name: 'fourth')
65
70
 
66
- person1 = Person.create(:name => 'first')
67
- person2 = Person.create(:name => 'second')
71
+ person1 = Person.create(name: 'first')
72
+ person2 = Person.create(name: 'second')
68
73
 
69
- person1.pets.create(:name => 'first')
70
- person1.pets.create(:name => 'second')
71
- person2.pets.create(:name => 'third')
72
- person2.pets.create(:name => 'fourth')
74
+ person1.pets.create(name: 'first')
75
+ person1.pets.create(name: 'second')
76
+ person2.pets.create(name: 'third')
77
+ person2.pets.create(name: 'fourth')
73
78
 
74
- author1 = Author.create(:name => 'author1')
75
- author2 = Author.create(:name => 'author2')
76
- folder1 = Folder.create(:name => 'folder1', :author_id => author1.id)
77
- folder2 = Folder.create(:name => 'folder2', :author_id => author2.id)
78
- page1 = Page.create(:name => 'page1', :parent_id => folder1.id, :author_id => author1.id)
79
- page2 = Page.create(:name => 'page2', :parent_id => folder1.id, :author_id => author1.id)
80
- page3 = Page.create(:name => 'page3', :parent_id => folder2.id, :author_id => author2.id)
81
- page4 = Page.create(:name => 'page4', :parent_id => folder2.id, :author_id => author2.id)
79
+ author1 = Author.create(name: 'author1')
80
+ author2 = Author.create(name: 'author2')
81
+ folder1 = Folder.create(name: 'folder1', author_id: author1.id)
82
+ folder2 = Folder.create(name: 'folder2', author_id: author2.id)
83
+ page1 = Page.create(name: 'page1', parent_id: folder1.id, author_id: author1.id)
84
+ page2 = Page.create(name: 'page2', parent_id: folder1.id, author_id: author1.id)
85
+ page3 = Page.create(name: 'page3', parent_id: folder2.id, author_id: author2.id)
86
+ page4 = Page.create(name: 'page4', parent_id: folder2.id, author_id: author2.id)
82
87
 
83
- user1 = User.create(:name => 'user1', :category => category1)
84
- user2 = User.create(:name => 'user2', :category => category1)
88
+ user1 = User.create(name: 'user1', category: category1)
89
+ user2 = User.create(name: 'user2', category: category1)
85
90
 
86
- submission1 = user1.create_submission(:name => "submission1")
87
- submission2 = user2.create_submission(:name => "submission2")
91
+ submission1 = user1.create_submission(name: 'submission1')
92
+ submission2 = user2.create_submission(name: 'submission2')
88
93
 
89
- submission1.replies.create(:name => 'reply1')
90
- submission1.replies.create(:name => 'reply2')
91
- submission2.replies.create(:name => 'reply3')
92
- submission2.replies.create(:name => 'reply4')
94
+ submission1.replies.create(name: 'reply1')
95
+ submission1.replies.create(name: 'reply2')
96
+ submission2.replies.create(name: 'reply3')
97
+ submission2.replies.create(name: 'reply4')
93
98
  end
94
99
 
95
100
  def setup_db
96
- ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
101
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
97
102
 
98
- ActiveRecord::Schema.define(:version => 1) do
103
+ ActiveRecord::Schema.define(version: 1) do
99
104
  create_table :addresses do |t|
100
105
  t.column :name, :string
101
106
  t.column :company_id, :integer
@@ -122,6 +127,7 @@ module Support
122
127
 
123
128
  create_table :clients do |t|
124
129
  t.column :name, :string
130
+ t.column :group_id, :integer
125
131
  end
126
132
 
127
133
  create_table :comments do |t|
@@ -168,6 +174,10 @@ module Support
168
174
  t.column :name, :string
169
175
  end
170
176
 
177
+ create_table :groups do |t|
178
+ t.column :name, :string
179
+ end
180
+
171
181
  create_table :hotels do |t|
172
182
  t.column :name, :string
173
183
  t.column :location_id, :integer
@@ -195,7 +205,7 @@ module Support
195
205
  t.column :name, :string
196
206
  t.column :category_id, :integer
197
207
  t.column :writer_id, :integer
198
- t.column :active, :boolean, :default => true
208
+ t.column :active, :boolean, default: true
199
209
  end
200
210
 
201
211
  create_table :relationships do |t|
@@ -207,7 +217,7 @@ module Support
207
217
  t.column :name, :string
208
218
  end
209
219
 
210
- create_table :students_teachers, :id => false do |t|
220
+ create_table :students_teachers, id: false do |t|
211
221
  t.column :student_id, :integer
212
222
  t.column :teacher_id, :integer
213
223
  end
@@ -232,7 +242,5 @@ module Support
232
242
  end
233
243
  end
234
244
  end
235
-
236
- extend self
237
245
  end
238
246
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  namespace :bullet do
2
4
  namespace :log do
3
- desc "Truncates the bullet log file to zero bytes"
5
+ desc 'Truncates the bullet log file to zero bytes'
4
6
  task :clear do
5
- f = File.open("log/bullet.log", "w")
7
+ f = File.open('log/bullet.log', 'w')
6
8
  f.close
7
9
  end
8
10
  end
data/test.sh CHANGED
@@ -1,5 +1,7 @@
1
1
  #bundle update rails && bundle exec rspec spec
2
2
  #BUNDLE_GEMFILE=Gemfile.mongoid bundle update mongoid && BUNDLE_GEMFILE=Gemfile.mongoid bundle exec rspec spec
3
+ BUNDLE_GEMFILE=Gemfile.rails-5.2 bundle && BUNDLE_GEMFILE=Gemfile.rails-5.2 bundle exec rspec spec
4
+ BUNDLE_GEMFILE=Gemfile.rails-5.1 bundle && BUNDLE_GEMFILE=Gemfile.rails-5.1 bundle exec rspec spec
3
5
  BUNDLE_GEMFILE=Gemfile.rails-5.0 bundle && BUNDLE_GEMFILE=Gemfile.rails-5.0 bundle exec rspec spec
4
6
  BUNDLE_GEMFILE=Gemfile.rails-4.2 bundle && BUNDLE_GEMFILE=Gemfile.rails-4.2 bundle exec rspec spec
5
7
  BUNDLE_GEMFILE=Gemfile.rails-4.1 bundle && BUNDLE_GEMFILE=Gemfile.rails-4.1 bundle exec rspec spec
data/update.sh CHANGED
@@ -1,3 +1,5 @@
1
+ BUNDLE_GEMFILE=Gemfile.rails-5.2 bundle update
2
+ BUNDLE_GEMFILE=Gemfile.rails-5.1 bundle update
1
3
  BUNDLE_GEMFILE=Gemfile.rails-5.0 bundle update
2
4
  BUNDLE_GEMFILE=Gemfile.rails-4.2 bundle update
3
5
  BUNDLE_GEMFILE=Gemfile.rails-4.1 bundle update
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.5.0
4
+ version: 5.8.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: 2016-12-30 00:00:00.000000000 Z
11
+ date: 2018-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.10.0
33
+ version: '1.11'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.10.0
40
+ version: '1.11'
41
41
  description: help to kill N+1 queries and unused eager loading.
42
42
  email:
43
43
  - flyerhzm@gmail.com
@@ -58,6 +58,8 @@ files:
58
58
  - Gemfile.rails-4.1
59
59
  - Gemfile.rails-4.2
60
60
  - Gemfile.rails-5.0
61
+ - Gemfile.rails-5.1
62
+ - Gemfile.rails-5.2
61
63
  - Guardfile
62
64
  - Hacking.md
63
65
  - MIT-LICENSE
@@ -69,6 +71,7 @@ files:
69
71
  - lib/bullet/active_record41.rb
70
72
  - lib/bullet/active_record42.rb
71
73
  - lib/bullet/active_record5.rb
74
+ - lib/bullet/active_record52.rb
72
75
  - lib/bullet/dependency.rb
73
76
  - lib/bullet/detector.rb
74
77
  - lib/bullet/detector/association.rb
@@ -94,6 +97,7 @@ files:
94
97
  - lib/bullet/registry/object.rb
95
98
  - lib/bullet/stack_trace_filter.rb
96
99
  - lib/bullet/version.rb
100
+ - lib/generators/bullet/install_generator.rb
97
101
  - perf/benchmark.rb
98
102
  - rails/init.rb
99
103
  - spec/bullet/detector/association_spec.rb
@@ -113,8 +117,7 @@ files:
113
117
  - spec/bullet/registry/base_spec.rb
114
118
  - spec/bullet/registry/object_spec.rb
115
119
  - spec/bullet_spec.rb
116
- - spec/integration/active_record4/association_spec.rb
117
- - spec/integration/active_record5/association_spec.rb
120
+ - spec/integration/active_record/association_spec.rb
118
121
  - spec/integration/counter_cache_spec.rb
119
122
  - spec/integration/mongoid/association_spec.rb
120
123
  - spec/models/address.rb
@@ -130,6 +133,7 @@ files:
130
133
  - spec/models/entry.rb
131
134
  - spec/models/firm.rb
132
135
  - spec/models/folder.rb
136
+ - spec/models/group.rb
133
137
  - spec/models/mongoid/address.rb
134
138
  - spec/models/mongoid/category.rb
135
139
  - spec/models/mongoid/comment.rb
@@ -157,10 +161,12 @@ files:
157
161
  - tasks/bullet_tasks.rake
158
162
  - test.sh
159
163
  - update.sh
160
- homepage: http://github.com/flyerhzm/bullet
164
+ homepage: https://github.com/flyerhzm/bullet
161
165
  licenses:
162
166
  - MIT
163
- metadata: {}
167
+ metadata:
168
+ changelog_uri: https://github.com/flyerhzm/bullet/blob/master/CHANGELOG.md
169
+ source_code_uri: https://github.com/flyerhzm/bullet
164
170
  post_install_message:
165
171
  rdoc_options: []
166
172
  require_paths:
@@ -177,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
177
183
  version: 1.3.6
178
184
  requirements: []
179
185
  rubyforge_project:
180
- rubygems_version: 2.5.1
186
+ rubygems_version: 2.6.14
181
187
  signing_key:
182
188
  specification_version: 4
183
189
  summary: help to kill N+1 queries and unused eager loading.
@@ -199,8 +205,7 @@ test_files:
199
205
  - spec/bullet/registry/base_spec.rb
200
206
  - spec/bullet/registry/object_spec.rb
201
207
  - spec/bullet_spec.rb
202
- - spec/integration/active_record4/association_spec.rb
203
- - spec/integration/active_record5/association_spec.rb
208
+ - spec/integration/active_record/association_spec.rb
204
209
  - spec/integration/counter_cache_spec.rb
205
210
  - spec/integration/mongoid/association_spec.rb
206
211
  - spec/models/address.rb
@@ -216,6 +221,7 @@ test_files:
216
221
  - spec/models/entry.rb
217
222
  - spec/models/firm.rb
218
223
  - spec/models/folder.rb
224
+ - spec/models/group.rb
219
225
  - spec/models/mongoid/address.rb
220
226
  - spec/models/mongoid/category.rb
221
227
  - spec/models/mongoid/comment.rb