lib/grape-swagger/endpoint.rb in grape-swagger-0.24.0 vs lib/grape-swagger/endpoint.rb in grape-swagger-0.25.0

- old
+ new

@@ -1,7 +1,5 @@ -# frozen_string_literal: true - require 'active_support' require 'active_support/core_ext/string/inflections.rb' module Grape class Endpoint @@ -27,11 +25,10 @@ produces: content_types_for(target_class), authorizations: options[:authorizations], securityDefinitions: options[:security_definitions], host: GrapeSwagger::DocMethods::OptionalObject.build(:host, options, request), basePath: GrapeSwagger::DocMethods::OptionalObject.build(:base_path, options, request), - tags: GrapeSwagger::DocMethods::TagNameDescription.build(options), schemes: options[:schemes].is_a?(String) ? [options[:schemes]] : options[:schemes] }.delete_if { |_, value| value.blank? } end # building info object @@ -110,11 +107,11 @@ method[:produces] = produces_object(route, options[:produces] || options[:format]) method[:consumes] = consumes_object(route, options[:format]) method[:parameters] = params_object(route) method[:security] = security_object(route) method[:responses] = response_object(route, options[:markdown]) - method[:tags] = tag_object(route) + method[:tags] = route.options.fetch(:tags, tag_object(route)) method[:operationId] = GrapeSwagger::DocMethods::OperationId.build(route, path) method.delete_if { |_, value| value.blank? } [route.request_method.downcase.to_sym, method] end @@ -162,11 +159,16 @@ def params_object(route) 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 == '' - GrapeSwagger::DocMethods::ParseParams.call(param, value, route) + if value[:type] + expose_params(value[:type]) + elsif value[:documentation] + expose_params(value[:documentation][:type]) + end + GrapeSwagger::DocMethods::ParseParams.call(param, value, route, @definitions) end if GrapeSwagger::DocMethods::MoveParams.can_be_moved?(parameters, route.request_method) parameters = GrapeSwagger::DocMethods::MoveParams.to_definition(parameters, route, @definitions) end @@ -260,52 +262,47 @@ return false unless param_types param_types = param_types[0].split(',') if param_types param_types.size == 1 end + def expose_params(value) + if value.is_a?(Class) && GrapeSwagger.model_parsers.find(value) + expose_params_from_model(value) + elsif value.is_a?(String) + begin + expose_params(Object.const_get(value.gsub(/\[|\]/, ''))) # try to load class from its name + rescue NameError + nil + end + end + end + def expose_params_from_model(model) + model = model.is_a?(String) ? model.constantize : model model_name = model_name(model) return model_name if @definitions.key?(model_name) @definitions[model_name] = nil - properties = nil - parser = nil - - GrapeSwagger.model_parsers.each do |klass, ancestor| - next unless model.ancestors.map(&:to_s).include?(ancestor) - parser = klass.new(model, self) - break - end - - properties = parser.call unless parser.nil? - + parser = GrapeSwagger.model_parsers.find(model) raise GrapeSwagger::Errors::UnregisteredParser, "No parser registered for #{model_name}." unless parser + + properties = parser.new(model, self).call raise GrapeSwagger::Errors::SwaggerSpec, "Empty model #{model_name}, swagger 2.0 doesn't support empty definitions." unless properties && properties.any? - @definitions[model_name] = { type: 'object', properties: properties } + @definitions[model_name] = GrapeSwagger::DocMethods::BuildModelDefinition.build(model, properties) model_name end def model_name(name) - if name.respond_to?(:entity_name) - name.entity_name - elsif name.to_s.end_with?('Entity', 'Entities') - length = 0 - name.to_s.split('::')[0..-2].reverse.take_while do |x| - length += x.length - length < 42 - end.reverse.join - else - name.name.demodulize.camelize - end + GrapeSwagger::DocMethods::DataType.parse_entity_name(name) end def hidden?(route, options) route_hidden = route.options[:hidden] return route_hidden unless route_hidden.is_a?(Proc) - options[:oauth_token] ? route_hidden.call(send(options[:oauth_token].to_sym)) : route_hidden.call + options[:token_owner] ? route_hidden.call(send(options[:token_owner].to_sym)) : route_hidden.call end def public_parameter?(param) param_options = param.last return true unless param_options.key?(:documentation) && !param_options[:required]