grape 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grape might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -66
- data/.rubocop_todo.yml +78 -17
- data/.travis.yml +7 -3
- data/Appraisals +7 -0
- data/CHANGELOG.md +24 -0
- data/CONTRIBUTING.md +7 -0
- data/Gemfile +1 -7
- data/Guardfile +1 -1
- data/README.md +560 -94
- data/RELEASING.md +1 -1
- data/Rakefile +10 -11
- data/UPGRADING.md +211 -3
- data/gemfiles/rails_3.gemfile +14 -0
- data/gemfiles/rails_4.gemfile +14 -0
- data/grape.gemspec +10 -9
- data/lib/backports/active_support/deep_dup.rb +49 -0
- data/lib/backports/active_support/duplicable.rb +88 -0
- data/lib/grape.rb +29 -2
- data/lib/grape/api.rb +59 -65
- data/lib/grape/dsl/api.rb +19 -0
- data/lib/grape/dsl/callbacks.rb +6 -4
- data/lib/grape/dsl/configuration.rb +49 -5
- data/lib/grape/dsl/helpers.rb +7 -8
- data/lib/grape/dsl/inside_route.rb +22 -10
- data/lib/grape/dsl/middleware.rb +5 -5
- data/lib/grape/dsl/parameters.rb +6 -2
- data/lib/grape/dsl/request_response.rb +23 -20
- data/lib/grape/dsl/routing.rb +52 -49
- data/lib/grape/dsl/settings.rb +110 -0
- data/lib/grape/dsl/validations.rb +14 -6
- data/lib/grape/endpoint.rb +104 -88
- data/lib/grape/exceptions/base.rb +2 -2
- data/lib/grape/exceptions/incompatible_option_values.rb +1 -1
- data/lib/grape/exceptions/invalid_formatter.rb +1 -1
- data/lib/grape/exceptions/invalid_versioner_option.rb +1 -1
- data/lib/grape/exceptions/invalid_with_option_for_represent.rb +1 -1
- data/lib/grape/exceptions/missing_mime_type.rb +1 -1
- data/lib/grape/exceptions/missing_option.rb +1 -1
- data/lib/grape/exceptions/missing_vendor_option.rb +1 -1
- data/lib/grape/exceptions/unknown_options.rb +1 -1
- data/lib/grape/exceptions/unknown_validator.rb +1 -1
- data/lib/grape/exceptions/validation.rb +1 -1
- data/lib/grape/exceptions/validation_errors.rb +2 -2
- data/lib/grape/formatter/serializable_hash.rb +1 -1
- data/lib/grape/formatter/xml.rb +1 -1
- data/lib/grape/locale/en.yml +2 -0
- data/lib/grape/middleware/auth/dsl.rb +26 -21
- data/lib/grape/middleware/auth/strategies.rb +1 -1
- data/lib/grape/middleware/auth/strategy_info.rb +0 -2
- data/lib/grape/middleware/base.rb +2 -2
- data/lib/grape/middleware/error.rb +1 -1
- data/lib/grape/middleware/formatter.rb +5 -5
- data/lib/grape/middleware/versioner.rb +1 -1
- data/lib/grape/middleware/versioner/header.rb +3 -3
- data/lib/grape/middleware/versioner/param.rb +2 -2
- data/lib/grape/middleware/versioner/path.rb +1 -1
- data/lib/grape/namespace.rb +1 -1
- data/lib/grape/path.rb +9 -3
- data/lib/grape/util/content_types.rb +16 -8
- data/lib/grape/util/inheritable_setting.rb +74 -0
- data/lib/grape/util/inheritable_values.rb +51 -0
- data/lib/grape/util/stackable_values.rb +52 -0
- data/lib/grape/util/strict_hash_configuration.rb +106 -0
- data/lib/grape/validations.rb +0 -220
- data/lib/grape/validations/attributes_iterator.rb +21 -0
- data/lib/grape/validations/params_scope.rb +176 -0
- data/lib/grape/validations/validators/all_or_none.rb +20 -0
- data/lib/grape/validations/validators/allow_blank.rb +30 -0
- data/lib/grape/validations/validators/at_least_one_of.rb +20 -0
- data/lib/grape/validations/validators/base.rb +37 -0
- data/lib/grape/validations/{coerce.rb → validators/coerce.rb} +3 -3
- data/lib/grape/validations/{default.rb → validators/default.rb} +1 -1
- data/lib/grape/validations/validators/exactly_one_of.rb +20 -0
- data/lib/grape/validations/validators/multiple_params_base.rb +26 -0
- data/lib/grape/validations/validators/mutual_exclusion.rb +25 -0
- data/lib/grape/validations/{presence.rb → validators/presence.rb} +2 -2
- data/lib/grape/validations/validators/regexp.rb +12 -0
- data/lib/grape/validations/validators/values.rb +26 -0
- data/lib/grape/version.rb +1 -1
- data/spec/grape/api_spec.rb +522 -343
- data/spec/grape/dsl/callbacks_spec.rb +4 -4
- data/spec/grape/dsl/configuration_spec.rb +48 -9
- data/spec/grape/dsl/helpers_spec.rb +6 -13
- data/spec/grape/dsl/inside_route_spec.rb +43 -4
- data/spec/grape/dsl/middleware_spec.rb +1 -10
- data/spec/grape/dsl/parameters_spec.rb +8 -1
- data/spec/grape/dsl/request_response_spec.rb +16 -22
- data/spec/grape/dsl/routing_spec.rb +21 -5
- data/spec/grape/dsl/settings_spec.rb +219 -0
- data/spec/grape/dsl/validations_spec.rb +8 -11
- data/spec/grape/endpoint_spec.rb +115 -86
- data/spec/grape/entity_spec.rb +33 -33
- data/spec/grape/exceptions/invalid_formatter_spec.rb +3 -5
- data/spec/grape/exceptions/invalid_versioner_option_spec.rb +4 -6
- data/spec/grape/exceptions/missing_mime_type_spec.rb +5 -6
- data/spec/grape/exceptions/missing_option_spec.rb +3 -5
- data/spec/grape/exceptions/unknown_options_spec.rb +3 -5
- data/spec/grape/exceptions/unknown_validator_spec.rb +3 -5
- data/spec/grape/exceptions/validation_errors_spec.rb +5 -5
- data/spec/grape/loading_spec.rb +44 -0
- data/spec/grape/middleware/auth/base_spec.rb +0 -4
- data/spec/grape/middleware/auth/dsl_spec.rb +2 -4
- data/spec/grape/middleware/auth/strategies_spec.rb +5 -6
- data/spec/grape/middleware/exception_spec.rb +8 -10
- data/spec/grape/middleware/formatter_spec.rb +13 -15
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +10 -10
- data/spec/grape/middleware/versioner/header_spec.rb +25 -25
- data/spec/grape/middleware/versioner/param_spec.rb +15 -17
- data/spec/grape/middleware/versioner/path_spec.rb +1 -2
- data/spec/grape/middleware/versioner_spec.rb +0 -1
- data/spec/grape/path_spec.rb +66 -45
- data/spec/grape/util/inheritable_setting_spec.rb +217 -0
- data/spec/grape/util/inheritable_values_spec.rb +63 -0
- data/spec/grape/util/stackable_values_spec.rb +115 -0
- data/spec/grape/util/strict_hash_configuration_spec.rb +38 -0
- data/spec/grape/validations/attributes_iterator_spec.rb +4 -0
- data/spec/grape/validations/params_scope_spec.rb +57 -0
- data/spec/grape/validations/validators/all_or_none_spec.rb +60 -0
- data/spec/grape/validations/validators/allow_blank_spec.rb +170 -0
- data/spec/grape/validations/{at_least_one_of_spec.rb → validators/at_least_one_of_spec.rb} +7 -3
- data/spec/grape/validations/{coerce_spec.rb → validators/coerce_spec.rb} +8 -11
- data/spec/grape/validations/{default_spec.rb → validators/default_spec.rb} +7 -9
- data/spec/grape/validations/{exactly_one_of_spec.rb → validators/exactly_one_of_spec.rb} +15 -11
- data/spec/grape/validations/{mutual_exclusion_spec.rb → validators/mutual_exclusion_spec.rb} +11 -9
- data/spec/grape/validations/{presence_spec.rb → validators/presence_spec.rb} +30 -30
- data/spec/grape/validations/{regexp_spec.rb → validators/regexp_spec.rb} +2 -4
- data/spec/grape/validations/{values_spec.rb → validators/values_spec.rb} +95 -23
- data/spec/grape/validations/{zh-CN.yml → validators/zh-CN.yml} +0 -0
- data/spec/grape/validations_spec.rb +335 -70
- data/spec/shared/versioning_examples.rb +7 -8
- data/spec/spec_helper.rb +2 -0
- data/spec/support/basic_auth_encode_helpers.rb +1 -1
- data/spec/support/content_type_helpers.rb +1 -1
- data/spec/support/versioned_helpers.rb +3 -3
- metadata +80 -33
- data/lib/grape/util/deep_merge.rb +0 -23
- data/lib/grape/util/hash_stack.rb +0 -120
- data/lib/grape/validations/at_least_one_of.rb +0 -25
- data/lib/grape/validations/exactly_one_of.rb +0 -26
- data/lib/grape/validations/mutual_exclusion.rb +0 -25
- data/lib/grape/validations/regexp.rb +0 -12
- data/lib/grape/validations/values.rb +0 -23
- data/spec/grape/util/hash_stack_spec.rb +0 -132
@@ -5,10 +5,13 @@ module Grape
|
|
5
5
|
module Validations
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
|
+
include Grape::DSL::Configuration
|
9
|
+
|
8
10
|
module ClassMethods
|
9
11
|
def reset_validations!
|
10
|
-
|
11
|
-
|
12
|
+
unset_namespace_stackable :declared_params
|
13
|
+
unset_namespace_stackable :validations
|
14
|
+
unset_namespace_stackable :params
|
12
15
|
end
|
13
16
|
|
14
17
|
def params(&block)
|
@@ -16,11 +19,16 @@ module Grape
|
|
16
19
|
end
|
17
20
|
|
18
21
|
def document_attribute(names, opts)
|
19
|
-
|
20
|
-
|
22
|
+
route_setting(:description, {}) unless route_setting(:description)
|
23
|
+
|
24
|
+
route_setting(:description)[:params] ||= {}
|
25
|
+
|
26
|
+
setting = route_setting(:description)[:params]
|
21
27
|
Array(names).each do |name|
|
22
|
-
|
23
|
-
|
28
|
+
setting[name[:full_name].to_s] ||= {}
|
29
|
+
setting[name[:full_name].to_s].merge!(opts)
|
30
|
+
|
31
|
+
namespace_stackable(:params, name[:full_name].to_s => opts)
|
24
32
|
end
|
25
33
|
end
|
26
34
|
end
|
data/lib/grape/endpoint.rb
CHANGED
@@ -4,7 +4,9 @@ module Grape
|
|
4
4
|
# on the instance level of this class may be called
|
5
5
|
# from inside a `get`, `post`, etc.
|
6
6
|
class Endpoint
|
7
|
-
|
7
|
+
include Grape::DSL::Settings
|
8
|
+
|
9
|
+
attr_accessor :block, :source, :options
|
8
10
|
attr_reader :env, :request, :headers, :params
|
9
11
|
|
10
12
|
include Grape::DSL::InsideRoute
|
@@ -37,7 +39,7 @@ module Grape
|
|
37
39
|
# @raise [NameError] an instance method with the same name already exists
|
38
40
|
def generate_api_method(method_name, &block)
|
39
41
|
if instance_methods.include?(method_name.to_sym) || instance_methods.include?(method_name.to_s)
|
40
|
-
|
42
|
+
fail NameError.new("method #{method_name.inspect} already exists and cannot be used as an unbound method name")
|
41
43
|
end
|
42
44
|
define_method(method_name, &block)
|
43
45
|
method = instance_method(method_name)
|
@@ -46,12 +48,17 @@ module Grape
|
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
49
|
-
def initialize(
|
51
|
+
def initialize(new_settings, options = {}, &block)
|
50
52
|
require_option(options, :path)
|
51
53
|
require_option(options, :method)
|
52
54
|
|
53
|
-
|
54
|
-
|
55
|
+
self.inheritable_setting = new_settings.point_in_time_copy
|
56
|
+
|
57
|
+
route_setting(:saved_declared_params, namespace_stackable(:declared_params))
|
58
|
+
route_setting(:saved_validations, namespace_stackable(:validations))
|
59
|
+
|
60
|
+
namespace_stackable(:representations, []) unless namespace_stackable(:representations)
|
61
|
+
namespace_inheritable(:default_error_status, 500) unless namespace_inheritable(:default_error_status)
|
55
62
|
|
56
63
|
@options = options
|
57
64
|
|
@@ -68,29 +75,40 @@ module Grape
|
|
68
75
|
end
|
69
76
|
|
70
77
|
def require_option(options, key)
|
71
|
-
|
78
|
+
fail Grape::Exceptions::MissingOption.new(key) unless options.key?(key)
|
72
79
|
end
|
73
80
|
|
74
81
|
def method_name
|
75
82
|
[options[:method],
|
76
|
-
Namespace.joined_space(
|
77
|
-
|
83
|
+
Namespace.joined_space(namespace_stackable(:namespace)),
|
84
|
+
(namespace_stackable(:mount_path) || []).join('/'),
|
78
85
|
options[:path].join('/')
|
79
|
-
].join(
|
86
|
+
].join(' ')
|
80
87
|
end
|
81
88
|
|
82
89
|
def routes
|
83
90
|
@routes ||= endpoints ? endpoints.collect(&:routes).flatten : prepare_routes
|
84
91
|
end
|
85
92
|
|
93
|
+
def reset_routes!
|
94
|
+
endpoints.map(&:reset_routes!) if endpoints
|
95
|
+
@namespace = nil
|
96
|
+
@routes = nil
|
97
|
+
end
|
98
|
+
|
86
99
|
def mount_in(route_set)
|
87
100
|
if endpoints
|
88
|
-
endpoints.each
|
101
|
+
endpoints.each do |e|
|
102
|
+
e.inheritable_setting.inherit_from inheritable_setting
|
103
|
+
e.mount_in(route_set)
|
104
|
+
end
|
89
105
|
else
|
106
|
+
@routes = nil
|
107
|
+
|
90
108
|
routes.each do |route|
|
91
109
|
methods = [route.route_method]
|
92
|
-
if !
|
93
|
-
methods <<
|
110
|
+
if !namespace_inheritable(:do_not_route_head) && route.route_method == 'GET'
|
111
|
+
methods << 'HEAD'
|
94
112
|
end
|
95
113
|
methods.each do |method|
|
96
114
|
route_set.add_route(self, {
|
@@ -102,56 +120,63 @@ module Grape
|
|
102
120
|
end
|
103
121
|
end
|
104
122
|
|
105
|
-
def
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
123
|
+
def prepare_routes_requirements
|
124
|
+
endpoint_requirements = options[:route_options][:requirements] || {}
|
125
|
+
all_requirements = (namespace_stackable(:namespace).map(&:requirements) << endpoint_requirements)
|
126
|
+
all_requirements.reduce({}) do |base_requirements, single_requirements|
|
127
|
+
base_requirements.merge!(single_requirements)
|
128
|
+
end
|
129
|
+
end
|
110
130
|
|
111
|
-
|
112
|
-
|
131
|
+
def prepare_routes_path_params(path)
|
132
|
+
path_params = {}
|
113
133
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
134
|
+
# named parameters in the api path
|
135
|
+
regex = Rack::Mount::RegexpWithNamedGroups.new(path)
|
136
|
+
named_params = regex.named_captures.map { |nc| nc[0] } - %w(version format)
|
137
|
+
named_params.each { |named_param| path_params[named_param] = '' }
|
138
|
+
|
139
|
+
# route parameters declared via desc or appended to the api declaration
|
140
|
+
route_params = options[:route_options][:params]
|
141
|
+
path_params.merge! route_params if route_params
|
119
142
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
143
|
+
path_params
|
144
|
+
end
|
145
|
+
|
146
|
+
def prepare_routes
|
147
|
+
options[:method].map do |method|
|
148
|
+
options[:path].map do |path|
|
149
|
+
prepared_path = prepare_path(path)
|
150
|
+
anchor = options[:route_options].fetch(:anchor, true)
|
151
|
+
path = compile_path(prepared_path, anchor && !options[:app], prepare_routes_requirements)
|
129
152
|
request_method = (method.to_s.upcase unless method == :any)
|
130
|
-
|
131
|
-
|
132
|
-
|
153
|
+
|
154
|
+
Route.new(options[:route_options].clone.merge(
|
155
|
+
prefix: namespace_inheritable(:root_prefix),
|
156
|
+
version: namespace_inheritable(:version) ? namespace_inheritable(:version).join('|') : nil,
|
133
157
|
namespace: namespace,
|
134
158
|
method: request_method,
|
135
159
|
path: prepared_path,
|
136
|
-
params:
|
137
|
-
compiled: path
|
160
|
+
params: prepare_routes_path_params(path),
|
161
|
+
compiled: path,
|
162
|
+
settings: inheritable_setting.route.except(:saved_declared_params, :saved_validations)
|
138
163
|
))
|
139
164
|
end
|
140
|
-
end
|
141
|
-
routes
|
165
|
+
end.flatten
|
142
166
|
end
|
143
167
|
|
144
168
|
def prepare_path(path)
|
145
|
-
|
169
|
+
path_settings = inheritable_setting.to_hash[:namespace_stackable].merge(inheritable_setting.to_hash[:namespace_inheritable])
|
170
|
+
Path.prepare(path, namespace, path_settings)
|
146
171
|
end
|
147
172
|
|
148
173
|
def namespace
|
149
|
-
@namespace ||= Namespace.joined_space_path(
|
174
|
+
@namespace ||= Namespace.joined_space_path(namespace_stackable(:namespace))
|
150
175
|
end
|
151
176
|
|
152
177
|
def compile_path(prepared_path, anchor = true, requirements = {})
|
153
178
|
endpoint_options = {}
|
154
|
-
endpoint_options[:version] = /#{
|
179
|
+
endpoint_options[:version] = /#{namespace_inheritable(:version).join('|')}/ if namespace_inheritable(:version)
|
155
180
|
endpoint_options.merge!(requirements)
|
156
181
|
Rack::Mount::Strexp.compile(prepared_path, endpoint_options, %w( / . ? ), anchor)
|
157
182
|
end
|
@@ -168,7 +193,7 @@ module Grape
|
|
168
193
|
options[:app].call(env)
|
169
194
|
else
|
170
195
|
builder = build_middleware
|
171
|
-
builder.run
|
196
|
+
builder.run lambda { |arg| run(arg) }
|
172
197
|
builder.call(env)
|
173
198
|
end
|
174
199
|
end
|
@@ -203,7 +228,10 @@ module Grape
|
|
203
228
|
|
204
229
|
# Retrieve validations from this namespace and all parent namespaces.
|
205
230
|
validation_errors = []
|
206
|
-
|
231
|
+
|
232
|
+
# require 'pry-byebug'; binding.pry
|
233
|
+
|
234
|
+
route_setting(:saved_validations).each do |validator|
|
207
235
|
begin
|
208
236
|
validator.validate!(params)
|
209
237
|
rescue Grape::Exceptions::Validation => e
|
@@ -212,7 +240,7 @@ module Grape
|
|
212
240
|
end
|
213
241
|
|
214
242
|
if validation_errors.any?
|
215
|
-
|
243
|
+
fail Grape::Exceptions::ValidationErrors, errors: validation_errors
|
216
244
|
end
|
217
245
|
|
218
246
|
run_filters after_validations
|
@@ -229,18 +257,18 @@ module Grape
|
|
229
257
|
|
230
258
|
b.use Rack::Head
|
231
259
|
b.use Grape::Middleware::Error,
|
232
|
-
format:
|
233
|
-
content_types:
|
234
|
-
default_status:
|
235
|
-
rescue_all:
|
236
|
-
default_error_formatter:
|
237
|
-
error_formatters:
|
238
|
-
rescue_options:
|
239
|
-
rescue_handlers:
|
240
|
-
base_only_rescue_handlers:
|
241
|
-
all_rescue_handler:
|
242
|
-
|
243
|
-
|
260
|
+
format: namespace_inheritable(:format),
|
261
|
+
content_types: Grape::DSL::Configuration.stacked_hash_to_hash(namespace_stackable(:content_types)),
|
262
|
+
default_status: namespace_inheritable(:default_error_status),
|
263
|
+
rescue_all: namespace_inheritable(:rescue_all),
|
264
|
+
default_error_formatter: namespace_inheritable(:default_error_formatter),
|
265
|
+
error_formatters: Grape::DSL::Configuration.stacked_hash_to_hash(namespace_stackable(:error_formatters)),
|
266
|
+
rescue_options: Grape::DSL::Configuration.stacked_hash_to_hash(namespace_stackable(:rescue_options)) || {},
|
267
|
+
rescue_handlers: Grape::DSL::Configuration.stacked_hash_to_hash(namespace_stackable(:rescue_handlers)) || {},
|
268
|
+
base_only_rescue_handlers: Grape::DSL::Configuration.stacked_hash_to_hash(namespace_stackable(:base_only_rescue_handlers)) || {},
|
269
|
+
all_rescue_handler: namespace_inheritable(:all_rescue_handler)
|
270
|
+
|
271
|
+
(namespace_stackable(:middleware) || []).each do |m|
|
244
272
|
m = m.dup
|
245
273
|
block = m.pop if m.last.is_a?(Proc)
|
246
274
|
if block
|
@@ -250,42 +278,30 @@ module Grape
|
|
250
278
|
end
|
251
279
|
end
|
252
280
|
|
253
|
-
if
|
254
|
-
b.use Grape::Middleware::Versioner.using(
|
255
|
-
versions:
|
256
|
-
version_options:
|
257
|
-
prefix:
|
281
|
+
if namespace_inheritable(:version)
|
282
|
+
b.use Grape::Middleware::Versioner.using(namespace_inheritable(:version_options)[:using]),
|
283
|
+
versions: namespace_inheritable(:version) ? namespace_inheritable(:version).flatten : nil,
|
284
|
+
version_options: namespace_inheritable(:version_options),
|
285
|
+
prefix: namespace_inheritable(:root_prefix)
|
258
286
|
|
259
287
|
end
|
260
288
|
|
261
289
|
b.use Grape::Middleware::Formatter,
|
262
|
-
format:
|
263
|
-
default_format:
|
264
|
-
content_types:
|
265
|
-
formatters:
|
266
|
-
parsers:
|
290
|
+
format: namespace_inheritable(:format),
|
291
|
+
default_format: namespace_inheritable(:default_format) || :txt,
|
292
|
+
content_types: Grape::DSL::Configuration.stacked_hash_to_hash(namespace_stackable(:content_types)),
|
293
|
+
formatters: Grape::DSL::Configuration.stacked_hash_to_hash(namespace_stackable(:formatters)),
|
294
|
+
parsers: Grape::DSL::Configuration.stacked_hash_to_hash(namespace_stackable(:parsers))
|
267
295
|
|
268
296
|
b
|
269
297
|
end
|
270
298
|
|
271
299
|
def helpers
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
end
|
276
|
-
m
|
277
|
-
end
|
278
|
-
|
279
|
-
def aggregate_setting(key)
|
280
|
-
settings.stack.inject([]) do |aggregate, frame|
|
281
|
-
aggregate + (frame[key] || [])
|
282
|
-
end
|
283
|
-
end
|
284
|
-
|
285
|
-
def merged_setting(key)
|
286
|
-
settings.stack.inject({}) do |merged, frame|
|
287
|
-
merged.merge(frame[key] || {})
|
300
|
+
mod = Module.new
|
301
|
+
(namespace_stackable(:helpers) || []).each do |mod_to_include|
|
302
|
+
mod.send :include, mod_to_include
|
288
303
|
end
|
304
|
+
mod
|
289
305
|
end
|
290
306
|
|
291
307
|
def run_filters(filters)
|
@@ -295,19 +311,19 @@ module Grape
|
|
295
311
|
end
|
296
312
|
|
297
313
|
def befores
|
298
|
-
|
314
|
+
namespace_stackable(:befores) || []
|
299
315
|
end
|
300
316
|
|
301
317
|
def before_validations
|
302
|
-
|
318
|
+
namespace_stackable(:before_validations) || []
|
303
319
|
end
|
304
320
|
|
305
321
|
def after_validations
|
306
|
-
|
322
|
+
namespace_stackable(:after_validations) || []
|
307
323
|
end
|
308
324
|
|
309
325
|
def afters
|
310
|
-
|
326
|
+
namespace_stackable(:afters) || []
|
311
327
|
end
|
312
328
|
end
|
313
329
|
end
|
@@ -28,7 +28,7 @@ module Grape
|
|
28
28
|
@problem = problem(key, attributes)
|
29
29
|
@summary = summary(key, attributes)
|
30
30
|
@resolution = resolution(key, attributes)
|
31
|
-
[[
|
31
|
+
[['Problem', @problem], ['Summary', @summary], ['Resolution', @resolution]].reduce('') do |message, detail_array|
|
32
32
|
message << "\n#{detail_array[0]}:\n #{detail_array[1]}" unless detail_array[1].blank?
|
33
33
|
message
|
34
34
|
end
|
@@ -52,7 +52,7 @@ module Grape
|
|
52
52
|
def translate_attributes(keys, options = {})
|
53
53
|
keys.map do |key|
|
54
54
|
translate("#{BASE_ATTRIBUTES_KEY}.#{key}", { default: key }.merge(options))
|
55
|
-
end.join(
|
55
|
+
end.join(', ')
|
56
56
|
end
|
57
57
|
|
58
58
|
def translate_attribute(key, options = {})
|
@@ -3,7 +3,7 @@ module Grape
|
|
3
3
|
module Exceptions
|
4
4
|
class IncompatibleOptionValues < Base
|
5
5
|
def initialize(option1, value1, option2, value2)
|
6
|
-
super(message: compose_message(
|
6
|
+
super(message: compose_message('incompatible_option_values', option1: option1, value1: value1, option2: option2, value2: value2))
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
@@ -3,7 +3,7 @@ module Grape
|
|
3
3
|
module Exceptions
|
4
4
|
class InvalidFormatter < Base
|
5
5
|
def initialize(klass, to_format)
|
6
|
-
super(message: compose_message(
|
6
|
+
super(message: compose_message('invalid_formatter', klass: klass, to_format: to_format))
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
@@ -3,7 +3,7 @@ module Grape
|
|
3
3
|
module Exceptions
|
4
4
|
class InvalidVersionerOption < Base
|
5
5
|
def initialize(strategy)
|
6
|
-
super(message: compose_message(
|
6
|
+
super(message: compose_message('invalid_versioner_option', strategy: strategy))
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
@@ -3,7 +3,7 @@ module Grape
|
|
3
3
|
module Exceptions
|
4
4
|
class MissingMimeType < Base
|
5
5
|
def initialize(new_format)
|
6
|
-
super(message: compose_message(
|
6
|
+
super(message: compose_message('missing_mime_type', new_format: new_format))
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|