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
         
     |