kinetic_cafe_error 1.7 → 1.8.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.
- 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:
|