bullet 4.0.0 → 4.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +1 -1
  4. data/.travis.yml +17 -6
  5. data/CHANGELOG.md +86 -0
  6. data/Gemfile +13 -12
  7. data/Gemfile.mongoid +14 -0
  8. data/Gemfile.mongoid-2.4 +19 -0
  9. data/Gemfile.mongoid-2.5 +19 -0
  10. data/Gemfile.mongoid-2.6 +19 -0
  11. data/Gemfile.mongoid-2.7 +19 -0
  12. data/Gemfile.mongoid-2.8 +19 -0
  13. data/Gemfile.mongoid-3.0 +19 -0
  14. data/Gemfile.mongoid-3.1 +19 -0
  15. data/Gemfile.mongoid-4.0 +19 -0
  16. data/Gemfile.rails-3.0 +19 -0
  17. data/Gemfile.rails-3.1 +19 -0
  18. data/Gemfile.rails-3.2 +19 -0
  19. data/Gemfile.rails-4.0 +19 -0
  20. data/Gemfile.rails-4.1 +19 -0
  21. data/{Hacking.textile → Hacking.md} +10 -5
  22. data/README.md +432 -0
  23. data/Rakefile +13 -6
  24. data/bullet.gemspec +6 -3
  25. data/lib/bullet/active_record3.rb +49 -11
  26. data/lib/bullet/active_record3x.rb +134 -0
  27. data/lib/bullet/{active_record31.rb → active_record4.rb} +45 -15
  28. data/lib/bullet/active_record41.rb +128 -0
  29. data/lib/bullet/dependency.rb +81 -0
  30. data/lib/bullet/detector/association.rb +24 -68
  31. data/lib/bullet/detector/base.rb +0 -6
  32. data/lib/bullet/detector/counter_cache.rb +59 -0
  33. data/lib/bullet/detector/n_plus_one_query.rb +56 -15
  34. data/lib/bullet/detector/unused_eager_loading.rb +84 -0
  35. data/lib/bullet/detector.rb +2 -2
  36. data/lib/bullet/ext/object.rb +10 -2
  37. data/lib/bullet/{mongoid.rb → mongoid2x.rb} +18 -18
  38. data/lib/bullet/mongoid3x.rb +56 -0
  39. data/lib/bullet/mongoid4x.rb +56 -0
  40. data/lib/bullet/notification/base.rb +22 -4
  41. data/lib/bullet/notification/n_plus_one_query.rb +1 -1
  42. data/lib/bullet/notification.rb +2 -0
  43. data/lib/bullet/rack.rb +51 -17
  44. data/lib/bullet/registry/base.rb +1 -1
  45. data/lib/bullet/registry/object.rb +4 -4
  46. data/lib/bullet/version.rb +1 -2
  47. data/lib/bullet.rb +119 -39
  48. data/perf/benchmark.rb +1 -4
  49. data/spec/bullet/detector/association_spec.rb +2 -70
  50. data/spec/bullet/detector/base_spec.rb +0 -6
  51. data/spec/bullet/detector/counter_cache_spec.rb +56 -0
  52. data/spec/bullet/detector/n_plus_one_query_spec.rb +78 -34
  53. data/spec/bullet/detector/unused_eager_loading_spec.rb +88 -0
  54. data/spec/bullet/ext/object_spec.rb +18 -7
  55. data/spec/bullet/ext/string_spec.rb +2 -2
  56. data/spec/bullet/notification/base_spec.rb +68 -15
  57. data/spec/bullet/notification/counter_cache_spec.rb +2 -2
  58. data/spec/bullet/notification/n_plus_one_query_spec.rb +4 -3
  59. data/spec/bullet/notification/unused_eager_loading_spec.rb +2 -2
  60. data/spec/bullet/notification_collector_spec.rb +4 -4
  61. data/spec/bullet/rack_spec.rb +40 -39
  62. data/spec/bullet/registry/association_spec.rb +3 -3
  63. data/spec/bullet/registry/base_spec.rb +6 -6
  64. data/spec/bullet/registry/object_spec.rb +4 -5
  65. data/spec/bullet_spec.rb +41 -0
  66. data/spec/integration/active_record3/association_spec.rb +662 -0
  67. data/spec/integration/active_record4/association_spec.rb +660 -0
  68. data/spec/integration/counter_cache_spec.rb +63 -0
  69. data/spec/integration/mongoid/association_spec.rb +190 -208
  70. data/spec/models/category.rb +1 -1
  71. data/spec/models/client.rb +1 -1
  72. data/spec/models/comment.rb +2 -2
  73. data/spec/models/document.rb +2 -2
  74. data/spec/models/firm.rb +1 -1
  75. data/spec/models/mongoid/address.rb +2 -0
  76. data/spec/models/mongoid/category.rb +2 -0
  77. data/spec/models/mongoid/comment.rb +2 -0
  78. data/spec/models/mongoid/company.rb +2 -0
  79. data/spec/models/mongoid/entry.rb +2 -0
  80. data/spec/models/mongoid/post.rb +4 -0
  81. data/spec/models/mongoid/user.rb +5 -0
  82. data/spec/models/newspaper.rb +1 -1
  83. data/spec/models/pet.rb +1 -1
  84. data/spec/models/post.rb +6 -13
  85. data/spec/spec_helper.rb +60 -25
  86. data/spec/support/bullet_ext.rb +1 -1
  87. data/spec/support/mongo_seed.rb +26 -2
  88. data/spec/support/sqlite_seed.rb +0 -6
  89. data/test.sh +15 -0
  90. metadata +77 -54
  91. data/.rvmrc +0 -2
  92. data/.rvmrc.example +0 -2
  93. data/Gemfile.lock +0 -132
  94. data/Gemfile.rails-2.3.14 +0 -16
  95. data/Gemfile.rails-2.3.14.lock +0 -65
  96. data/Gemfile.rails-3.0.12 +0 -17
  97. data/Gemfile.rails-3.0.12.lock +0 -116
  98. data/Gemfile.rails-3.1.4 +0 -18
  99. data/Gemfile.rails-3.1.4.lock +0 -134
  100. data/README.textile +0 -395
  101. data/README_for_rails2.textile +0 -400
  102. data/lib/bullet/action_controller2.rb +0 -49
  103. data/lib/bullet/active_record2.rb +0 -121
  104. data/lib/bullet/detector/counter.rb +0 -48
  105. data/lib/bullet/detector/unused_eager_association.rb +0 -42
  106. data/spec/bullet/detector/counter_spec.rb +0 -64
  107. data/spec/bullet/detector/unused_eager_association_spec.rb +0 -62
  108. data/spec/integration/association_spec.rb +0 -593
  109. data/spec/integration/counter_spec.rb +0 -39
  110. data/spec/integration/rails2/association_spec.rb +0 -593
  111. data/spec/integration/rails2/counter_spec.rb +0 -39
  112. data/test.result +0 -2293
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c4c663f19d349dc9be3a82803ba5e5af344ed0e2
4
+ data.tar.gz: f996a53cd2ce05eb85f11e55477b41d7b6f841f8
5
+ SHA512:
6
+ metadata.gz: 9fe6ad4a5e0b23c19815a121e8b3dec2989c04f2e81836eba4a096a06b68ae7b33c7c202c1a7a99e697a48bd5bd29711b7ad0a2b17e1d203e32cc964a0e95314
7
+ data.tar.gz: 77e4bc950eaa4e0e87fd32beaa6f11a605e1e443b0de0f3fbea89798cd11721c3c6a4fa0c9f70bad5c3b7f65586a56b050e38265a21d57d57244e219ab0f8501
data/.gitignore CHANGED
@@ -8,3 +8,7 @@ tags
8
8
  .bundle
9
9
  *.gem
10
10
  benchmark_profile*
11
+ /nbproject/private/
12
+ coverage/
13
+ .coveralls.yml
14
+ Gemfile*.lock
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
1
  --colour
2
- --format nested
2
+ --format progress
data/.travis.yml CHANGED
@@ -1,9 +1,20 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
3
+ - 2.1.2
4
4
  gemfile:
5
- - Gemfile
6
- - Gemfile.rails-3.1.4
7
- - Gemfile.rails-3.0.12
8
- - Gemfile.rails-2.3.14
9
- env: DB=sqlite
5
+ - Gemfile.rails-4.1
6
+ - Gemfile.rails-4.0
7
+ - Gemfile.rails-3.2
8
+ - Gemfile.rails-3.1
9
+ - Gemfile.rails-3.0
10
+ - Gemfile.mongoid-3.1
11
+ - Gemfile.mongoid-3.0
12
+ - Gemfile.mongoid-2.8
13
+ - Gemfile.mongoid-2.7
14
+ - Gemfile.mongoid-2.6
15
+ - Gemfile.mongoid-2.5
16
+ - Gemfile.mongoid-2.4
17
+ env:
18
+ - DB=sqlite
19
+ services:
20
+ - mongodb
data/CHANGELOG.md ADDED
@@ -0,0 +1,86 @@
1
+ # Next Release
2
+
3
+ ## 4.13.1
4
+
5
+ * Fix swallow exception issue
6
+
7
+ ## 4.13.0 (07/19/2014)
8
+
9
+ * Support include? call on ar associations
10
+
11
+ ## 4.12.0 (07/13/2014)
12
+
13
+ * Fix false n+1 queries caused by inversed objects.
14
+ * Replace .id with .primary_key_value
15
+ * Rename bullet_ar_key to bullet_key
16
+ * Fix rails sse detect
17
+ * Fix bullet using in test environment
18
+ * Memoize whoami
19
+
20
+ ## 4.11.0 (06/24/2014)
21
+
22
+ * Support empty? call on ar associations
23
+ * Skip detecting if object is a new record
24
+
25
+ ## 4.10.0 (06/06/2014)
26
+
27
+ * Handle join query smarter
28
+ * Support mongoid 4.0
29
+ * Thread safe
30
+ * Add debug mode
31
+
32
+ ## 4.9.0 (04/30/2014)
33
+
34
+ * Add Bullet.stacktrace_includes option
35
+ * Applied keyword argument fixes on Ruby 2.2.0
36
+ * Add bugsnag notifier
37
+ * Support rails 4.1.0
38
+
39
+ ## 4.8.0 (02/16/2014)
40
+
41
+ * Support rails 4.1.0.beta1
42
+ * Update specs to be RSpec 3.0 compatible
43
+ * Update latest minor version activerecord and mongoid on travis
44
+
45
+ ## 4.7.0 (11/03/2013)
46
+
47
+ * Add coverall support
48
+ * Add helper to profile code outside a request
49
+ * Add activesupport dependency
50
+ * Add Bullet.raise notification
51
+ * Add Bullet.add_footer notification
52
+ * Fix activerecord4 warnings in test code
53
+
54
+ ## 4.6.0 (04/18/2013)
55
+
56
+ * Fix Bullet::Rack to support sinatra
57
+
58
+ ## 4.5.0 (03/24/2013)
59
+
60
+ * Add api way to access captured associatioin
61
+ * Allow disable n_plus_one_query, unused_eager_loading and counter_cache respectively
62
+ * Add whitelist
63
+
64
+ ## 4.4.0 (03/15/2013)
65
+
66
+ * Remove disable_browser_cache option
67
+ * Compatible with Rails 4.0.0.beta1
68
+
69
+ ## 4.3.0 (12/28/2012)
70
+
71
+ * Fix content-length for non ascii html
72
+ * Add mongoid 2.5.x support
73
+
74
+ ## 4.2.0 (09/29/2012)
75
+
76
+ * Add Bullet::Dependency to check AR and mongoid version
77
+ * Add Rails 4 support
78
+ * Add airbrake notifier support
79
+
80
+ ## 4.1.0 (05/30/2012)
81
+
82
+ * Add mongoid 3 support
83
+
84
+ ## 4.0.0 (05/09/2012)
85
+
86
+ * Add mongoid support
data/Gemfile CHANGED
@@ -1,18 +1,19 @@
1
- # Use `bundle install` in order to install these gems
2
- # Use `bundle exec rake` in order to run the specs using the bundle
3
- source "http://rubygems.org"
1
+ source 'https://rubygems.org'
4
2
 
5
3
  gemspec
6
4
 
7
- gem 'rails', '3.2.3'
8
- gem 'sqlite3'
9
- gem 'mysql'
5
+ gem 'rails', github: 'rails/rails'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
10
8
  gem 'activerecord-import'
11
- gem 'mongoid'
12
- gem 'bson_ext'
13
9
 
14
- gem "rspec"
15
- gem "guard"
16
- gem "guard-rspec"
10
+ gem 'rspec'
11
+ gem 'guard'
12
+ gem 'guard-rspec'
17
13
 
18
- gem "perftools.rb"
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
data/Gemfile.mongoid ADDED
@@ -0,0 +1,14 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'mongoid', github: 'mongoid/mongoid'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.2.16'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'mongoid', '~> 2.4.12'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.2.16'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'mongoid', '~> 2.5.2'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.2.16'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'mongoid', '~> 2.6.0'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.2.16'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'mongoid', '~> 2.7.1'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.2'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'mongoid', '~> 2.8'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.2.16'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'mongoid', '~> 3.0.23'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.2.16'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'mongoid', '~> 3.1.6'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 4.0.5'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'mongoid', '~> 4.0.0'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
data/Gemfile.rails-3.0 ADDED
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.0.20'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'activerecord-import'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
data/Gemfile.rails-3.1 ADDED
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.1.12'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'activerecord-import'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
data/Gemfile.rails-3.2 ADDED
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.2.19'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'activerecord-import'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
data/Gemfile.rails-4.0 ADDED
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 4.0.8'
6
+ gem 'sqlite3', platforms: [:ruby]
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'activerecord-import'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
data/Gemfile.rails-4.1 ADDED
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 4.1.4'
6
+ gem 'sqlite3'
7
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
8
+ gem 'activerecord-import'
9
+
10
+ gem "rspec"
11
+ gem "guard"
12
+ gem "guard-rspec"
13
+
14
+ gem 'coveralls', require: false
15
+
16
+ platforms :rbx do
17
+ gem 'rubysl', '~> 2.0'
18
+ gem 'rubinius-developer_tools'
19
+ end
@@ -1,8 +1,10 @@
1
- h1. Bullet Overview for Developers
1
+ # Bullet Overview for Developers
2
+
2
3
  This file aims to give developers a quick tour of the bullet internals, making
3
4
  it (hopefully) easier to extend or enhance the Bullet gem.
4
5
 
5
- h2. General Control Flow aka. 10000 Meter View
6
+ ## General Control Flow aka. 10000 Meter View
7
+
6
8
  When Rails is initialized, Bullet will extend ActiveRecord (and if you're using
7
9
  Rails 2.x ActiveController too) with the relevant modules and methods found
8
10
  in lib/bullet/active_recordX.rb and lib/bullet/action_controller2.rb. If you're
@@ -36,7 +38,8 @@ So the flow of a request goes like this:
36
38
  8. Bullet calls end_request for each detector.
37
39
  9. Goto 1.
38
40
 
39
- h2. Adding Notification Types
41
+ ## Adding Notification Types
42
+
40
43
  If you want to add more kinds of things that Bullet can detect, a little more
41
44
  work is needed than if you were just adding a Presenter, but the concepts are
42
45
  similar.
@@ -55,7 +58,8 @@ Since the detection of pathological associations is a bit hairy, I'd recommend
55
58
  having a look at the counter cache detector and associated notification to get
56
59
  a feel for what is needed to get off the ground.
57
60
 
58
- h3. Detectors
61
+ ### Detectors
62
+
59
63
  The only things you'll need to consider when building your Detector class is
60
64
  that it will need to supply the .start_request, .end_request and .clear class
61
65
  methods.
@@ -63,7 +67,8 @@ methods.
63
67
  Simple implementations are provided by Bullet::Detector::Base for start_request
64
68
  and end_request, you will have to supply your own clear method.
65
69
 
66
- h3. Notifications
70
+ ### Notifications
71
+
67
72
  For notifications you will want to supply a #title and #body instance method,
68
73
  and check to see if the #initialize and #full_notice methods in the
69
74
  Bullet::Notification::Base class fit your needs.