bullet 5.6.0 → 5.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Guardfile +2 -2
  4. data/Rakefile +16 -16
  5. data/bullet.gemspec +11 -11
  6. data/lib/bullet.rb +3 -3
  7. data/lib/bullet/detector/association.rb +2 -2
  8. data/lib/bullet/detector/counter_cache.rb +3 -3
  9. data/lib/bullet/detector/n_plus_one_query.rb +5 -5
  10. data/lib/bullet/detector/unused_eager_loading.rb +2 -2
  11. data/lib/bullet/ext/string.rb +1 -1
  12. data/lib/bullet/notification/base.rb +6 -6
  13. data/lib/bullet/notification/counter_cache.rb +1 -1
  14. data/lib/bullet/rack.rb +4 -4
  15. data/lib/bullet/stack_trace_filter.rb +2 -2
  16. data/lib/bullet/version.rb +2 -2
  17. data/lib/generators/bullet/install_generator.rb +5 -5
  18. data/perf/benchmark.rb +3 -3
  19. data/spec/bullet/detector/association_spec.rb +4 -4
  20. data/spec/bullet/detector/counter_cache_spec.rb +11 -11
  21. data/spec/bullet/detector/n_plus_one_query_spec.rb +33 -33
  22. data/spec/bullet/detector/unused_eager_loading_spec.rb +19 -19
  23. data/spec/bullet/ext/object_spec.rb +7 -7
  24. data/spec/bullet/ext/string_spec.rb +5 -5
  25. data/spec/bullet/notification/base_spec.rb +32 -32
  26. data/spec/bullet/notification/counter_cache_spec.rb +2 -2
  27. data/spec/bullet/notification/n_plus_one_query_spec.rb +2 -2
  28. data/spec/bullet/notification/unused_eager_loading_spec.rb +2 -2
  29. data/spec/bullet/notification_collector_spec.rb +10 -10
  30. data/spec/bullet/rack_spec.rb +46 -46
  31. data/spec/bullet/registry/association_spec.rb +10 -10
  32. data/spec/bullet/registry/base_spec.rb +20 -20
  33. data/spec/bullet/registry/object_spec.rb +4 -4
  34. data/spec/integration/active_record/association_spec.rb +101 -101
  35. data/spec/integration/counter_cache_spec.rb +12 -12
  36. data/spec/integration/mongoid/association_spec.rb +33 -33
  37. data/spec/models/comment.rb +1 -1
  38. data/spec/models/document.rb +2 -2
  39. data/spec/models/mongoid/address.rb +1 -1
  40. data/spec/models/mongoid/category.rb +2 -2
  41. data/spec/models/mongoid/comment.rb +1 -1
  42. data/spec/models/mongoid/company.rb +1 -1
  43. data/spec/models/mongoid/entry.rb +1 -1
  44. data/spec/models/mongoid/post.rb +3 -3
  45. data/spec/models/newspaper.rb +1 -1
  46. data/spec/spec_helper.rb +12 -12
  47. data/spec/support/mongo_seed.rb +6 -6
  48. data/spec/support/rack_double.rb +2 -2
  49. data/spec/support/sqlite_seed.rb +6 -6
  50. data/tasks/bullet_tasks.rake +2 -2
  51. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 652f59b5a91224c16cace3931e368d0da02fa449
4
- data.tar.gz: 9ef371969315cd308b194a9d230d1f19892a57e4
3
+ metadata.gz: 32281988136558818e4c3ae98c4059d88b6baf79
4
+ data.tar.gz: eb9281de70a51206eddebfe0eb70fa681b7bff51
5
5
  SHA512:
6
- metadata.gz: ed473ab951e1f168de703cf0615f203abc93e37ef896330d6f91c7b61d320cd0906e691e41245e13a11aa9e3aa3d059ea62b00b256fa96af0540c8ab35ebc2fb
7
- data.tar.gz: f6c4456dfb56957b441fce1b56094baacc911186b59b48b43f22e41ad3bbed88c52aa16b4bc7247b7ca37a3c7d026bb45f5342ccc24b37bc47836cd63fb41a1c
6
+ metadata.gz: 49d6dba2f3881bd6c129ff12b2c241627431602804010a2a09cc11e5a1912c636f75b1f286e863117426faa830a7486b17b29b37fe6aa706f241e18eb3df282e
7
+ data.tar.gz: a24b68afef28189f25406b8233d50e1b14a002d71749d4bfa85a0fff40a9d9a927140e133d2f11aaf5878b126da70544a4e335ddedb6db99ce1f1fa3b10569af
@@ -1,5 +1,9 @@
1
1
  # Next Release
2
2
 
3
+ ## 5.6.1 (08/01/2017)
4
+
5
+ * Fix caller_path in the case of nil
6
+
3
7
  ## 5.6.0 (07/16/2017)
4
8
 
5
9
  * Migrate alias_method to Module#prepend
data/Guardfile CHANGED
@@ -1,8 +1,8 @@
1
1
  # A sample Guardfile
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
- guard 'rspec', :version => 2, :all_after_pass => false, :all_on_start => false, :cli => "--color --format nested --fail-fast" do
4
+ guard 'rspec', :version => 2, :all_after_pass => false, :all_on_start => false, :cli => '--color --format nested --fail-fast' do
5
5
  watch(%r{^spec/.+_spec\.rb$})
6
6
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
- watch('spec/spec_helper.rb') { "spec" }
7
+ watch('spec/spec_helper.rb') { 'spec' }
8
8
  end
data/Rakefile CHANGED
@@ -1,15 +1,15 @@
1
- $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
- require "bundler"
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
+ require 'bundler'
3
3
  Bundler.setup
4
4
 
5
- require "rake"
6
- require "rspec"
7
- require "rspec/core/rake_task"
5
+ require 'rake'
6
+ require 'rspec'
7
+ require 'rspec/core/rake_task'
8
8
 
9
- require "bullet/version"
9
+ require 'bullet/version'
10
10
 
11
11
  task :build do
12
- system "gem build bullet.gemspec"
12
+ system 'gem build bullet.gemspec'
13
13
  end
14
14
 
15
15
  task :install => :build do
@@ -19,31 +19,31 @@ end
19
19
  task :release => :build do
20
20
  puts "Tagging #{Bullet::VERSION}..."
21
21
  system "git tag -a #{Bullet::VERSION} -m 'Tagging #{Bullet::VERSION}'"
22
- puts "Pushing to Github..."
23
- system "git push --tags"
24
- puts "Pushing to rubygems.org..."
22
+ puts 'Pushing to Github...'
23
+ system 'git push --tags'
24
+ puts 'Pushing to rubygems.org...'
25
25
  system "gem push bullet-#{Bullet::VERSION}.gem"
26
26
  end
27
27
 
28
28
  RSpec::Core::RakeTask.new(:spec) do |spec|
29
- spec.pattern = "spec/**/*_spec.rb"
29
+ spec.pattern = 'spec/**/*_spec.rb'
30
30
  end
31
31
 
32
32
  RSpec::Core::RakeTask.new('spec:progress') do |spec|
33
33
  spec.rspec_opts = %w(--format progress)
34
- spec.pattern = "spec/**/*_spec.rb"
34
+ spec.pattern = 'spec/**/*_spec.rb'
35
35
  end
36
36
 
37
37
 
38
38
  begin
39
39
  require 'rdoc/task'
40
40
 
41
- desc "Generate documentation for the plugin."
41
+ desc 'Generate documentation for the plugin.'
42
42
  Rake::RDocTask.new do |rdoc|
43
- rdoc.rdoc_dir = "rdoc"
43
+ rdoc.rdoc_dir = 'rdoc'
44
44
  rdoc.title = "bullet #{Bullet::VERSION}"
45
- rdoc.rdoc_files.include("README*")
46
- rdoc.rdoc_files.include("lib/**/*.rb")
45
+ rdoc.rdoc_files.include('README*')
46
+ rdoc.rdoc_files.include('lib/**/*.rb')
47
47
  end
48
48
  rescue LoadError
49
49
  puts 'RDocTask is not supported for this platform'
@@ -1,27 +1,27 @@
1
1
  lib = File.expand_path('../lib/', __FILE__)
2
2
  $:.unshift lib unless $:.include?(lib)
3
3
 
4
- require "bullet/version"
4
+ require 'bullet/version'
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = "bullet"
7
+ s.name = 'bullet'
8
8
  s.version = Bullet::VERSION
9
9
  s.platform = Gem::Platform::RUBY
10
- s.authors = ["Richard Huang"]
11
- s.email = ["flyerhzm@gmail.com"]
12
- s.homepage = "http://github.com/flyerhzm/bullet"
13
- s.summary = "help to kill N+1 queries and unused eager loading."
14
- s.description = "help to kill N+1 queries and unused eager loading."
10
+ s.authors = ['Richard Huang']
11
+ s.email = ['flyerhzm@gmail.com']
12
+ s.homepage = 'http://github.com/flyerhzm/bullet'
13
+ s.summary = 'help to kill N+1 queries and unused eager loading.'
14
+ s.description = 'help to kill N+1 queries and unused eager loading.'
15
15
 
16
16
  s.license = 'MIT'
17
17
 
18
- s.required_rubygems_version = ">= 1.3.6"
18
+ s.required_rubygems_version = '>= 1.3.6'
19
19
 
20
- s.add_runtime_dependency "activesupport", ">= 3.0.0"
21
- s.add_runtime_dependency "uniform_notifier", "~> 1.10.0"
20
+ s.add_runtime_dependency 'activesupport', '>= 3.0.0'
21
+ s.add_runtime_dependency 'uniform_notifier', '~> 1.10.0'
22
22
 
23
23
  s.files = `git ls-files`.split("\n")
24
24
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
- s.require_paths = ["lib"]
25
+ s.require_paths = ['lib']
26
26
  end
27
27
 
@@ -1,4 +1,4 @@
1
- require "active_support/core_ext/module/delegation"
1
+ require 'active_support/core_ext/module/delegation'
2
2
  require 'set'
3
3
  require 'uniform_notifier'
4
4
  require 'bullet/ext/object'
@@ -22,7 +22,7 @@ module Bullet
22
22
 
23
23
  if defined? Rails::Railtie
24
24
  class BulletRailtie < Rails::Railtie
25
- initializer "bullet.configure_rails_initialization" do |app|
25
+ initializer 'bullet.configure_rails_initialization' do |app|
26
26
  app.middleware.use Bullet::Rack
27
27
  end
28
28
  end
@@ -43,7 +43,7 @@ module Bullet
43
43
 
44
44
  DETECTORS = [ Bullet::Detector::NPlusOneQuery,
45
45
  Bullet::Detector::UnusedEagerLoading,
46
- Bullet::Detector::CounterCache ]
46
+ Bullet::Detector::CounterCache ].freeze
47
47
 
48
48
  def enable=(enable)
49
49
  @enable = @n_plus_one_query_enable = @unused_eager_loading_enable = @counter_cache_enable = enable
@@ -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".freeze, "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".freeze, "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
 
@@ -7,7 +7,7 @@ module Bullet
7
7
  return unless Bullet.counter_cache_enable?
8
8
  return unless object.primary_key_value
9
9
 
10
- Bullet.debug("Detector::CounterCache#add_counter_cache", "object: #{object.bullet_key}, associations: #{associations}")
10
+ Bullet.debug('Detector::CounterCache#add_counter_cache', "object: #{object.bullet_key}, associations: #{associations}")
11
11
  if conditions_met?(object, associations)
12
12
  create_notification object.class.to_s, associations
13
13
  end
@@ -19,7 +19,7 @@ module Bullet
19
19
  objects = Array(object_or_objects)
20
20
  return if objects.map(&:primary_key_value).compact.empty?
21
21
 
22
- Bullet.debug("Detector::CounterCache#add_possible_objects", "objects: #{objects.map(&:bullet_key).join(', ')}")
22
+ Bullet.debug('Detector::CounterCache#add_possible_objects', "objects: #{objects.map(&:bullet_key).join(', ')}")
23
23
  objects.each { |object| possible_objects.add object.bullet_key }
24
24
  end
25
25
 
@@ -28,7 +28,7 @@ module Bullet
28
28
  return unless Bullet.counter_cache_enable?
29
29
  return unless object.primary_key_value
30
30
 
31
- Bullet.debug("Detector::CounterCache#add_impossible_object", "object: #{object.bullet_key}")
31
+ Bullet.debug('Detector::CounterCache#add_impossible_object', "object: #{object.bullet_key}")
32
32
  impossible_objects.add object.bullet_key
33
33
  end
34
34
 
@@ -16,9 +16,9 @@ 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".freeze, "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
- Bullet.debug("detect n + 1 query", "object: #{object.bullet_key}, associations: #{associations}")
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
23
23
  end
24
24
  end
@@ -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".freeze, "objects: #{objects.map(&:bullet_key).join(', '.freeze)}")
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".freeze, "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".freeze, "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
 
@@ -17,7 +17,7 @@ module Bullet
17
17
  object_association_diff = diff_object_associations bullet_key, associations
18
18
  next if object_association_diff.empty?
19
19
 
20
- Bullet.debug("detect unused preload", "object: #{bullet_key}, associations: #{object_association_diff}")
20
+ Bullet.debug('detect unused preload', "object: #{bullet_key}, associations: #{object_association_diff}")
21
21
  create_notification(caller_in_project, bullet_key.bullet_class_name, object_association_diff)
22
22
  end
23
23
  end
@@ -27,7 +27,7 @@ module Bullet
27
27
  return unless Bullet.unused_eager_loading_enable?
28
28
  return if objects.map(&:primary_key_value).compact.empty?
29
29
 
30
- Bullet.debug("Detector::UnusedEagerLoading#add_eager_loadings", "objects: #{objects.map(&:bullet_key).join(', ')}, associations: #{associations}")
30
+ Bullet.debug('Detector::UnusedEagerLoading#add_eager_loadings', "objects: #{objects.map(&:bullet_key).join(', ')}, associations: #{associations}")
31
31
  bullet_keys = objects.map(&:bullet_key)
32
32
 
33
33
  to_add, to_merge, to_delete = [], [], []
@@ -1,5 +1,5 @@
1
1
  class String
2
2
  def bullet_class_name
3
- self.sub(/:[^:]*?$/, "".freeze)
3
+ self.sub(/:[^:]*?$/, ''.freeze)
4
4
  end
5
5
  end
@@ -11,23 +11,23 @@ module Bullet
11
11
  end
12
12
 
13
13
  def title
14
- raise NoMethodError.new("no method title defined")
14
+ raise NoMethodError.new('no method title defined')
15
15
  end
16
16
 
17
17
  def body
18
- raise NoMethodError.new("no method body defined")
18
+ raise NoMethodError.new('no method body defined')
19
19
  end
20
20
 
21
21
  def call_stack_messages
22
- ""
22
+ ''
23
23
  end
24
24
 
25
25
  def whoami
26
- @user ||= ENV['USER'].presence || (`whoami`.chomp rescue "")
26
+ @user ||= ENV['USER'].presence || (`whoami`.chomp rescue '')
27
27
  if @user.present?
28
28
  "user: #{@user}"
29
29
  else
30
- ""
30
+ ''
31
31
  end
32
32
  end
33
33
 
@@ -44,7 +44,7 @@ module Bullet
44
44
  end
45
45
 
46
46
  def short_notice
47
- [whoami.presence, url, title, body].compact.join(" ")
47
+ [whoami.presence, url, title, body].compact.join(' ')
48
48
  end
49
49
 
50
50
  def notification_data
@@ -6,7 +6,7 @@ module Bullet
6
6
  end
7
7
 
8
8
  def title
9
- "Need Counter Cache"
9
+ 'Need Counter Cache'
10
10
  end
11
11
  end
12
12
  end
@@ -51,19 +51,19 @@ module Bullet
51
51
  end
52
52
 
53
53
  def footer_note
54
- "<div #{footer_div_attributes}>" + footer_close_button + Bullet.footer_info.uniq.join("<br>") + "</div>"
54
+ "<div #{footer_div_attributes}>" + footer_close_button + Bullet.footer_info.uniq.join('<br>') + '</div>'
55
55
  end
56
56
 
57
57
  def file?(headers)
58
- headers["Content-Transfer-Encoding"] == "binary" || headers["Content-Disposition"]
58
+ headers['Content-Transfer-Encoding'] == 'binary' || headers['Content-Disposition']
59
59
  end
60
60
 
61
61
  def sse?(headers)
62
- headers["Content-Type"] == "text/event-stream"
62
+ headers['Content-Type'] == 'text/event-stream'
63
63
  end
64
64
 
65
65
  def html_request?(headers, response)
66
- headers['Content-Type'] && headers['Content-Type'].include?('text/html') && response_body(response).include?("<html")
66
+ headers['Content-Type'] && headers['Content-Type'].include?('text/html') && response_body(response).include?('<html')
67
67
  end
68
68
 
69
69
  def response_body(response)
@@ -1,12 +1,12 @@
1
1
  module Bullet
2
2
  module StackTraceFilter
3
- VENDOR_PATH = "/vendor"
3
+ VENDOR_PATH = '/vendor'.freeze
4
4
 
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
+ caller_path = location.absolute_path.to_s
10
10
  caller_path.include?(app_root) && !caller_path.include?(vendor_root) ||
11
11
  Bullet.stacktrace_includes.any? do |include_pattern|
12
12
  case include_pattern
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+
2
2
  module Bullet
3
- VERSION = "5.6.0"
3
+ VERSION = '5.6.1'.freeze
4
4
  end
@@ -7,7 +7,7 @@ Description:
7
7
  DESC
8
8
 
9
9
  def enable_in_development
10
- environment(nil, env: "development") do
10
+ environment(nil, env: 'development') do
11
11
  <<-"FILE".strip
12
12
 
13
13
  config.after_initialize do
@@ -22,12 +22,12 @@ Description:
22
22
  FILE
23
23
  end
24
24
 
25
- say "Enabled bullet in config/environments/development.rb"
25
+ say 'Enabled bullet in config/environments/development.rb'
26
26
  end
27
27
 
28
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
29
+ if yes?('Would you like to enable bullet in test environment? (y/n)')
30
+ environment(nil, env: 'test') do
31
31
  <<-"FILE".strip
32
32
 
33
33
  config.after_initialize do
@@ -38,7 +38,7 @@ Description:
38
38
  FILE
39
39
  end
40
40
 
41
- say "Enabled bullet in config/environments/test.rb"
41
+ say 'Enabled bullet in config/environments/test.rb'
42
42
  end
43
43
  end
44
44
  end
@@ -74,7 +74,7 @@ comments_size.times do |i|
74
74
  end
75
75
  Comment.import comments
76
76
 
77
- puts "Start benchmarking..."
77
+ puts 'Start benchmarking...'
78
78
 
79
79
 
80
80
  Bullet.enable = true
@@ -83,7 +83,7 @@ Benchmark.bm(70) do |bm|
83
83
  bm.report("Querying & Iterating #{posts_size} Posts with #{comments_size} Comments and #{users_size} Users") do
84
84
  10.times do
85
85
  Bullet.start_request
86
- Post.select("SQL_NO_CACHE *").includes(:user, :comments => :user).each do |p|
86
+ Post.select('SQL_NO_CACHE *').includes(:user, :comments => :user).each do |p|
87
87
  p.title
88
88
  p.user.name
89
89
  p.comments.each do |c|
@@ -96,7 +96,7 @@ Benchmark.bm(70) do |bm|
96
96
  end
97
97
  end
98
98
 
99
- puts "End benchmarking..."
99
+ puts 'End benchmarking...'
100
100
 
101
101
 
102
102
  # Run benchmark with bundler
@@ -8,15 +8,15 @@ module Bullet
8
8
  @post2 = Post.last
9
9
  end
10
10
 
11
- context ".add_object_association" do
12
- it "should add object, associations pair" do
11
+ context '.add_object_association' do
12
+ it 'should add object, associations pair' do
13
13
  Association.add_object_associations(@post1, :associations)
14
14
  expect(Association.send(:object_associations)).to be_include(@post1.bullet_key, :associations)
15
15
  end
16
16
  end
17
17
 
18
- context ".add_call_object_associations" do
19
- it "should add call object, associations pair" do
18
+ context '.add_call_object_associations' do
19
+ it 'should add call object, associations pair' do
20
20
  Association.add_call_object_associations(@post1, :associations)
21
21
  expect(Association.send(:call_object_associations)).to be_include(@post1.bullet_key, :associations)
22
22
  end