kinetic_cafe_error 1.11 → 1.12
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.md +25 -0
- data/Manifest.txt +1 -0
- data/lib/kinetic_cafe/error.rb +2 -2
- data/lib/kinetic_cafe/error_dsl.rb +54 -18
- data/lib/kinetic_cafe/error_tasks.rb +117 -75
- data/test/test_error_tasks.rb +95 -0
- data/test/test_helper.rb +1 -0
- data/test/test_kinetic_cafe_error_dsl.rb +40 -0
- data/test/test_kinetic_cafe_error_hierarchy.rb +4 -0
- metadata +4 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ac74dac14f83a0930ff010ec22ee5f38779bc0fb
|
|
4
|
+
data.tar.gz: 2d538e50f54639617655dc5e3d8486bdb66730f2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a2475041b6851c65005929b3640abd492f625dcee28dee0e7d7c8f57e79c2a0bda44731540a48b483e2e438b65be789381a743c21b06d80c90420e60a800ed77
|
|
7
|
+
data.tar.gz: 8098e1494dc7c9c12c201e71d8cce5cd7ad3d48ae8602e144ddc83026d8f1c384cf9766a8b52f10e54fcf404a4a518d3fd1b6560e23530f7fec36d37e3e7a105
|
data/History.md
CHANGED
|
@@ -1,3 +1,28 @@
|
|
|
1
|
+
### 1.12 / 2016-05-27
|
|
2
|
+
|
|
3
|
+
* 4 major enhancements:
|
|
4
|
+
|
|
5
|
+
* Replace the use of ObjectSpace with a custom system to get a list of the
|
|
6
|
+
children of StandardError. This makes the provided rake tasks compatible
|
|
7
|
+
with JRuby.
|
|
8
|
+
|
|
9
|
+
* Refactor rake tasks into methods and add tests for those methods.
|
|
10
|
+
|
|
11
|
+
* Errors can now be declared in a severity block where their default_severity
|
|
12
|
+
will be different from the default of :error.
|
|
13
|
+
|
|
14
|
+
* Error-declarations can accept a block with other error-declaratons in them,
|
|
15
|
+
allowing for nested error hierarchies.
|
|
16
|
+
|
|
17
|
+
* 1 bug fix:
|
|
18
|
+
|
|
19
|
+
* Use String#new when we need mutable strings.
|
|
20
|
+
|
|
21
|
+
* 1 minor enhancement:
|
|
22
|
+
|
|
23
|
+
* If the controller instance does not respond to the 'respond_to' method,
|
|
24
|
+
then we default to rendering a JSON response.
|
|
25
|
+
|
|
1
26
|
### 1.11 / 2016-05-24
|
|
2
27
|
|
|
3
28
|
* 1 minor enhancement:
|
data/Manifest.txt
CHANGED
data/lib/kinetic_cafe/error.rb
CHANGED
|
@@ -26,7 +26,7 @@ module KineticCafe # :nodoc:
|
|
|
26
26
|
# rescue clause and handled there, as is shown in the included
|
|
27
27
|
# KineticCafe::ErrorHandler controller concern for Rails.
|
|
28
28
|
class Error < ::StandardError
|
|
29
|
-
VERSION = '1.
|
|
29
|
+
VERSION = '1.12' # :nodoc:
|
|
30
30
|
|
|
31
31
|
# Get the KineticCafe::Error functionality.
|
|
32
32
|
include KineticCafe::ErrorModule
|
|
@@ -175,4 +175,4 @@ end
|
|
|
175
175
|
|
|
176
176
|
require_relative 'error_dsl'
|
|
177
177
|
require_relative 'error_engine' if defined?(::Rails)
|
|
178
|
-
require_relative 'error_tasks' if defined?(::Rake
|
|
178
|
+
require_relative 'error_tasks' if defined?(::Rake)
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
# frozen_string_literal:
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
##
|
|
2
4
|
module KineticCafe
|
|
3
5
|
# Make defining new children of KineticCafe::Error easy. Adds the
|
|
4
|
-
# #define_error method.
|
|
6
|
+
# #define_error method and #severity block modifier.
|
|
5
7
|
#
|
|
6
8
|
# If using when Rack is present, useful variant methodss are provided
|
|
7
9
|
# matching Rack status symbol codes. These set the default status to the Rack
|
|
@@ -78,7 +80,10 @@ module KineticCafe
|
|
|
78
80
|
# +i18n_params+:: An array of parameter names that are expected to be
|
|
79
81
|
# provided for translation. This helps document the
|
|
80
82
|
# expected translations.
|
|
81
|
-
|
|
83
|
+
#
|
|
84
|
+
# If a +block+ is provided, errors may be defined as subclasses of the error
|
|
85
|
+
# defined here.
|
|
86
|
+
def define_error(options, &block)
|
|
82
87
|
fail ArgumentError, 'invalid options' unless options.kind_of?(Hash)
|
|
83
88
|
fail ArgumentError, 'define what error?' if options.empty?
|
|
84
89
|
|
|
@@ -91,10 +96,12 @@ module KineticCafe
|
|
|
91
96
|
fail ArgumentError, ":key conflicts with class:#{klass}" if options.key?(:key)
|
|
92
97
|
|
|
93
98
|
key = if status.kind_of?(Symbol) || status.kind_of?(String)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
99
|
+
"#{klass}_#{KineticCafe::ErrorDSL.namify(status)}"
|
|
100
|
+
else
|
|
101
|
+
"#{klass}_#{KineticCafe::ErrorDSL.namify(name)}"
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
key = String.new(key)
|
|
98
105
|
else
|
|
99
106
|
key = options.fetch(:key) {
|
|
100
107
|
fail ArgumentError, 'one of :key or :class must be provided'
|
|
@@ -115,7 +122,7 @@ module KineticCafe
|
|
|
115
122
|
i18n_key = "#{i18n_key_base}.#{key}"
|
|
116
123
|
|
|
117
124
|
if const_defined?(error_name)
|
|
118
|
-
message = "key:#{key} already exists as #{error_name}"
|
|
125
|
+
message = String.new("key:#{key} already exists as #{error_name}")
|
|
119
126
|
message << " with class:#{klass}" if klass
|
|
120
127
|
fail ArgumentError, message
|
|
121
128
|
end
|
|
@@ -141,27 +148,52 @@ module KineticCafe
|
|
|
141
148
|
status ||= defined?(Rack::Utils) && :bad_request || 400
|
|
142
149
|
status.freeze
|
|
143
150
|
|
|
144
|
-
|
|
151
|
+
if status
|
|
152
|
+
error.send :define_method, :default_status, -> { status }
|
|
153
|
+
error.send :private, :default_status
|
|
154
|
+
error.send :define_singleton_method, :default_status, -> { status }
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
severity ||= @severity || :error
|
|
145
158
|
severity.freeze
|
|
146
159
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
160
|
+
if severity
|
|
161
|
+
error.send :define_method, :default_severity, -> { severity }
|
|
162
|
+
error.send :define_singleton_method, :default_severity, -> { severity }
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
error.instance_exec(&block) if block
|
|
150
166
|
|
|
151
167
|
const_set(error_name, error)
|
|
152
168
|
end
|
|
153
169
|
|
|
154
|
-
|
|
155
|
-
|
|
170
|
+
# Temporarily override the default severity with +value+ for errors defined in
|
|
171
|
+
# the provided +block+.
|
|
172
|
+
def severity(value, &block)
|
|
173
|
+
old_severity, @severity = @severity, value
|
|
174
|
+
fail 'Severity must have a block' unless block
|
|
175
|
+
instance_exec(&block)
|
|
176
|
+
ensure
|
|
177
|
+
@severity = old_severity
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Keep track of subclasses of errors using ErrorDSL.
|
|
181
|
+
def inherited(subclass) #:nodoc:
|
|
182
|
+
super
|
|
183
|
+
KineticCafe::ErrorDSL.inheritors << subclass
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def self.included(_mod) # :nodoc:
|
|
156
187
|
fail "#{self} cannot be included"
|
|
157
188
|
end
|
|
158
189
|
|
|
159
|
-
|
|
160
|
-
def self.extended(base)
|
|
190
|
+
def self.extended(base) # :nodoc:
|
|
161
191
|
unless base < ::StandardError
|
|
162
192
|
fail "#{self} cannot extend #{base} (not a StandardError)"
|
|
163
193
|
end
|
|
164
194
|
|
|
195
|
+
inheritors << base
|
|
196
|
+
|
|
165
197
|
rack_status = base.__rack_status if base.respond_to?(:__rack_status)
|
|
166
198
|
|
|
167
199
|
case rack_status
|
|
@@ -178,8 +210,8 @@ module KineticCafe
|
|
|
178
210
|
# Make the Rack names safe to use
|
|
179
211
|
name = name.to_s.gsub(/[^[:word:]]/, '_').squeeze('_').to_sym
|
|
180
212
|
if rack_status.fetch(:methods, true)
|
|
181
|
-
base.singleton_class.send :define_method, name do |options = {}|
|
|
182
|
-
define_error(options.merge(status: name))
|
|
213
|
+
base.singleton_class.send :define_method, name do |options = {}, &block|
|
|
214
|
+
define_error(options.merge(status: name), &block)
|
|
183
215
|
end
|
|
184
216
|
end
|
|
185
217
|
|
|
@@ -189,5 +221,9 @@ module KineticCafe
|
|
|
189
221
|
end
|
|
190
222
|
end
|
|
191
223
|
end
|
|
224
|
+
|
|
225
|
+
def self.inheritors # :nodoc:
|
|
226
|
+
@inheritors ||= []
|
|
227
|
+
end
|
|
192
228
|
end
|
|
193
229
|
end
|
|
@@ -1,102 +1,144 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'kinetic_cafe_error'
|
|
4
|
+
|
|
3
5
|
module KineticCafe
|
|
4
6
|
# Tasks to assist with managing kinetic_cafe_error classes in Rake.
|
|
5
7
|
module ErrorTasks #:nodoc:
|
|
6
|
-
|
|
8
|
+
require 'rake' unless defined?(::Rake)
|
|
9
|
+
|
|
10
|
+
extend ::Rake::DSL
|
|
7
11
|
end
|
|
8
12
|
end
|
|
9
13
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
display = ->(root, prefix: '', show_params: false) {
|
|
18
|
-
line = "#{prefix}- #{root}"
|
|
19
|
-
|
|
20
|
-
if !root.i18n_params.empty? && show_params
|
|
21
|
-
line << ' (' << root.i18n_params.join(', ') << ')'
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
puts line
|
|
25
|
-
|
|
26
|
-
if @descendants[root]
|
|
27
|
-
sorted = @descendants[root].sort_by(&:to_s)
|
|
28
|
-
sorted.each do |child|
|
|
29
|
-
s = (child == sorted.last) ? '`' : '|'
|
|
30
|
-
display.(
|
|
31
|
-
child,
|
|
32
|
-
prefix: "#{prefix.tr('|`', ' ')} #{s}",
|
|
33
|
-
show_params: show_params
|
|
34
|
-
)
|
|
35
|
-
end
|
|
36
|
-
end
|
|
14
|
+
class << KineticCafe::ErrorTasks
|
|
15
|
+
def print_defined(descendants = @descendants, output: $stdout, params: false)
|
|
16
|
+
if descendants[::StandardError].nil? || descendants[::StandardError].empty?
|
|
17
|
+
output.puts 'No defined errors.'
|
|
18
|
+
else
|
|
19
|
+
descendants[::StandardError].sort_by(&:to_s).each { |d|
|
|
20
|
+
display_error_class(descendants, d, output: output, params: params)
|
|
37
21
|
}
|
|
22
|
+
end
|
|
23
|
+
end
|
|
38
24
|
|
|
39
|
-
|
|
25
|
+
def print_translation_yaml(descendants = @descendants, output: $stdout)
|
|
26
|
+
output.puts build_translation_yaml(descendants)
|
|
27
|
+
end
|
|
40
28
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def display_error_class(descendants, root, output: $stdout, prefix: '', params: false)
|
|
32
|
+
line = String.new("#{prefix}- #{root}")
|
|
33
|
+
|
|
34
|
+
if !root.i18n_params.empty? && params
|
|
35
|
+
line << ' (' << root.i18n_params.join(', ') << ')'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
output.puts line
|
|
39
|
+
|
|
40
|
+
if descendants[root]
|
|
41
|
+
sorted = descendants[root].sort_by(&:to_s)
|
|
42
|
+
sorted.each do |child|
|
|
43
|
+
s = (child == sorted.last) ? '`' : '|'
|
|
44
|
+
display_error_class(
|
|
45
|
+
descendants,
|
|
46
|
+
child,
|
|
47
|
+
output: output,
|
|
48
|
+
prefix: "#{prefix.tr('|`', ' ')} #{s}",
|
|
49
|
+
params: params
|
|
50
|
+
)
|
|
47
51
|
end
|
|
48
52
|
end
|
|
53
|
+
end
|
|
49
54
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
55
|
+
def build_error_hierarchy(error_class_list)
|
|
56
|
+
Hash.new { |h, k| h[k] = [] }.tap do |hierarchy|
|
|
57
|
+
error_class_list.each do |error_class|
|
|
58
|
+
hierarchy[error_class.superclass] << error_class
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
hierarchy[::StandardError].push(
|
|
62
|
+
*(
|
|
63
|
+
hierarchy.keys.select { |r| r.superclass == ::StandardError } -
|
|
64
|
+
hierarchy[::StandardError]
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def find_with_error_dsl_inheritors
|
|
71
|
+
@descendants = build_error_hierarchy(KineticCafe::ErrorDSL.inheritors)
|
|
72
|
+
end
|
|
69
73
|
|
|
70
|
-
|
|
71
|
-
|
|
74
|
+
def collect_translations(descendants, translations, root)
|
|
75
|
+
translation = (translations[root.i18n_key_base] ||= {})
|
|
76
|
+
name = KineticCafe::ErrorDSL.namify(root)
|
|
72
77
|
|
|
73
|
-
|
|
74
|
-
# against. Therefore, we are going to write this file manually.
|
|
75
|
-
text = 'kc:'
|
|
78
|
+
params = root.i18n_params.map { |param| "%{#{param}}" }.join(' ')
|
|
76
79
|
|
|
77
|
-
|
|
78
|
-
|
|
80
|
+
translation[name] = if params.empty?
|
|
81
|
+
"Translation for #{name} with no params."
|
|
82
|
+
else
|
|
83
|
+
"Translation for #{name} with #{params}."
|
|
84
|
+
end
|
|
79
85
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
86
|
+
if descendants[root]
|
|
87
|
+
descendants[root].sort_by(&:to_s).each do |child|
|
|
88
|
+
collect_translations(descendants, translations, child)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
84
92
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
end
|
|
93
|
+
def find_translations(descendants)
|
|
94
|
+
{}.tap do |translations|
|
|
95
|
+
descendants[::StandardError].sort_by(&:to_s).each do |d|
|
|
96
|
+
collect_translations(descendants, translations, d)
|
|
90
97
|
end
|
|
91
98
|
end
|
|
99
|
+
end
|
|
92
100
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
101
|
+
def build_translation_yaml(descendants)
|
|
102
|
+
translations = find_translations(descendants)
|
|
103
|
+
return if translations.empty?
|
|
104
|
+
|
|
105
|
+
# Normal YAML dump does not match the pattern that we want to compare
|
|
106
|
+
# against. Therefore, we are going to write this file manually.
|
|
107
|
+
String.new('kc:').tap do |text|
|
|
108
|
+
translations.keys.sort.each do |group|
|
|
109
|
+
text << "\n #{group}:"
|
|
97
110
|
|
|
98
|
-
|
|
111
|
+
translations[group].keys.sort.each { |k|
|
|
112
|
+
text << "\n #{k}: >-\n #{translations[group][k]}"
|
|
113
|
+
}
|
|
99
114
|
end
|
|
100
115
|
end
|
|
101
116
|
end
|
|
117
|
+
|
|
118
|
+
def save_translation_yaml(filename, descendants = @descendants)
|
|
119
|
+
File.open(filename, 'w') { |f| print_translation_yaml(descendants, output: f) }
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
##
|
|
124
|
+
module KineticCafe::ErrorTasks #:nodoc:
|
|
125
|
+
namespace :kcerror do
|
|
126
|
+
desc 'Show defined errors.'
|
|
127
|
+
task :defined, [ :params ] => 'kcerror:find' do |_, args|
|
|
128
|
+
print_defined(params: args.params =~ /^y/i)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
desc 'Generate a sample translation key file.'
|
|
132
|
+
task :translations, [ :output ] => 'kcerror:find' do |_, args|
|
|
133
|
+
if args.output
|
|
134
|
+
save_translation_yaml(args.output)
|
|
135
|
+
else
|
|
136
|
+
print_translation_yaml
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
task :find do
|
|
141
|
+
find_with_error_dsl_inheritors
|
|
142
|
+
end
|
|
143
|
+
end
|
|
102
144
|
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
require 'kinetic_cafe/error_tasks'
|
|
5
|
+
|
|
6
|
+
describe KineticCafe::ErrorTasks do
|
|
7
|
+
def setup
|
|
8
|
+
Object.const_set(:My, Module.new)
|
|
9
|
+
KineticCafe::Error.hierarchy(class: :Base, namespace: My, rack_status: { errors: false }) do
|
|
10
|
+
define_error class: :child, status: :not_found, i18n_params: %i(query)
|
|
11
|
+
define_error key: :other_child, status: :bad_request do
|
|
12
|
+
define_error key: :sub_child, status: :im_a_teapot
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def teardown
|
|
18
|
+
Object.send(:remove_const, :My)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe '.print_defined' do
|
|
22
|
+
describe 'when no StandardError descendants' do
|
|
23
|
+
it 'prints no defined errors' do
|
|
24
|
+
io = StringIO.new
|
|
25
|
+
KineticCafe::ErrorTasks.print_defined({}, { output: io })
|
|
26
|
+
|
|
27
|
+
assert_match(/No defined errors./, io.string)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe 'when data' do
|
|
32
|
+
it 'prints out the classes involved, sorted' do
|
|
33
|
+
io = StringIO.new
|
|
34
|
+
|
|
35
|
+
classes = [
|
|
36
|
+
My::Base,
|
|
37
|
+
My::Base::ChildNotFound, My::Base::OtherChild,
|
|
38
|
+
My::Base::OtherChild::SubChild
|
|
39
|
+
]
|
|
40
|
+
descendants = KineticCafe::ErrorTasks.send(:build_error_hierarchy, classes)
|
|
41
|
+
KineticCafe::ErrorTasks.print_defined(descendants, output: io)
|
|
42
|
+
|
|
43
|
+
expected = [
|
|
44
|
+
'KineticCafe::Error',
|
|
45
|
+
'My::Base',
|
|
46
|
+
'My::Base::ChildNotFound',
|
|
47
|
+
'My::Base::OtherChild',
|
|
48
|
+
'My::Base::OtherChild::SubChild'
|
|
49
|
+
]
|
|
50
|
+
actual = io.string.scan(/ \w.+\n/).map(&:strip)
|
|
51
|
+
|
|
52
|
+
assert_equal expected, actual
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe '.print_translation_yaml' do
|
|
58
|
+
describe 'when no StandardError descendant' do
|
|
59
|
+
it 'prints no defined errors' do
|
|
60
|
+
io = StringIO.new
|
|
61
|
+
KineticCafe::ErrorTasks.print_defined({}, { output: io })
|
|
62
|
+
|
|
63
|
+
assert_match(/No defined errors./, io.string)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe 'when data' do
|
|
68
|
+
it 'prints the correct data in YAML format' do
|
|
69
|
+
io = StringIO.new
|
|
70
|
+
|
|
71
|
+
classes = [
|
|
72
|
+
My::Base,
|
|
73
|
+
My::Base::ChildNotFound, My::Base::OtherChild,
|
|
74
|
+
My::Base::OtherChild::SubChild
|
|
75
|
+
]
|
|
76
|
+
descendants = KineticCafe::ErrorTasks.send(:build_error_hierarchy, classes)
|
|
77
|
+
KineticCafe::ErrorTasks.print_translation_yaml(descendants, output: io)
|
|
78
|
+
|
|
79
|
+
expected = { 'kc' =>
|
|
80
|
+
{ 'kcerrors' =>
|
|
81
|
+
{
|
|
82
|
+
'base' => 'Translation for base with no params.',
|
|
83
|
+
'child_not_found' => 'Translation for child_not_found with %{query}.',
|
|
84
|
+
'error' => 'Translation for error with no params.',
|
|
85
|
+
'other_child' => 'Translation for other_child with no params.',
|
|
86
|
+
'sub_child' => 'Translation for sub_child with no params.'
|
|
87
|
+
} } }
|
|
88
|
+
|
|
89
|
+
actual = YAML.load(io.string)
|
|
90
|
+
|
|
91
|
+
assert_equal expected, actual
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
data/test/test_helper.rb
CHANGED
|
@@ -36,6 +36,34 @@ describe KineticCafe::ErrorDSL do
|
|
|
36
36
|
assert base.respond_to?(:define_error)
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
+
describe '#severity' do
|
|
40
|
+
describe 'fails when' do
|
|
41
|
+
it 'is not passed a block' do
|
|
42
|
+
ex = assert_raises RuntimeError do
|
|
43
|
+
base.severity(:foo)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
assert_match(/must have a block/, ex.message)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'creates any errors in its block with the given severity, then reverts to old severity' do
|
|
51
|
+
severity = :test_level
|
|
52
|
+
|
|
53
|
+
base.severity(severity) do
|
|
54
|
+
not_found key: :foo
|
|
55
|
+
not_found key: :bar
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
assert_equal severity, base::Foo.default_severity
|
|
59
|
+
assert_equal severity, base::Bar.default_severity
|
|
60
|
+
|
|
61
|
+
base.define_error key: :child
|
|
62
|
+
|
|
63
|
+
refute_equal severity, base::Child.default_severity
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
39
67
|
describe '#define_error' do
|
|
40
68
|
describe 'fails when' do
|
|
41
69
|
it 'given bad options' do
|
|
@@ -113,6 +141,18 @@ describe KineticCafe::ErrorDSL do
|
|
|
113
141
|
end
|
|
114
142
|
end
|
|
115
143
|
|
|
144
|
+
describe 'when nested definitions' do
|
|
145
|
+
it 'creates a nested error' do
|
|
146
|
+
base.define_error(key: :child) do
|
|
147
|
+
not_found key: :foo
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
assert base::Child::Foo < base::Child
|
|
151
|
+
|
|
152
|
+
assert base::Child::Foo.respond_to?(:default_severity)
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
116
156
|
describe 'class-based definition' do
|
|
117
157
|
describe 'without status' do
|
|
118
158
|
before do
|
|
@@ -84,6 +84,10 @@ describe KineticCafe::Error, '.hierarchy' do
|
|
|
84
84
|
KineticCafe::Error.hierarchy(class: My)
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
+
it 'does not subclass KineticCafe::Error' do
|
|
88
|
+
refute My < KineticCafe::Error
|
|
89
|
+
end
|
|
90
|
+
|
|
87
91
|
it 'has been extended with KineticCafe::ErrorDSL' do
|
|
88
92
|
assert My.singleton_class < KineticCafe::ErrorDSL
|
|
89
93
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kinetic_cafe_error
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: '1.
|
|
4
|
+
version: '1.12'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Austin Ziegler
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2016-05-
|
|
13
|
+
date: 2016-05-27 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: minitest
|
|
@@ -364,6 +364,7 @@ files:
|
|
|
364
364
|
- lib/kinetic_cafe/error_tasks.rake
|
|
365
365
|
- lib/kinetic_cafe/error_tasks.rb
|
|
366
366
|
- lib/kinetic_cafe_error.rb
|
|
367
|
+
- test/test_error_tasks.rb
|
|
367
368
|
- test/test_helper.rb
|
|
368
369
|
- test/test_kinetic_cafe_error.rb
|
|
369
370
|
- test/test_kinetic_cafe_error_dsl.rb
|
|
@@ -390,7 +391,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
390
391
|
version: '0'
|
|
391
392
|
requirements: []
|
|
392
393
|
rubyforge_project:
|
|
393
|
-
rubygems_version: 2.
|
|
394
|
+
rubygems_version: 2.5.1
|
|
394
395
|
signing_key:
|
|
395
396
|
specification_version: 4
|
|
396
397
|
summary: kinetic_cafe_error provides an API-smart error base class and a DSL for defining
|