exception_notification 2.6.1 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. data/CHANGELOG.rdoc +12 -0
  2. data/CONTRIBUTING.md +33 -0
  3. data/Gemfile.lock +61 -33
  4. data/README.md +59 -12
  5. data/exception_notification.gemspec +5 -3
  6. data/lib/exception_notifier.rb +7 -0
  7. data/lib/exception_notifier/campfire_notifier.rb +30 -0
  8. data/lib/exception_notifier/notifier.rb +55 -26
  9. data/lib/exception_notifier/views/exception_notifier/_backtrace.html.erb +1 -0
  10. data/lib/exception_notifier/views/exception_notifier/_data.html.erb +1 -0
  11. data/lib/exception_notifier/views/exception_notifier/_environment.html.erb +8 -0
  12. data/lib/exception_notifier/views/exception_notifier/_request.html.erb +5 -0
  13. data/lib/exception_notifier/views/exception_notifier/_session.html.erb +2 -0
  14. data/lib/exception_notifier/views/exception_notifier/_title.html.erb +3 -0
  15. data/lib/exception_notifier/views/exception_notifier/background_exception_notification.html.erb +26 -0
  16. data/lib/exception_notifier/views/exception_notifier/background_exception_notification.text.erb +5 -3
  17. data/lib/exception_notifier/views/exception_notifier/exception_notification.html.erb +36 -0
  18. data/lib/exception_notifier/views/exception_notifier/exception_notification.text.erb +4 -3
  19. data/test/background_exception_notification_test.rb +21 -6
  20. data/test/campfire_test.rb +52 -0
  21. data/test/dummy/Gemfile +1 -1
  22. data/test/dummy/Gemfile.lock +93 -58
  23. data/test/dummy/app/controllers/posts_controller.rb +1 -0
  24. data/test/dummy/app/views/exception_notifier/_new_bkg_section.html.erb +1 -0
  25. data/test/dummy/app/views/exception_notifier/_new_section.html.erb +1 -0
  26. data/test/dummy/app/views/exception_notifier/_new_section.text.erb +1 -1
  27. data/test/dummy/test/functional/posts_controller_test.rb +62 -10
  28. data/test/exception_notification_test.rb +27 -2
  29. data/test/test_helper.rb +3 -0
  30. metadata +55 -7
@@ -1,3 +1,15 @@
1
+ == 3.0.0
2
+
3
+ * enhancements
4
+ * Campfire integration
5
+ * Support fot HTML notifications (by @Xenofex)
6
+ * Be able to override SMTP settings (by @piglop and @Macint)
7
+
8
+ * bug fixes
9
+ * Fix encoding issues
10
+ * Allow default sections to be overridden (by @jfarmer)
11
+ * Don't automatically deliver background notifications
12
+
1
13
  == 2.6.1
2
14
 
3
15
  * bug fixes
@@ -0,0 +1,33 @@
1
+ # How to contribute
2
+
3
+ We love your contribution, for it's essential for making ExceptionNotification greater every day.
4
+ In order to keep it as easy as possible to contribute changes, here are a few guidelines that we
5
+ need contributors to follow:
6
+
7
+ ## First of all
8
+
9
+ * Check if the issue you're going to submit isn't already submitted in
10
+ the [Issues](https://github.com/smartinez87/exception_notification/issues) page.
11
+
12
+ ## Issues
13
+
14
+ * Submit a ticket for your issue, assuming one does not already exist.
15
+ * The issue must:
16
+ * Clearly describe the problem including steps to reproduce when it is a bug.
17
+ * Also include all the information you can to make it easier for us to reproduce it,
18
+ like OS version, gem versions, etc...
19
+ * Even better, provide a failing test case for it.
20
+
21
+ ## Pull Requests
22
+
23
+ If you've gone the extra mile and have a patch that fixes the issue, you
24
+ should submit a Pull Request!
25
+
26
+ * Fork the repo on Github.
27
+ * Create a topic branch from where you want to base your work.
28
+ * Add a test for your change. Only refactoring and documentation changes
29
+ require no new tests. If you are adding functionality or fixing a bug,
30
+ we need a test!
31
+ * Run _all_ the tests to assure nothine else was broken. We only take pull requests with passing tests.
32
+ * Check for unnecessary whitespace with `git diff --check` before committing.
33
+ * Push to your fork and submit a pull request.
@@ -1,52 +1,64 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- exception_notification (2.6.0)
4
+ exception_notification (3.0.0.rc1)
5
5
  actionmailer (>= 3.0.4)
6
+ tinder (~> 1.8)
6
7
 
7
8
  GEM
8
9
  remote: http://rubygems.org/
9
10
  specs:
10
- actionmailer (3.2.3)
11
- actionpack (= 3.2.3)
11
+ actionmailer (3.2.6)
12
+ actionpack (= 3.2.6)
12
13
  mail (~> 2.4.4)
13
- actionpack (3.2.3)
14
- activemodel (= 3.2.3)
15
- activesupport (= 3.2.3)
14
+ actionpack (3.2.6)
15
+ activemodel (= 3.2.6)
16
+ activesupport (= 3.2.6)
16
17
  builder (~> 3.0.0)
17
18
  erubis (~> 2.7.0)
18
19
  journey (~> 1.0.1)
19
20
  rack (~> 1.4.0)
20
21
  rack-cache (~> 1.2)
21
22
  rack-test (~> 0.6.1)
22
- sprockets (~> 2.1.2)
23
- activemodel (3.2.3)
24
- activesupport (= 3.2.3)
23
+ sprockets (~> 2.1.3)
24
+ activemodel (3.2.6)
25
+ activesupport (= 3.2.6)
25
26
  builder (~> 3.0.0)
26
- activerecord (3.2.3)
27
- activemodel (= 3.2.3)
28
- activesupport (= 3.2.3)
27
+ activerecord (3.2.6)
28
+ activemodel (= 3.2.6)
29
+ activesupport (= 3.2.6)
29
30
  arel (~> 3.0.2)
30
31
  tzinfo (~> 0.3.29)
31
- activeresource (3.2.3)
32
- activemodel (= 3.2.3)
33
- activesupport (= 3.2.3)
34
- activesupport (3.2.3)
32
+ activeresource (3.2.6)
33
+ activemodel (= 3.2.6)
34
+ activesupport (= 3.2.6)
35
+ activesupport (3.2.6)
35
36
  i18n (~> 0.6)
36
37
  multi_json (~> 1.0)
37
38
  arel (3.0.2)
38
39
  builder (3.0.0)
39
40
  erubis (2.7.0)
41
+ eventmachine (1.0.0)
42
+ faraday (0.8.4)
43
+ multipart-post (~> 1.1)
44
+ faraday_middleware (0.8.8)
45
+ faraday (>= 0.7.4, < 0.9)
46
+ hashie (1.2.0)
40
47
  hike (1.2.1)
48
+ http_parser.rb (0.5.3)
41
49
  i18n (0.6.0)
42
- journey (1.0.3)
43
- json (1.6.6)
50
+ journey (1.0.4)
51
+ json (1.7.3)
44
52
  mail (2.4.4)
45
53
  i18n (>= 0.4.0)
46
54
  mime-types (~> 1.16)
47
55
  treetop (~> 1.4.8)
48
- mime-types (1.18)
49
- multi_json (1.3.2)
56
+ metaclass (0.0.1)
57
+ mime-types (1.19)
58
+ mocha (0.12.0)
59
+ metaclass (~> 0.0.1)
60
+ multi_json (1.3.6)
61
+ multipart-post (1.1.5)
50
62
  polyglot (0.3.3)
51
63
  rack (1.4.1)
52
64
  rack-cache (1.2)
@@ -55,34 +67,49 @@ GEM
55
67
  rack
56
68
  rack-test (0.6.1)
57
69
  rack (>= 1.0)
58
- rails (3.2.3)
59
- actionmailer (= 3.2.3)
60
- actionpack (= 3.2.3)
61
- activerecord (= 3.2.3)
62
- activeresource (= 3.2.3)
63
- activesupport (= 3.2.3)
70
+ rails (3.2.6)
71
+ actionmailer (= 3.2.6)
72
+ actionpack (= 3.2.6)
73
+ activerecord (= 3.2.6)
74
+ activeresource (= 3.2.6)
75
+ activesupport (= 3.2.6)
64
76
  bundler (~> 1.0)
65
- railties (= 3.2.3)
66
- railties (3.2.3)
67
- actionpack (= 3.2.3)
68
- activesupport (= 3.2.3)
77
+ railties (= 3.2.6)
78
+ railties (3.2.6)
79
+ actionpack (= 3.2.6)
80
+ activesupport (= 3.2.6)
69
81
  rack-ssl (~> 1.3.2)
70
82
  rake (>= 0.8.7)
71
83
  rdoc (~> 3.4)
72
- thor (~> 0.14.6)
84
+ thor (>= 0.14.6, < 2.0)
73
85
  rake (0.9.2.2)
74
86
  rdoc (3.12)
75
87
  json (~> 1.4)
76
- sprockets (2.1.2)
88
+ simple_oauth (0.1.9)
89
+ sprockets (2.1.3)
77
90
  hike (~> 1.2)
78
91
  rack (~> 1.0)
79
92
  tilt (~> 1.1, != 1.3.0)
80
93
  sqlite3 (1.3.6)
81
- thor (0.14.6)
94
+ thor (0.15.4)
82
95
  tilt (1.3.3)
96
+ tinder (1.9.1)
97
+ eventmachine (>= 0.12.0, < 2)
98
+ faraday (~> 0.8)
99
+ faraday_middleware (~> 0.8)
100
+ hashie (~> 1.0)
101
+ json (~> 1.6)
102
+ mime-types (~> 1.16)
103
+ multi_json (~> 1.0)
104
+ multipart-post (~> 1.1)
105
+ twitter-stream (~> 0.1)
83
106
  treetop (1.4.10)
84
107
  polyglot
85
108
  polyglot (>= 0.3.1)
109
+ twitter-stream (0.1.16)
110
+ eventmachine (>= 0.12.8)
111
+ http_parser.rb (~> 0.5.1)
112
+ simple_oauth (~> 0.1.4)
86
113
  tzinfo (0.3.33)
87
114
 
88
115
  PLATFORMS
@@ -90,5 +117,6 @@ PLATFORMS
90
117
 
91
118
  DEPENDENCIES
92
119
  exception_notification!
120
+ mocha (>= 0.11.3)
93
121
  rails (>= 3.0.4)
94
122
  sqlite3 (>= 1.3.4)
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- Exception Notifier Plugin for Rails ![project status](http://stillmaintained.com/smartinez87/exception_notification.png) [![Travis](http://travis-ci.org/smartinez87/exception_notification.png)](http://travis-ci.org/smartinez87/exception_notification)
1
+ Exception Notifier Plugin for Rails ![project status](http://stillmaintained.com/smartinez87/exception_notification.png) [![Travis](http://travis-ci.org/smartinez87/exception_notification.png)](http://travis-ci.org/smartinez87/exception_notification) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/smartinez87/exception_notification)
2
2
  ====
3
3
 
4
4
  The Exception Notifier plugin provides a mailer object and a default set of
@@ -35,6 +35,25 @@ Whatever::Application.config.middleware.use ExceptionNotifier,
35
35
  :exception_recipients => %w{exceptions@example.com}
36
36
  ```
37
37
 
38
+ Campfire Integration
39
+ ---
40
+
41
+ Additionally, ExceptionNotification supports sending notifications to
42
+ your Campfire room.
43
+ To configure it, you need to set the subdomain, token and room name,
44
+ like this
45
+
46
+ ```ruby
47
+ Whatever::Application.config.middleware.use ExceptionNotifier,
48
+ :email_prefix => "[Whatever] ",
49
+ :sender_address => %{"notifier" <notifier@example.com>},
50
+ :exception_recipients => %w{exceptions@example.com},
51
+ :campfire => {:subdomain => 'my_subdomain', :token => 'my_token', :room_name => 'my_room'}
52
+ ```
53
+
54
+ For more options to set Campfire, like _ssl_, check
55
+ [here](https://github.com/collectiveidea/tinder/blob/master/lib/tinder/campfire.rb#L17).
56
+
38
57
  Customization
39
58
  ---
40
59
 
@@ -47,7 +66,7 @@ app/views/exception_notifier directory (e.g., _session.rhtml). Each partial has
47
66
  access to the following variables:
48
67
 
49
68
  ```ruby
50
- @controller # the controller that caused the error
69
+ @kontroller # the controller that caused the error
51
70
  @request # the current request object
52
71
  @exception # the exception that was raised
53
72
  @backtrace # a sanitized version of the exception's backtrace
@@ -55,7 +74,7 @@ access to the following variables:
55
74
  @sections # the array of sections to include in the email
56
75
  ```
57
76
 
58
- Background views will not have access to @controller and @request.
77
+ Background views will not have access to @kontroller and @request.
59
78
 
60
79
  You can reorder the sections, or exclude sections completely, by altering the
61
80
  ExceptionNotifier.sections variable. You can even add new sections that
@@ -71,6 +90,9 @@ Whatever::Application.config.middleware.use ExceptionNotifier,
71
90
  :sections => %w{my_section1 my_section2} + ExceptionNotifier::Notifier.default_sections
72
91
  ```
73
92
 
93
+ Place your custom sections under `./app/views/exception_notifier/` with the suffix `.text.erb`, e.g.
94
+ `./app/views/exception_notifier/_my_section1.text.erb`.
95
+
74
96
  If your new section requires information that isn't available by default, make sure
75
97
  it is made available to the email using the exception_data macro:
76
98
 
@@ -181,6 +203,11 @@ You can also choose to remove numbers from subject so they thread as a single on
181
203
  This is disabled by default.
182
204
  Use _:normalize_subject => true_ to enable it.
183
205
 
206
+ ### HTML
207
+
208
+ You may want to send multipart notifications instead of just plain text, which ExceptionNotification sends by default.
209
+ You can do so by adding this to the configuration: _:email_format => :html_.
210
+
184
211
 
185
212
  Background Notifications
186
213
  ---
@@ -193,7 +220,7 @@ like this:
193
220
  begin
194
221
  some code...
195
222
  rescue => e
196
- ExceptionNotifier::Notifier.background_exception_notification(e)
223
+ ExceptionNotifier::Notifier.background_exception_notification(e).deliver
197
224
  end
198
225
  ```
199
226
 
@@ -205,7 +232,7 @@ begin
205
232
  some code...
206
233
  rescue => exception
207
234
  ExceptionNotifier::Notifier.background_exception_notification(exception,
208
- :data => {:worker => worker.to_s, :queue => queue, :payload => payload})
235
+ :data => {:worker => worker.to_s, :queue => queue, :payload => payload}).deliver
209
236
  end
210
237
  ```
211
238
 
@@ -231,12 +258,33 @@ Notification
231
258
  ---
232
259
 
233
260
  After an exception notification has been delivered the rack environment variable
234
- 'exception_notifier.delivered' will be set to +true+.
261
+ 'exception_notifier.delivered' will be set to `true`.
262
+
263
+
264
+ Override SMTP settings
265
+ ---
266
+
267
+ You can use specific SMTP settings for notifications:
268
+
269
+ ```ruby
270
+ Whatever::Application.config.middleware.use ExceptionNotifier,
271
+ :email_prefix => "[Whatever] ",
272
+ :sender_address => %{"notifier" <notifier@example.com>},
273
+ :exception_recipients => %w{exceptions@example.com},
274
+ :smtp_settings => {
275
+ :user_name => "bob",
276
+ :password => "password",
277
+ }
278
+ ```
235
279
 
236
280
  Versions
237
281
  ---
238
282
 
239
- NOTE: Master branch is currently set for v2.6.1
283
+ NOTE: Master branch is currently set for v3.0.0
284
+
285
+ For v2.6.1, see this tag:
286
+
287
+ <a href="http://github.com/smartinez87/exception_notification/tree/v2.6.1">http://github.com/smartinez87/exception_notification/tree/v2.6.1</a>
240
288
 
241
289
  For v2.6.0, see this tag:
242
290
 
@@ -246,10 +294,6 @@ For v2.5.2, see this tag:
246
294
 
247
295
  <a href="http://github.com/smartinez87/exception_notification/tree/v2.5.2">http://github.com/smartinez87/exception_notification/tree/v2.5.2</a>
248
296
 
249
- For v2.5.0, see tag:
250
-
251
- <a href="http://github.com/smartinez87/exception_notification/tree/v2.5.0">http://github.com/smartinez87/exception_notification/tree/v2.5.0</a>
252
-
253
297
  For previous releases, visit:
254
298
 
255
299
  <a href="https://github.com/smartinez87/exception_notification/tags">https://github.com/smartinez87/exception_notification/tags</a>
@@ -265,6 +309,9 @@ If you are running pre-rack Rails then see this tag:
265
309
  Support and tickets
266
310
  ---
267
311
 
268
- <a href="https://github.com/smartinez87/exception_notification/issues">https://github.com/smartinez87/exception_notification/issues</a>
312
+ Here's the list of [issues](https://github.com/smartinez87/exception_notification/issues) we're currently working on.
313
+
314
+ To contribute, please read first the [Contributing
315
+ Guide](https://github.com/smartinez87/exception_notification/blob/master/CONTRIBUTING.md).
269
316
 
270
317
  Copyright (c) 2005 Jamis Buck, released under the MIT license: <a href="http://www.opensource.org/licenses/MIT">http://www.opensource.org/licenses/MIT</a>
@@ -1,9 +1,9 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'exception_notification'
3
- s.version = '2.6.1'
3
+ s.version = '3.0.0.rc1'
4
4
  s.authors = ["Jamis Buck", "Josh Peek"]
5
- s.date = %q{2012-04-21}
6
- s.summary = "Exception notification by email for Rails apps"
5
+ s.date = %q{2012-10-05}
6
+ s.summary = "Exception notification for Rails apps"
7
7
  s.homepage = "http://smartinez87.github.com/exception_notification"
8
8
  s.email = "smartinez87@gmail.com"
9
9
 
@@ -12,6 +12,8 @@ Gem::Specification.new do |s|
12
12
  s.require_path = 'lib'
13
13
 
14
14
  s.add_dependency("actionmailer", ">= 3.0.4")
15
+ s.add_dependency("tinder", "~> 1.8")
15
16
  s.add_development_dependency "rails", ">= 3.0.4"
17
+ s.add_development_dependency "mocha", ">= 0.11.3"
16
18
  s.add_development_dependency "sqlite3", ">= 1.3.4"
17
19
  end
@@ -1,7 +1,9 @@
1
1
  require 'action_dispatch'
2
2
  require 'exception_notifier/notifier'
3
+ require 'exception_notifier/campfire_notifier'
3
4
 
4
5
  class ExceptionNotifier
6
+
5
7
  def self.default_ignore_exceptions
6
8
  [].tap do |exceptions|
7
9
  exceptions << 'ActiveRecord::RecordNotFound'
@@ -20,10 +22,14 @@ class ExceptionNotifier
20
22
  Notifier.default_sender_address = @options[:sender_address]
21
23
  Notifier.default_exception_recipients = @options[:exception_recipients]
22
24
  Notifier.default_email_prefix = @options[:email_prefix]
25
+ Notifier.default_email_format = @options[:email_format]
23
26
  Notifier.default_sections = @options[:sections]
24
27
  Notifier.default_background_sections = @options[:background_sections]
25
28
  Notifier.default_verbose_subject = @options[:verbose_subject]
26
29
  Notifier.default_normalize_subject = @options[:normalize_subject]
30
+ Notifier.default_smtp_settings = @options[:smtp_settings]
31
+
32
+ @campfire = CampfireNotifier.new @options[:campfire]
27
33
 
28
34
  @options[:ignore_exceptions] ||= self.class.default_ignore_exceptions
29
35
  @options[:ignore_crawlers] ||= self.class.default_ignore_crawlers
@@ -40,6 +46,7 @@ class ExceptionNotifier
40
46
  from_crawler(options[:ignore_crawlers], env['HTTP_USER_AGENT']) ||
41
47
  conditionally_ignored(options[:ignore_if], env, exception)
42
48
  Notifier.exception_notification(env, exception).deliver
49
+ @campfire.exception_notification(exception)
43
50
  env['exception_notifier.delivered'] = true
44
51
  end
45
52
 
@@ -0,0 +1,30 @@
1
+ class ExceptionNotifier
2
+ class CampfireNotifier
3
+ require 'tinder'
4
+
5
+ attr_accessor :subdomain
6
+ attr_accessor :token
7
+ attr_accessor :room
8
+
9
+ def initialize(options)
10
+ begin
11
+ subdomain = options.delete(:subdomain)
12
+ room_name = options.delete(:room_name)
13
+ @campfire = Tinder::Campfire.new subdomain, options
14
+ @room = @campfire.find_room_by_name room_name
15
+ rescue
16
+ @campfire = @room = nil
17
+ end
18
+ end
19
+
20
+ def exception_notification(exception)
21
+ @room.paste "A new exception occurred: '#{exception.message}' on '#{exception.backtrace.first}'" if active?
22
+ end
23
+
24
+ private
25
+
26
+ def active?
27
+ !@room.nil?
28
+ end
29
+ end
30
+ end
@@ -12,10 +12,12 @@ class ExceptionNotifier
12
12
  attr_writer :default_sender_address
13
13
  attr_writer :default_exception_recipients
14
14
  attr_writer :default_email_prefix
15
+ attr_writer :default_email_format
15
16
  attr_writer :default_sections
16
17
  attr_writer :default_background_sections
17
18
  attr_writer :default_verbose_subject
18
19
  attr_writer :default_normalize_subject
20
+ attr_writer :default_smtp_settings
19
21
 
20
22
  def default_sender_address
21
23
  @default_sender_address || %("Exception Notifier" <exception.notifier@default.com>)
@@ -29,6 +31,10 @@ class ExceptionNotifier
29
31
  @default_email_prefix || "[ERROR] "
30
32
  end
31
33
 
34
+ def default_email_format
35
+ @default_email_format || :text
36
+ end
37
+
32
38
  def default_sections
33
39
  @default_sections || %w(request session environment backtrace)
34
40
  end
@@ -45,14 +51,21 @@ class ExceptionNotifier
45
51
  @default_normalize_prefix || false
46
52
  end
47
53
 
54
+ def default_smtp_settings
55
+ @default_smtp_settings || nil
56
+ end
57
+
48
58
  def default_options
49
59
  { :sender_address => default_sender_address,
50
60
  :exception_recipients => default_exception_recipients,
51
61
  :email_prefix => default_email_prefix,
62
+ :email_format => default_email_format,
52
63
  :sections => default_sections,
53
64
  :background_sections => default_background_sections,
54
65
  :verbose_subject => default_verbose_subject,
55
- :normalize_subject => default_normalize_subject }
66
+ :normalize_subject => default_normalize_subject,
67
+ :template_path => mailer_name,
68
+ :smtp_settings => default_smtp_settings }
56
69
  end
57
70
 
58
71
  def normalize_digits(string)
@@ -66,60 +79,52 @@ class ExceptionNotifier
66
79
  end
67
80
 
68
81
  def exception_notification(env, exception, options={})
69
- self.append_view_path Rails.root.nil? ? "app/views" : "#{Rails.root}/app/views" if defined?(Rails)
82
+ load_custom_views
70
83
 
71
84
  @env = env
72
85
  @exception = exception
73
- @options = (env['exception_notifier.options'] || {}).reverse_merge(self.class.default_options)
86
+ @options = options.reverse_merge(env['exception_notifier.options'] || {}).reverse_merge(self.class.default_options)
74
87
  @kontroller = env['action_controller.instance'] || MissingController.new
75
88
  @request = ActionDispatch::Request.new(env)
76
89
  @backtrace = exception.backtrace ? clean_backtrace(exception) : []
77
90
  @sections = @options[:sections]
78
91
  @data = (env['exception_notifier.exception_data'] || {}).merge(options[:data] || {})
79
92
  @sections = @sections + %w(data) unless @data.empty?
80
-
81
- @data.each do |name, value|
82
- instance_variable_set("@#{name}", value)
83
- end
84
- subject = compose_subject(exception, @kontroller)
85
-
86
- mail(:to => @options[:exception_recipients], :from => @options[:sender_address], :subject => subject) do |format|
87
- format.text { render "#{mailer_name}/exception_notification" }
88
- end
93
+
94
+ compose_email
89
95
  end
90
96
 
91
97
  def background_exception_notification(exception, options={})
92
- self.append_view_path Rails.root.nil? ? "app/views" : "#{Rails.root}/app/views" if defined?(Rails)
98
+ load_custom_views
93
99
 
94
100
  if @notifier = Rails.application.config.middleware.detect{ |x| x.klass == ExceptionNotifier }
95
- @options = (@notifier.args.first || {}).reverse_merge(self.class.default_options)
101
+ @options = options.reverse_merge(@notifier.args.first || {}).reverse_merge(self.class.default_options)
96
102
  @exception = exception
97
103
  @backtrace = exception.backtrace || []
98
104
  @sections = @options[:background_sections]
99
105
  @data = options[:data] || {}
100
106
 
101
- @data.each do |name, value|
102
- instance_variable_set("@#{name}", value)
103
- end
104
- subject = compose_subject(exception)
105
-
106
- mail(:to => @options[:exception_recipients], :from => @options[:sender_address], :subject => subject) do |format|
107
- format.text { render "#{mailer_name}/background_exception_notification" }
108
- end.deliver
107
+ compose_email
109
108
  end
110
109
  end
111
110
 
112
111
  private
113
112
 
114
- def compose_subject(exception, kontroller=nil)
113
+ def compose_subject
115
114
  subject = "#{@options[:email_prefix]}"
116
- subject << "#{kontroller.controller_name}##{kontroller.action_name}" if kontroller
117
- subject << " (#{exception.class})"
118
- subject << " #{exception.message.inspect}" if @options[:verbose_subject]
115
+ subject << "#{@kontroller.controller_name}##{@kontroller.action_name}" if @kontroller
116
+ subject << " (#{@exception.class})"
117
+ subject << " #{@exception.message.inspect}" if @options[:verbose_subject]
119
118
  subject = normalize_digits(subject) if @options[:normalize_subject]
120
119
  subject.length > 120 ? subject[0...120] + "..." : subject
121
120
  end
122
121
 
122
+ def set_data_variables
123
+ @data.each do |name, value|
124
+ instance_variable_set("@#{name}", value)
125
+ end
126
+ end
127
+
123
128
  def clean_backtrace(exception)
124
129
  if Rails.respond_to?(:backtrace_cleaner)
125
130
  Rails.backtrace_cleaner.send(:filter, exception.backtrace)
@@ -140,5 +145,29 @@ class ExceptionNotifier
140
145
  object.to_s
141
146
  end
142
147
  end
148
+
149
+ def html_mail?
150
+ @options[:email_format] == :html
151
+ end
152
+
153
+ def compose_email
154
+ set_data_variables
155
+ subject = compose_subject
156
+ name = @env.nil? ? 'background_exception_notification' : 'exception_notification'
157
+
158
+ mail = mail(:to => @options[:exception_recipients], :from => @options[:sender_address],
159
+ :subject => subject, :template_name => name) do |format|
160
+ format.text
161
+ format.html if html_mail?
162
+ end
163
+
164
+ mail.delivery_method.settings.merge!(@options[:smtp_settings]) if @options[:smtp_settings]
165
+
166
+ mail
167
+ end
168
+
169
+ def load_custom_views
170
+ self.prepend_view_path Rails.root.nil? ? "app/views" : "#{Rails.root}/app/views" if defined?(Rails)
171
+ end
143
172
  end
144
173
  end