super_exception_notifier 3.0.13 → 3.0.14

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.
data/README DELETED
@@ -1,120 +0,0 @@
1
- = Super Exception Notifier
2
-
3
- The Super Exception Notifier (SEN) gem provides a mailer object and a default set of templates
4
- for sending email notifications when errors occur in a Rails application, as well as a default
5
- set of error page templates to render based on the status code assigned to an error. The gem
6
- is configurable, allowing programmers to customize (settings are per environment or per class):
7
-
8
- * the sender address of the email
9
- * the recipient addresses
10
- * text used to prepend and append the subject line
11
- * the HTTP status codes to send emails for
12
- * the error classes to send emails for
13
- * alternatively, the error classes to not send emails for
14
- * whether to send error emails or just render without sending anything
15
- * the HTTP status and status code that gets rendered with specific errors
16
- * the view path to the error page templates
17
- * custom errors, with custom error templates
18
- * fine-grained customization of error layouts (or no layout)
19
- * get error notification for errors that occur in the console, using notifiable method
20
- * Hooks into `git blame` output so you can get an idea of who (may) have introduced the bug
21
- * Hooks into other website services (e.g. you can send exceptions to to Switchub.com)
22
- * Specify which level of notification you would like with an array of optional styles of notification:
23
- [:render, :email, :web_hooks]
24
- * Can notify of errors occurring in any method in any class in Ruby by wrapping the method call like this:
25
- notifiable { method }
26
- * Can notify of errors in Rake tasks using 'NotifiedTask.new' instead of 'task' when writing tasks
27
- * Works with Hoptoad Notifier, so you can notify via SEN and/or Hoptoad for any particular errors.
28
- * Tested with Rails 2.3.x, should work with Rails 2.2.x, and is apparently not yet compatible with Rails 3.
29
-
30
- The email includes information about the current request, session, and
31
- environment, and also gives a backtrace of the exception.
32
-
33
- This gem is based on the wonderful exception_notification plugin created by Jamis Buck. I have
34
- modified it extensively and merged many of the improvements from a dozen or so other forks.
35
- It remains a (mostly) drop in replacement with greatly extended functionality and customization
36
- options. I keep it up to date with the work on the core team's
37
- branch.
38
-
39
- The venerable original is here:
40
-
41
- http://github.com/rails/exception_notification
42
-
43
- The current version of this gem is a git fork of the original and has been updated to include
44
- the latest improvements from the original, and many improvements from the other forks on github.
45
- I merge them in when I have time, and when the changes fit nicely with the enhancements I have
46
- already made.
47
-
48
- This fork of Exception Notifier is in production use on several large websites (top 5000).
49
-
50
- == Installation as RubyGem
51
-
52
- [sudo] gem install super_exception_notifier
53
-
54
- More Installation Options are here: http://wiki.github.com/pboling/exception_notification/installation
55
-
56
- == Configuration as RubyGem
57
-
58
- config.gem 'super_exception_notifier', :lib => "exception_notification"
59
-
60
- More Configuration Options are here: http://wiki.github.com/pboling/exception_notification/configuration
61
-
62
- == Configuration In Environment (Initializer)
63
-
64
- ExceptionNotification::Notifier.configure_exception_notifier do |config|
65
- config[:app_name] = "[MYAPP]"
66
- config[:sender_address] = "super.exception.notifier@example.com"
67
- config[:exception_recipients] = [] # You need to set at least one recipient if you want to get the notifications
68
- # In a local environment only use this gem to render, never email
69
- #defaults to false - meaning by default it sends email. Setting true will cause it to only render the error pages, and NOT email.
70
- config[:skip_local_notification] = true
71
- # Error Notification will be sent if the HTTP response code for the error matches one of the following error codes
72
- config[:notify_error_codes] = %W( 405 500 503 )
73
- # Error Notification will be sent if the error class matches one of the following error classes
74
- config[:notify_error_classes] = %W( )
75
- # What should we do for errors not listed?
76
- config[:notify_other_errors] = true
77
- # If you set this SEN will attempt to use git blame to discover the person who made the last change to the problem code
78
- config[:git_repo_path] = nil # ssh://git@blah.example.com/repo/webapp.git
79
- end
80
-
81
- More Configuration Options: http://wiki.github.com/pboling/exception_notification/advanced-environment-configuration
82
-
83
- == Handling Errors in Request Cycle
84
-
85
- 1. Include the ExceptionNotification::ExceptionNotifiable mixin in whichever controller you want to generate error emails (typically ApplicationController):
86
-
87
- class ApplicationController < ActionController::Base
88
- ############################################################
89
- # ERROR HANDLING et Foo
90
- include ExceptionNotification::ExceptionNotifiable
91
- #Comment out the line below if you want to see the normal rails errors in normal development.
92
- alias :rescue_action_locally :rescue_action_in_public if Rails.env == 'development'
93
- #self.error_layout = 'errors'
94
- self.exception_notifiable_verbose = true #SEN uses logger.info, so won't be verbose in production
95
- self.exception_notifiable_pass_through = :hoptoad # requires the standard hoptoad gem to be installed, and setup normally
96
- self.exception_notifiable_silent_exceptions = [Acl9::AccessDenied, MethodDisabled, ActionController::RoutingError ]
97
- #specific errors can be handled by something else:
98
- rescue_from 'Acl9::AccessDenied', :with => :access_denied
99
- # END ERROR HANDLING
100
- ############################################################
101
- ...
102
- end
103
-
104
- 2. Specify the email recipients in your environment (You should have already done this in the "Configuration in Environment (Initializer)" step above):
105
-
106
- ExceptionNotification::Notifier.configure_exception_notifier do |config|
107
- config[:exception_recipients] = %w(joe@example.com bill@example.com)
108
- end
109
-
110
- 3. Make sure you have your ActionMailer server settings correct if you are using the e-mail features.
111
-
112
- 4. That’s it! The defaults take care of the rest.
113
-
114
- http://wiki.github.com/pboling/exception_notification/exceptions-inside-request-cycle
115
-
116
- == Advanced Configuration
117
-
118
- There is a lot more you can configure, and do:
119
-
120
- http://wiki.github.com/pboling/exception_notification/
data/VERSION.yml DELETED
@@ -1,5 +0,0 @@
1
- ---
2
- :major: 3
3
- :build:
4
- :minor: 0
5
- :patch: 13
data/init.rb DELETED
@@ -1 +0,0 @@
1
- require File.dirname(__FILE__) + "/rails/init"
@@ -1,113 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{super_exception_notifier}
8
- s.version = "3.0.13"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Peter Boling", "Scott Windsor", "Ismael Celis", "Jacques Crocker", "Jamis Buck"]
12
- s.date = %q{2010-06-30}
13
- s.description = %q{Allows customization of:
14
- * Specify which level of notification you would like with an array of optional styles of notification (email, webhooks)
15
- * the sender address of the email
16
- * the recipient addresses
17
- * the text used to prefix the subject line
18
- * the HTTP status codes to notify for
19
- * the error classes to send emails for
20
- * alternatively, the error classes to not notify for
21
- * whether to send error emails or just render without sending anything
22
- * the HTTP status and status code that gets rendered with specific errors
23
- * the view path to the error page templates
24
- * custom errors, with custom error templates
25
- * define error layouts at application or controller level, or use the controller's own default layout, or no layout at all
26
- * get error notification for errors that occur in the console, using notifiable method
27
- * Override the gem's handling and rendering with explicit rescue statements inline.
28
- * Hooks into `git blame` output so you can get an idea of who (may) have introduced the bug
29
- * Hooks into other website services (e.g. you can send exceptions to to Switchub.com)
30
- * Can notify of errors occurring in any class/method using notifiable { method }
31
- * Can notify of errors in Rake tasks using NotifiedTask.new instead of task
32
- * Works with Hoptoad Notifier, so you can notify via SEN and/or Hoptoad for any particular errors.
33
- * Tested with Rails 2.3.x, should work with rails 2.2.x, and is apparently not yet compatible with rails 3.}
34
- s.email = %q{peter.boling@gmail.com}
35
- s.extra_rdoc_files = [
36
- "README"
37
- ]
38
- s.files = [
39
- "CHANGELOG.txt",
40
- "MIT-LICENSE",
41
- "README",
42
- "VERSION.yml",
43
- "init.rb",
44
- "lib/exception_notification.rb",
45
- "lib/exception_notification/consider_local.rb",
46
- "lib/exception_notification/custom_exception_classes.rb",
47
- "lib/exception_notification/custom_exception_methods.rb",
48
- "lib/exception_notification/deprecated_methods.rb",
49
- "lib/exception_notification/exception_notifiable.rb",
50
- "lib/exception_notification/git_blame.rb",
51
- "lib/exception_notification/helpful_hashes.rb",
52
- "lib/exception_notification/hooks_notifier.rb",
53
- "lib/exception_notification/notifiable.rb",
54
- "lib/exception_notification/notifiable_helper.rb",
55
- "lib/exception_notification/notified_task.rb",
56
- "lib/exception_notification/notifier.rb",
57
- "lib/exception_notification/notifier_helper.rb",
58
- "lib/views/exception_notification/notifier/_backtrace.html.erb",
59
- "lib/views/exception_notification/notifier/_environment.html.erb",
60
- "lib/views/exception_notification/notifier/_inspect_model.html.erb",
61
- "lib/views/exception_notification/notifier/_request.html.erb",
62
- "lib/views/exception_notification/notifier/_session.html.erb",
63
- "lib/views/exception_notification/notifier/_title.html.erb",
64
- "lib/views/exception_notification/notifier/background_exception_notification.text.plain.erb",
65
- "lib/views/exception_notification/notifier/exception_notification.text.plain.erb",
66
- "lib/views/exception_notification/notifier/rake_exception_notification.text.plain.erb",
67
- "rails/app/views/exception_notifiable/400.html",
68
- "rails/app/views/exception_notifiable/403.html",
69
- "rails/app/views/exception_notifiable/404.html",
70
- "rails/app/views/exception_notifiable/405.html",
71
- "rails/app/views/exception_notifiable/410.html",
72
- "rails/app/views/exception_notifiable/418.html",
73
- "rails/app/views/exception_notifiable/422.html",
74
- "rails/app/views/exception_notifiable/423.html",
75
- "rails/app/views/exception_notifiable/500.html",
76
- "rails/app/views/exception_notifiable/501.html",
77
- "rails/app/views/exception_notifiable/503.html",
78
- "rails/app/views/exception_notifiable/method_disabled.html.erb",
79
- "rails/init.rb",
80
- "super_exception_notifier.gemspec"
81
- ]
82
- s.homepage = %q{http://github.com/pboling/exception_notification}
83
- s.rdoc_options = ["--charset=UTF-8"]
84
- s.require_paths = ["lib"]
85
- s.rubygems_version = %q{1.3.7}
86
- s.summary = %q{Allows unhandled (and handled!) exceptions to be captured and sent via email}
87
- s.test_files = [
88
- "test/exception_notifiable_test.rb",
89
- "test/exception_notifier_helper_test.rb",
90
- "test/exception_notifier_test.rb",
91
- "test/exception_notify_functional_test.rb",
92
- "test/mocks/controllers.rb",
93
- "test/notifiable_test.rb",
94
- "test/test_helper.rb"
95
- ]
96
-
97
- if s.respond_to? :specification_version then
98
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
99
- s.specification_version = 3
100
-
101
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
102
- s.add_runtime_dependency(%q<actionmailer>, [">= 0"])
103
- s.add_runtime_dependency(%q<rake>, [">= 0"])
104
- else
105
- s.add_dependency(%q<actionmailer>, [">= 0"])
106
- s.add_dependency(%q<rake>, [">= 0"])
107
- end
108
- else
109
- s.add_dependency(%q<actionmailer>, [">= 0"])
110
- s.add_dependency(%q<rake>, [">= 0"])
111
- end
112
- end
113
-
@@ -1,34 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- class ExceptionNotifiableTest < Test::Unit::TestCase
4
-
5
- def setup
6
- @controller = BasicController.new
7
- end
8
-
9
- #Tests for the default values when ExceptionNotifiable is included in a controller
10
- def test_default_http_status_codes
11
- assert(BasicController.http_status_codes == HTTP_STATUS_CODES, "Default http_status_codes is incorrect")
12
- end
13
-
14
- def test_default_error_layout
15
- assert(BasicController.error_layout == nil, "Default error_layout is incorrect")
16
- end
17
-
18
- def test_default_error_class_status_codes
19
- assert(BasicController.error_class_status_codes == BasicController.codes_for_error_classes, "Default error_class_status_codes is incorrect")
20
- end
21
-
22
- def test_default_exception_notifiable_verbose
23
- assert(BasicController.exception_notifiable_verbose == false, "Default exception_notifiable_verbose is incorrect")
24
- end
25
-
26
- def test_default_exception_notifiable_silent_exceptions
27
- assert(BasicController.exception_notifiable_silent_exceptions == SILENT_EXCEPTIONS, "Default exception_notifiable_silent_exceptions is incorrect")
28
- end
29
-
30
- def test_default_exception_notifiable_notification_level
31
- assert(BasicController.exception_notifiable_notification_level == [:render, :email, :web_hooks], "Default exception_notifiable_notification_level is incorrect")
32
- end
33
-
34
- end
@@ -1,68 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
- #require 'exception_notification/notifier_helper'
3
-
4
- class ExceptionNotifierHelperTest < Test::Unit::TestCase
5
-
6
- class ExceptionNotifierHelperIncludeTarget
7
- include ExceptionNotification::NotifierHelper
8
- end
9
-
10
- def setup
11
- @helper = ExceptionNotifierHelperIncludeTarget.new
12
- end
13
-
14
- # No controller
15
-
16
- def test_should_not_exclude_raw_post_parameters_if_no_controller
17
- assert !@helper.exclude_raw_post_parameters?
18
- end
19
-
20
- # Controller, no filtering
21
-
22
- class ControllerWithoutFilterParameters; end
23
-
24
- def test_should_not_filter_env_values_for_raw_post_data_keys_if_controller_can_not_filter_parameters
25
- stub_controller(ControllerWithoutFilterParameters.new)
26
- assert @helper.filter_sensitive_post_data_from_env("RAW_POST_DATA", "secret").include?("secret")
27
- end
28
- def test_should_not_exclude_raw_post_parameters_if_controller_can_not_filter_parameters
29
- stub_controller(ControllerWithoutFilterParameters.new)
30
- assert !@helper.exclude_raw_post_parameters?
31
- end
32
- def test_should_return_params_if_controller_can_not_filter_parameters
33
- stub_controller(ControllerWithoutFilterParameters.new)
34
- assert_equal :params, @helper.filter_sensitive_post_data_parameters(:params)
35
- end
36
-
37
- # Controller with filter paramaters method, no params to filter
38
-
39
- class ControllerWithFilterParametersThatDoesntFilter
40
- def filter_parameters(params); params end
41
- end
42
-
43
- def test_should_filter_env_values_for_raw_post_data_keys_if_controller_can_filter_parameters
44
- stub_controller(ControllerWithFilterParametersThatDoesntFilter.new)
45
- assert !@helper.filter_sensitive_post_data_from_env("RAW_POST_DATA", "secret").include?("secret")
46
- assert @helper.filter_sensitive_post_data_from_env("SOME_OTHER_KEY", "secret").include?("secret")
47
- end
48
- def test_should_exclude_raw_post_parameters_if_controller_can_filter_parameters
49
- stub_controller(ControllerWithFilterParametersThatDoesntFilter.new)
50
- assert @helper.exclude_raw_post_parameters?
51
- end
52
-
53
- # Controller with filter paramaters method, filtering a secret param
54
-
55
- class ControllerWithFilterParametersThatDoesFilter
56
- def filter_parameters(params); :filtered end
57
- end
58
-
59
- def test_should_delegate_param_filtering_to_controller_if_controller_can_filter_parameters
60
- stub_controller(ControllerWithFilterParametersThatDoesFilter.new)
61
- assert_equal :filtered, @helper.filter_sensitive_post_data_parameters(:secret)
62
- end
63
-
64
- private
65
- def stub_controller(controller)
66
- @helper.instance_variable_set(:@controller, controller)
67
- end
68
- end
@@ -1,41 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
- require 'action_controller/test_process'
3
-
4
- class ExceptionNotifierTest < Test::Unit::TestCase
5
-
6
- def setup
7
- @controller = ActionController::Base.new
8
- @controller.request = ActionController::TestRequest.new
9
- @controller.response = ActionController::TestResponse.new
10
- @controller.params = {}
11
- @controller.send(:initialize_current_url)
12
- ActionController::Base.consider_all_requests_local = false
13
- @@delivered_mail = []
14
- ActionMailer::Base.class_eval do
15
- def deliver!(mail = @mail)
16
- @@delivered_mail << mail
17
- end
18
- end
19
- end
20
-
21
- def test_should_generate_message_without_controller
22
- begin
23
- raise 'problem'
24
- rescue RuntimeError => e
25
- assert_nothing_raised do
26
- ExceptionNotification::Notifier.deliver_exception_notification(e)
27
- end
28
- end
29
- end
30
-
31
- def test_should_generate_message_with_controller
32
- begin
33
- raise 'problem'
34
- rescue RuntimeError => e
35
- assert_nothing_raised do
36
- ExceptionNotification::Notifier.deliver_exception_notification(e, @controller, @controller.request)
37
- end
38
- end
39
- end
40
-
41
- end
@@ -1,139 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
- require 'test/unit'
3
-
4
- require File.join(File.dirname(__FILE__), 'mocks/controllers')
5
-
6
- ActionController::Routing::Routes.clear!
7
- ActionController::Routing::Routes.draw {|m| m.connect ':controller/:action/:id' }
8
-
9
- class ExceptionNotifyFunctionalTest < ActionController::TestCase
10
-
11
- def setup
12
- @request = ActionController::TestRequest.new
13
- @response = ActionController::TestResponse.new
14
- ActionController::Base.consider_all_requests_local = false
15
- @@delivered_mail = []
16
- ActionMailer::Base.class_eval do
17
- def deliver!(mail = @mail)
18
- @@delivered_mail << mail
19
- end
20
- end
21
- end
22
-
23
- def test_view_path_200; assert_view_path_for_status_cd_is_string("200"); end
24
- def test_view_path_400; assert_view_path_for_status_cd_is_string("400"); end
25
- def test_view_path_403; assert_view_path_for_status_cd_is_string("403"); end
26
- def test_view_path_404; assert_view_path_for_status_cd_is_string("404"); end
27
- def test_view_path_405; assert_view_path_for_status_cd_is_string("405"); end
28
- def test_view_path_410; assert_view_path_for_status_cd_is_string("410"); end
29
- def test_view_path_418; assert_view_path_for_status_cd_is_string("422"); end
30
- def test_view_path_422; assert_view_path_for_status_cd_is_string("422"); end
31
- def test_view_path_423; assert_view_path_for_status_cd_is_string("423"); end
32
- def test_view_path_500; assert_view_path_for_status_cd_is_string("500"); end
33
- def test_view_path_501; assert_view_path_for_status_cd_is_string("501"); end
34
- def test_view_path_503; assert_view_path_for_status_cd_is_string("503"); end
35
- def test_view_path_nil; assert_view_path_for_status_cd_is_string(nil); end
36
- def test_view_path_empty; assert_view_path_for_status_cd_is_string(""); end
37
- def test_view_path_nonsense; assert_view_path_for_status_cd_is_string("slartibartfarst"); end
38
- def test_view_path_class;
39
- exception = ExceptionNotification::CustomExceptionClasses::MethodDisabled
40
- assert_view_path_for_class_is_string(exception);
41
- assert ExceptionNotification::Notifier.get_view_path_for_class(exception).match("/rails/app/views/exception_notifiable/method_disabled.html.erb")
42
- end
43
- def test_view_path_class_nil; assert_view_path_for_class_is_string(nil); end
44
- def test_view_path_class_empty; assert_view_path_for_class_is_string(""); end
45
- def test_view_path_class_nonsense; assert_view_path_for_class_is_string("slartibartfarst"); end
46
- def test_view_path_class_integer; assert_view_path_for_class_is_string(Integer); end
47
-
48
- def test_exception_to_filenames
49
- assert(["exception_notification_custom_exception_classes_method_disabled", "method_disabled"] == ExceptionNotification::Notifier.exception_to_filenames(ExceptionNotification::CustomExceptionClasses::MethodDisabled))
50
- end
51
-
52
- def test_old_style_where_requests_are_local
53
- ActionController::Base.consider_all_requests_local = true
54
- @controller = OldStyle.new
55
- get "runtime_error"
56
- assert_nothing_mailed
57
- end
58
-
59
- def test_new_style_where_requests_are_local
60
- ActionController::Base.consider_all_requests_local = true
61
- @controller = NewStyle.new
62
- ExceptionNotification::Notifier.config[:skip_local_notification] = true
63
- get "runtime_error"
64
- assert_nothing_mailed
65
- end
66
-
67
- def test_old_style_runtime_error_sends_mail
68
- @controller = OldStyle.new
69
- get "runtime_error"
70
- assert_error_mail_contains("This is a runtime error that we should be emailed about")
71
- end
72
-
73
- def test_old_style_record_not_found_does_not_send_mail
74
- @controller = OldStyle.new
75
- get "ar_record_not_found"
76
- assert_nothing_mailed
77
- end
78
-
79
- def test_new_style_runtime_error_sends_mail
80
- @controller = NewStyle.new
81
- get "runtime_error"
82
- assert_error_mail_contains("This is a runtime error that we should be emailed about")
83
- end
84
-
85
- def test_new_style_record_not_found_does_not_send_mail
86
- @controller = NewStyle.new
87
- get "ar_record_not_found"
88
- assert_nothing_mailed
89
- end
90
-
91
- def test_controller_with_custom_silent_exceptions
92
- @controller = CustomSilentExceptions.new
93
- get "runtime_error"
94
- assert_nothing_mailed
95
- end
96
-
97
- def test_controller_with_empty_silent_exceptions
98
- @controller = EmptySilentExceptions.new
99
- get "ar_record_not_found"
100
- assert_error_mail_contains("ActiveRecord::RecordNotFound")
101
- end
102
-
103
- def test_controller_with_nil_silent_exceptions
104
- @controller = NilSilentExceptions.new
105
- get "ar_record_not_found"
106
- assert_error_mail_contains("ActiveRecord::RecordNotFound")
107
- end
108
-
109
- def test_controller_with_default_silent_exceptions
110
- @controller = DefaultSilentExceptions.new
111
- get "unknown_controller"
112
- assert_nothing_mailed
113
- end
114
-
115
- private
116
-
117
- def assert_view_path_for_status_cd_is_string(status)
118
- assert(ExceptionNotification::Notifier.get_view_path_for_status_code(status).is_a?(String), "View Path is not a string for status code '#{status}'")
119
- end
120
-
121
- def assert_view_path_for_class_is_string(exception)
122
- assert(ExceptionNotification::Notifier.get_view_path_for_class(exception).is_a?(String), "View Path is not a string for exception '#{exception}'")
123
- end
124
-
125
- def assert_error_mail_contains(text)
126
- assert(mailed_error.index(text),
127
- "Expected mailed error body to contain '#{text}', but not found. \n actual contents: \n#{mailed_error}")
128
- end
129
-
130
- def assert_nothing_mailed
131
- assert @@delivered_mail.empty?, "Expected to have NOT mailed out a notification about an error occuring, but mailed: \n#{@@delivered_mail}"
132
- end
133
-
134
- def mailed_error
135
- assert @@delivered_mail.last, "Expected to have mailed out a notification about an error occuring, but none mailed"
136
- @@delivered_mail.last.encoded
137
- end
138
-
139
- end