lib/grape-swagger/endpoint.rb in grape-swagger-0.26.1 vs lib/grape-swagger/endpoint.rb in grape-swagger-0.27.0

- old
+ new

@@ -1,5 +1,7 @@ +# frozen_string_literal: true + require 'active_support' require 'active_support/core_ext/string/inflections.rb' module Grape class Endpoint @@ -33,18 +35,22 @@ }.delete_if { |_, value| value.blank? } end # building info object def info_object(infos) - { + result = { title: infos[:title] || 'API title', description: infos[:description], termsOfServiceUrl: infos[:terms_of_service_url], contact: contact_object(infos), license: license_object(infos), version: infos[:version] - }.delete_if { |_, value| value.blank? } + } + + GrapeSwagger::DocMethods::Extensions.add_extensions_to_info(infos, result) + + result.delete_if { |_, value| value.blank? } end # sub-objects of info object # license def license_object(infos) @@ -106,14 +112,14 @@ method = {} method[:summary] = summary_object(route) method[:description] = description_object(route) method[:produces] = produces_object(route, options[:produces] || options[:format]) method[:consumes] = consumes_object(route, options[:format]) - method[:parameters] = params_object(route) + method[:parameters] = params_object(route, path) method[:security] = security_object(route) method[:responses] = response_object(route) - method[:tags] = route.options.fetch(:tags, tag_object(route)) + method[:tags] = route.options.fetch(:tags, tag_object(route, path)) method[:operationId] = GrapeSwagger::DocMethods::OperationId.build(route, path) method.delete_if { |_, value| value.blank? } [route.request_method.downcase.to_sym, method] end @@ -136,13 +142,16 @@ description end def produces_object(route, format) + return ['application/octet-stream'] if file_response?(route.attributes.success) && + !route.attributes.produces.present? + mime_types = GrapeSwagger::DocMethods::ProducesConsumes.call(format) - route_mime_types = [:formats, :content_types, :produces].map do |producer| + route_mime_types = %i(formats content_types produces).map do |producer| possible = route.options[producer] GrapeSwagger::DocMethods::ProducesConsumes.call(possible) if possible.present? end.flatten.compact.uniq route_mime_types.present? ? route_mime_types : mime_types @@ -151,29 +160,29 @@ def consumes_object(route, format) method = route.request_method.downcase.to_sym if route.settings[:description] && route.settings[:description][:consumes] format = route.settings[:description][:consumes] end - mime_types = GrapeSwagger::DocMethods::ProducesConsumes.call(format) if [:post, :put].include?(method) + mime_types = GrapeSwagger::DocMethods::ProducesConsumes.call(format) if %i(post put).include?(method) mime_types end - def params_object(route) + def params_object(route, path) parameters = partition_params(route).map do |param, value| value = { required: false }.merge(value) if value.is_a?(Hash) _, value = default_type([[param, value]]).first if value == '' if value[:type] expose_params(value[:type]) elsif value[:documentation] expose_params(value[:documentation][:type]) end - GrapeSwagger::DocMethods::ParseParams.call(param, value, route, @definitions) + GrapeSwagger::DocMethods::ParseParams.call(param, value, path, route, @definitions) end if GrapeSwagger::DocMethods::MoveParams.can_be_moved?(parameters, route.request_method) - parameters = GrapeSwagger::DocMethods::MoveParams.to_definition(parameters, route, @definitions) + parameters = GrapeSwagger::DocMethods::MoveParams.to_definition(path, parameters, route, @definitions) end parameters end @@ -183,10 +192,11 @@ codes = apply_success_codes(route) + codes codes.map! { |x| x.is_a?(Array) ? { code: x[0], message: x[1], model: x[2] } : x } codes.each_with_object({}) do |value, memo| memo[value[:code]] = { description: value[:message] } + next build_file_response(memo[value[:code]]) if file_response?(value[:model]) response_model = @item response_model = expose_params_from_model(value[:model]) if value[:model] if memo.key?(200) && route.request_method == 'DELETE' && value[:model].nil? @@ -199,11 +209,11 @@ @definitions[response_model][:description] = description_object(route) # TODO: proof that the definition exist, if model isn't specified reference = { '$ref' => "#/definitions/#{response_model}" } memo[value[:code]][:schema] = if route.options[:is_array] && value[:code] < 300 - { 'type' => 'array', 'items' => reference } + { type: 'array', items: reference } else reference end end end @@ -221,38 +231,46 @@ end [default_code] end - def tag_object(route) + def tag_object(route, path) version = GrapeSwagger::DocMethods::Version.get(route) version = [version] unless version.is_a?(Array) Array( - route.path.split('{')[0].split('/').reject(&:empty?).delete_if do |i| + path.split('{')[0].split('/').reject(&:empty?).delete_if do |i| i == route.prefix.to_s || version.map(&:to_s).include?(i) end.first ) end private + def file_response?(value) + value.to_s.casecmp('file').zero? ? true : false + end + + def build_file_response(memo) + memo['schema'] = { type: 'file' } + end + def partition_params(route) declared_params = route.settings[:declared_params] if route.settings[:declared_params].present? - required, exposed = route.params.partition { |x| x.first.is_a? String } + required = merge_params(route) required = GrapeSwagger::DocMethods::Headers.parse(route) + required unless route.headers.nil? default_type(required) - default_type(exposed) request_params = unless declared_params.nil? && route.headers.nil? parse_request_params(required) end || {} - if route.params.present? && !route.settings[:declared_params].present? - request_params = route.params.merge(request_params) - end + request_params.empty? ? required : request_params + end - request_params + def merge_params(route) + param_keys = route.params.keys + route.params.delete_if { |key| key.is_a?(String) && param_keys.include?(key.to_sym) }.to_a end def default_type(params) params.each do |param| param[-1] = param.last == '' ? { required: true, type: 'Integer' } : param.last