Parse route_param type for nested endpoints (#847)

* Fix documentation of `route_param` type when used with nested endpoints

* Rubocop fixes

* Rubocop fixes

* grape 1.6

Co-authored-by: peter scholz <pscholz.le@gmail.com>
This commit is contained in:
Devin Moss 2022-07-26 03:04:09 -05:00 committed by GitHub
parent d5766639d2
commit 908a7a8912
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 72 additions and 3 deletions

View File

@ -1,3 +1,9 @@
### 1.4.4
#### Fixes
* [#840](https://github.com/ruby-grape/grape-swagger/pull/847): Fix documentation of `route_param` type when used with nested endpoints - [@dmoss18](https://github.com/dmoss18)
### 1.4.3 (January 5, 2022)
#### Fixes

View File

@ -6,14 +6,14 @@ ruby RUBY_VERSION
gemspec
gem 'grape', case version = ENV.fetch('GRAPE_VERSION', '>= 1.5.0')
gem 'grape', case version = ENV.fetch('GRAPE_VERSION', '~> 1.6')
when 'HEAD'
{ git: 'https://github.com/ruby-grape/grape' }
else
version
end
gem ENV['MODEL_PARSER'] if ENV.key?('MODEL_PARSER')
gem ENV.fetch('MODEL_PARSER', nil) if ENV.key?('MODEL_PARSER')
group :development, :test do
gem 'bundler'

View File

@ -348,13 +348,39 @@ module Grape
end
def merge_params(route)
path_params = get_path_params(route.app&.inheritable_setting&.namespace_stackable)
param_keys = route.params.keys
# Merge path params options into route params
route_params = route.params
route_params.each_key do |key|
path = path_params[key] || {}
params = route_params[key]
params = {} unless params.is_a? Hash
route_params[key] = path.merge(params)
end
route.params.delete_if { |key| key.is_a?(String) && param_keys.include?(key.to_sym) }.to_a
end
# Iterates over namespaces recursively
# to build a hash of path params with options, including type
def get_path_params(stackable_values)
params = {}
return param unless stackable_values
return params unless stackable_values.is_a? Grape::Util::StackableValues
stackable_values&.new_values&.dig(:namespace)&.each do |namespace|
space = namespace.space.to_s.gsub(':', '')
params[space] = namespace.options || {}
end
inherited_params = get_path_params(stackable_values.inherited_values)
inherited_params.merge(params)
end
def default_type(params)
default_param_type = { required: true, type: 'Integer' }
params.each { |param| param[-1] = param.last == '' ? default_param_type : param.last }
params.each { |param| param[-1] = param.last.empty? ? default_param_type : param.last }
end
def expose_params(value)

View File

@ -0,0 +1,37 @@
# frozen_string_literal: true
require 'spec_helper'
describe '#847 route_param type is included in documentation' do
let(:app) do
Class.new(Grape::API) do
resource :accounts do
route_param :account_number, type: String do
resource :records do
route_param :id do
get do
{ message: 'hello world' }
end
end
end
end
end
add_swagger_documentation
end
end
let(:parameters) { subject['paths']['/accounts/{account_number}/records/{id}']['get']['parameters'] }
subject do
get '/swagger_doc'
JSON.parse(last_response.body)
end
specify do
account_number_param = parameters.find { |param| param['name'] == 'account_number' }
expect(account_number_param['type']).to eq 'string'
id_param = parameters.find { |param| param['name'] == 'id' }
# Default is still integer
expect(id_param['type']).to eq 'integer'
end
end