kinetic_cafe_error 1.7 → 1.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.rdoc +11 -0
- data/README.rdoc +14 -1
- data/Rakefile +1 -0
- data/app/controllers/concerns/kinetic_cafe/error_handler.rb +21 -4
- data/lib/kinetic_cafe/error.rb +5 -1
- data/lib/kinetic_cafe/error_dsl.rb +22 -14
- data/lib/kinetic_cafe/error_module.rb +10 -3
- data/test/test_kinetic_cafe_error.rb +4 -1
- data/test/test_kinetic_cafe_error_dsl.rb +21 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc17826f6f7567f2438621fac02064e64fae64ba
|
4
|
+
data.tar.gz: 8ee581bf23ad9bbedcb42638e01d159773f02c35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3398f8cefdabc226f3851a6b4ecf7e9a3dc0db0c135a66699341e71367ab53852745b09cf8856043ba79223a9e096c13ba83ff2405c008effe35979ae494e038
|
7
|
+
data.tar.gz: da175a041e62246c34e837723e0f631b9150f96891aec8271396464aaa3c09dcd456381aa689019bf9b17f04aa3b9b8110fe99874e21c9c143947fc60e1029f7
|
data/History.rdoc
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
=== 1.8.1 / 2015-10-26
|
2
|
+
|
3
|
+
* Re-release because 1.8 was yanked
|
4
|
+
|
5
|
+
=== 1.8 / 2015-10-26
|
6
|
+
|
7
|
+
* 1 minor enhancement:
|
8
|
+
|
9
|
+
* Add +kinetic_cafe_error_handle_post_error+ to allow for capturing or
|
10
|
+
post-processing of errors after logging and handling.
|
11
|
+
|
1
12
|
=== 1.7 / 2015-08-05
|
2
13
|
|
3
14
|
* 1 minor enhancement:
|
data/README.rdoc
CHANGED
@@ -65,6 +65,19 @@ automatically injected, which enables the following functionality:
|
|
65
65
|
that can be provided with the kinetic_cafe_error_handler_log_locale helper
|
66
66
|
method.
|
67
67
|
|
68
|
+
The error can be then captured for processing by providing the
|
69
|
+
kinetic_cafe_error_handle_post_error method.
|
70
|
+
|
71
|
+
Example for capturing KineticCafe::Errors with raven-ruby for Sentry:
|
72
|
+
|
73
|
+
ExampleController < ActionController
|
74
|
+
include KineticCafe::ErrorHandler
|
75
|
+
|
76
|
+
def kinetic_cafe_error_handle_post_error(error)
|
77
|
+
Raven.capture_exception(error)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
68
81
|
=== Using with Minitest
|
69
82
|
|
70
83
|
KineticCafe::Error provides a number of assertions that can help testing that
|
@@ -110,7 +123,7 @@ KineticCafe::Error provides four experimental matchers:
|
|
110
123
|
|
111
124
|
Add kinetic_cafe_error to your Gemfile:
|
112
125
|
|
113
|
-
gem 'kinetic_cafe_error', '~> 1.
|
126
|
+
gem 'kinetic_cafe_error', '~> 1.8'
|
114
127
|
|
115
128
|
If not using Rails, install with RubyGems:
|
116
129
|
|
data/Rakefile
CHANGED
@@ -35,12 +35,19 @@ module KineticCafe::ErrorHandler
|
|
35
35
|
# This method is called with +error+ when Rails catches a KineticCafe::Error
|
36
36
|
# descendant. It logs the message and its cause as severity error. After
|
37
37
|
# logging as +error+, it will render to HTML or JSON. The received error is
|
38
|
-
# logged using the value of #kinetic_cafe_error_handler_log_locale.
|
38
|
+
# logged using the value of #kinetic_cafe_error_handler_log_locale. After
|
39
|
+
# rendering to HTML or JSON, +error+ will be passed to a post-processing
|
40
|
+
# handler.
|
39
41
|
#
|
40
42
|
# HTML is rendered with #kinetic_cafe_error_render_html. JSON is rendered
|
41
43
|
# with #kinetic_cafe_error_render_json. Either of these can be overridden in
|
42
44
|
# controllers for different behaviour.
|
43
45
|
#
|
46
|
+
# The +error+ is passed to #kinetic_cafe_error_handle_post_error to be
|
47
|
+
# handled for post-processing. This should be overridden to implement
|
48
|
+
# post-processing, for example passing the error to an external error
|
49
|
+
# capturing/tracking service such as Airbrake or Sentry.
|
50
|
+
#
|
44
51
|
# As an option, +kinetic_cafe_error_handler+ can also be used in a
|
45
52
|
# +rescue_from+ block with an error class and parameters, and it will
|
46
53
|
# construct the error for handling. The following example assumes that there
|
@@ -72,6 +79,8 @@ module KineticCafe::ErrorHandler
|
|
72
79
|
kinetic_cafe_error_render_json(error)
|
73
80
|
end
|
74
81
|
end
|
82
|
+
|
83
|
+
kinetic_cafe_error_handle_post_error(error)
|
75
84
|
end
|
76
85
|
|
77
86
|
# Render the +error+ as HTML. Uses the template +kinetic_cafe_error/page+
|
@@ -101,16 +110,24 @@ module KineticCafe::ErrorHandler
|
|
101
110
|
end
|
102
111
|
end
|
103
112
|
|
113
|
+
def kinetic_cafe_error_handle_post_error(_error)
|
114
|
+
end
|
115
|
+
|
104
116
|
# Write the provided error to the Rails log using the value of
|
105
117
|
# #kinetic_cafe_error_handler_log_locale. If the error has a cause, log
|
106
|
-
# that as well.
|
118
|
+
# that as well. Rails.logger.class is expected to have constants matching
|
119
|
+
# error.severity.upcase, which is used to determine the numeric severity
|
120
|
+
# to log the error at.
|
107
121
|
def kinetic_cafe_error_log_error(error)
|
108
122
|
locale = self.class.kinetic_cafe_error_handler_log_locale
|
109
|
-
Rails.logger.
|
123
|
+
severity = Rails.logger.class.const_get(error.severity.upcase)
|
124
|
+
Rails.logger.add(severity, nil, error.message(locale))
|
110
125
|
|
111
126
|
return unless error.cause
|
112
127
|
|
113
|
-
Rails.logger.
|
128
|
+
Rails.logger.add(
|
129
|
+
severity,
|
130
|
+
nil,
|
114
131
|
t(
|
115
132
|
'kinetic_cafe_error.cause',
|
116
133
|
message: error.cause.message,
|
data/lib/kinetic_cafe/error.rb
CHANGED
@@ -25,7 +25,7 @@ module KineticCafe # :nodoc:
|
|
25
25
|
# rescue clause and handled there, as is shown in the included
|
26
26
|
# KineticCafe::ErrorHandler controller concern for Rails.
|
27
27
|
class Error < ::StandardError
|
28
|
-
VERSION = '1.
|
28
|
+
VERSION = '1.8.1' # :nodoc:
|
29
29
|
|
30
30
|
# Get the KineticCafe::Error functionality.
|
31
31
|
include KineticCafe::ErrorModule
|
@@ -176,6 +176,10 @@ module KineticCafe # :nodoc:
|
|
176
176
|
defined?(Rack::Utils) && :bad_request || 400
|
177
177
|
end
|
178
178
|
|
179
|
+
def default_severity
|
180
|
+
:error
|
181
|
+
end
|
182
|
+
|
179
183
|
def stringify(object, namespace = nil)
|
180
184
|
case object
|
181
185
|
when Hash
|
@@ -53,22 +53,25 @@ module KineticCafe
|
|
53
53
|
# Define a new error as a subclass of the exception hosting ErrorDSL.
|
54
54
|
# Options is a Hash supporting the following values:
|
55
55
|
#
|
56
|
-
# +status+::
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
# +
|
61
|
-
#
|
62
|
-
#
|
63
|
-
# +
|
64
|
-
#
|
56
|
+
# +status+:: A number or Ruby symbol representing the HTTP status code
|
57
|
+
# associated with this error. If not provided, defaults to
|
58
|
+
# :bad_request. Must be provided if +class+ is provided. HTTP
|
59
|
+
# status codes are defined in Rack::Utils.
|
60
|
+
# +severity+:: A Ruby symbol representing the severity level associated
|
61
|
+
# with this error. If not provided, defaults to :error. Error
|
62
|
+
# severity levels are defined in Logger::Severity.
|
63
|
+
# +key+:: The name of the error class to be created. Provide as a
|
64
|
+
# snake_case value that will be turned into a camelized class
|
65
|
+
# name. Mutually exclusive with +class+.
|
66
|
+
# +class+:: The name of the class the error is for. If present, +status+
|
67
|
+
# must be provided to create a complete error class. That is,
|
65
68
|
#
|
66
|
-
#
|
69
|
+
# define_error class: :object, status: :not_found
|
67
70
|
#
|
68
|
-
#
|
69
|
-
# +header+::
|
70
|
-
#
|
71
|
-
#
|
71
|
+
# will create an +ObjectNotFound+ error class.
|
72
|
+
# +header+:: Indicates that when this is caught, it should not be
|
73
|
+
# returned with full details, but should instead be treated as
|
74
|
+
# a header-only API response. Also available as +header_only+.
|
72
75
|
# +internal+:: Generates a response that indicates to clients that the
|
73
76
|
# error should not be shown to users.
|
74
77
|
# +i18n_params+:: An array of parameter names that are expected to be
|
@@ -80,6 +83,7 @@ module KineticCafe
|
|
80
83
|
|
81
84
|
options = options.dup
|
82
85
|
status = options[:status]
|
86
|
+
severity = options[:severity]
|
83
87
|
|
84
88
|
klass = options.delete(:class)
|
85
89
|
if klass
|
@@ -137,7 +141,11 @@ module KineticCafe
|
|
137
141
|
status ||= defined?(Rack::Utils) && :bad_request || 400
|
138
142
|
status.freeze
|
139
143
|
|
144
|
+
severity ||= :error
|
145
|
+
severity.freeze
|
146
|
+
|
140
147
|
error.send :define_method, :default_status, -> { status } if status
|
148
|
+
error.send :define_method, :default_severity, -> { severity } if severity
|
141
149
|
error.send :private, :default_status
|
142
150
|
|
143
151
|
const_set(error_name, error)
|
@@ -6,6 +6,9 @@ module KineticCafe # :nodoc:
|
|
6
6
|
# The HTTP status to be returned. If not provided in the constructor, uses
|
7
7
|
# #default_status.
|
8
8
|
attr_reader :status
|
9
|
+
# The severity to be returned. If not provided in the constructor, uses
|
10
|
+
# #default_severity
|
11
|
+
attr_reader :severity
|
9
12
|
# Extra data relevant to recipients of the exception, provided on
|
10
13
|
# construction.
|
11
14
|
attr_reader :extra
|
@@ -39,6 +42,8 @@ module KineticCafe # :nodoc:
|
|
39
42
|
# value.
|
40
43
|
# +status+:: An override to the HTTP status code to be returned by this
|
41
44
|
# error by default.
|
45
|
+
# +severity+:: An override to the default severity to be returned by this
|
46
|
+
# error.
|
42
47
|
# +i18n_params+:: The parameters to be sent to I18n.translate with the
|
43
48
|
# #i18n_key.
|
44
49
|
# +cause+:: The exception that caused this error. Used to wrap an earlier
|
@@ -69,6 +74,7 @@ module KineticCafe # :nodoc:
|
|
69
74
|
@message && @message.freeze
|
70
75
|
|
71
76
|
@status = options.delete(:status) || default_status
|
77
|
+
@severity = options.delete(:severity) || default_severity
|
72
78
|
@i18n_params = options.delete(:i18n_params) || {}
|
73
79
|
@extra = options.delete(:extra)
|
74
80
|
|
@@ -147,6 +153,7 @@ module KineticCafe # :nodoc:
|
|
147
153
|
{
|
148
154
|
message: @message,
|
149
155
|
status: status,
|
156
|
+
severity: severity,
|
150
157
|
name: name,
|
151
158
|
internal: internal?,
|
152
159
|
i18n_message: i18n_message,
|
@@ -174,9 +181,9 @@ module KineticCafe # :nodoc:
|
|
174
181
|
# Nice debugging version of a KineticCafe::Error
|
175
182
|
def inspect
|
176
183
|
"#<#{self.class}: name=#{name} status=#{status} " \
|
177
|
-
"message=#{message.inspect}
|
178
|
-
"
|
179
|
-
"cause=#{cause}>"
|
184
|
+
"severity=#{severity} message=#{message.inspect} " \
|
185
|
+
"i18n_key=#{i18n_key} i18n_params=#{@i18n_params.inspect} " \
|
186
|
+
"extra=#{extra.inspect} cause=#{cause}>"
|
180
187
|
end
|
181
188
|
|
182
189
|
private
|
@@ -7,7 +7,7 @@ describe KineticCafe::Error do
|
|
7
7
|
it 'defaults correctly' do
|
8
8
|
stub I18n, :translate, 'Untranslatable error' do
|
9
9
|
expected = '#<KineticCafe::Error: name=error ' \
|
10
|
-
|
10
|
+
'status=bad_request severity=error message="Untranslatable error" ' \
|
11
11
|
'i18n_key=kcerrors.error i18n_params={} extra=nil cause=>'
|
12
12
|
assert_equal expected, exception.inspect
|
13
13
|
end
|
@@ -91,6 +91,7 @@ describe KineticCafe::Error do
|
|
91
91
|
assert_equal(
|
92
92
|
{
|
93
93
|
status: :bad_request,
|
94
|
+
severity: :error,
|
94
95
|
name: 'error',
|
95
96
|
internal: false,
|
96
97
|
i18n_key: 'kcerrors.error'
|
@@ -104,6 +105,7 @@ describe KineticCafe::Error do
|
|
104
105
|
{
|
105
106
|
error: {
|
106
107
|
status: :bad_request,
|
108
|
+
severity: :error,
|
107
109
|
name: 'error',
|
108
110
|
internal: false,
|
109
111
|
i18n_key: 'kcerrors.error'
|
@@ -121,6 +123,7 @@ describe KineticCafe::Error do
|
|
121
123
|
json: {
|
122
124
|
error: {
|
123
125
|
status: :bad_request,
|
126
|
+
severity: :error,
|
124
127
|
name: 'error',
|
125
128
|
internal: false,
|
126
129
|
i18n_key: 'kcerrors.error'
|
@@ -99,6 +99,11 @@ describe KineticCafe::ErrorDSL do
|
|
99
99
|
assert_equal 400, instance.send(:default_status)
|
100
100
|
end
|
101
101
|
end
|
102
|
+
|
103
|
+
it 'returns :error for #default_severity (private)' do
|
104
|
+
refute base.private_instance_methods.include?(:default_severity)
|
105
|
+
assert_equal :error, instance.send(:default_severity)
|
106
|
+
end
|
102
107
|
end
|
103
108
|
|
104
109
|
describe 'class-based definition' do
|
@@ -138,6 +143,22 @@ describe KineticCafe::ErrorDSL do
|
|
138
143
|
assert_equal 400, instance.send(:default_status)
|
139
144
|
end
|
140
145
|
end
|
146
|
+
|
147
|
+
it 'returns :error for #default_severity (private)' do
|
148
|
+
refute base.private_instance_methods.include?(:default_severity)
|
149
|
+
assert_equal :error, instance.send(:default_severity)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
describe 'with severity' do
|
154
|
+
let(:child) {
|
155
|
+
base.define_error class: :child, severity: :fatal
|
156
|
+
}
|
157
|
+
|
158
|
+
it 'returns :fatal for #default_severity (private)' do
|
159
|
+
refute base.private_instance_methods.include?(:default_severity)
|
160
|
+
assert_equal :fatal, instance.send(:default_severity)
|
161
|
+
end
|
141
162
|
end
|
142
163
|
|
143
164
|
describe 'with symbol status' do
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kinetic_cafe_error
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Austin Ziegler
|
8
|
+
- Jero Sutlovic
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-
|
12
|
+
date: 2015-10-26 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: minitest
|
@@ -16,14 +17,14 @@ dependencies:
|
|
16
17
|
requirements:
|
17
18
|
- - "~>"
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version: '5.
|
20
|
+
version: '5.8'
|
20
21
|
type: :development
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
25
|
- - "~>"
|
25
26
|
- !ruby/object:Gem::Version
|
26
|
-
version: '5.
|
27
|
+
version: '5.8'
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
name: rdoc
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -302,6 +303,7 @@ description: |-
|
|
302
303
|
representations across both clients and servers.
|
303
304
|
email:
|
304
305
|
- aziegler@kineticcafe.com
|
306
|
+
- jsutlovic@kineticcafe.com
|
305
307
|
executables: []
|
306
308
|
extensions: []
|
307
309
|
extra_rdoc_files:
|