2017-03-08 16:32:31 +08:00
|
|
|
# frozen_string_literal: true
|
2017-03-28 17:15:33 +08:00
|
|
|
|
2016-03-16 19:30:52 +08:00
|
|
|
module GrapeSwagger
|
|
|
|
|
module DocMethods
|
|
|
|
|
class ParseParams
|
|
|
|
|
class << self
|
2017-02-28 04:59:31 +08:00
|
|
|
def call(param, settings, path, route, definitions)
|
2016-05-07 05:18:45 +08:00
|
|
|
method = route.request_method
|
2016-06-10 07:38:00 +08:00
|
|
|
additional_documentation = settings.fetch(:documentation, {})
|
|
|
|
|
settings.merge!(additional_documentation)
|
2016-12-19 00:40:56 +08:00
|
|
|
data_type = DataType.call(settings)
|
2016-03-16 19:30:52 +08:00
|
|
|
|
2016-03-30 22:02:36 +08:00
|
|
|
value_type = settings.merge(data_type: data_type, path: path, param_name: param, method: method)
|
|
|
|
|
|
2016-04-25 03:44:33 +08:00
|
|
|
# required properties
|
2016-03-30 22:02:36 +08:00
|
|
|
@parsed_param = {
|
2016-04-25 03:44:33 +08:00
|
|
|
in: param_type(value_type),
|
|
|
|
|
name: settings[:full_name] || param
|
2016-03-30 22:02:36 +08:00
|
|
|
}
|
|
|
|
|
|
2016-04-25 03:44:33 +08:00
|
|
|
# optional properties
|
|
|
|
|
document_description(settings)
|
2017-02-04 00:35:34 +08:00
|
|
|
document_type_and_format(settings, data_type)
|
2016-10-31 19:14:08 +08:00
|
|
|
document_array_param(value_type, definitions) if value_type[:is_array]
|
2016-03-30 22:02:36 +08:00
|
|
|
document_default_value(settings)
|
|
|
|
|
document_range_values(settings)
|
|
|
|
|
document_required(settings)
|
|
|
|
|
|
|
|
|
|
@parsed_param
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
2016-04-25 03:44:33 +08:00
|
|
|
def document_description(settings)
|
|
|
|
|
description = settings[:desc] || settings[:description]
|
|
|
|
|
@parsed_param[:description] = description if description
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-30 22:02:36 +08:00
|
|
|
def document_required(settings)
|
|
|
|
|
@parsed_param[:required] = settings[:required] || false
|
|
|
|
|
@parsed_param[:required] = true if @parsed_param[:in] == 'path'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def document_range_values(settings)
|
2016-03-30 06:43:33 +08:00
|
|
|
values = settings[:values] || nil
|
2016-03-16 19:30:52 +08:00
|
|
|
enum_or_range_values = parse_enum_or_range_values(values)
|
2016-03-30 22:02:36 +08:00
|
|
|
@parsed_param.merge!(enum_or_range_values) if enum_or_range_values
|
|
|
|
|
end
|
2016-03-16 19:30:52 +08:00
|
|
|
|
2016-03-30 22:02:36 +08:00
|
|
|
def document_default_value(settings)
|
2016-04-23 00:39:47 +08:00
|
|
|
@parsed_param[:default] = settings[:default] if settings[:default].present?
|
2016-03-30 22:02:36 +08:00
|
|
|
end
|
2016-03-16 19:30:52 +08:00
|
|
|
|
2017-02-04 00:35:34 +08:00
|
|
|
def document_type_and_format(settings, data_type)
|
2016-12-19 00:40:56 +08:00
|
|
|
if DataType.primitive?(data_type)
|
|
|
|
|
data = DataType.mapping(data_type)
|
2016-03-30 22:02:36 +08:00
|
|
|
@parsed_param[:type], @parsed_param[:format] = data
|
2016-03-24 07:30:38 +08:00
|
|
|
else
|
2016-03-30 22:02:36 +08:00
|
|
|
@parsed_param[:type] = data_type
|
2016-03-30 06:43:33 +08:00
|
|
|
end
|
2017-02-04 00:35:34 +08:00
|
|
|
@parsed_param[:format] = settings[:format] if settings[:format].present?
|
2016-03-16 19:30:52 +08:00
|
|
|
end
|
|
|
|
|
|
2016-10-14 05:06:03 +08:00
|
|
|
def document_array_param(value_type, definitions)
|
2016-10-31 19:14:08 +08:00
|
|
|
if value_type[:documentation].present?
|
|
|
|
|
param_type = value_type[:documentation][:param_type]
|
|
|
|
|
doc_type = value_type[:documentation][:type]
|
2016-12-19 00:40:56 +08:00
|
|
|
type = DataType.mapping(doc_type) if doc_type && !DataType.request_primitive?(doc_type)
|
2016-10-31 19:14:08 +08:00
|
|
|
collection_format = value_type[:documentation][:collectionFormat]
|
|
|
|
|
end
|
2016-03-30 22:02:36 +08:00
|
|
|
|
2016-11-29 08:03:24 +08:00
|
|
|
param_type ||= value_type[:param_type]
|
|
|
|
|
|
2016-10-31 19:14:08 +08:00
|
|
|
array_items = {}
|
|
|
|
|
if definitions[value_type[:data_type]]
|
|
|
|
|
array_items['$ref'] = "#/definitions/#{@parsed_param[:type]}"
|
|
|
|
|
else
|
2016-12-16 08:35:13 +08:00
|
|
|
array_items[:type] = type || @parsed_param[:type] == 'array' ? 'string' : @parsed_param[:type]
|
2016-03-30 22:02:36 +08:00
|
|
|
end
|
2016-10-31 19:14:08 +08:00
|
|
|
array_items[:format] = @parsed_param.delete(:format) if @parsed_param[:format]
|
|
|
|
|
|
|
|
|
|
@parsed_param[:in] = param_type || 'formData'
|
|
|
|
|
@parsed_param[:items] = array_items
|
|
|
|
|
@parsed_param[:type] = 'array'
|
2016-12-19 00:40:56 +08:00
|
|
|
@parsed_param[:collectionFormat] = collection_format if DataType.collections.include?(collection_format)
|
2016-03-30 22:02:36 +08:00
|
|
|
end
|
2016-03-30 06:43:33 +08:00
|
|
|
|
2016-03-30 22:02:36 +08:00
|
|
|
def param_type(value_type)
|
|
|
|
|
param_type = value_type[:param_type] || value_type[:in]
|
2016-05-11 04:01:13 +08:00
|
|
|
if value_type[:path].include?("{#{value_type[:param_name]}}")
|
2016-03-30 22:02:36 +08:00
|
|
|
'path'
|
2016-05-11 04:01:13 +08:00
|
|
|
elsif param_type
|
2016-04-03 06:35:55 +08:00
|
|
|
param_type
|
2016-05-11 04:01:13 +08:00
|
|
|
elsif %w(POST PUT PATCH).include?(value_type[:method])
|
2016-12-19 00:40:56 +08:00
|
|
|
DataType.request_primitive?(value_type[:data_type]) ? 'formData' : 'body'
|
2016-03-16 19:30:52 +08:00
|
|
|
else
|
2016-03-30 22:02:36 +08:00
|
|
|
'query'
|
2016-03-16 19:30:52 +08:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def parse_enum_or_range_values(values)
|
|
|
|
|
case values
|
2017-01-16 06:46:22 +08:00
|
|
|
when Proc
|
|
|
|
|
parse_enum_or_range_values(values.call)
|
2016-03-16 19:30:52 +08:00
|
|
|
when Range
|
|
|
|
|
parse_range_values(values) if values.first.is_a?(Integer)
|
|
|
|
|
else
|
|
|
|
|
{ enum: values } if values
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def parse_range_values(values)
|
|
|
|
|
{ minimum: values.first, maximum: values.last }
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|