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.

Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -66
  3. data/.rubocop_todo.yml +78 -17
  4. data/.travis.yml +7 -3
  5. data/Appraisals +7 -0
  6. data/CHANGELOG.md +24 -0
  7. data/CONTRIBUTING.md +7 -0
  8. data/Gemfile +1 -7
  9. data/Guardfile +1 -1
  10. data/README.md +560 -94
  11. data/RELEASING.md +1 -1
  12. data/Rakefile +10 -11
  13. data/UPGRADING.md +211 -3
  14. data/gemfiles/rails_3.gemfile +14 -0
  15. data/gemfiles/rails_4.gemfile +14 -0
  16. data/grape.gemspec +10 -9
  17. data/lib/backports/active_support/deep_dup.rb +49 -0
  18. data/lib/backports/active_support/duplicable.rb +88 -0
  19. data/lib/grape.rb +29 -2
  20. data/lib/grape/api.rb +59 -65
  21. data/lib/grape/dsl/api.rb +19 -0
  22. data/lib/grape/dsl/callbacks.rb +6 -4
  23. data/lib/grape/dsl/configuration.rb +49 -5
  24. data/lib/grape/dsl/helpers.rb +7 -8
  25. data/lib/grape/dsl/inside_route.rb +22 -10
  26. data/lib/grape/dsl/middleware.rb +5 -5
  27. data/lib/grape/dsl/parameters.rb +6 -2
  28. data/lib/grape/dsl/request_response.rb +23 -20
  29. data/lib/grape/dsl/routing.rb +52 -49
  30. data/lib/grape/dsl/settings.rb +110 -0
  31. data/lib/grape/dsl/validations.rb +14 -6
  32. data/lib/grape/endpoint.rb +104 -88
  33. data/lib/grape/exceptions/base.rb +2 -2
  34. data/lib/grape/exceptions/incompatible_option_values.rb +1 -1
  35. data/lib/grape/exceptions/invalid_formatter.rb +1 -1
  36. data/lib/grape/exceptions/invalid_versioner_option.rb +1 -1
  37. data/lib/grape/exceptions/invalid_with_option_for_represent.rb +1 -1
  38. data/lib/grape/exceptions/missing_mime_type.rb +1 -1
  39. data/lib/grape/exceptions/missing_option.rb +1 -1
  40. data/lib/grape/exceptions/missing_vendor_option.rb +1 -1
  41. data/lib/grape/exceptions/unknown_options.rb +1 -1
  42. data/lib/grape/exceptions/unknown_validator.rb +1 -1
  43. data/lib/grape/exceptions/validation.rb +1 -1
  44. data/lib/grape/exceptions/validation_errors.rb +2 -2
  45. data/lib/grape/formatter/serializable_hash.rb +1 -1
  46. data/lib/grape/formatter/xml.rb +1 -1
  47. data/lib/grape/locale/en.yml +2 -0
  48. data/lib/grape/middleware/auth/dsl.rb +26 -21
  49. data/lib/grape/middleware/auth/strategies.rb +1 -1
  50. data/lib/grape/middleware/auth/strategy_info.rb +0 -2
  51. data/lib/grape/middleware/base.rb +2 -2
  52. data/lib/grape/middleware/error.rb +1 -1
  53. data/lib/grape/middleware/formatter.rb +5 -5
  54. data/lib/grape/middleware/versioner.rb +1 -1
  55. data/lib/grape/middleware/versioner/header.rb +3 -3
  56. data/lib/grape/middleware/versioner/param.rb +2 -2
  57. data/lib/grape/middleware/versioner/path.rb +1 -1
  58. data/lib/grape/namespace.rb +1 -1
  59. data/lib/grape/path.rb +9 -3
  60. data/lib/grape/util/content_types.rb +16 -8
  61. data/lib/grape/util/inheritable_setting.rb +74 -0
  62. data/lib/grape/util/inheritable_values.rb +51 -0
  63. data/lib/grape/util/stackable_values.rb +52 -0
  64. data/lib/grape/util/strict_hash_configuration.rb +106 -0
  65. data/lib/grape/validations.rb +0 -220
  66. data/lib/grape/validations/attributes_iterator.rb +21 -0
  67. data/lib/grape/validations/params_scope.rb +176 -0
  68. data/lib/grape/validations/validators/all_or_none.rb +20 -0
  69. data/lib/grape/validations/validators/allow_blank.rb +30 -0
  70. data/lib/grape/validations/validators/at_least_one_of.rb +20 -0
  71. data/lib/grape/validations/validators/base.rb +37 -0
  72. data/lib/grape/validations/{coerce.rb → validators/coerce.rb} +3 -3
  73. data/lib/grape/validations/{default.rb → validators/default.rb} +1 -1
  74. data/lib/grape/validations/validators/exactly_one_of.rb +20 -0
  75. data/lib/grape/validations/validators/multiple_params_base.rb +26 -0
  76. data/lib/grape/validations/validators/mutual_exclusion.rb +25 -0
  77. data/lib/grape/validations/{presence.rb → validators/presence.rb} +2 -2
  78. data/lib/grape/validations/validators/regexp.rb +12 -0
  79. data/lib/grape/validations/validators/values.rb +26 -0
  80. data/lib/grape/version.rb +1 -1
  81. data/spec/grape/api_spec.rb +522 -343
  82. data/spec/grape/dsl/callbacks_spec.rb +4 -4
  83. data/spec/grape/dsl/configuration_spec.rb +48 -9
  84. data/spec/grape/dsl/helpers_spec.rb +6 -13
  85. data/spec/grape/dsl/inside_route_spec.rb +43 -4
  86. data/spec/grape/dsl/middleware_spec.rb +1 -10
  87. data/spec/grape/dsl/parameters_spec.rb +8 -1
  88. data/spec/grape/dsl/request_response_spec.rb +16 -22
  89. data/spec/grape/dsl/routing_spec.rb +21 -5
  90. data/spec/grape/dsl/settings_spec.rb +219 -0
  91. data/spec/grape/dsl/validations_spec.rb +8 -11
  92. data/spec/grape/endpoint_spec.rb +115 -86
  93. data/spec/grape/entity_spec.rb +33 -33
  94. data/spec/grape/exceptions/invalid_formatter_spec.rb +3 -5
  95. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +4 -6
  96. data/spec/grape/exceptions/missing_mime_type_spec.rb +5 -6
  97. data/spec/grape/exceptions/missing_option_spec.rb +3 -5
  98. data/spec/grape/exceptions/unknown_options_spec.rb +3 -5
  99. data/spec/grape/exceptions/unknown_validator_spec.rb +3 -5
  100. data/spec/grape/exceptions/validation_errors_spec.rb +5 -5
  101. data/spec/grape/loading_spec.rb +44 -0
  102. data/spec/grape/middleware/auth/base_spec.rb +0 -4
  103. data/spec/grape/middleware/auth/dsl_spec.rb +2 -4
  104. data/spec/grape/middleware/auth/strategies_spec.rb +5 -6
  105. data/spec/grape/middleware/exception_spec.rb +8 -10
  106. data/spec/grape/middleware/formatter_spec.rb +13 -15
  107. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +10 -10
  108. data/spec/grape/middleware/versioner/header_spec.rb +25 -25
  109. data/spec/grape/middleware/versioner/param_spec.rb +15 -17
  110. data/spec/grape/middleware/versioner/path_spec.rb +1 -2
  111. data/spec/grape/middleware/versioner_spec.rb +0 -1
  112. data/spec/grape/path_spec.rb +66 -45
  113. data/spec/grape/util/inheritable_setting_spec.rb +217 -0
  114. data/spec/grape/util/inheritable_values_spec.rb +63 -0
  115. data/spec/grape/util/stackable_values_spec.rb +115 -0
  116. data/spec/grape/util/strict_hash_configuration_spec.rb +38 -0
  117. data/spec/grape/validations/attributes_iterator_spec.rb +4 -0
  118. data/spec/grape/validations/params_scope_spec.rb +57 -0
  119. data/spec/grape/validations/validators/all_or_none_spec.rb +60 -0
  120. data/spec/grape/validations/validators/allow_blank_spec.rb +170 -0
  121. data/spec/grape/validations/{at_least_one_of_spec.rb → validators/at_least_one_of_spec.rb} +7 -3
  122. data/spec/grape/validations/{coerce_spec.rb → validators/coerce_spec.rb} +8 -11
  123. data/spec/grape/validations/{default_spec.rb → validators/default_spec.rb} +7 -9
  124. data/spec/grape/validations/{exactly_one_of_spec.rb → validators/exactly_one_of_spec.rb} +15 -11
  125. data/spec/grape/validations/{mutual_exclusion_spec.rb → validators/mutual_exclusion_spec.rb} +11 -9
  126. data/spec/grape/validations/{presence_spec.rb → validators/presence_spec.rb} +30 -30
  127. data/spec/grape/validations/{regexp_spec.rb → validators/regexp_spec.rb} +2 -4
  128. data/spec/grape/validations/{values_spec.rb → validators/values_spec.rb} +95 -23
  129. data/spec/grape/validations/{zh-CN.yml → validators/zh-CN.yml} +0 -0
  130. data/spec/grape/validations_spec.rb +335 -70
  131. data/spec/shared/versioning_examples.rb +7 -8
  132. data/spec/spec_helper.rb +2 -0
  133. data/spec/support/basic_auth_encode_helpers.rb +1 -1
  134. data/spec/support/content_type_helpers.rb +1 -1
  135. data/spec/support/versioned_helpers.rb +3 -3
  136. metadata +80 -33
  137. data/lib/grape/util/deep_merge.rb +0 -23
  138. data/lib/grape/util/hash_stack.rb +0 -120
  139. data/lib/grape/validations/at_least_one_of.rb +0 -25
  140. data/lib/grape/validations/exactly_one_of.rb +0 -26
  141. data/lib/grape/validations/mutual_exclusion.rb +0 -25
  142. data/lib/grape/validations/regexp.rb +0 -12
  143. data/lib/grape/validations/values.rb +0 -23
  144. 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
- settings.peek[:declared_params] = []
11
- settings.peek[:validations] = []
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
- @last_description ||= {}
20
- @last_description[:params] ||= {}
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
- @last_description[:params][name[:full_name].to_s] ||= {}
23
- @last_description[:params][name[:full_name].to_s].merge!(opts)
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
@@ -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
- attr_accessor :block, :source, :options, :settings
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
- raise NameError.new("method #{method_name.inspect} already exists and cannot be used as an unbound method name")
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(settings, options = {}, &block)
51
+ def initialize(new_settings, options = {}, &block)
50
52
  require_option(options, :path)
51
53
  require_option(options, :method)
52
54
 
53
- @settings = settings
54
- @settings[:default_error_status] ||= 500
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
- raise Grape::Exceptions::MissingOption.new(key) unless options.key?(key)
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(settings),
77
- settings.gather(:mount_path).join('/'),
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 { |e| e.mount_in(route_set) }
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 !settings[:do_not_route_head] && route.route_method == "GET"
93
- methods << "HEAD"
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 prepare_routes
106
- routes = []
107
- options[:method].each do |method|
108
- options[:path].each do |path|
109
- prepared_path = prepare_path(path)
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
- anchor = options[:route_options][:anchor]
112
- anchor = anchor.nil? ? true : anchor
131
+ def prepare_routes_path_params(path)
132
+ path_params = {}
113
133
 
114
- endpoint_requirements = options[:route_options][:requirements] || {}
115
- all_requirements = (settings.gather(:namespace).map(&:requirements) << endpoint_requirements)
116
- requirements = all_requirements.reduce({}) do |base_requirements, single_requirements|
117
- base_requirements.merge!(single_requirements)
118
- end
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
- path = compile_path(prepared_path, anchor && !options[:app], requirements)
121
- regex = Rack::Mount::RegexpWithNamedGroups.new(path)
122
- path_params = {}
123
- # named parameters in the api path
124
- named_params = regex.named_captures.map { |nc| nc[0] } - %w(version format)
125
- named_params.each { |named_param| path_params[named_param] = "" }
126
- # route parameters declared via desc or appended to the api declaration
127
- route_params = (options[:route_options][:params] || {})
128
- path_params.merge!(route_params)
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
- routes << Route.new(options[:route_options].clone.merge(
131
- prefix: settings[:root_prefix],
132
- version: settings[:version] ? settings[:version].join('|') : nil,
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: path_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
- Path.prepare(path, namespace, settings)
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(settings)
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] = /#{settings[:version].join('|')}/ if settings[: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 options[:app] || lambda { |arg| run(arg) }
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
- settings.gather(:validations).each do |validator|
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
- raise Grape::Exceptions::ValidationErrors, errors: validation_errors
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: settings[:format],
233
- content_types: settings[:content_types],
234
- default_status: settings[:default_error_status],
235
- rescue_all: settings[:rescue_all],
236
- default_error_formatter: settings[:default_error_formatter],
237
- error_formatters: settings[:error_formatters],
238
- rescue_options: settings[:rescue_options],
239
- rescue_handlers: merged_setting(:rescue_handlers),
240
- base_only_rescue_handlers: merged_setting(:base_only_rescue_handlers),
241
- all_rescue_handler: settings[:all_rescue_handler]
242
-
243
- aggregate_setting(:middleware).each do |m|
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 settings[:version]
254
- b.use Grape::Middleware::Versioner.using(settings[:version_options][:using]),
255
- versions: settings[:version] ? settings[:version].flatten : nil,
256
- version_options: settings[:version_options],
257
- prefix: settings[:root_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: settings[:format],
263
- default_format: settings[:default_format] || :txt,
264
- content_types: settings[:content_types],
265
- formatters: settings[:formatters],
266
- parsers: settings[: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
- m = Module.new
273
- settings.stack.each do |frame|
274
- m.send :include, frame[:helpers] if frame[:helpers]
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
- aggregate_setting(:befores)
314
+ namespace_stackable(:befores) || []
299
315
  end
300
316
 
301
317
  def before_validations
302
- aggregate_setting(:before_validations)
318
+ namespace_stackable(:before_validations) || []
303
319
  end
304
320
 
305
321
  def after_validations
306
- aggregate_setting(:after_validations)
322
+ namespace_stackable(:after_validations) || []
307
323
  end
308
324
 
309
325
  def afters
310
- aggregate_setting(:afters)
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
- [["Problem", @problem], ["Summary", @summary], ["Resolution", @resolution]].reduce("") do |message, detail_array|
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("incompatible_option_values", option1: option1, value1: value1, option2: option2, value2: value2))
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("invalid_formatter", klass: klass, to_format: to_format))
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("invalid_versioner_option", strategy: strategy))
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 InvalidWithOptionForRepresent < Base
5
5
  def initialize
6
- super(message: compose_message("invalid_with_option_for_represent"))
6
+ super(message: compose_message('invalid_with_option_for_represent'))
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("missing_mime_type", new_format: new_format))
6
+ super(message: compose_message('missing_mime_type', new_format: new_format))
7
7
  end
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ module Grape
3
3
  module Exceptions
4
4
  class MissingOption < Base
5
5
  def initialize(option)
6
- super(message: compose_message("missing_option", option: option))
6
+ super(message: compose_message('missing_option', option: option))
7
7
  end
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ module Grape
3
3
  module Exceptions
4
4
  class MissingVendorOption < Base
5
5
  def initialize
6
- super(message: compose_message("missing_vendor_option"))
6
+ super(message: compose_message('missing_vendor_option'))
7
7
  end
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ module Grape
3
3
  module Exceptions
4
4
  class UnknownOptions < Base
5
5
  def initialize(options)
6
- super(message: compose_message("unknown_options", options: options))
6
+ super(message: compose_message('unknown_options', options: options))
7
7
  end
8
8
  end
9
9
  end