super_exception_notifier 2.0.8 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/{README.rdoc → README} +13 -17
- data/VERSION.yml +3 -3
- data/lib/exception_notification.rb +15 -0
- data/rails/init.rb +8 -12
- data/super_exception_notifier.gemspec +88 -0
- data/test/exception_notifier_helper_test.rb +2 -10
- data/test/exception_notifier_test.rb +2 -2
- data/test/exception_notify_functional_test.rb +6 -6
- data/test/mocks/controllers.rb +22 -15
- data/test/notifiable_test.rb +6 -6
- data/test/test_helper.rb +6 -4
- metadata +35 -33
- data/lib/exception_notifiable.rb +0 -177
- data/lib/exception_notifier.rb +0 -176
- data/lib/exception_notifier_helper.rb +0 -60
- data/lib/notifiable.rb +0 -92
- data/lib/super_exception_notifier/custom_exception_classes.rb +0 -16
- data/lib/super_exception_notifier/custom_exception_methods.rb +0 -50
- data/lib/super_exception_notifier/deprecated_methods.rb +0 -60
- data/lib/super_exception_notifier/git_blame.rb +0 -52
- data/lib/super_exception_notifier/helpful_hashes.rb +0 -66
- data/lib/super_exception_notifier/hooks_notifier.rb +0 -55
- data/lib/super_exception_notifier/notifiable_helper.rb +0 -80
- data/tasks/notified_task.rake +0 -15
- data/views/exception_notifier/_backtrace.html.erb +0 -1
- data/views/exception_notifier/_environment.html.erb +0 -14
- data/views/exception_notifier/_inspect_model.html.erb +0 -16
- data/views/exception_notifier/_request.html.erb +0 -8
- data/views/exception_notifier/_session.html.erb +0 -6
- data/views/exception_notifier/_title.html.erb +0 -3
- data/views/exception_notifier/background_exception_notification.text.plain.erb +0 -10
- data/views/exception_notifier/exception_notification.text.plain.erb +0 -15
- data/views/exception_notifier/rake_exception_notification.text.plain.erb +0 -6
data/test/test_helper.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rubygems'
|
3
3
|
|
4
|
-
require '
|
5
|
-
require '
|
4
|
+
require 'rake'
|
5
|
+
require 'rake/tasklib'
|
6
|
+
require 'action_mailer'
|
6
7
|
require 'active_record'
|
7
8
|
|
8
9
|
#just requiring active record wasn't loading classes soon enough for SILENT_EXCEPTIONS
|
@@ -20,9 +21,10 @@ RAILS_ENV = 'test' unless defined?(RAILS_ENV)
|
|
20
21
|
RAILS_DEFAULT_LOGGER = Logger.new(StringIO.new) unless defined?(RAILS_DEFAULT_LOGGER)
|
21
22
|
#$:.unshift File.join(File.dirname(__FILE__), '../lib')
|
22
23
|
|
23
|
-
require File.join(File.dirname(__FILE__), "..", "init")
|
24
|
+
#require File.join(File.dirname(__FILE__), "..", "init")
|
25
|
+
require "init"
|
24
26
|
|
25
|
-
|
27
|
+
ExceptionNotification::Notifier.configure_exception_notifier do |config|
|
26
28
|
# If left empty web hooks will not be engaged
|
27
29
|
config[:web_hooks] = []
|
28
30
|
config[:exception_recipients] = ["test.errors@example.com"]
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: super_exception_notifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 3
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 3.0.1
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Peter Boling
|
@@ -13,19 +18,33 @@ autorequire:
|
|
13
18
|
bindir: bin
|
14
19
|
cert_chain: []
|
15
20
|
|
16
|
-
date: 2010-
|
21
|
+
date: 2010-05-13 00:00:00 -04:00
|
17
22
|
default_executable:
|
18
23
|
dependencies:
|
19
24
|
- !ruby/object:Gem::Dependency
|
20
|
-
name:
|
25
|
+
name: action_mailer
|
26
|
+
prerelease: false
|
27
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
version: "0"
|
21
34
|
type: :runtime
|
22
|
-
|
23
|
-
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rake
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
24
40
|
requirements:
|
25
41
|
- - ">="
|
26
42
|
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 0
|
27
45
|
version: "0"
|
28
|
-
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
29
48
|
description: |-
|
30
49
|
Allows customization of:
|
31
50
|
* Specify which level of notification you would like with an array of optional styles of notification (email, webhooks)
|
@@ -52,23 +71,13 @@ executables: []
|
|
52
71
|
extensions: []
|
53
72
|
|
54
73
|
extra_rdoc_files:
|
55
|
-
- README
|
74
|
+
- README
|
56
75
|
files:
|
57
76
|
- MIT-LICENSE
|
58
|
-
- README
|
77
|
+
- README
|
59
78
|
- VERSION.yml
|
60
79
|
- init.rb
|
61
|
-
- lib/
|
62
|
-
- lib/exception_notifier.rb
|
63
|
-
- lib/exception_notifier_helper.rb
|
64
|
-
- lib/notifiable.rb
|
65
|
-
- lib/super_exception_notifier/custom_exception_classes.rb
|
66
|
-
- lib/super_exception_notifier/custom_exception_methods.rb
|
67
|
-
- lib/super_exception_notifier/deprecated_methods.rb
|
68
|
-
- lib/super_exception_notifier/git_blame.rb
|
69
|
-
- lib/super_exception_notifier/helpful_hashes.rb
|
70
|
-
- lib/super_exception_notifier/hooks_notifier.rb
|
71
|
-
- lib/super_exception_notifier/notifiable_helper.rb
|
80
|
+
- lib/exception_notification.rb
|
72
81
|
- rails/app/views/exception_notifiable/400.html
|
73
82
|
- rails/app/views/exception_notifiable/403.html
|
74
83
|
- rails/app/views/exception_notifiable/404.html
|
@@ -82,18 +91,9 @@ files:
|
|
82
91
|
- rails/app/views/exception_notifiable/503.html
|
83
92
|
- rails/app/views/exception_notifiable/method_disabled.html.erb
|
84
93
|
- rails/init.rb
|
85
|
-
-
|
86
|
-
- views/exception_notifier/_backtrace.html.erb
|
87
|
-
- views/exception_notifier/_environment.html.erb
|
88
|
-
- views/exception_notifier/_inspect_model.html.erb
|
89
|
-
- views/exception_notifier/_request.html.erb
|
90
|
-
- views/exception_notifier/_session.html.erb
|
91
|
-
- views/exception_notifier/_title.html.erb
|
92
|
-
- views/exception_notifier/background_exception_notification.text.plain.erb
|
93
|
-
- views/exception_notifier/exception_notification.text.plain.erb
|
94
|
-
- views/exception_notifier/rake_exception_notification.text.plain.erb
|
94
|
+
- super_exception_notifier.gemspec
|
95
95
|
has_rdoc: true
|
96
|
-
homepage: http://github.com/pboling/
|
96
|
+
homepage: http://github.com/pboling/exception_notifiable
|
97
97
|
licenses: []
|
98
98
|
|
99
99
|
post_install_message:
|
@@ -105,18 +105,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
105
105
|
requirements:
|
106
106
|
- - ">="
|
107
107
|
- !ruby/object:Gem::Version
|
108
|
+
segments:
|
109
|
+
- 0
|
108
110
|
version: "0"
|
109
|
-
version:
|
110
111
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
112
|
requirements:
|
112
113
|
- - ">="
|
113
114
|
- !ruby/object:Gem::Version
|
115
|
+
segments:
|
116
|
+
- 0
|
114
117
|
version: "0"
|
115
|
-
version:
|
116
118
|
requirements: []
|
117
119
|
|
118
120
|
rubyforge_project:
|
119
|
-
rubygems_version: 1.3.
|
121
|
+
rubygems_version: 1.3.6
|
120
122
|
signing_key:
|
121
123
|
specification_version: 3
|
122
124
|
summary: Allows unhandled (and handled!) exceptions to be captured and sent via email
|
data/lib/exception_notifiable.rb
DELETED
@@ -1,177 +0,0 @@
|
|
1
|
-
require 'ipaddr'
|
2
|
-
|
3
|
-
module ExceptionNotifiable
|
4
|
-
include SuperExceptionNotifier::NotifiableHelper
|
5
|
-
|
6
|
-
def self.included(base)
|
7
|
-
base.extend ClassMethods
|
8
|
-
|
9
|
-
# Adds the following class attributes to the classes that include ExceptionNotifiable
|
10
|
-
# HTTP status codes and what their 'English' status message is
|
11
|
-
base.cattr_accessor :http_status_codes
|
12
|
-
base.http_status_codes = HTTP_STATUS_CODES
|
13
|
-
# error_layout:
|
14
|
-
# can be defined at controller level to the name of the desired error layout,
|
15
|
-
# or set to true to render the controller's own default layout,
|
16
|
-
# or set to false to render errors with no layout
|
17
|
-
base.cattr_accessor :error_layout
|
18
|
-
base.error_layout = nil
|
19
|
-
# Rails error classes to rescue and how to rescue them (which error code to use)
|
20
|
-
base.cattr_accessor :error_class_status_codes
|
21
|
-
base.error_class_status_codes = self.codes_for_error_classes
|
22
|
-
# Verbosity of the gem
|
23
|
-
base.cattr_accessor :exception_notifiable_verbose
|
24
|
-
base.exception_notifiable_verbose = false
|
25
|
-
# Do Not Ever send error notification emails for these Error Classes
|
26
|
-
base.cattr_accessor :exception_notifiable_silent_exceptions
|
27
|
-
base.exception_notifiable_silent_exceptions = SILENT_EXCEPTIONS
|
28
|
-
# Notification Level
|
29
|
-
base.cattr_accessor :exception_notifiable_notification_level
|
30
|
-
base.exception_notifiable_notification_level = [:render, :email, :web_hooks]
|
31
|
-
end
|
32
|
-
|
33
|
-
module ClassMethods
|
34
|
-
include SuperExceptionNotifier::DeprecatedMethods
|
35
|
-
|
36
|
-
# specifies ip addresses that should be handled as though local
|
37
|
-
def consider_local(*args)
|
38
|
-
local_addresses.concat(args.flatten.map { |a| IPAddr.new(a) })
|
39
|
-
end
|
40
|
-
|
41
|
-
def local_addresses
|
42
|
-
addresses = read_inheritable_attribute(:local_addresses)
|
43
|
-
unless addresses
|
44
|
-
addresses = [IPAddr.new("127.0.0.1")]
|
45
|
-
write_inheritable_attribute(:local_addresses, addresses)
|
46
|
-
end
|
47
|
-
addresses
|
48
|
-
end
|
49
|
-
|
50
|
-
# set the exception_data deliverer OR retrieve the exception_data
|
51
|
-
def exception_data(deliverer = nil)
|
52
|
-
if deliverer
|
53
|
-
write_inheritable_attribute(:exception_data, deliverer)
|
54
|
-
else
|
55
|
-
read_inheritable_attribute(:exception_data)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def be_silent_for_exception?(exception)
|
60
|
-
self.exception_notifiable_silent_exceptions.respond_to?(:any?) && self.exception_notifiable_silent_exceptions.any? {|klass| klass === exception }
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
def be_silent_for_exception?(exception)
|
66
|
-
self.class.be_silent_for_exception?(exception)
|
67
|
-
end
|
68
|
-
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def notification_level_sends_email?
|
73
|
-
self.class.exception_notifiable_notification_level.include?(:email)
|
74
|
-
end
|
75
|
-
|
76
|
-
def notification_level_sends_web_hooks?
|
77
|
-
self.class.exception_notifiable_notification_level.include?(:web_hooks)
|
78
|
-
end
|
79
|
-
|
80
|
-
def notification_level_renders?
|
81
|
-
self.class.exception_notifiable_notification_level.include?(:render)
|
82
|
-
end
|
83
|
-
|
84
|
-
# overrides Rails' local_request? method to also check any ip
|
85
|
-
# addresses specified through consider_local.
|
86
|
-
def local_request?
|
87
|
-
remote = IPAddr.new(request.remote_ip)
|
88
|
-
!self.class.local_addresses.detect { |addr| addr.include?(remote) }.nil?
|
89
|
-
end
|
90
|
-
|
91
|
-
# When the action being executed has its own local error handling (rescue)
|
92
|
-
# Or when the error accurs somewhere without a subsequent render (eg. method calls in console)
|
93
|
-
def rescue_with_handler(exception)
|
94
|
-
to_return = super
|
95
|
-
if to_return
|
96
|
-
verbose = self.class.exception_notifiable_verbose
|
97
|
-
puts "[RESCUE STYLE] rescue_with_handler" if verbose
|
98
|
-
data = get_exception_data
|
99
|
-
status_code = status_code_for_exception(exception)
|
100
|
-
#We only send email if it has been configured in environment
|
101
|
-
send_email = should_email_on_exception?(exception, status_code, verbose)
|
102
|
-
#We only send web hooks if they've been configured in environment
|
103
|
-
send_web_hooks = should_web_hook_on_exception?(exception, status_code, verbose)
|
104
|
-
the_blamed = ExceptionNotifier.config[:git_repo_path].nil? ? nil : lay_blame(exception)
|
105
|
-
rejected_sections = %w(request session)
|
106
|
-
# Debugging output
|
107
|
-
verbose_output(exception, status_code, "rescued by handler", send_email, send_web_hooks, nil, the_blamed, rejected_sections) if verbose
|
108
|
-
# Send the exception notification email
|
109
|
-
perform_exception_notify_mailing(exception, data, nil, the_blamed, verbose, rejected_sections) if send_email
|
110
|
-
# Send Web Hook requests
|
111
|
-
HooksNotifier.deliver_exception_to_web_hooks(ExceptionNotifier.config, exception, self, request, data, the_blamed) if send_web_hooks
|
112
|
-
end
|
113
|
-
to_return
|
114
|
-
end
|
115
|
-
|
116
|
-
# When the action being executed is letting SEN handle the exception completely
|
117
|
-
def rescue_action_in_public(exception)
|
118
|
-
# If the error class is NOT listed in the rails_errror_class hash then we get a generic 500 error:
|
119
|
-
# OTW if the error class is listed, but has a blank code or the code is == '200' then we get a custom error layout rendered
|
120
|
-
# OTW the error class is listed!
|
121
|
-
verbose = self.class.exception_notifiable_verbose
|
122
|
-
puts "[RESCUE STYLE] rescue_action_in_public" if verbose
|
123
|
-
status_code = status_code_for_exception(exception)
|
124
|
-
if status_code == '200'
|
125
|
-
notify_and_render_error_template(status_code, request, exception, ExceptionNotifier.get_view_path_for_class(exception, verbose), verbose)
|
126
|
-
else
|
127
|
-
notify_and_render_error_template(status_code, request, exception, ExceptionNotifier.get_view_path_for_status_code(status_code, verbose), verbose)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def notify_and_render_error_template(status_cd, request, exception, file_path, verbose = false)
|
132
|
-
status = self.class.http_status_codes[status_cd] ? status_cd + " " + self.class.http_status_codes[status_cd] : status_cd
|
133
|
-
data = get_exception_data
|
134
|
-
#We only send email if it has been configured in environment
|
135
|
-
send_email = should_email_on_exception?(exception, status_cd, verbose)
|
136
|
-
#We only send web hooks if they've been configured in environment
|
137
|
-
send_web_hooks = should_web_hook_on_exception?(exception, status_cd, verbose)
|
138
|
-
the_blamed = ExceptionNotifier.config[:git_repo_path].nil? ? nil : lay_blame(exception)
|
139
|
-
rejected_sections = request.nil? ? %w(request session) : []
|
140
|
-
# Debugging output
|
141
|
-
verbose_output(exception, status_cd, file_path, send_email, send_web_hooks, request, the_blamed, rejected_sections) if verbose
|
142
|
-
#TODO: is _rescue_action something from rails 3?
|
143
|
-
#if !(self.controller_name == 'application' && self.action_name == '_rescue_action')
|
144
|
-
# Send the exception notification email
|
145
|
-
perform_exception_notify_mailing(exception, data, request, the_blamed, verbose, rejected_sections) if send_email
|
146
|
-
# Send Web Hook requests
|
147
|
-
HooksNotifier.deliver_exception_to_web_hooks(ExceptionNotifier.config, exception, self, request, data, the_blamed) if send_web_hooks
|
148
|
-
|
149
|
-
# We put the render call after the deliver call to ensure that, if the
|
150
|
-
# deliver raises an exception, we don't call render twice.
|
151
|
-
# Render the error page to the end user
|
152
|
-
render_error_template(file_path, status)
|
153
|
-
end
|
154
|
-
|
155
|
-
def is_local?
|
156
|
-
(consider_all_requests_local || local_request?)
|
157
|
-
end
|
158
|
-
|
159
|
-
def status_code_for_exception(exception)
|
160
|
-
self.class.error_class_status_codes[exception.class].nil? ?
|
161
|
-
'500' :
|
162
|
-
self.class.error_class_status_codes[exception.class].blank? ?
|
163
|
-
'200' :
|
164
|
-
self.class.error_class_status_codes[exception.class]
|
165
|
-
end
|
166
|
-
|
167
|
-
def render_error_template(file, status)
|
168
|
-
respond_to do |type|
|
169
|
-
type.html { render :file => file,
|
170
|
-
:layout => self.class.error_layout,
|
171
|
-
:status => status }
|
172
|
-
type.all { render :nothing => true,
|
173
|
-
:status => status}
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
end
|
data/lib/exception_notifier.rb
DELETED
@@ -1,176 +0,0 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
|
3
|
-
class ExceptionNotifier < ActionMailer::Base
|
4
|
-
|
5
|
-
#andrewroth reported that @@config gets clobbered because rails loads this class twice when installed as a plugin, and adding the ||= fixed it.
|
6
|
-
@@config ||= {
|
7
|
-
# If left empty web hooks will not be engaged
|
8
|
-
:web_hooks => [],
|
9
|
-
:app_name => "[MYAPP]",
|
10
|
-
:version => "0.0.0",
|
11
|
-
:sender_address => "super.exception.notifier@example.com",
|
12
|
-
:exception_recipients => [],
|
13
|
-
# Customize the subject line
|
14
|
-
:subject_prepend => "[#{(defined?(Rails) ? Rails.env : RAILS_ENV).capitalize} ERROR] ",
|
15
|
-
:subject_append => nil,
|
16
|
-
# Include which sections of the exception email?
|
17
|
-
:sections => %w(request session environment backtrace),
|
18
|
-
:skip_local_notification => true,
|
19
|
-
:view_path => nil,
|
20
|
-
#Error Notification will be sent if the HTTP response code for the error matches one of the following error codes
|
21
|
-
:notify_error_codes => %W( 405 500 503 ),
|
22
|
-
#Error Notification will be sent if the error class matches one of the following error error classes
|
23
|
-
:notify_error_classes => %W( ),
|
24
|
-
:notify_other_errors => true,
|
25
|
-
:git_repo_path => nil,
|
26
|
-
:template_root => "#{File.dirname(__FILE__)}/../views"
|
27
|
-
}
|
28
|
-
|
29
|
-
cattr_accessor :config
|
30
|
-
|
31
|
-
def self.configure_exception_notifier(&block)
|
32
|
-
yield @@config
|
33
|
-
end
|
34
|
-
|
35
|
-
self.template_root = config[:template_root]
|
36
|
-
|
37
|
-
def self.reloadable?() false end
|
38
|
-
|
39
|
-
# Returns an array of potential filenames to look for
|
40
|
-
# eg. For the Exception Class - SuperExceptionNotifier::CustomExceptionClasses::MethodDisabled
|
41
|
-
# the filename handles are:
|
42
|
-
# super_exception_notifier_custom_exception_classes_method_disabled
|
43
|
-
# method_disabled
|
44
|
-
def self.exception_to_filenames(exception)
|
45
|
-
filenames = []
|
46
|
-
e = exception.to_s
|
47
|
-
filenames << ExceptionNotifier.filenamify(e)
|
48
|
-
|
49
|
-
last_colon = e.rindex(':')
|
50
|
-
unless last_colon.nil?
|
51
|
-
filenames << ExceptionNotifier.filenamify(e[(last_colon + 1)..(e.length - 1)])
|
52
|
-
end
|
53
|
-
filenames
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.sections_for_email(rejected_sections, request)
|
57
|
-
rejected_sections = rejected_sections.nil? ? request.nil? ? %w(request session) : [] : rejected_sections
|
58
|
-
rejected_sections.empty? ? config[:sections] : config[:sections].reject{|s| rejected_sections.include?(s) }
|
59
|
-
end
|
60
|
-
|
61
|
-
# Converts Stringified Class Names to acceptable filename handles with underscores
|
62
|
-
def self.filenamify(str)
|
63
|
-
str.delete(':').gsub( /([A-Za-z])([A-Z])/, '\1' << '_' << '\2').downcase
|
64
|
-
end
|
65
|
-
|
66
|
-
# What is the path of the file we will render to the user based on a given status code?
|
67
|
-
def self.get_view_path_for_status_code(status_cd, verbose = false)
|
68
|
-
file_name = ExceptionNotifier.get_view_path(status_cd, verbose)
|
69
|
-
#ExceptionNotifierHelper::COMPAT_MODE ? "#{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/500.html" : "500.html"
|
70
|
-
file_name.nil? ? self.catch_all(verbose) : file_name
|
71
|
-
end
|
72
|
-
|
73
|
-
# def self.get_view_path_for_files(filenames = [])
|
74
|
-
# filepaths = filenames.map do |file|
|
75
|
-
# ExceptionNotifier.get_view_path(file)
|
76
|
-
# end.compact
|
77
|
-
# filepaths.empty? ? "#{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/500.html" : filepaths.first
|
78
|
-
# end
|
79
|
-
|
80
|
-
# What is the path of the file we will render to the user based on a given exception class?
|
81
|
-
def self.get_view_path_for_class(exception, verbose = false)
|
82
|
-
return self.catch_all(verbose) if exception.nil?
|
83
|
-
#return self.catch_all(verbose) unless exception.is_a?(StandardError) || exception.is_a?(Class) # For some reason exception.is_a?(Class) works in console, but not when running in mongrel (ALWAYS returns false)?!?!?
|
84
|
-
filepaths = ExceptionNotifier.exception_to_filenames(exception).map do |file|
|
85
|
-
ExceptionNotifier.get_view_path(file, verbose)
|
86
|
-
end.compact
|
87
|
-
filepaths.empty? ? self.catch_all(verbose) : filepaths.first
|
88
|
-
end
|
89
|
-
|
90
|
-
def self.catch_all(verbose = false)
|
91
|
-
puts "[CATCH ALL INVOKED] #{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/500.html" if verbose
|
92
|
-
"#{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/500.html"
|
93
|
-
end
|
94
|
-
|
95
|
-
# Check the usual suspects
|
96
|
-
def self.get_view_path(file_name, verbose = false)
|
97
|
-
if File.exist?("#{RAILS_ROOT}/public/#{file_name}.html")
|
98
|
-
puts "[FOUND FILE:A] #{RAILS_ROOT}/public/#{file_name}.html" if verbose
|
99
|
-
"#{RAILS_ROOT}/public/#{file_name}.html"
|
100
|
-
elsif !config[:view_path].nil? && File.exist?("#{RAILS_ROOT}/#{config[:view_path]}/#{file_name}.html.erb")
|
101
|
-
puts "[FOUND FILE:B] #{RAILS_ROOT}/#{config[:view_path]}/#{file_name}.html.erb" if verbose
|
102
|
-
"#{RAILS_ROOT}/#{config[:view_path]}/#{file_name}.html.erb"
|
103
|
-
elsif !config[:view_path].nil? && File.exist?("#{RAILS_ROOT}/#{config[:view_path]}/#{file_name}.html")
|
104
|
-
puts "[FOUND FILE:C] #{RAILS_ROOT}/#{config[:view_path]}/#{file_name}.html" if verbose
|
105
|
-
"#{RAILS_ROOT}/#{config[:view_path]}/#{file_name}.html"
|
106
|
-
elsif File.exist?("#{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/#{file_name}.html.erb")
|
107
|
-
puts "[FOUND FILE:D] #{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/#{file_name}.html.erb" if verbose
|
108
|
-
"#{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/#{file_name}.html.erb"
|
109
|
-
elsif File.exist?("#{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/#{file_name}.html")
|
110
|
-
#ExceptionNotifierHelper::COMPAT_MODE ? "#{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/#{file_name}.html" : "#{status_cd}.html"
|
111
|
-
puts "[FOUND FILE:E] #{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/#{file_name}.html" if verbose
|
112
|
-
"#{File.dirname(__FILE__)}/../rails/app/views/exception_notifiable/#{file_name}.html"
|
113
|
-
else
|
114
|
-
nil
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
def exception_notification(exception, class_name = nil, method_name = nil, request = nil, data = {}, the_blamed = nil, rejected_sections = nil)
|
119
|
-
body_hash = error_environment_data_hash(exception, class_name, method_name, request, data, the_blamed, rejected_sections)
|
120
|
-
#Prefer to have custom, potentially HTML email templates available
|
121
|
-
#content_type "text/plain"
|
122
|
-
recipients config[:exception_recipients]
|
123
|
-
from config[:sender_address]
|
124
|
-
|
125
|
-
request.session.inspect unless request.nil? # Ensure session data is loaded (Rails 2.3 lazy-loading)
|
126
|
-
|
127
|
-
subject "#{config[:subject_prepend]}#{body_hash[:location]} (#{exception.class}) #{exception.message.inspect}#{config[:subject_append]}"
|
128
|
-
body body_hash
|
129
|
-
end
|
130
|
-
|
131
|
-
def background_exception_notification(exception, data = {}, the_blamed = nil, rejected_sections = %w(request session))
|
132
|
-
exception_notification(exception, nil, nil, nil, data, the_blamed, rejected_sections)
|
133
|
-
end
|
134
|
-
|
135
|
-
def rake_exception_notification(exception, task, data={}, the_blamed = nil, rejected_sections = %w(request session))
|
136
|
-
exception_notification(exception, "", "#{task.name}", nil, data, the_blamed, rejected_sections)
|
137
|
-
end
|
138
|
-
|
139
|
-
private
|
140
|
-
|
141
|
-
def error_environment_data_hash(exception, class_name = nil, method_name = nil, request = nil, data = {}, the_blamed = nil, rejected_sections = nil)
|
142
|
-
data.merge!({
|
143
|
-
:exception => exception,
|
144
|
-
:backtrace => sanitize_backtrace(exception.backtrace),
|
145
|
-
:rails_root => rails_root,
|
146
|
-
:data => data,
|
147
|
-
:the_blamed => the_blamed
|
148
|
-
})
|
149
|
-
|
150
|
-
data.merge!({:class_name => class_name}) if class_name
|
151
|
-
data.merge!({:method_name => method_name}) if method_name
|
152
|
-
if class_name && method_name
|
153
|
-
data.merge!({:location => "#{class_name}##{method_name}"})
|
154
|
-
elsif method_name
|
155
|
-
data.merge!({:location => "#{method_name}"})
|
156
|
-
else
|
157
|
-
data.merge!({:location => sanitize_backtrace([exception.backtrace.first]).first})
|
158
|
-
end
|
159
|
-
if request
|
160
|
-
data.merge!({:request => request})
|
161
|
-
data.merge!({:host => (request.env['HTTP_X_REAL_IP'] || request.env["HTTP_X_FORWARDED_HOST"] || request.env["HTTP_HOST"])})
|
162
|
-
end
|
163
|
-
data.merge!({:sections => ExceptionNotifier.sections_for_email(rejected_sections, request)})
|
164
|
-
return data
|
165
|
-
end
|
166
|
-
|
167
|
-
def sanitize_backtrace(trace)
|
168
|
-
re = Regexp.new(/^#{Regexp.escape(rails_root)}/)
|
169
|
-
trace.map { |line| Pathname.new(line.gsub(re, "[RAILS_ROOT]")).cleanpath.to_s }
|
170
|
-
end
|
171
|
-
|
172
|
-
def rails_root
|
173
|
-
@rails_root ||= Pathname.new(RAILS_ROOT).cleanpath.to_s
|
174
|
-
end
|
175
|
-
|
176
|
-
end
|