kinetic_cafe_error 1.1 → 1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.rdoc +33 -0
- data/Manifest.txt +3 -0
- data/README.rdoc +97 -10
- data/Rakefile +2 -0
- data/app/controllers/concerns/kinetic_cafe/error_handler.rb +13 -2
- data/config/locales/kinetic_cafe_error.en-CA.yml +2 -0
- data/config/locales/kinetic_cafe_error.en-UK.yml +2 -0
- data/config/locales/kinetic_cafe_error.en-US.yml +2 -0
- data/config/locales/kinetic_cafe_error.en.yml +2 -0
- data/config/locales/kinetic_cafe_error.fr-CA.yml +2 -0
- data/config/locales/kinetic_cafe_error.fr.yml +2 -0
- data/lib/kinetic_cafe/error.rb +136 -135
- data/lib/kinetic_cafe/error/minitest.rb +27 -2
- data/lib/kinetic_cafe/error_dsl.rb +39 -19
- data/lib/kinetic_cafe/error_engine.rb +3 -0
- data/lib/kinetic_cafe/error_module.rb +192 -0
- data/lib/kinetic_cafe/error_rspec.rb +17 -0
- data/lib/kinetic_cafe/error_tasks.rake +59 -0
- data/test/test_helper.rb +2 -1
- data/test/test_kinetic_cafe_error.rb +21 -2
- data/test/test_kinetic_cafe_error_dsl.rb +83 -2
- data/test/test_kinetic_cafe_error_hierarchy.rb +147 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f729db0dc8d7bd5d7299f904a9731348d5d22d0
|
4
|
+
data.tar.gz: 5f2cca7f8b42a6cfb4cc6cb45b6f4bc8602ac762
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2172f4681a2163199a49c1a099d84a50d6853db13db34e3462df7944239d8922c4e4e25c066ad170d8b82b4331d8ad9a33af00aae8da9b31a6b1e4449d84bb82
|
7
|
+
data.tar.gz: a134be803972f943ee5189ac97530f15c5bda8756b146d2c3996d4e89f99a9e72bd34733dc8bdc2a0860b1c92a78619d8064a4767d1859648d330dbbf8f0ea59
|
data/History.rdoc
CHANGED
@@ -1,3 +1,36 @@
|
|
1
|
+
=== 1.2 / 2015-06-08
|
2
|
+
|
3
|
+
* 1 major enhancement
|
4
|
+
|
5
|
+
* Changed the preferred way of creating an error hierarchy from just
|
6
|
+
extending the error class with KineticCafe::ErrorDSL to calling
|
7
|
+
KineticCafe.create_hierarchy. Among other options this provides, the
|
8
|
+
automatic creation of helper methods and errors based on Rack::Utils status
|
9
|
+
codes can be controlled.
|
10
|
+
|
11
|
+
* 5 minor enhancements
|
12
|
+
|
13
|
+
* Renamed KineticCafe#header_only? to KineticCafe#header? The old version is
|
14
|
+
still present but deprecated. Similarly, the option to
|
15
|
+
KineticCafe::ErrorDSL#define_error is now called +header+, but
|
16
|
+
+header_only+ also works.
|
17
|
+
|
18
|
+
* Added an option, +i18n_params+ to KineticCafe::ErrorDSL#define_error, used
|
19
|
+
to describe the I18n parameters that are expected to be provided to the
|
20
|
+
error for translations. This gets defined as a class method on the new
|
21
|
+
error. This should be passed as an array.
|
22
|
+
|
23
|
+
* Extracted most of the 'magic' functionality to KineticCafe::ErrorModule so
|
24
|
+
that useful hierarchies can be generated without inheriting directly from
|
25
|
+
KineticCafe::Error.
|
26
|
+
|
27
|
+
* Added a class method to the Rails controller concern to generate a new
|
28
|
+
rescue_from for a non-KineticCafe::Error-derived exception.
|
29
|
+
|
30
|
+
* Added a pair of rake tasks, kcerror:defined (shows defined errors) and
|
31
|
+
kcerror:translations (generates a sample translation key file).
|
32
|
+
Automatically inserted for Rails applications.
|
33
|
+
|
1
34
|
=== 1.1 / 2015-06-05
|
2
35
|
|
3
36
|
* 7 minor enhancements
|
data/Manifest.txt
CHANGED
@@ -26,8 +26,11 @@ lib/kinetic_cafe/error.rb
|
|
26
26
|
lib/kinetic_cafe/error/minitest.rb
|
27
27
|
lib/kinetic_cafe/error_dsl.rb
|
28
28
|
lib/kinetic_cafe/error_engine.rb
|
29
|
+
lib/kinetic_cafe/error_module.rb
|
29
30
|
lib/kinetic_cafe/error_rspec.rb
|
31
|
+
lib/kinetic_cafe/error_tasks.rake
|
30
32
|
lib/kinetic_cafe_error.rb
|
31
33
|
test/test_helper.rb
|
32
34
|
test/test_kinetic_cafe_error.rb
|
33
35
|
test/test_kinetic_cafe_error_dsl.rb
|
36
|
+
test/test_kinetic_cafe_error_hierarchy.rb
|
data/README.rdoc
CHANGED
@@ -9,24 +9,111 @@ continuous integration :: {<img src="https://travis-ci.org/KineticCafe/kinetic_c
|
|
9
9
|
kinetic_cafe_error provides an API-smart error base class and a DSL for
|
10
10
|
defining errors. Under Rails, it also provides a controller concern
|
11
11
|
(KineticCafe::ErrorHandler) that has a useful implementation of +rescue_from+
|
12
|
-
|
12
|
+
to handle KineticCafe::Error types.
|
13
|
+
|
14
|
+
Exceptions in a hierarchy can be handled in a uniform manner, including getting
|
15
|
+
an I18n translation message with parameters, standard status values, and
|
16
|
+
meaningful JSON representations that can be used to establish a standard error
|
17
|
+
representations across both clients and servers.
|
13
18
|
|
14
19
|
== Synopsis
|
15
20
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
not_found class: :user # =>
|
20
|
-
unauthorized class: :user # =>
|
21
|
-
forbidden class: :user # =>
|
22
|
-
conflict class: :user# =>
|
21
|
+
Define a hierarchy with KineticCafe::Error.hierarchy.
|
22
|
+
|
23
|
+
KineticCafe::Error.hierarchy class: :MyBaseError do
|
24
|
+
not_found class: :user # => MyBaseError::UserNotFound
|
25
|
+
unauthorized class: :user # => MyBaseError::UserUnauthorized
|
26
|
+
forbidden class: :user # => MyBaseError::UserForbidden
|
27
|
+
conflict class: :user# => MyBaseError::UserConflict
|
23
28
|
end
|
24
29
|
|
30
|
+
There are a few documented ways to define hierarchies. Examples for handling
|
31
|
+
exceptions can be found in the provided Minitest assertions module and the
|
32
|
+
RSpec matchers.
|
33
|
+
|
34
|
+
=== Using with Rails
|
35
|
+
|
36
|
+
When using KineticCafe::Error with Rails, KineticCafe::ErrorEngine is
|
37
|
+
automatically injected, which enables the following functionality:
|
38
|
+
|
39
|
+
* Two rake tasks:
|
40
|
+
|
41
|
+
* <tt>rake kcerror:defined</tt>, showing the errors defined in the known
|
42
|
+
hierarchy.
|
43
|
+
|
44
|
+
* <tt>rake kcerror:translations[output]</tt>, creating a template translation
|
45
|
+
file for all defined errors.
|
46
|
+
|
47
|
+
* An error view, <tt>kinetic_cafe_error/page</tt>, in ERB, HAML, and Slim
|
48
|
+
formats. This also has a partial, <tt>kinetic_cafe_error/_table</tt>. This
|
49
|
+
allows KineticCafe::Error classes to be used in HTML contexts as well as JSON
|
50
|
+
contexts.
|
51
|
+
|
52
|
+
* Access to the kinetic_cafe_error translation files for English and French,
|
53
|
+
used in logging and in the error view.
|
54
|
+
|
55
|
+
* A controller concern, KineticCafe::ErrorHandler, that defines a +rescue_from+
|
56
|
+
handler for descendants of the KineticCafe::Error class, and a error handler
|
57
|
+
generator, #kinetic_cafe_error_handler_for, that sets a +rescue_from+ handler
|
58
|
+
for a KineticCafe::Error hierarchy that does not descend from
|
59
|
+
KineticCafe::Error itself.
|
60
|
+
|
61
|
+
#kinetic_cafe_error_handler distinguishes between HTML and JSON contexts.
|
62
|
+
|
63
|
+
=== Using with Minitest
|
64
|
+
|
65
|
+
KineticCafe::Error provides a number of assertions that can help testing that
|
66
|
+
your code returns KineticCafe::Error hierarchies.
|
67
|
+
|
68
|
+
* #assert_kc_error when used with the return value of +assert_raises+, verifies
|
69
|
+
that the captured exception is the expected exception, including parameters.
|
70
|
+
Also available as #must_be_kc_error.
|
71
|
+
|
72
|
+
* assert_kc_error_json when used with a response body, verifies that the
|
73
|
+
response is the same as would be generated with the requested error class.
|
74
|
+
Also available as #must_be_kc_error_json.
|
75
|
+
|
76
|
+
* assert_response_kc_error_html works with ActiveSupport::Test; it asserts that
|
77
|
+
the +kinetic_cafe_error/page+ template has been rendered and that the
|
78
|
+
expected class I18n key is part of the response body. Depends on
|
79
|
+
<tt>@response.body</tt> being part of the available test environment.
|
80
|
+
|
81
|
+
* assert_response_kc_Error works with ActiveSupport::Test and checks
|
82
|
+
<tt>@request.format</tt> to determine whether to forward to
|
83
|
+
#assert_response_kc_error_html or #assert_kc_error_json.
|
84
|
+
|
85
|
+
Get access to these with:
|
86
|
+
|
87
|
+
require 'kinetic_cafe/error/minitest'
|
88
|
+
|
89
|
+
In your test setup code.
|
90
|
+
|
91
|
+
=== Using with RSpec (Experimental)
|
92
|
+
|
93
|
+
KineticCafe::Error provides four experimental matchers:
|
94
|
+
|
95
|
+
* +be_json_for+ verifies that the JSON in the +actual+ string or body match the
|
96
|
+
+expected+ data structure.
|
97
|
+
* +be_kc_error+ verifies that the error is the expected class and renders
|
98
|
+
properly with the same parameters.
|
99
|
+
* +be_kc_error_json+ verifies that the JSON provided that the JSON output of the
|
100
|
+
+expected+ is generates the same JSON.
|
101
|
+
* +be_kc_error_html+ verifies that the response renders the
|
102
|
+
+kinetic_cafe_error/page+ template.
|
103
|
+
|
25
104
|
== Install
|
26
105
|
|
27
|
-
Add kinetic_cafe_error to your
|
106
|
+
Add kinetic_cafe_error to your Gemfile:
|
107
|
+
|
108
|
+
gem 'kinetic_cafe_error', '~> 1.2'
|
109
|
+
|
110
|
+
If not using Rails, install with RubyGems:
|
111
|
+
|
112
|
+
gem install kinetic_cafe_error
|
113
|
+
|
114
|
+
And require where needed in your application:
|
28
115
|
|
29
|
-
|
116
|
+
require 'kinetic_cafe_error'
|
30
117
|
|
31
118
|
:include: Contributing.rdoc
|
32
119
|
:include: Licence.rdoc
|
data/Rakefile
CHANGED
@@ -7,7 +7,16 @@ module KineticCafe::ErrorHandler
|
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
|
9
9
|
included do
|
10
|
-
|
10
|
+
kinetic_cafe_error_handler_for KineticCafe::Error
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
# Create a new +rescue_from+ handler for the specified base class. Useful
|
15
|
+
# if the base is not a descendant of KineticCafe::Error, but includes
|
16
|
+
# KineticCafe::ErrorHandler.
|
17
|
+
def kinetic_cafe_error_handler_for(klass)
|
18
|
+
rescue_from klass, with: :kinetic_cafe_error_handler
|
19
|
+
end
|
11
20
|
end
|
12
21
|
|
13
22
|
# This method is called with +error+ when Rails catches a KineticCafe::Error
|
@@ -19,7 +28,9 @@ module KineticCafe::ErrorHandler
|
|
19
28
|
# controllers for different behaviour.
|
20
29
|
def kinetic_cafe_error_handler(error)
|
21
30
|
Rails.logger.error(error.message)
|
22
|
-
|
31
|
+
if error.cause
|
32
|
+
Rails.logger.error(t('kinetic_cafe_error.cause', error.cause.message))
|
33
|
+
end
|
23
34
|
|
24
35
|
respond_to do |format|
|
25
36
|
format.html do
|
data/lib/kinetic_cafe/error.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
require_relative 'error_module'
|
2
|
+
|
3
|
+
module KineticCafe # :nodoc:
|
2
4
|
# A subclass of StandardError that can render itself as a descriptive JSON
|
3
5
|
# hash, or as a hash that can be passed to a Rails controller +render+
|
4
6
|
# method.
|
@@ -9,12 +11,10 @@ module KineticCafe #:nodoc:
|
|
9
11
|
#
|
10
12
|
# == Defining an Error Hierarchy
|
11
13
|
#
|
12
|
-
# An error hierarchy is defined by
|
13
|
-
#
|
14
|
-
#
|
15
|
-
# class MyErrorBase < KineticCafe::Error
|
16
|
-
# extend KineticCafe::ErrorDSL
|
14
|
+
# An error hierarchy is defined by using KineticCafe::Error.hierarchy and
|
15
|
+
# defining error subclasses with the DSL.
|
17
16
|
#
|
17
|
+
# KineticCafe::Error.hierarchy(class: :MyErrorBase) do
|
18
18
|
# not_found class: :user # => MyErrorBase::UserNotFound
|
19
19
|
# unauthorized class: :user # => MyErrorBase::UserUnauthorized
|
20
20
|
# forbidden class: :user # => MyErrorBase::UserForbidden
|
@@ -25,147 +25,148 @@ 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.2' # :nodoc:
|
29
29
|
|
30
|
-
#
|
31
|
-
|
32
|
-
attr_reader :status
|
33
|
-
# Extra data relevant to recipients of the exception, provided on
|
34
|
-
# construction.
|
35
|
-
attr_reader :extra
|
36
|
-
# The exception that caused this exception; provided on construction.
|
37
|
-
attr_reader :cause
|
30
|
+
# Get the KineticCafe::Error functionality.
|
31
|
+
include KineticCafe::ErrorModule
|
38
32
|
|
39
|
-
# Create
|
33
|
+
# Create an error hierarchy using +options+ and the optional +block+. When
|
34
|
+
# given, the +block+ will either +yield+ the hierarchy base (if the block
|
35
|
+
# accepts arguments) or run with +instance_eval+.
|
36
|
+
#
|
37
|
+
# If the class does not already include KineticCafe::ErrorModule, it will
|
38
|
+
# be included.
|
39
|
+
#
|
40
|
+
# === Building a Hierarchy
|
41
|
+
#
|
42
|
+
# A hierarchy using KineticCafe::Error as its base can be created with
|
43
|
+
# KineticCafe::Error.hierarchy and no arguments.
|
44
|
+
#
|
45
|
+
# KineticCafe::Error.hierarchy do
|
46
|
+
# not_found class: :user # => KineticCafe::Error::UserNotFound
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# A hierarchy in a new error class (that descends from KineticCafe::Error)
|
50
|
+
# can be created by providing a class name:
|
51
|
+
#
|
52
|
+
# KineticCafe::Error.hierarchy(class: :MyErrorBase) do
|
53
|
+
# not_found class: :user # => MyErrorBase::UserNotFound
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# The new error class can itself be in a namespace, but the parent
|
57
|
+
# namespace must be identified:
|
58
|
+
#
|
59
|
+
# module My; end
|
60
|
+
#
|
61
|
+
# KineticCafe::Error.hierarchy(class: :ErrorBase, namespace: My) do
|
62
|
+
# not_found class: :user # => My::ErrorBase::UserNotFound
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# It is also possible to use an explicit descendant easily:
|
66
|
+
#
|
67
|
+
# module My
|
68
|
+
# ErrorBase = Class.new(KineticCafe::Error)
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# KineticCafe::Error.hierarchy(class: My::ErrorBase) do
|
72
|
+
# not_found class: :user # => My::ErrorBase::UserNotFound
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
# === Rack::Utils Errors and Helpers
|
76
|
+
#
|
77
|
+
# By default, when Rack::Utils is present, KineticCafe::Error will present
|
78
|
+
# helper methods and default HTTP status code errors.
|
79
|
+
#
|
80
|
+
# KineticCafe::Error.hierarchy do
|
81
|
+
# not_found class: :user # => KineticCafe::Error::UserNotFound
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# KineticCafe::Error::UserNotFound.new.status # => :not_found / 404
|
85
|
+
# KineticCafe::Error::NotFound.new.status # => :not_found
|
86
|
+
#
|
87
|
+
# These may be controlled with the option +rack_status+. If provided as
|
88
|
+
# +false+, neither will be created:
|
89
|
+
#
|
90
|
+
# KineticCafe::Error.hierarchy(rack_status: false) do
|
91
|
+
# not_found class: :user # => raises NoMethodError
|
92
|
+
# end
|
93
|
+
#
|
94
|
+
# fail KineticCafe::Error::NotFound # => raises NameError
|
95
|
+
#
|
96
|
+
# These may be controlled individually, as well. Disable the methods:
|
97
|
+
#
|
98
|
+
# KineticCafe::Error.hierarchy(rack_status: { methods: false }) do
|
99
|
+
# not_found class: :user # => raises NoMethodError
|
100
|
+
# end
|
101
|
+
#
|
102
|
+
# fail KineticCafe::Error::NotFound # => works
|
103
|
+
#
|
104
|
+
# Disable the default error classes:
|
105
|
+
#
|
106
|
+
# KineticCafe::Error.hierarchy(rack_status: { errors: false }) do
|
107
|
+
# not_found class: :user # => KineticCafe::Error::UserNotFound
|
108
|
+
# end
|
109
|
+
#
|
110
|
+
# fail KineticCafe::Error::NotFound # => raises NoMethodError
|
40
111
|
#
|
41
112
|
# === Options
|
42
113
|
#
|
43
|
-
# +
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
# +
|
48
|
-
#
|
49
|
-
# +
|
50
|
-
#
|
51
|
-
# +
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
# :call-seq:
|
66
|
-
# new(message, options = {})
|
67
|
-
# new(options)
|
68
|
-
def initialize(*args)
|
69
|
-
options = args.last.kind_of?(Hash) ? args.pop.dup : {}
|
70
|
-
@message = args.shift
|
71
|
-
@message = options.delete(:message) if @message.nil? || @message.empty?
|
72
|
-
options.delete(:message)
|
73
|
-
|
74
|
-
@message && @message.freeze
|
75
|
-
|
76
|
-
@status = options.delete(:status) || default_status
|
77
|
-
@i18n_params = options.delete(:i18n_params) || {}
|
78
|
-
@extra = options.delete(:extra)
|
79
|
-
@cause = options.delete(:cause)
|
80
|
-
|
81
|
-
@i18n_params.update(cause: cause.message) if cause
|
82
|
-
|
83
|
-
query = options.delete(:query)
|
84
|
-
@i18n_params.merge!(query: stringify(query)) if query
|
85
|
-
@i18n_params.merge!(options)
|
86
|
-
@i18n_params.freeze
|
87
|
-
end
|
88
|
-
|
89
|
-
# The message associated with this exception. If not provided, defaults to
|
90
|
-
# #i18n_message.
|
91
|
-
def message
|
92
|
-
@message || i18n_message
|
93
|
-
end
|
94
|
-
|
95
|
-
# The name of the error class.
|
96
|
-
def name
|
97
|
-
@name ||= KineticCafe::ErrorDSL.namify(self.class.name)
|
98
|
-
end
|
99
|
-
|
100
|
-
# The key used for I18n translation.
|
101
|
-
def i18n_key
|
102
|
-
@i18n_key ||= "#{self.class.i18n_key_base}.#{name}".freeze
|
103
|
-
end
|
104
|
-
alias_method :code, :i18n_key
|
114
|
+
# +class+:: If given, identifies the base class and host namespace of the
|
115
|
+
# error hierarchy. Provided as a class, that class is used.
|
116
|
+
# Provided as a symbol, creates a new class that descends from
|
117
|
+
# KineticCafe::Error.
|
118
|
+
# +namespace+:: If +class+ is provided as a symbol, this namespace will be
|
119
|
+
# the one where the new error class is created.
|
120
|
+
# +rack_status+:: Controls the creation of error-definition helper methods
|
121
|
+
# and errors based on Rack::Utils status codes (e.g.,
|
122
|
+
# +not_found+). +true+ creates both; +false+ disables both.
|
123
|
+
# The values <tt>{ methods: false }</tt> and <tt>{ errors:
|
124
|
+
# false }</tt> individually control one.
|
125
|
+
def self.hierarchy(options = {}, &block) # :yields base:
|
126
|
+
base = options.fetch(:class, self)
|
127
|
+
|
128
|
+
if base.kind_of?(Symbol)
|
129
|
+
ns = options.fetch(:namespace, Object)
|
130
|
+
base = if ns.const_defined?(base)
|
131
|
+
ns.const_get(base)
|
132
|
+
else
|
133
|
+
ns.const_set(base, Class.new(self))
|
134
|
+
end
|
135
|
+
end
|
105
136
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
false
|
110
|
-
end
|
137
|
+
if base.singleton_class < KineticCafe::ErrorDSL
|
138
|
+
fail "#{base} is already a root hierarchy"
|
139
|
+
end
|
111
140
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
false
|
116
|
-
end
|
141
|
+
unless base <= ::StandardError
|
142
|
+
fail "#{base} cannot root a hierarchy (not a StandardError)"
|
143
|
+
end
|
117
144
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
@i18n_message ||= if defined?(I18n.translate)
|
122
|
-
I18n.translate(i18n_key, @i18n_params).freeze
|
123
|
-
else
|
124
|
-
[ i18n_key, @i18n_params ].freeze
|
125
|
-
end
|
126
|
-
end
|
145
|
+
unless base <= KineticCafe::ErrorModule
|
146
|
+
base.send(:include, KineticCafe::ErrorModule)
|
147
|
+
end
|
127
148
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
status: status,
|
134
|
-
name: name,
|
135
|
-
internal: internal?,
|
136
|
-
i18n_message: i18n_message,
|
137
|
-
i18n_key: i18n_key,
|
138
|
-
i18n_params: @i18n_params,
|
139
|
-
cause: cause && cause.message,
|
140
|
-
extra: extra
|
141
|
-
}.delete_if { |_, v| v.nil? || (v.respond_to?(:empty?) && v.empty?) }
|
142
|
-
end
|
143
|
-
alias_method :as_json, :api_error
|
149
|
+
unless rs_defined = base.respond_to?(:__rack_status)
|
150
|
+
base.send :define_singleton_method, :__rack_status do
|
151
|
+
options.fetch(:rack_status, { errors: true, methods: true })
|
152
|
+
end
|
153
|
+
end
|
144
154
|
|
145
|
-
|
146
|
-
def error_result
|
147
|
-
{ error: api_error, message: message }
|
148
|
-
end
|
155
|
+
base.send(:extend, KineticCafe::ErrorDSL)
|
149
156
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
# Nice debugging version of a KineticCafe::Error
|
159
|
-
def inspect
|
160
|
-
"#<#{self.class}: name=#{name} status=#{status} " \
|
161
|
-
"message=#{message.inspect} i18n_key=#{i18n_key} " \
|
162
|
-
"i18n_params=#{@i18n_params.inspect} extra=#{extra.inspect} " \
|
163
|
-
"cause=#{cause}>"
|
164
|
-
end
|
157
|
+
if block_given?
|
158
|
+
if block.arity > 0
|
159
|
+
yield base
|
160
|
+
else
|
161
|
+
base.instance_eval(&block)
|
162
|
+
end
|
163
|
+
end
|
165
164
|
|
166
|
-
|
167
|
-
|
168
|
-
|
165
|
+
base
|
166
|
+
ensure
|
167
|
+
if base.respond_to?(:__rack_status) && !rs_defined
|
168
|
+
base.singleton_class.send :undef_method, :__rack_status
|
169
|
+
end
|
169
170
|
end
|
170
171
|
|
171
172
|
private
|