grape 1.2.5 → 1.4.0
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/CHANGELOG.md +97 -0
- data/LICENSE +1 -1
- data/README.md +53 -16
- data/UPGRADING.md +231 -23
- data/grape.gemspec +10 -1
- data/lib/grape.rb +6 -7
- data/lib/grape/api.rb +4 -2
- data/lib/grape/api/helpers.rb +2 -0
- data/lib/grape/api/instance.rb +36 -33
- data/lib/grape/config.rb +2 -0
- data/lib/grape/content_types.rb +34 -0
- data/lib/grape/cookies.rb +2 -0
- data/lib/grape/dsl/api.rb +2 -0
- data/lib/grape/dsl/callbacks.rb +2 -0
- data/lib/grape/dsl/configuration.rb +2 -0
- data/lib/grape/dsl/desc.rb +2 -0
- data/lib/grape/dsl/headers.rb +2 -0
- data/lib/grape/dsl/helpers.rb +4 -2
- data/lib/grape/dsl/inside_route.rb +83 -34
- data/lib/grape/dsl/logger.rb +2 -0
- data/lib/grape/dsl/middleware.rb +2 -0
- data/lib/grape/dsl/parameters.rb +8 -6
- data/lib/grape/dsl/request_response.rb +4 -2
- data/lib/grape/dsl/routing.rb +9 -5
- data/lib/grape/dsl/settings.rb +7 -1
- data/lib/grape/dsl/validations.rb +20 -1
- data/lib/grape/eager_load.rb +3 -1
- data/lib/grape/endpoint.rb +21 -13
- data/lib/grape/error_formatter.rb +3 -1
- data/lib/grape/error_formatter/base.rb +2 -0
- data/lib/grape/error_formatter/json.rb +2 -0
- data/lib/grape/error_formatter/txt.rb +2 -0
- data/lib/grape/error_formatter/xml.rb +2 -0
- data/lib/grape/exceptions/base.rb +11 -13
- data/lib/grape/exceptions/incompatible_option_values.rb +2 -0
- data/lib/grape/exceptions/invalid_accept_header.rb +2 -0
- data/lib/grape/exceptions/invalid_formatter.rb +2 -0
- data/lib/grape/exceptions/invalid_message_body.rb +2 -0
- data/lib/grape/exceptions/invalid_response.rb +2 -0
- data/lib/grape/exceptions/invalid_version_header.rb +2 -0
- data/lib/grape/exceptions/invalid_versioner_option.rb +2 -0
- data/lib/grape/exceptions/invalid_with_option_for_represent.rb +2 -0
- data/lib/grape/exceptions/method_not_allowed.rb +2 -0
- data/lib/grape/exceptions/missing_group_type.rb +2 -0
- data/lib/grape/exceptions/missing_mime_type.rb +2 -0
- data/lib/grape/exceptions/missing_option.rb +2 -0
- data/lib/grape/exceptions/missing_vendor_option.rb +2 -0
- data/lib/grape/exceptions/unknown_options.rb +2 -0
- data/lib/grape/exceptions/unknown_parameter.rb +2 -0
- data/lib/grape/exceptions/unknown_validator.rb +2 -0
- data/lib/grape/exceptions/unsupported_group_type.rb +2 -0
- data/lib/grape/exceptions/validation.rb +3 -1
- data/lib/grape/exceptions/validation_array_errors.rb +2 -0
- data/lib/grape/exceptions/validation_errors.rb +13 -12
- data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +4 -3
- data/lib/grape/extensions/deep_mergeable_hash.rb +2 -0
- data/lib/grape/extensions/deep_symbolize_hash.rb +2 -0
- data/lib/grape/extensions/hash.rb +2 -0
- data/lib/grape/extensions/hashie/mash.rb +2 -0
- data/lib/grape/formatter.rb +5 -3
- data/lib/grape/formatter/json.rb +2 -0
- data/lib/grape/formatter/serializable_hash.rb +2 -0
- data/lib/grape/formatter/txt.rb +2 -0
- data/lib/grape/formatter/xml.rb +2 -0
- data/lib/grape/http/headers.rb +50 -18
- data/lib/grape/middleware/auth/base.rb +2 -0
- data/lib/grape/middleware/auth/dsl.rb +2 -0
- data/lib/grape/middleware/auth/strategies.rb +2 -0
- data/lib/grape/middleware/auth/strategy_info.rb +2 -0
- data/lib/grape/middleware/base.rb +7 -7
- data/lib/grape/middleware/error.rb +3 -1
- data/lib/grape/middleware/filter.rb +2 -0
- data/lib/grape/middleware/formatter.rb +8 -6
- data/lib/grape/middleware/globals.rb +2 -0
- data/lib/grape/middleware/helpers.rb +2 -0
- data/lib/grape/middleware/stack.rb +4 -1
- data/lib/grape/middleware/versioner.rb +2 -0
- data/lib/grape/middleware/versioner/accept_version_header.rb +2 -0
- data/lib/grape/middleware/versioner/header.rb +6 -4
- data/lib/grape/middleware/versioner/param.rb +3 -1
- data/lib/grape/middleware/versioner/parse_media_type_patch.rb +4 -1
- data/lib/grape/middleware/versioner/path.rb +3 -1
- data/lib/grape/namespace.rb +14 -2
- data/lib/grape/parser.rb +3 -1
- data/lib/grape/parser/json.rb +2 -0
- data/lib/grape/parser/xml.rb +2 -0
- data/lib/grape/path.rb +15 -3
- data/lib/grape/presenters/presenter.rb +2 -0
- data/lib/grape/request.rb +15 -8
- data/lib/grape/router.rb +30 -29
- data/lib/grape/router/attribute_translator.rb +39 -8
- data/lib/grape/router/pattern.rb +20 -16
- data/lib/grape/router/route.rb +12 -26
- data/lib/grape/{serve_file → serve_stream}/file_body.rb +3 -1
- data/lib/grape/{serve_file → serve_stream}/sendfile_response.rb +3 -1
- data/lib/grape/{serve_file/file_response.rb → serve_stream/stream_response.rb} +10 -8
- data/lib/grape/util/base_inheritable.rb +15 -6
- data/lib/grape/util/cache.rb +20 -0
- data/lib/grape/util/endpoint_configuration.rb +2 -0
- data/lib/grape/util/env.rb +19 -17
- data/lib/grape/util/inheritable_setting.rb +2 -0
- data/lib/grape/util/inheritable_values.rb +2 -0
- data/lib/grape/util/json.rb +2 -0
- data/lib/grape/util/lazy_block.rb +2 -0
- data/lib/grape/util/lazy_object.rb +43 -0
- data/lib/grape/util/lazy_value.rb +2 -0
- data/lib/grape/util/registrable.rb +2 -0
- data/lib/grape/util/reverse_stackable_values.rb +4 -0
- data/lib/grape/util/stackable_values.rb +10 -20
- data/lib/grape/util/strict_hash_configuration.rb +2 -0
- data/lib/grape/util/xml.rb +2 -0
- data/lib/grape/validations.rb +2 -0
- data/lib/grape/validations/attributes_iterator.rb +3 -3
- data/lib/grape/validations/multiple_attributes_iterator.rb +2 -0
- data/lib/grape/validations/params_scope.rb +27 -14
- data/lib/grape/validations/single_attribute_iterator.rb +13 -2
- data/lib/grape/validations/types.rb +12 -34
- data/lib/grape/validations/types/array_coercer.rb +65 -0
- data/lib/grape/validations/types/build_coercer.rb +47 -49
- data/lib/grape/validations/types/custom_type_coercer.rb +15 -49
- data/lib/grape/validations/types/custom_type_collection_coercer.rb +10 -25
- data/lib/grape/validations/types/dry_type_coercer.rb +76 -0
- data/lib/grape/validations/types/file.rb +22 -18
- data/lib/grape/validations/types/json.rb +46 -39
- data/lib/grape/validations/types/multiple_type_coercer.rb +14 -33
- data/lib/grape/validations/types/primitive_coercer.rb +67 -0
- data/lib/grape/validations/types/set_coercer.rb +40 -0
- data/lib/grape/validations/types/variant_collection_coercer.rb +5 -13
- data/lib/grape/validations/validator_factory.rb +2 -0
- data/lib/grape/validations/validators/all_or_none.rb +3 -1
- data/lib/grape/validations/validators/allow_blank.rb +3 -1
- data/lib/grape/validations/validators/as.rb +2 -0
- data/lib/grape/validations/validators/at_least_one_of.rb +3 -1
- data/lib/grape/validations/validators/base.rb +8 -5
- data/lib/grape/validations/validators/coerce.rb +39 -29
- data/lib/grape/validations/validators/default.rb +2 -1
- data/lib/grape/validations/validators/exactly_one_of.rb +6 -2
- data/lib/grape/validations/validators/except_values.rb +3 -1
- data/lib/grape/validations/validators/multiple_params_base.rb +2 -0
- data/lib/grape/validations/validators/mutual_exclusion.rb +3 -1
- data/lib/grape/validations/validators/presence.rb +3 -1
- data/lib/grape/validations/validators/regexp.rb +4 -2
- data/lib/grape/validations/validators/same_as.rb +6 -3
- data/lib/grape/validations/validators/values.rb +17 -5
- data/lib/grape/version.rb +3 -1
- data/spec/grape/api/custom_validations_spec.rb +5 -3
- data/spec/grape/api/deeply_included_options_spec.rb +2 -0
- data/spec/grape/api/defines_boolean_in_params_spec.rb +5 -3
- data/spec/grape/api/inherited_helpers_spec.rb +2 -0
- data/spec/grape/api/instance_spec.rb +104 -0
- data/spec/grape/api/invalid_format_spec.rb +2 -0
- data/spec/grape/api/namespace_parameters_in_route_spec.rb +2 -0
- data/spec/grape/api/nested_helpers_spec.rb +2 -0
- data/spec/grape/api/optional_parameters_in_route_spec.rb +2 -0
- data/spec/grape/api/parameters_modification_spec.rb +3 -1
- data/spec/grape/api/patch_method_helpers_spec.rb +2 -0
- data/spec/grape/api/recognize_path_spec.rb +2 -0
- data/spec/grape/api/required_parameters_in_route_spec.rb +2 -0
- data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +2 -0
- data/spec/grape/api/routes_with_requirements_spec.rb +2 -0
- data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +2 -0
- data/spec/grape/api/shared_helpers_spec.rb +2 -0
- data/spec/grape/api_remount_spec.rb +2 -0
- data/spec/grape/api_spec.rb +99 -11
- data/spec/grape/config_spec.rb +2 -0
- data/spec/grape/dsl/callbacks_spec.rb +2 -0
- data/spec/grape/dsl/configuration_spec.rb +2 -0
- data/spec/grape/dsl/desc_spec.rb +2 -0
- data/spec/grape/dsl/headers_spec.rb +2 -0
- data/spec/grape/dsl/helpers_spec.rb +4 -2
- data/spec/grape/dsl/inside_route_spec.rb +177 -33
- data/spec/grape/dsl/logger_spec.rb +2 -0
- data/spec/grape/dsl/middleware_spec.rb +2 -0
- data/spec/grape/dsl/parameters_spec.rb +2 -0
- data/spec/grape/dsl/request_response_spec.rb +2 -0
- data/spec/grape/dsl/routing_spec.rb +2 -0
- data/spec/grape/dsl/settings_spec.rb +2 -0
- data/spec/grape/dsl/validations_spec.rb +2 -0
- data/spec/grape/endpoint_spec.rb +21 -6
- data/spec/grape/entity_spec.rb +2 -0
- data/spec/grape/exceptions/base_spec.rb +3 -1
- data/spec/grape/exceptions/body_parse_errors_spec.rb +2 -0
- data/spec/grape/exceptions/invalid_accept_header_spec.rb +2 -0
- data/spec/grape/exceptions/invalid_formatter_spec.rb +2 -0
- data/spec/grape/exceptions/invalid_response_spec.rb +2 -0
- data/spec/grape/exceptions/invalid_versioner_option_spec.rb +2 -0
- data/spec/grape/exceptions/missing_mime_type_spec.rb +2 -0
- data/spec/grape/exceptions/missing_option_spec.rb +2 -0
- data/spec/grape/exceptions/unknown_options_spec.rb +2 -0
- data/spec/grape/exceptions/unknown_validator_spec.rb +2 -0
- data/spec/grape/exceptions/validation_errors_spec.rb +4 -2
- data/spec/grape/exceptions/validation_spec.rb +3 -1
- data/spec/grape/extensions/param_builders/hash_spec.rb +2 -0
- data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +2 -0
- data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +2 -0
- data/spec/grape/integration/global_namespace_function_spec.rb +2 -0
- data/spec/grape/integration/rack_sendfile_spec.rb +14 -8
- data/spec/grape/integration/rack_spec.rb +3 -1
- data/spec/grape/loading_spec.rb +2 -0
- data/spec/grape/middleware/auth/base_spec.rb +2 -0
- data/spec/grape/middleware/auth/dsl_spec.rb +2 -0
- data/spec/grape/middleware/auth/strategies_spec.rb +3 -1
- data/spec/grape/middleware/base_spec.rb +2 -0
- data/spec/grape/middleware/error_spec.rb +2 -0
- data/spec/grape/middleware/exception_spec.rb +3 -1
- data/spec/grape/middleware/formatter_spec.rb +19 -12
- data/spec/grape/middleware/globals_spec.rb +2 -0
- data/spec/grape/middleware/stack_spec.rb +11 -0
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +3 -1
- data/spec/grape/middleware/versioner/header_spec.rb +3 -1
- data/spec/grape/middleware/versioner/param_spec.rb +3 -1
- data/spec/grape/middleware/versioner/path_spec.rb +3 -1
- data/spec/grape/middleware/versioner_spec.rb +2 -0
- data/spec/grape/named_api_spec.rb +2 -0
- data/spec/grape/parser_spec.rb +7 -5
- data/spec/grape/path_spec.rb +6 -4
- data/spec/grape/presenters/presenter_spec.rb +2 -0
- data/spec/grape/request_spec.rb +2 -0
- data/spec/grape/util/inheritable_setting_spec.rb +2 -0
- data/spec/grape/util/inheritable_values_spec.rb +2 -0
- data/spec/grape/util/reverse_stackable_values_spec.rb +2 -0
- data/spec/grape/util/stackable_values_spec.rb +3 -1
- data/spec/grape/util/strict_hash_configuration_spec.rb +2 -0
- data/spec/grape/validations/attributes_iterator_spec.rb +2 -0
- data/spec/grape/validations/instance_behaivour_spec.rb +5 -3
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +2 -0
- data/spec/grape/validations/params_scope_spec.rb +3 -1
- data/spec/grape/validations/single_attribute_iterator_spec.rb +18 -4
- data/spec/grape/validations/types/array_coercer_spec.rb +35 -0
- data/spec/grape/validations/types/primitive_coercer_spec.rb +135 -0
- data/spec/grape/validations/types/set_coercer_spec.rb +34 -0
- data/spec/grape/validations/types_spec.rb +9 -36
- data/spec/grape/validations/validators/all_or_none_spec.rb +2 -0
- data/spec/grape/validations/validators/allow_blank_spec.rb +2 -0
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +2 -0
- data/spec/grape/validations/validators/coerce_spec.rb +341 -136
- data/spec/grape/validations/validators/default_spec.rb +123 -0
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +14 -12
- data/spec/grape/validations/validators/except_values_spec.rb +3 -1
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +2 -0
- data/spec/grape/validations/validators/presence_spec.rb +30 -0
- data/spec/grape/validations/validators/regexp_spec.rb +2 -0
- data/spec/grape/validations/validators/same_as_spec.rb +2 -0
- data/spec/grape/validations/validators/values_spec.rb +30 -5
- data/spec/grape/validations_spec.rb +91 -33
- data/spec/integration/eager_load/eager_load_spec.rb +15 -0
- data/spec/integration/multi_json/json_spec.rb +2 -0
- data/spec/integration/multi_xml/xml_spec.rb +2 -0
- data/spec/shared/versioning_examples.rb +2 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/support/basic_auth_encode_helpers.rb +2 -0
- data/spec/support/content_type_helpers.rb +2 -0
- data/spec/support/eager_load.rb +19 -0
- data/spec/support/endpoint_faker.rb +2 -0
- data/spec/support/file_streamer.rb +2 -0
- data/spec/support/integer_helpers.rb +2 -0
- data/spec/support/versioned_helpers.rb +4 -2
- metadata +48 -28
- data/lib/grape/extensions/deep_hash_with_indifferent_access.rb +0 -18
- data/lib/grape/util/content_types.rb +0 -26
- data/lib/grape/validations/types/virtus_collection_patch.rb +0 -16
data/lib/grape/dsl/logger.rb
CHANGED
data/lib/grape/dsl/middleware.rb
CHANGED
data/lib/grape/dsl/parameters.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Grape
|
@@ -125,13 +127,13 @@ module Grape
|
|
125
127
|
|
126
128
|
opts = attrs.extract_options!.clone
|
127
129
|
opts[:presence] = { value: true, message: opts[:message] }
|
128
|
-
opts = @group.merge(opts) if @group
|
130
|
+
opts = @group.merge(opts) if instance_variable_defined?(:@group) && @group
|
129
131
|
|
130
132
|
if opts[:using]
|
131
133
|
require_required_and_optional_fields(attrs.first, opts)
|
132
134
|
else
|
133
135
|
validate_attributes(attrs, opts, &block)
|
134
|
-
block_given? ? new_scope(orig_attrs, &block) : push_declared_params(attrs, opts.slice(:as))
|
136
|
+
block_given? ? new_scope(orig_attrs, &block) : push_declared_params(attrs, **opts.slice(:as))
|
135
137
|
end
|
136
138
|
end
|
137
139
|
|
@@ -144,7 +146,7 @@ module Grape
|
|
144
146
|
|
145
147
|
opts = attrs.extract_options!.clone
|
146
148
|
type = opts[:type]
|
147
|
-
opts = @group.merge(opts) if @group
|
149
|
+
opts = @group.merge(opts) if instance_variable_defined?(:@group) && @group
|
148
150
|
|
149
151
|
# check type for optional parameter group
|
150
152
|
if attrs && block_given?
|
@@ -157,7 +159,7 @@ module Grape
|
|
157
159
|
else
|
158
160
|
validate_attributes(attrs, opts, &block)
|
159
161
|
|
160
|
-
block_given? ? new_scope(orig_attrs, true, &block) : push_declared_params(attrs, opts.slice(:as))
|
162
|
+
block_given? ? new_scope(orig_attrs, true, &block) : push_declared_params(attrs, **opts.slice(:as))
|
161
163
|
end
|
162
164
|
end
|
163
165
|
|
@@ -241,8 +243,8 @@ module Grape
|
|
241
243
|
# @return hash of parameters relevant for the current scope
|
242
244
|
# @api private
|
243
245
|
def params(params)
|
244
|
-
params = @parent.params(params) if @parent
|
245
|
-
params = map_params(params, @element) if @element
|
246
|
+
params = @parent.params(params) if instance_variable_defined?(:@parent) && @parent
|
247
|
+
params = map_params(params, @element) if instance_variable_defined?(:@element) && @element
|
246
248
|
params
|
247
249
|
end
|
248
250
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Grape
|
@@ -20,7 +22,7 @@ module Grape
|
|
20
22
|
if new_format
|
21
23
|
namespace_inheritable(:format, new_format.to_sym)
|
22
24
|
# define the default error formatters
|
23
|
-
namespace_inheritable(:default_error_formatter, Grape::ErrorFormatter.formatter_for(new_format, {}))
|
25
|
+
namespace_inheritable(:default_error_formatter, Grape::ErrorFormatter.formatter_for(new_format, **{}))
|
24
26
|
# define a single mime type
|
25
27
|
mime_type = content_types[new_format.to_sym]
|
26
28
|
raise Grape::Exceptions::MissingMimeType.new(new_format) unless mime_type
|
@@ -43,7 +45,7 @@ module Grape
|
|
43
45
|
# Specify a default error formatter.
|
44
46
|
def default_error_formatter(new_formatter_name = nil)
|
45
47
|
if new_formatter_name
|
46
|
-
new_formatter = Grape::ErrorFormatter.formatter_for(new_formatter_name, {})
|
48
|
+
new_formatter = Grape::ErrorFormatter.formatter_for(new_formatter_name, **{})
|
47
49
|
namespace_inheritable(:default_error_formatter, new_formatter)
|
48
50
|
else
|
49
51
|
namespace_inheritable(:default_error_formatter)
|
data/lib/grape/dsl/routing.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Grape
|
@@ -49,7 +51,7 @@ module Grape
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
52
|
-
@versions.last
|
54
|
+
@versions.last if instance_variable_defined?(:@versions) && @versions
|
53
55
|
end
|
54
56
|
|
55
57
|
# Define a root URL prefix for your entire API.
|
@@ -140,11 +142,11 @@ module Grape
|
|
140
142
|
reset_validations!
|
141
143
|
end
|
142
144
|
|
143
|
-
|
144
|
-
define_method
|
145
|
+
Grape::Http::Headers::SUPPORTED_METHODS.each do |supported_method|
|
146
|
+
define_method supported_method.downcase do |*args, &block|
|
145
147
|
options = args.extract_options!
|
146
148
|
paths = args.first || ['/']
|
147
|
-
route(
|
149
|
+
route(supported_method, paths, options, &block)
|
148
150
|
end
|
149
151
|
end
|
150
152
|
|
@@ -161,13 +163,15 @@ module Grape
|
|
161
163
|
# end
|
162
164
|
# end
|
163
165
|
def namespace(space = nil, options = {}, &block)
|
166
|
+
@namespace_description = nil unless instance_variable_defined?(:@namespace_description) && @namespace_description
|
167
|
+
|
164
168
|
if space || block_given?
|
165
169
|
within_namespace do
|
166
170
|
previous_namespace_description = @namespace_description
|
167
171
|
@namespace_description = (@namespace_description || {}).deep_merge(namespace_setting(:description) || {})
|
168
172
|
nest(block) do
|
169
173
|
if space
|
170
|
-
namespace_stackable(:namespace, Namespace.new(space, options))
|
174
|
+
namespace_stackable(:namespace, Namespace.new(space, **options))
|
171
175
|
end
|
172
176
|
end
|
173
177
|
@namespace_description = previous_namespace_description
|
data/lib/grape/dsl/settings.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Grape
|
@@ -169,7 +171,11 @@ module Grape
|
|
169
171
|
# the superclass's :inheritable_setting.
|
170
172
|
def build_top_level_setting
|
171
173
|
Grape::Util::InheritableSetting.new.tap do |setting|
|
172
|
-
|
174
|
+
# Doesn't try to inherit settings from +Grape::API::Instance+ which also responds to
|
175
|
+
# +inheritable_setting+, however, it doesn't contain any user-defined settings.
|
176
|
+
# Otherwise, it would lead to an extra instance of +Grape::Util::InheritableSetting+
|
177
|
+
# in the chain for every endpoint.
|
178
|
+
if defined?(superclass) && superclass.respond_to?(:inheritable_setting) && superclass != Grape::API::Instance
|
173
179
|
setting.inherit_from superclass.inheritable_setting
|
174
180
|
end
|
175
181
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Grape
|
@@ -8,7 +10,24 @@ module Grape
|
|
8
10
|
include Grape::DSL::Configuration
|
9
11
|
|
10
12
|
module ClassMethods
|
11
|
-
# Clears all defined parameters and validations.
|
13
|
+
# Clears all defined parameters and validations. The main purpose of it is to clean up
|
14
|
+
# settings, so next endpoint won't interfere with previous one.
|
15
|
+
#
|
16
|
+
# params do
|
17
|
+
# # params for the endpoint below this block
|
18
|
+
# end
|
19
|
+
# post '/current' do
|
20
|
+
# # whatever
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# # somewhere between them the reset_validations! method gets called
|
24
|
+
#
|
25
|
+
# params do
|
26
|
+
# # params for the endpoint below this block
|
27
|
+
# end
|
28
|
+
# post '/next' do
|
29
|
+
# # whatever
|
30
|
+
# end
|
12
31
|
def reset_validations!
|
13
32
|
unset_namespace_stackable :declared_params
|
14
33
|
unset_namespace_stackable :validations
|
data/lib/grape/eager_load.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
Grape.eager_load!
|
2
4
|
Grape::Http.eager_load!
|
3
5
|
Grape::Exceptions.eager_load!
|
@@ -14,5 +16,5 @@ Grape::Parser.eager_load!
|
|
14
16
|
Grape::DSL.eager_load!
|
15
17
|
Grape::API.eager_load!
|
16
18
|
Grape::Presenters.eager_load!
|
17
|
-
Grape::
|
19
|
+
Grape::ServeStream.eager_load!
|
18
20
|
Rack::Head # AutoLoads the Rack::Head
|
data/lib/grape/endpoint.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Grape
|
2
4
|
# An Endpoint is the proxy scope in which all routing
|
3
5
|
# blocks are executed. In other words, any methods
|
@@ -78,7 +80,10 @@ module Grape
|
|
78
80
|
|
79
81
|
self.inheritable_setting = new_settings.point_in_time_copy
|
80
82
|
|
81
|
-
|
83
|
+
# now +namespace_stackable(:declared_params)+ contains all params defined for
|
84
|
+
# this endpoint and its parents, but later it will be cleaned up,
|
85
|
+
# see +reset_validations!+ in lib/grape/dsl/validations.rb
|
86
|
+
route_setting(:declared_params, namespace_stackable(:declared_params).flatten)
|
82
87
|
route_setting(:saved_validations, namespace_stackable(:validations))
|
83
88
|
|
84
89
|
namespace_stackable(:representations, []) unless namespace_stackable(:representations)
|
@@ -97,7 +102,7 @@ module Grape
|
|
97
102
|
@block = nil
|
98
103
|
|
99
104
|
@status = nil
|
100
|
-
@
|
105
|
+
@stream = nil
|
101
106
|
@body = nil
|
102
107
|
@proc = nil
|
103
108
|
|
@@ -114,7 +119,6 @@ module Grape
|
|
114
119
|
parent_declared_params = namespace_stackable[:declared_params]
|
115
120
|
|
116
121
|
if parent_declared_params
|
117
|
-
inheritable_setting.route[:declared_params] ||= []
|
118
122
|
inheritable_setting.route[:declared_params].concat(parent_declared_params.flatten)
|
119
123
|
end
|
120
124
|
|
@@ -154,8 +158,8 @@ module Grape
|
|
154
158
|
methods << Grape::Http::Headers::HEAD
|
155
159
|
end
|
156
160
|
methods.each do |method|
|
157
|
-
unless route.request_method
|
158
|
-
route = Grape::Router::Route.new(method, route.origin, route.attributes.to_h)
|
161
|
+
unless route.request_method == method
|
162
|
+
route = Grape::Router::Route.new(method, route.origin, **route.attributes.to_h)
|
159
163
|
end
|
160
164
|
router.append(route.apply(self))
|
161
165
|
end
|
@@ -167,8 +171,8 @@ module Grape
|
|
167
171
|
route_options = prepare_default_route_attributes
|
168
172
|
map_routes do |method, path|
|
169
173
|
path = prepare_path(path)
|
170
|
-
params = merge_route_options(route_options.merge(suffix: path.suffix))
|
171
|
-
route = Router::Route.new(method, path.path, params)
|
174
|
+
params = merge_route_options(**route_options.merge(suffix: path.suffix))
|
175
|
+
route = Router::Route.new(method, path.path, **params)
|
172
176
|
route.apply(self)
|
173
177
|
end.flatten
|
174
178
|
end
|
@@ -188,7 +192,7 @@ module Grape
|
|
188
192
|
requirements: prepare_routes_requirements,
|
189
193
|
prefix: namespace_inheritable(:root_prefix),
|
190
194
|
anchor: options[:route_options].fetch(:anchor, true),
|
191
|
-
settings: inheritable_setting.route.except(:
|
195
|
+
settings: inheritable_setting.route.except(:declared_params, :saved_validations),
|
192
196
|
forward_match: options[:forward_match]
|
193
197
|
}
|
194
198
|
end
|
@@ -260,7 +264,7 @@ module Grape
|
|
260
264
|
run_validators validations, request
|
261
265
|
remove_renamed_params
|
262
266
|
run_filters after_validations, :after_validation
|
263
|
-
response_object =
|
267
|
+
response_object = execute
|
264
268
|
end
|
265
269
|
|
266
270
|
run_filters afters, :after
|
@@ -269,8 +273,8 @@ module Grape
|
|
269
273
|
# status verifies body presence when DELETE
|
270
274
|
@body ||= response_object
|
271
275
|
|
272
|
-
# The body commonly is an Array of Strings, the application instance itself, or a
|
273
|
-
response_object =
|
276
|
+
# The body commonly is an Array of Strings, the application instance itself, or a Stream-like object
|
277
|
+
response_object = stream || [body]
|
274
278
|
|
275
279
|
[status, header, response_object]
|
276
280
|
ensure
|
@@ -333,6 +337,10 @@ module Grape
|
|
333
337
|
|
334
338
|
private :build_stack, :build_helpers, :remove_renamed_params
|
335
339
|
|
340
|
+
def execute
|
341
|
+
@block ? @block.call(self) : nil
|
342
|
+
end
|
343
|
+
|
336
344
|
def helpers
|
337
345
|
lazy_initialize! && @helpers
|
338
346
|
end
|
@@ -353,7 +361,7 @@ module Grape
|
|
353
361
|
def run_validators(validator_factories, request)
|
354
362
|
validation_errors = []
|
355
363
|
|
356
|
-
validators = validator_factories.map { |options| Grape::Validations::ValidatorFactory.create_validator(options) }
|
364
|
+
validators = validator_factories.map { |options| Grape::Validations::ValidatorFactory.create_validator(**options) }
|
357
365
|
|
358
366
|
ActiveSupport::Notifications.instrument('endpoint_run_validators.grape', endpoint: self, validators: validators, request: request) do
|
359
367
|
validators.each do |validator|
|
@@ -369,7 +377,7 @@ module Grape
|
|
369
377
|
end
|
370
378
|
end
|
371
379
|
|
372
|
-
validation_errors.any? && raise(Grape::Exceptions::ValidationErrors
|
380
|
+
validation_errors.any? && raise(Grape::Exceptions::ValidationErrors.new(errors: validation_errors, headers: header))
|
373
381
|
end
|
374
382
|
|
375
383
|
def run_filters(filters, type = :other)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Grape
|
2
4
|
module ErrorFormatter
|
3
5
|
extend Util::Registrable
|
@@ -13,7 +15,7 @@ module Grape
|
|
13
15
|
}
|
14
16
|
end
|
15
17
|
|
16
|
-
def formatters(options)
|
18
|
+
def formatters(**options)
|
17
19
|
builtin_formatters.merge(default_elements).merge!(options[:error_formatters] || {})
|
18
20
|
end
|
19
21
|
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Grape
|
2
4
|
module Exceptions
|
3
5
|
class Base < StandardError
|
4
|
-
BASE_MESSAGES_KEY = 'grape.errors.messages'
|
5
|
-
BASE_ATTRIBUTES_KEY = 'grape.errors.attributes'
|
6
|
+
BASE_MESSAGES_KEY = 'grape.errors.messages'
|
7
|
+
BASE_ATTRIBUTES_KEY = 'grape.errors.attributes'
|
6
8
|
FALLBACK_LOCALE = :en
|
7
9
|
|
8
10
|
attr_reader :status, :message, :headers
|
@@ -28,7 +30,7 @@ module Grape
|
|
28
30
|
@problem = problem(key, **attributes)
|
29
31
|
@summary = summary(key, **attributes)
|
30
32
|
@resolution = resolution(key, **attributes)
|
31
|
-
[['Problem', @problem], ['Summary', @summary], ['Resolution', @resolution]].
|
33
|
+
[['Problem', @problem], ['Summary', @summary], ['Resolution', @resolution]].each_with_object(+'') do |detail_array, message|
|
32
34
|
message << "\n#{detail_array[0]}:\n #{detail_array[1]}" unless detail_array[1].blank?
|
33
35
|
message
|
34
36
|
end
|
@@ -37,16 +39,16 @@ module Grape
|
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
40
|
-
def problem(key, attributes)
|
41
|
-
translate_message("#{key}.problem".to_sym, attributes)
|
42
|
+
def problem(key, **attributes)
|
43
|
+
translate_message("#{key}.problem".to_sym, **attributes)
|
42
44
|
end
|
43
45
|
|
44
|
-
def summary(key, attributes)
|
45
|
-
translate_message("#{key}.summary".to_sym, attributes)
|
46
|
+
def summary(key, **attributes)
|
47
|
+
translate_message("#{key}.summary".to_sym, **attributes)
|
46
48
|
end
|
47
49
|
|
48
|
-
def resolution(key, attributes)
|
49
|
-
translate_message("#{key}.resolution".to_sym, attributes)
|
50
|
+
def resolution(key, **attributes)
|
51
|
+
translate_message("#{key}.resolution".to_sym, **attributes)
|
50
52
|
end
|
51
53
|
|
52
54
|
def translate_attributes(keys, **options)
|
@@ -55,10 +57,6 @@ module Grape
|
|
55
57
|
end.join(', ')
|
56
58
|
end
|
57
59
|
|
58
|
-
def translate_attribute(key, **options)
|
59
|
-
translate("#{BASE_ATTRIBUTES_KEY}.#{key}", default: key, **options)
|
60
|
-
end
|
61
|
-
|
62
60
|
def translate_message(key, **options)
|
63
61
|
case key
|
64
62
|
when Symbol
|