grape 1.2.5 → 1.3.1
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 +45 -0
- data/README.md +7 -6
- data/UPGRADING.md +43 -0
- data/grape.gemspec +10 -1
- data/lib/grape/api/helpers.rb +2 -0
- data/lib/grape/api/instance.rb +8 -6
- data/lib/grape/api.rb +4 -2
- 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 +15 -11
- 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 +2 -0
- data/lib/grape/eager_load.rb +2 -0
- data/lib/grape/endpoint.rb +13 -7
- 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/error_formatter.rb +3 -1
- 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/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/formatter.rb +5 -3
- data/lib/grape/http/headers.rb +49 -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 +5 -5
- data/lib/grape/middleware/error.rb +3 -1
- data/lib/grape/middleware/filter.rb +2 -0
- data/lib/grape/middleware/formatter.rb +5 -3
- 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/accept_version_header.rb +2 -0
- data/lib/grape/middleware/versioner/header.rb +5 -3
- data/lib/grape/middleware/versioner/param.rb +3 -1
- data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -0
- data/lib/grape/middleware/versioner/path.rb +3 -1
- data/lib/grape/middleware/versioner.rb +2 -0
- data/lib/grape/namespace.rb +14 -2
- data/lib/grape/parser/json.rb +2 -0
- data/lib/grape/parser/xml.rb +2 -0
- data/lib/grape/parser.rb +3 -1
- data/lib/grape/path.rb +13 -1
- data/lib/grape/presenters/presenter.rb +2 -0
- data/lib/grape/request.rb +15 -8
- data/lib/grape/router/attribute_translator.rb +18 -8
- data/lib/grape/router/pattern.rb +20 -16
- data/lib/grape/router/route.rb +9 -4
- data/lib/grape/router.rb +26 -12
- data/lib/grape/serve_file/file_body.rb +2 -0
- data/lib/grape/serve_file/file_response.rb +2 -0
- data/lib/grape/serve_file/sendfile_response.rb +2 -0
- data/lib/grape/util/base_inheritable.rb +6 -0
- 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 +3 -1
- data/lib/grape/util/stackable_values.rb +9 -21
- data/lib/grape/util/strict_hash_configuration.rb +2 -0
- data/lib/grape/util/xml.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 +24 -11
- data/lib/grape/validations/single_attribute_iterator.rb +13 -2
- data/lib/grape/validations/types/array_coercer.rb +56 -0
- data/lib/grape/validations/types/build_coercer.rb +49 -48
- 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 +41 -0
- data/lib/grape/validations/types/file.rb +11 -9
- data/lib/grape/validations/types/json.rb +11 -8
- data/lib/grape/validations/types/multiple_type_coercer.rb +14 -33
- data/lib/grape/validations/types/primitive_coercer.rb +61 -0
- data/lib/grape/validations/types/set_coercer.rb +38 -0
- data/lib/grape/validations/types/variant_collection_coercer.rb +4 -12
- data/lib/grape/validations/types.rb +7 -30
- 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 +44 -27
- data/lib/grape/validations/validators/default.rb +2 -0
- 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 +3 -1
- data/lib/grape/validations/validators/same_as.rb +6 -3
- data/lib/grape/validations/validators/values.rb +17 -5
- data/lib/grape/validations.rb +2 -0
- data/lib/grape/version.rb +3 -1
- data/lib/grape.rb +4 -5
- 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 +54 -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 +34 -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 +2 -0
- 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 +3 -1
- 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 +2 -0
- 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 +2 -0
- 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 +2 -0
- 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/primitive_coercer_spec.rb +75 -0
- data/spec/grape/validations/types_spec.rb +8 -35
- 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 +51 -110
- data/spec/grape/validations/validators/default_spec.rb +2 -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 +29 -4
- data/spec/grape/validations_spec.rb +69 -15
- 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 +126 -112
- 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
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Grape
|
2
4
|
module Validations
|
3
5
|
class ValuesValidator < Base
|
@@ -24,17 +26,23 @@ module Grape
|
|
24
26
|
|
25
27
|
def validate_param!(attr_name, params)
|
26
28
|
return unless params.is_a?(Hash)
|
27
|
-
return unless params[attr_name] || required_for_root_scope?
|
28
29
|
|
29
|
-
|
30
|
+
val = params[attr_name]
|
31
|
+
|
32
|
+
return if val.nil? && !required_for_root_scope?
|
33
|
+
|
34
|
+
# don't forget that +false.blank?+ is true
|
35
|
+
return if val != false && val.blank? && @allow_blank
|
30
36
|
|
31
|
-
|
37
|
+
param_array = val.nil? ? [nil] : Array.wrap(val)
|
38
|
+
|
39
|
+
raise validation_exception(attr_name, except_message) \
|
32
40
|
unless check_excepts(param_array)
|
33
41
|
|
34
|
-
raise
|
42
|
+
raise validation_exception(attr_name, message(:values)) \
|
35
43
|
unless check_values(param_array, attr_name)
|
36
44
|
|
37
|
-
raise
|
45
|
+
raise validation_exception(attr_name, message(:values)) \
|
38
46
|
if @proc && !param_array.all? { |param| @proc.call(param) }
|
39
47
|
end
|
40
48
|
|
@@ -66,6 +74,10 @@ module Grape
|
|
66
74
|
def required_for_root_scope?
|
67
75
|
@required && @scope.root?
|
68
76
|
end
|
77
|
+
|
78
|
+
def validation_exception(attr_name, message)
|
79
|
+
Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: message)
|
80
|
+
end
|
69
81
|
end
|
70
82
|
end
|
71
83
|
end
|
data/lib/grape/validations.rb
CHANGED
data/lib/grape/version.rb
CHANGED
data/lib/grape.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'logger'
|
2
4
|
require 'rack'
|
3
5
|
require 'rack/builder'
|
@@ -18,9 +20,6 @@ require 'active_support/core_ext/hash/conversions'
|
|
18
20
|
require 'active_support/dependencies/autoload'
|
19
21
|
require 'active_support/notifications'
|
20
22
|
require 'i18n'
|
21
|
-
require 'thread'
|
22
|
-
|
23
|
-
require 'virtus'
|
24
23
|
|
25
24
|
I18n.load_path << File.expand_path('../grape/locale/en.yml', __FILE__)
|
26
25
|
|
@@ -84,7 +83,6 @@ module Grape
|
|
84
83
|
eager_autoload do
|
85
84
|
autoload :DeepMergeableHash
|
86
85
|
autoload :DeepSymbolizeHash
|
87
|
-
autoload :DeepHashWithIndifferentAccess
|
88
86
|
autoload :Hash
|
89
87
|
end
|
90
88
|
module ActiveSupport
|
@@ -219,7 +217,8 @@ module Grape
|
|
219
217
|
end
|
220
218
|
|
221
219
|
require 'grape/config'
|
222
|
-
require 'grape/
|
220
|
+
require 'grape/content_types'
|
221
|
+
|
223
222
|
require 'grape/util/lazy_value'
|
224
223
|
require 'grape/util/lazy_block'
|
225
224
|
require 'grape/util/endpoint_configuration'
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Grape::Validations do
|
@@ -8,7 +10,7 @@ describe Grape::Validations do
|
|
8
10
|
def validate_param!(attr_name, params)
|
9
11
|
@option = params[:max].to_i if params.key?(:max)
|
10
12
|
return if params[attr_name].length <= @option
|
11
|
-
raise Grape::Exceptions::Validation
|
13
|
+
raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: "must be at the most #{@option} characters long")
|
12
14
|
end
|
13
15
|
end
|
14
16
|
end
|
@@ -87,7 +89,7 @@ describe Grape::Validations do
|
|
87
89
|
module CustomValidationsSpec
|
88
90
|
class WithMessageKey < Grape::Validations::PresenceValidator
|
89
91
|
def validate_param!(attr_name, _params)
|
90
|
-
raise Grape::Exceptions::Validation
|
92
|
+
raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: :presence)
|
91
93
|
end
|
92
94
|
end
|
93
95
|
end
|
@@ -126,7 +128,7 @@ describe Grape::Validations do
|
|
126
128
|
return unless @option
|
127
129
|
# check if user is admin or not
|
128
130
|
# as an example get a token from request and check if it's admin or not
|
129
|
-
raise Grape::Exceptions::Validation
|
131
|
+
raise Grape::Exceptions::Validation.new(params: @attrs, message: 'Can not set Admin only field.') unless request.headers['X-Access-Token'] == 'admin'
|
130
132
|
end
|
131
133
|
end
|
132
134
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Grape::API::Instance do
|
@@ -21,7 +23,7 @@ describe Grape::API::Instance do
|
|
21
23
|
{ class: 'TrueClass', value: true }.to_s
|
22
24
|
end
|
23
25
|
|
24
|
-
it 'sets Boolean as a
|
26
|
+
it 'sets Boolean as a type' do
|
25
27
|
post '/echo?message=true'
|
26
28
|
expect(last_response.status).to eq(201)
|
27
29
|
expect(last_response.body).to eq expected_body
|
@@ -29,8 +31,8 @@ describe Grape::API::Instance do
|
|
29
31
|
|
30
32
|
context 'Params endpoint type' do
|
31
33
|
subject { DefinesBooleanInstanceSpec::API.new.router.map['POST'].first.options[:params]['message'][:type] }
|
32
|
-
it 'params type is a
|
33
|
-
is_expected.to eq '
|
34
|
+
it 'params type is a boolean' do
|
35
|
+
is_expected.to eq 'Grape::API::Boolean'
|
34
36
|
end
|
35
37
|
end
|
36
38
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'shared/versioning_examples'
|
5
|
+
|
6
|
+
describe Grape::API::Instance do
|
7
|
+
subject(:an_instance) do
|
8
|
+
Class.new(Grape::API::Instance) do
|
9
|
+
namespace :some_namespace do
|
10
|
+
get 'some_endpoint' do
|
11
|
+
'success'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:root_api) do
|
18
|
+
to_mount = an_instance
|
19
|
+
Class.new(Grape::API) do
|
20
|
+
mount to_mount
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def app
|
25
|
+
root_api
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when an instance is mounted on the root' do
|
29
|
+
it 'can call the instance endpoint' do
|
30
|
+
get '/some_namespace/some_endpoint'
|
31
|
+
expect(last_response.body).to eq 'success'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when an instance is the root' do
|
36
|
+
let(:root_api) do
|
37
|
+
to_mount = an_instance
|
38
|
+
Class.new(Grape::API::Instance) do
|
39
|
+
mount to_mount
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'can call the instance endpoint' do
|
44
|
+
get '/some_namespace/some_endpoint'
|
45
|
+
expect(last_response.body).to eq 'success'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'top level setting' do
|
50
|
+
it 'does not inherit settings from the superclass (Grape::API::Instance)' do
|
51
|
+
expect(an_instance.top_level_setting.parent).to be_nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Grape::Endpoint do
|
@@ -10,7 +12,7 @@ describe Grape::Endpoint do
|
|
10
12
|
before do
|
11
13
|
subject.namespace :test do
|
12
14
|
params do
|
13
|
-
optional :foo, default: '-abcdef'
|
15
|
+
optional :foo, default: +'-abcdef'
|
14
16
|
end
|
15
17
|
get do
|
16
18
|
params[:foo].slice!(0)
|
data/spec/grape/api_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'shared/versioning_examples'
|
3
5
|
|
@@ -933,7 +935,7 @@ XML
|
|
933
935
|
|
934
936
|
it 'adds a before filter to current and child namespaces only' do
|
935
937
|
subject.get '/' do
|
936
|
-
"root - #{@foo}"
|
938
|
+
"root - #{instance_variable_defined?(:@foo) ? @foo : nil}"
|
937
939
|
end
|
938
940
|
subject.namespace :blah do
|
939
941
|
before { @foo = 'foo' }
|
@@ -1133,7 +1135,7 @@ XML
|
|
1133
1135
|
|
1134
1136
|
subject.use Rack::Chunked
|
1135
1137
|
subject.get('/stream') { stream test_stream }
|
1136
|
-
get '/stream', {}, 'HTTP_VERSION' => 'HTTP/1.1'
|
1138
|
+
get '/stream', {}, 'HTTP_VERSION' => 'HTTP/1.1', 'SERVER_PROTOCOL' => 'HTTP/1.1'
|
1137
1139
|
|
1138
1140
|
expect(last_response.headers['Content-Type']).to eq('text/plain')
|
1139
1141
|
expect(last_response.headers['Content-Length']).to eq(nil)
|
@@ -1901,9 +1903,9 @@ XML
|
|
1901
1903
|
it 'avoids polluting global namespace' do
|
1902
1904
|
env = Rack::MockRequest.env_for('/')
|
1903
1905
|
|
1904
|
-
expect(a.call(env)[2]
|
1905
|
-
expect(b.call(env)[2]
|
1906
|
-
expect(a.call(env)[2]
|
1906
|
+
expect(read_chunks(a.call(env)[2])).to eq(['foo'])
|
1907
|
+
expect(read_chunks(b.call(env)[2])).to eq(['bar'])
|
1908
|
+
expect(read_chunks(a.call(env)[2])).to eq(['foo'])
|
1907
1909
|
end
|
1908
1910
|
end
|
1909
1911
|
|
@@ -1940,6 +1942,26 @@ XML
|
|
1940
1942
|
expect { get '/unrescued' }.to raise_error(RuntimeError, 'beefcake')
|
1941
1943
|
end
|
1942
1944
|
|
1945
|
+
it 'mimics default ruby "rescue" handler' do
|
1946
|
+
# The exception is matched to the rescue starting at the top, and matches only once
|
1947
|
+
|
1948
|
+
subject.rescue_from ArgumentError do |e|
|
1949
|
+
error!(e, 402)
|
1950
|
+
end
|
1951
|
+
subject.rescue_from StandardError do |e|
|
1952
|
+
error!(e, 401)
|
1953
|
+
end
|
1954
|
+
|
1955
|
+
subject.get('/child_of_standard_error') { raise ArgumentError }
|
1956
|
+
subject.get('/standard_error') { raise StandardError }
|
1957
|
+
|
1958
|
+
get '/child_of_standard_error'
|
1959
|
+
expect(last_response.status).to eql 402
|
1960
|
+
|
1961
|
+
get '/standard_error'
|
1962
|
+
expect(last_response.status).to eql 401
|
1963
|
+
end
|
1964
|
+
|
1943
1965
|
context 'CustomError subclass of Grape::Exceptions::Base' do
|
1944
1966
|
before do
|
1945
1967
|
module ApiSpec
|
@@ -1958,7 +1980,7 @@ XML
|
|
1958
1980
|
rack_response('New Error', e.status)
|
1959
1981
|
end
|
1960
1982
|
subject.get '/custom_error' do
|
1961
|
-
raise ApiSpec::CustomError
|
1983
|
+
raise ApiSpec::CustomError.new(status: 400, message: 'Custom Error')
|
1962
1984
|
end
|
1963
1985
|
|
1964
1986
|
get '/custom_error'
|
@@ -3655,12 +3677,13 @@ XML
|
|
3655
3677
|
end
|
3656
3678
|
end
|
3657
3679
|
context ':serializable_hash' do
|
3658
|
-
|
3659
|
-
|
3660
|
-
def
|
3661
|
-
{ abc: 'def' }
|
3662
|
-
end
|
3680
|
+
class SerializableHashExample
|
3681
|
+
def serializable_hash
|
3682
|
+
{ abc: 'def' }
|
3663
3683
|
end
|
3684
|
+
end
|
3685
|
+
|
3686
|
+
before(:each) do
|
3664
3687
|
subject.format :serializable_hash
|
3665
3688
|
end
|
3666
3689
|
it 'instance' do
|
data/spec/grape/config_spec.rb
CHANGED
data/spec/grape/dsl/desc_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
module Grape
|
@@ -75,9 +77,9 @@ module Grape
|
|
75
77
|
end
|
76
78
|
|
77
79
|
context 'with an external file' do
|
78
|
-
it 'sets Boolean as a
|
80
|
+
it 'sets Boolean as a Grape::API::Boolean' do
|
79
81
|
subject.helpers BooleanParam
|
80
|
-
expect(subject.first_mod::Boolean).to eq
|
82
|
+
expect(subject.first_mod::Boolean).to eq Grape::API::Boolean
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
data/spec/grape/endpoint_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Grape::Endpoint do
|
@@ -149,7 +151,7 @@ describe Grape::Endpoint do
|
|
149
151
|
it 'includes headers passed as symbols' do
|
150
152
|
env = Rack::MockRequest.env_for('/headers')
|
151
153
|
env['HTTP_SYMBOL_HEADER'.to_sym] = 'Goliath passes symbols'
|
152
|
-
body = subject.call(env)[2].
|
154
|
+
body = read_chunks(subject.call(env)[2]).join
|
153
155
|
expect(JSON.parse(body)['Symbol-Header']).to eq('Goliath passes symbols')
|
154
156
|
end
|
155
157
|
end
|
data/spec/grape/entity_spec.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Grape::Exceptions::Base do
|
4
6
|
describe '#compose_message' do
|
5
|
-
subject { described_class.new.send(:compose_message, key, attributes) }
|
7
|
+
subject { described_class.new.send(:compose_message, key, **attributes) }
|
6
8
|
|
7
9
|
let(:key) { :invalid_formatter }
|
8
10
|
let(:attributes) { { klass: String, to_format: 'xml' } }
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'ostruct'
|
3
5
|
|
@@ -79,8 +81,8 @@ describe Grape::Exceptions::ValidationErrors do
|
|
79
81
|
expect(last_response.status).to eq(400)
|
80
82
|
expect(JSON.parse(last_response.body)).to eq(
|
81
83
|
[
|
82
|
-
'params' => %w[beer wine
|
83
|
-
'messages' => ['are
|
84
|
+
'params' => %w[beer wine],
|
85
|
+
'messages' => ['are mutually exclusive']
|
84
86
|
]
|
85
87
|
)
|
86
88
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Grape::Exceptions::Validation do
|
4
6
|
it 'fails when params are missing' do
|
5
|
-
expect { Grape::Exceptions::Validation.new(message: 'presence') }.to raise_error(ArgumentError,
|
7
|
+
expect { Grape::Exceptions::Validation.new(message: 'presence') }.to raise_error(ArgumentError, /missing keyword:.+?params/)
|
6
8
|
end
|
7
9
|
context 'when message is a symbol' do
|
8
10
|
it 'stores message_key' do
|