From f60e58eec0d9cf56ddab5bd078f7a0436a71650d Mon Sep 17 00:00:00 2001 From: "zhangyaning1985@gmail.com" Date: Sat, 18 Apr 2015 08:07:20 +0800 Subject: [PATCH] Fix optional Array params default to Hash --- .rubocop_todo.yml | 6 +++--- CHANGELOG.md | 1 + gemfiles/rails_3.gemfile | 2 +- gemfiles/rails_4.gemfile | 2 +- lib/grape/dsl/inside_route.rb | 3 ++- spec/grape/endpoint_spec.rb | 38 +++++++++++++++++++++++++++++++++++ 6 files changed, 46 insertions(+), 6 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 753b44beeb..34cf5231e8 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,5 +1,5 @@ # This configuration was generated by `rubocop --auto-gen-config` -# on 2014-12-16 11:52:50 -0500 using RuboCop version 0.28.0. +# on 2014-12-16 11:52:50 -0500 using RuboCop version 0.29.1. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new @@ -30,7 +30,7 @@ Metrics/ClassLength: # Offense count: 15 Metrics/CyclomaticComplexity: - Max: 19 + Max: 20 # Offense count: 545 # Configuration parameters: AllowURI, URISchemes. @@ -44,7 +44,7 @@ Metrics/MethodLength: # Offense count: 13 Metrics/PerceivedComplexity: - Max: 21 + Max: 22 # Offense count: 26 # Cop supports --auto-correct. diff --git a/CHANGELOG.md b/CHANGELOG.md index 154b84c85d..e6ce6a8fa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ #### Fixes +* [#994](https://github.com/intridea/grape/pull/994): Fixed optional Array params default to Hash - [@u2](https://github.com/u2). * [#988](https://github.com/intridea/grape/pull/988): Fixed duplicate identical endpoints - [@u2](https://github.com/u2). * [#936](https://github.com/intridea/grape/pull/936): Fixed default params processing for optional groups - [@dm1try](https://github.com/dm1try). * [#942](https://github.com/intridea/grape/pull/942): Fixed forced presence for optional params when based on a reused entity that was also required in another context - [@croeck](https://github.com/croeck). diff --git a/gemfiles/rails_3.gemfile b/gemfiles/rails_3.gemfile index afa336176e..0768c590dd 100644 --- a/gemfiles/rails_3.gemfile +++ b/gemfiles/rails_3.gemfile @@ -5,7 +5,7 @@ source 'https://rubygems.org' gem 'rails', '3.2.19' group :development, :test do - gem 'rubocop', '~> 0.28.0' + gem 'rubocop', '~> 0.29.1' gem 'guard' gem 'guard-rspec' gem 'guard-rubocop' diff --git a/gemfiles/rails_4.gemfile b/gemfiles/rails_4.gemfile index 54bfa99fcd..3cf4948dd2 100644 --- a/gemfiles/rails_4.gemfile +++ b/gemfiles/rails_4.gemfile @@ -5,7 +5,7 @@ source 'https://rubygems.org' gem 'rails', '4.1.6' group :development, :test do - gem 'rubocop', '~> 0.28.0' + gem 'rubocop', '~> 0.29.1' gem 'guard' gem 'guard-rspec' gem 'guard-rubocop' diff --git a/lib/grape/dsl/inside_route.rb b/lib/grape/dsl/inside_route.rb index 0dd0e23fb3..c82425abdc 100644 --- a/lib/grape/dsl/inside_route.rb +++ b/lib/grape/dsl/inside_route.rb @@ -43,7 +43,8 @@ def declared(params, options = {}, declared_params = nil) if params.key?(parent) || options[:include_missing] hash[output_key] = if children - declared(params[parent] || {}, options, Array(children)) + children_params = params[parent] || (children.is_a?(Array) ? [] : {}) + declared(children_params, options, Array(children)) else params[parent] end diff --git a/spec/grape/endpoint_spec.rb b/spec/grape/endpoint_spec.rb index 0d878ee915..528a28b396 100644 --- a/spec/grape/endpoint_spec.rb +++ b/spec/grape/endpoint_spec.rb @@ -295,6 +295,44 @@ def app expect(inner_params[:nested].size).to eq 2 end + it 'builds nested params' do + inner_params = nil + subject.get '/declared' do + inner_params = declared(params) + '' + end + + get '/declared?first=present&nested[fourth]=1' + expect(last_response.status).to eq(200) + expect(inner_params[:nested].keys.size).to eq 1 + end + + context 'sets nested array when the param is missing' do + it 'to be array when include_missing is true' do + inner_params = nil + subject.get '/declared' do + inner_params = declared(params, include_missing: true) + '' + end + + get '/declared?first=present' + expect(last_response.status).to eq(200) + expect(inner_params[:nested]).to be_a(Array) + end + + it 'to be nil when include_missing is false' do + inner_params = nil + subject.get '/declared' do + inner_params = declared(params, include_missing: false) + '' + end + + get '/declared?first=present' + expect(last_response.status).to eq(200) + expect(inner_params[:nested]).to be_nil + end + end + it 'filters out any additional params that are given' do inner_params = nil subject.get '/declared' do