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/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 
     | 
    
         | 
| 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            module Grape
         
     | 
| 
         @@ -201,80 +203,222 @@ describe Grape::Endpoint do 
     | 
|
| 
       201 
203 
     | 
    
         
             
              end
         
     | 
| 
       202 
204 
     | 
    
         | 
| 
       203 
205 
     | 
    
         
             
              describe '#file' do
         
     | 
| 
      
 206 
     | 
    
         
            +
                before do
         
     | 
| 
      
 207 
     | 
    
         
            +
                  allow(subject).to receive(:warn)
         
     | 
| 
      
 208 
     | 
    
         
            +
                end
         
     | 
| 
      
 209 
     | 
    
         
            +
             
     | 
| 
       204 
210 
     | 
    
         
             
                describe 'set' do
         
     | 
| 
       205 
211 
     | 
    
         
             
                  context 'as file path' do
         
     | 
| 
       206 
212 
     | 
    
         
             
                    let(:file_path) { '/some/file/path' }
         
     | 
| 
       207 
213 
     | 
    
         | 
| 
       208 
     | 
    
         
            -
                     
     | 
| 
       209 
     | 
    
         
            -
                       
     | 
| 
       210 
     | 
    
         
            -
                      Grape::ServeFile::FileResponse.new(file_body)
         
     | 
| 
       211 
     | 
    
         
            -
                    end
         
     | 
| 
      
 214 
     | 
    
         
            +
                    it 'emits a warning that this method is deprecated' do
         
     | 
| 
      
 215 
     | 
    
         
            +
                      expect(subject).to receive(:warn).with(/Use sendfile or stream/)
         
     | 
| 
       212 
216 
     | 
    
         | 
| 
       213 
     | 
    
         
            -
                    before do
         
     | 
| 
       214 
217 
     | 
    
         
             
                      subject.file file_path
         
     | 
| 
       215 
218 
     | 
    
         
             
                    end
         
     | 
| 
       216 
219 
     | 
    
         | 
| 
       217 
     | 
    
         
            -
                    it ' 
     | 
| 
       218 
     | 
    
         
            -
                      expect(subject 
     | 
| 
      
 220 
     | 
    
         
            +
                    it 'forwards the call to sendfile' do
         
     | 
| 
      
 221 
     | 
    
         
            +
                      expect(subject).to receive(:sendfile).with(file_path)
         
     | 
| 
      
 222 
     | 
    
         
            +
             
     | 
| 
      
 223 
     | 
    
         
            +
                      subject.file file_path
         
     | 
| 
       219 
224 
     | 
    
         
             
                    end
         
     | 
| 
       220 
225 
     | 
    
         
             
                  end
         
     | 
| 
       221 
226 
     | 
    
         | 
| 
       222 
227 
     | 
    
         
             
                  context 'as object (backward compatibility)' do
         
     | 
| 
       223 
     | 
    
         
            -
                    let(:file_object) {  
     | 
| 
      
 228 
     | 
    
         
            +
                    let(:file_object) { double('StreamerObject', each: nil) }
         
     | 
| 
      
 229 
     | 
    
         
            +
             
     | 
| 
      
 230 
     | 
    
         
            +
                    it 'emits a warning that this method is deprecated' do
         
     | 
| 
      
 231 
     | 
    
         
            +
                      expect(subject).to receive(:warn).with(/Use stream to use a Stream object/)
         
     | 
| 
      
 232 
     | 
    
         
            +
             
     | 
| 
      
 233 
     | 
    
         
            +
                      subject.file file_object
         
     | 
| 
      
 234 
     | 
    
         
            +
                    end
         
     | 
| 
      
 235 
     | 
    
         
            +
             
     | 
| 
      
 236 
     | 
    
         
            +
                    it 'forwards the call to stream' do
         
     | 
| 
      
 237 
     | 
    
         
            +
                      expect(subject).to receive(:stream).with(file_object)
         
     | 
| 
      
 238 
     | 
    
         
            +
             
     | 
| 
      
 239 
     | 
    
         
            +
                      subject.file file_object
         
     | 
| 
      
 240 
     | 
    
         
            +
                    end
         
     | 
| 
      
 241 
     | 
    
         
            +
                  end
         
     | 
| 
      
 242 
     | 
    
         
            +
                end
         
     | 
| 
      
 243 
     | 
    
         
            +
             
     | 
| 
      
 244 
     | 
    
         
            +
                describe 'get' do
         
     | 
| 
      
 245 
     | 
    
         
            +
                  it 'emits a warning that this method is deprecated' do
         
     | 
| 
      
 246 
     | 
    
         
            +
                    expect(subject).to receive(:warn).with(/Use sendfile or stream/)
         
     | 
| 
      
 247 
     | 
    
         
            +
             
     | 
| 
      
 248 
     | 
    
         
            +
                    subject.file
         
     | 
| 
      
 249 
     | 
    
         
            +
                  end
         
     | 
| 
      
 250 
     | 
    
         
            +
             
     | 
| 
      
 251 
     | 
    
         
            +
                  it 'fowards call to sendfile' do
         
     | 
| 
      
 252 
     | 
    
         
            +
                    expect(subject).to receive(:sendfile)
         
     | 
| 
      
 253 
     | 
    
         
            +
             
     | 
| 
      
 254 
     | 
    
         
            +
                    subject.file
         
     | 
| 
      
 255 
     | 
    
         
            +
                  end
         
     | 
| 
      
 256 
     | 
    
         
            +
                end
         
     | 
| 
      
 257 
     | 
    
         
            +
              end
         
     | 
| 
      
 258 
     | 
    
         
            +
             
     | 
| 
      
 259 
     | 
    
         
            +
              describe '#sendfile' do
         
     | 
| 
      
 260 
     | 
    
         
            +
                describe 'set' do
         
     | 
| 
      
 261 
     | 
    
         
            +
                  context 'as file path' do
         
     | 
| 
      
 262 
     | 
    
         
            +
                    let(:file_path) { '/some/file/path' }
         
     | 
| 
       224 
263 
     | 
    
         | 
| 
       225 
264 
     | 
    
         
             
                    let(:file_response) do
         
     | 
| 
       226 
     | 
    
         
            -
                      Grape:: 
     | 
| 
      
 265 
     | 
    
         
            +
                      file_body = Grape::ServeStream::FileBody.new(file_path)
         
     | 
| 
      
 266 
     | 
    
         
            +
                      Grape::ServeStream::StreamResponse.new(file_body)
         
     | 
| 
       227 
267 
     | 
    
         
             
                    end
         
     | 
| 
       228 
268 
     | 
    
         | 
| 
       229 
269 
     | 
    
         
             
                    before do
         
     | 
| 
       230 
     | 
    
         
            -
                      subject. 
     | 
| 
      
 270 
     | 
    
         
            +
                      subject.header 'Cache-Control', 'cache'
         
     | 
| 
      
 271 
     | 
    
         
            +
                      subject.header 'Content-Length', 123
         
     | 
| 
      
 272 
     | 
    
         
            +
                      subject.header 'Transfer-Encoding', 'base64'
         
     | 
| 
      
 273 
     | 
    
         
            +
                    end
         
     | 
| 
      
 274 
     | 
    
         
            +
             
     | 
| 
      
 275 
     | 
    
         
            +
                    it 'sends no deprecation warnings' do
         
     | 
| 
      
 276 
     | 
    
         
            +
                      expect(subject).to_not receive(:warn)
         
     | 
| 
      
 277 
     | 
    
         
            +
             
     | 
| 
      
 278 
     | 
    
         
            +
                      subject.sendfile file_path
         
     | 
| 
       231 
279 
     | 
    
         
             
                    end
         
     | 
| 
       232 
280 
     | 
    
         | 
| 
       233 
     | 
    
         
            -
                    it 'returns value wrapped in  
     | 
| 
       234 
     | 
    
         
            -
                       
     | 
| 
      
 281 
     | 
    
         
            +
                    it 'returns value wrapped in StreamResponse' do
         
     | 
| 
      
 282 
     | 
    
         
            +
                      subject.sendfile file_path
         
     | 
| 
      
 283 
     | 
    
         
            +
             
     | 
| 
      
 284 
     | 
    
         
            +
                      expect(subject.sendfile).to eq file_response
         
     | 
| 
      
 285 
     | 
    
         
            +
                    end
         
     | 
| 
      
 286 
     | 
    
         
            +
             
     | 
| 
      
 287 
     | 
    
         
            +
                    it 'does not change the Cache-Control header' do
         
     | 
| 
      
 288 
     | 
    
         
            +
                      subject.sendfile file_path
         
     | 
| 
      
 289 
     | 
    
         
            +
             
     | 
| 
      
 290 
     | 
    
         
            +
                      expect(subject.header['Cache-Control']).to eq 'cache'
         
     | 
| 
      
 291 
     | 
    
         
            +
                    end
         
     | 
| 
      
 292 
     | 
    
         
            +
             
     | 
| 
      
 293 
     | 
    
         
            +
                    it 'does not change the Content-Length header' do
         
     | 
| 
      
 294 
     | 
    
         
            +
                      subject.sendfile file_path
         
     | 
| 
      
 295 
     | 
    
         
            +
             
     | 
| 
      
 296 
     | 
    
         
            +
                      expect(subject.header['Content-Length']).to eq 123
         
     | 
| 
      
 297 
     | 
    
         
            +
                    end
         
     | 
| 
      
 298 
     | 
    
         
            +
             
     | 
| 
      
 299 
     | 
    
         
            +
                    it 'does not change the Transfer-Encoding header' do
         
     | 
| 
      
 300 
     | 
    
         
            +
                      subject.sendfile file_path
         
     | 
| 
      
 301 
     | 
    
         
            +
             
     | 
| 
      
 302 
     | 
    
         
            +
                      expect(subject.header['Transfer-Encoding']).to eq 'base64'
         
     | 
| 
      
 303 
     | 
    
         
            +
                    end
         
     | 
| 
      
 304 
     | 
    
         
            +
                  end
         
     | 
| 
      
 305 
     | 
    
         
            +
             
     | 
| 
      
 306 
     | 
    
         
            +
                  context 'as object' do
         
     | 
| 
      
 307 
     | 
    
         
            +
                    let(:file_object) { double('StreamerObject', each: nil) }
         
     | 
| 
      
 308 
     | 
    
         
            +
             
     | 
| 
      
 309 
     | 
    
         
            +
                    it 'raises an error that only a file path is supported' do
         
     | 
| 
      
 310 
     | 
    
         
            +
                      expect { subject.sendfile file_object }.to raise_error(ArgumentError, /Argument must be a file path/)
         
     | 
| 
       235 
311 
     | 
    
         
             
                    end
         
     | 
| 
       236 
312 
     | 
    
         
             
                  end
         
     | 
| 
       237 
313 
     | 
    
         
             
                end
         
     | 
| 
       238 
314 
     | 
    
         | 
| 
       239 
315 
     | 
    
         
             
                it 'returns default' do
         
     | 
| 
       240 
     | 
    
         
            -
                  expect(subject. 
     | 
| 
      
 316 
     | 
    
         
            +
                  expect(subject.sendfile).to be nil
         
     | 
| 
       241 
317 
     | 
    
         
             
                end
         
     | 
| 
       242 
318 
     | 
    
         
             
              end
         
     | 
| 
       243 
319 
     | 
    
         | 
| 
       244 
320 
     | 
    
         
             
              describe '#stream' do
         
     | 
| 
       245 
321 
     | 
    
         
             
                describe 'set' do
         
     | 
| 
       246 
     | 
    
         
            -
                   
     | 
| 
      
 322 
     | 
    
         
            +
                  context 'as a file path' do
         
     | 
| 
      
 323 
     | 
    
         
            +
                    let(:file_path) { '/some/file/path' }
         
     | 
| 
       247 
324 
     | 
    
         | 
| 
       248 
     | 
    
         
            -
             
     | 
| 
       249 
     | 
    
         
            -
             
     | 
| 
       250 
     | 
    
         
            -
             
     | 
| 
       251 
     | 
    
         
            -
                     
     | 
| 
       252 
     | 
    
         
            -
                    subject.stream file_object
         
     | 
| 
       253 
     | 
    
         
            -
                  end
         
     | 
| 
      
 325 
     | 
    
         
            +
                    let(:file_response) do
         
     | 
| 
      
 326 
     | 
    
         
            +
                      file_body = Grape::ServeStream::FileBody.new(file_path)
         
     | 
| 
      
 327 
     | 
    
         
            +
                      Grape::ServeStream::StreamResponse.new(file_body)
         
     | 
| 
      
 328 
     | 
    
         
            +
                    end
         
     | 
| 
       254 
329 
     | 
    
         | 
| 
       255 
     | 
    
         
            -
             
     | 
| 
       256 
     | 
    
         
            -
             
     | 
| 
       257 
     | 
    
         
            -
             
     | 
| 
      
 330 
     | 
    
         
            +
                    before do
         
     | 
| 
      
 331 
     | 
    
         
            +
                      subject.header 'Cache-Control', 'cache'
         
     | 
| 
      
 332 
     | 
    
         
            +
                      subject.header 'Content-Length', 123
         
     | 
| 
      
 333 
     | 
    
         
            +
                      subject.header 'Transfer-Encoding', 'base64'
         
     | 
| 
      
 334 
     | 
    
         
            +
                    end
         
     | 
| 
       258 
335 
     | 
    
         | 
| 
       259 
     | 
    
         
            -
             
     | 
| 
       260 
     | 
    
         
            -
             
     | 
| 
       261 
     | 
    
         
            -
             
     | 
| 
      
 336 
     | 
    
         
            +
                    it 'emits no deprecation warnings' do
         
     | 
| 
      
 337 
     | 
    
         
            +
                      expect(subject).to_not receive(:warn)
         
     | 
| 
      
 338 
     | 
    
         
            +
             
     | 
| 
      
 339 
     | 
    
         
            +
                      subject.stream file_path
         
     | 
| 
      
 340 
     | 
    
         
            +
                    end
         
     | 
| 
      
 341 
     | 
    
         
            +
             
     | 
| 
      
 342 
     | 
    
         
            +
                    it 'returns file body wrapped in StreamResponse' do
         
     | 
| 
      
 343 
     | 
    
         
            +
                      subject.stream file_path
         
     | 
| 
      
 344 
     | 
    
         
            +
             
     | 
| 
      
 345 
     | 
    
         
            +
                      expect(subject.stream).to eq file_response
         
     | 
| 
      
 346 
     | 
    
         
            +
                    end
         
     | 
| 
      
 347 
     | 
    
         
            +
             
     | 
| 
      
 348 
     | 
    
         
            +
                    it 'sets Cache-Control header to no-cache' do
         
     | 
| 
      
 349 
     | 
    
         
            +
                      subject.stream file_path
         
     | 
| 
      
 350 
     | 
    
         
            +
             
     | 
| 
      
 351 
     | 
    
         
            +
                      expect(subject.header['Cache-Control']).to eq 'no-cache'
         
     | 
| 
      
 352 
     | 
    
         
            +
                    end
         
     | 
| 
      
 353 
     | 
    
         
            +
             
     | 
| 
      
 354 
     | 
    
         
            +
                    it 'sets Content-Length header to nil' do
         
     | 
| 
      
 355 
     | 
    
         
            +
                      subject.stream file_path
         
     | 
| 
      
 356 
     | 
    
         
            +
             
     | 
| 
      
 357 
     | 
    
         
            +
                      expect(subject.header['Content-Length']).to eq nil
         
     | 
| 
      
 358 
     | 
    
         
            +
                    end
         
     | 
| 
      
 359 
     | 
    
         
            +
             
     | 
| 
      
 360 
     | 
    
         
            +
                    it 'sets Transfer-Encoding header to nil' do
         
     | 
| 
      
 361 
     | 
    
         
            +
                      subject.stream file_path
         
     | 
| 
       262 
362 
     | 
    
         | 
| 
       263 
     | 
    
         
            -
             
     | 
| 
       264 
     | 
    
         
            -
                     
     | 
| 
      
 363 
     | 
    
         
            +
                      expect(subject.header['Transfer-Encoding']).to eq nil
         
     | 
| 
      
 364 
     | 
    
         
            +
                    end
         
     | 
| 
       265 
365 
     | 
    
         
             
                  end
         
     | 
| 
       266 
366 
     | 
    
         | 
| 
       267 
     | 
    
         
            -
                   
     | 
| 
       268 
     | 
    
         
            -
                     
     | 
| 
      
 367 
     | 
    
         
            +
                  context 'as a stream object' do
         
     | 
| 
      
 368 
     | 
    
         
            +
                    let(:stream_object) { double('StreamerObject', each: nil) }
         
     | 
| 
      
 369 
     | 
    
         
            +
             
     | 
| 
      
 370 
     | 
    
         
            +
                    let(:stream_response) do
         
     | 
| 
      
 371 
     | 
    
         
            +
                      Grape::ServeStream::StreamResponse.new(stream_object)
         
     | 
| 
      
 372 
     | 
    
         
            +
                    end
         
     | 
| 
      
 373 
     | 
    
         
            +
             
     | 
| 
      
 374 
     | 
    
         
            +
                    before do
         
     | 
| 
      
 375 
     | 
    
         
            +
                      subject.header 'Cache-Control', 'cache'
         
     | 
| 
      
 376 
     | 
    
         
            +
                      subject.header 'Content-Length', 123
         
     | 
| 
      
 377 
     | 
    
         
            +
                      subject.header 'Transfer-Encoding', 'base64'
         
     | 
| 
      
 378 
     | 
    
         
            +
                    end
         
     | 
| 
      
 379 
     | 
    
         
            +
             
     | 
| 
      
 380 
     | 
    
         
            +
                    it 'emits no deprecation warnings' do
         
     | 
| 
      
 381 
     | 
    
         
            +
                      expect(subject).to_not receive(:warn)
         
     | 
| 
      
 382 
     | 
    
         
            +
             
     | 
| 
      
 383 
     | 
    
         
            +
                      subject.stream stream_object
         
     | 
| 
      
 384 
     | 
    
         
            +
                    end
         
     | 
| 
      
 385 
     | 
    
         
            +
             
     | 
| 
      
 386 
     | 
    
         
            +
                    it 'returns value wrapped in StreamResponse' do
         
     | 
| 
      
 387 
     | 
    
         
            +
                      subject.stream stream_object
         
     | 
| 
      
 388 
     | 
    
         
            +
             
     | 
| 
      
 389 
     | 
    
         
            +
                      expect(subject.stream).to eq stream_response
         
     | 
| 
      
 390 
     | 
    
         
            +
                    end
         
     | 
| 
      
 391 
     | 
    
         
            +
             
     | 
| 
      
 392 
     | 
    
         
            +
                    it 'sets Cache-Control header to no-cache' do
         
     | 
| 
      
 393 
     | 
    
         
            +
                      subject.stream stream_object
         
     | 
| 
      
 394 
     | 
    
         
            +
             
     | 
| 
      
 395 
     | 
    
         
            +
                      expect(subject.header['Cache-Control']).to eq 'no-cache'
         
     | 
| 
      
 396 
     | 
    
         
            +
                    end
         
     | 
| 
      
 397 
     | 
    
         
            +
             
     | 
| 
      
 398 
     | 
    
         
            +
                    it 'sets Content-Length header to nil' do
         
     | 
| 
      
 399 
     | 
    
         
            +
                      subject.stream stream_object
         
     | 
| 
      
 400 
     | 
    
         
            +
             
     | 
| 
      
 401 
     | 
    
         
            +
                      expect(subject.header['Content-Length']).to eq nil
         
     | 
| 
      
 402 
     | 
    
         
            +
                    end
         
     | 
| 
      
 403 
     | 
    
         
            +
             
     | 
| 
      
 404 
     | 
    
         
            +
                    it 'sets Transfer-Encoding header to nil' do
         
     | 
| 
      
 405 
     | 
    
         
            +
                      subject.stream stream_object
         
     | 
| 
      
 406 
     | 
    
         
            +
             
     | 
| 
      
 407 
     | 
    
         
            +
                      expect(subject.header['Transfer-Encoding']).to eq nil
         
     | 
| 
      
 408 
     | 
    
         
            +
                    end
         
     | 
| 
       269 
409 
     | 
    
         
             
                  end
         
     | 
| 
       270 
410 
     | 
    
         | 
| 
       271 
     | 
    
         
            -
                   
     | 
| 
       272 
     | 
    
         
            -
                     
     | 
| 
      
 411 
     | 
    
         
            +
                  context 'as a non-stream object' do
         
     | 
| 
      
 412 
     | 
    
         
            +
                    let(:non_stream_object) { double('NonStreamerObject') }
         
     | 
| 
      
 413 
     | 
    
         
            +
             
     | 
| 
      
 414 
     | 
    
         
            +
                    it 'raises an error that the object must implement :each' do
         
     | 
| 
      
 415 
     | 
    
         
            +
                      expect { subject.stream non_stream_object }.to raise_error(ArgumentError, /:each/)
         
     | 
| 
      
 416 
     | 
    
         
            +
                    end
         
     | 
| 
       273 
417 
     | 
    
         
             
                  end
         
     | 
| 
       274 
418 
     | 
    
         
             
                end
         
     | 
| 
       275 
419 
     | 
    
         | 
| 
       276 
420 
     | 
    
         
             
                it 'returns default' do
         
     | 
| 
       277 
     | 
    
         
            -
                  expect(subject. 
     | 
| 
      
 421 
     | 
    
         
            +
                  expect(subject.stream).to be nil
         
     | 
| 
       278 
422 
     | 
    
         
             
                end
         
     | 
| 
       279 
423 
     | 
    
         
             
              end
         
     | 
| 
       280 
424 
     | 
    
         | 
    
        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
         
     | 
| 
         @@ -294,9 +296,12 @@ describe Grape::Endpoint do 
     | 
|
| 
       294 
296 
     | 
    
         
             
                          optional :seventh
         
     | 
| 
       295 
297 
     | 
    
         
             
                        end
         
     | 
| 
       296 
298 
     | 
    
         
             
                      end
         
     | 
| 
      
 299 
     | 
    
         
            +
                      optional :nested_arr, type: Array do
         
     | 
| 
      
 300 
     | 
    
         
            +
                        optional :eighth
         
     | 
| 
      
 301 
     | 
    
         
            +
                      end
         
     | 
| 
       297 
302 
     | 
    
         
             
                    end
         
     | 
| 
       298 
     | 
    
         
            -
                    optional : 
     | 
| 
       299 
     | 
    
         
            -
                      optional : 
     | 
| 
      
 303 
     | 
    
         
            +
                    optional :arr, type: Array do
         
     | 
| 
      
 304 
     | 
    
         
            +
                      optional :nineth
         
     | 
| 
       300 
305 
     | 
    
         
             
                    end
         
     | 
| 
       301 
306 
     | 
    
         
             
                  end
         
     | 
| 
       302 
307 
     | 
    
         
             
                end
         
     | 
| 
         @@ -388,7 +393,7 @@ describe Grape::Endpoint do 
     | 
|
| 
       388 
393 
     | 
    
         | 
| 
       389 
394 
     | 
    
         
             
                  get '/declared?first=present&nested[fourth]=1'
         
     | 
| 
       390 
395 
     | 
    
         
             
                  expect(last_response.status).to eq(200)
         
     | 
| 
       391 
     | 
    
         
            -
                  expect(JSON.parse(last_response.body)['nested'].keys.size).to eq  
     | 
| 
      
 396 
     | 
    
         
            +
                  expect(JSON.parse(last_response.body)['nested'].keys.size).to eq 4
         
     | 
| 
       392 
397 
     | 
    
         
             
                end
         
     | 
| 
       393 
398 
     | 
    
         | 
| 
       394 
399 
     | 
    
         
             
                it 'builds nested params when given array' do
         
     | 
| 
         @@ -419,7 +424,7 @@ describe Grape::Endpoint do 
     | 
|
| 
       419 
424 
     | 
    
         | 
| 
       420 
425 
     | 
    
         
             
                    get '/declared?first=present'
         
     | 
| 
       421 
426 
     | 
    
         
             
                    expect(last_response.status).to eq(200)
         
     | 
| 
       422 
     | 
    
         
            -
                    expect(JSON.parse(last_response.body)['nested']).to  
     | 
| 
      
 427 
     | 
    
         
            +
                    expect(JSON.parse(last_response.body)['nested']).to eq({})
         
     | 
| 
       423 
428 
     | 
    
         
             
                  end
         
     | 
| 
       424 
429 
     | 
    
         | 
| 
       425 
430 
     | 
    
         
             
                  it 'to be an array when include_missing is true' do
         
     | 
| 
         @@ -429,7 +434,17 @@ describe Grape::Endpoint do 
     | 
|
| 
       429 
434 
     | 
    
         | 
| 
       430 
435 
     | 
    
         
             
                    get '/declared?first=present'
         
     | 
| 
       431 
436 
     | 
    
         
             
                    expect(last_response.status).to eq(200)
         
     | 
| 
       432 
     | 
    
         
            -
                    expect(JSON.parse(last_response.body)[' 
     | 
| 
      
 437 
     | 
    
         
            +
                    expect(JSON.parse(last_response.body)['arr']).to be_a(Array)
         
     | 
| 
      
 438 
     | 
    
         
            +
                  end
         
     | 
| 
      
 439 
     | 
    
         
            +
             
     | 
| 
      
 440 
     | 
    
         
            +
                  it 'to be an array when nested and include_missing is true' do
         
     | 
| 
      
 441 
     | 
    
         
            +
                    subject.get '/declared' do
         
     | 
| 
      
 442 
     | 
    
         
            +
                      declared(params, include_missing: true)
         
     | 
| 
      
 443 
     | 
    
         
            +
                    end
         
     | 
| 
      
 444 
     | 
    
         
            +
             
     | 
| 
      
 445 
     | 
    
         
            +
                    get '/declared?first=present&nested[fourth]=1'
         
     | 
| 
      
 446 
     | 
    
         
            +
                    expect(last_response.status).to eq(200)
         
     | 
| 
      
 447 
     | 
    
         
            +
                    expect(JSON.parse(last_response.body)['nested']['nested_arr']).to be_a(Array)
         
     | 
| 
       433 
448 
     | 
    
         
             
                  end
         
     | 
| 
       434 
449 
     | 
    
         | 
| 
       435 
450 
     | 
    
         
             
                  it 'to be nil when include_missing is false' do
         
     | 
    
        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' } }
         
     |