grape-swagger 0.20.2 → 0.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +0 -3
- data/.rubocop_todo.yml +43 -33
- data/.travis.yml +22 -13
- data/CHANGELOG.md +29 -53
- data/Gemfile +1 -1
- data/README.md +24 -24
- data/example/api/endpoints.rb +28 -29
- data/example/api/entities.rb +1 -1
- data/example/config.ru +5 -7
- data/grape-swagger.gemspec +1 -1
- data/lib/grape-swagger.rb +9 -6
- data/lib/grape-swagger/doc_methods.rb +1 -1
- data/lib/grape-swagger/doc_methods/extensions.rb +3 -3
- data/lib/grape-swagger/doc_methods/headers.rb +1 -1
- data/lib/grape-swagger/doc_methods/move_params.rb +25 -16
- data/lib/grape-swagger/doc_methods/operation_id.rb +2 -2
- data/lib/grape-swagger/doc_methods/parse_params.rb +12 -5
- data/lib/grape-swagger/doc_methods/path_string.rb +1 -1
- data/lib/grape-swagger/doc_methods/status_codes.rb +3 -1
- data/lib/grape-swagger/doc_methods/tag_name_description.rb +1 -1
- data/lib/grape-swagger/endpoint.rb +33 -46
- data/lib/grape-swagger/grape/route.rb +16 -0
- data/lib/grape-swagger/version.rb +1 -1
- data/spec/issues/403_versions_spec.rb +158 -0
- data/spec/lib/data_type_spec.rb +9 -10
- data/spec/lib/endpoint_spec.rb +1 -2
- data/spec/lib/extensions_spec.rb +44 -40
- data/spec/lib/move_params_spec.rb +113 -93
- data/spec/lib/operation_id_spec.rb +42 -12
- data/spec/lib/optional_object_spec.rb +3 -4
- data/spec/lib/path_string_spec.rb +2 -2
- data/spec/lib/produces_consumes_spec.rb +64 -53
- data/spec/markdown/redcarpet_adapter_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/api_swagger_v2_result.rb +122 -128
- data/spec/support/namespace_tags.rb +17 -19
- data/spec/support/the_api_entities.rb +1 -3
- data/spec/support/the_paths_definitions.rb +95 -85
- data/spec/swagger_v2/api_swagger_v2_definitions-models_spec.rb +1 -1
- data/spec/swagger_v2/api_swagger_v2_detail_spec.rb +19 -19
- data/spec/swagger_v2/api_swagger_v2_extensions_spec.rb +21 -21
- data/spec/swagger_v2/api_swagger_v2_format-content_type_spec.rb +34 -32
- data/spec/swagger_v2/api_swagger_v2_global_configuration_spec.rb +5 -7
- data/spec/swagger_v2/api_swagger_v2_headers_spec.rb +19 -18
- data/spec/swagger_v2/api_swagger_v2_hide_documentation_path_spec.rb +9 -10
- data/spec/swagger_v2/api_swagger_v2_mounted_spec.rb +21 -24
- data/spec/swagger_v2/api_swagger_v2_param_type_body_nested_spec.rb +90 -92
- data/spec/swagger_v2/api_swagger_v2_param_type_body_spec.rb +54 -54
- data/spec/swagger_v2/api_swagger_v2_param_type_spec.rb +65 -57
- data/spec/swagger_v2/api_swagger_v2_request_params_fix_spec.rb +17 -14
- data/spec/swagger_v2/api_swagger_v2_response_spec.rb +79 -123
- data/spec/swagger_v2/api_swagger_v2_spec.rb +33 -34
- data/spec/swagger_v2/api_swagger_v2_type-format_spec.rb +32 -36
- data/spec/swagger_v2/boolean_params_spec.rb +1 -1
- data/spec/swagger_v2/default_api_spec.rb +26 -29
- data/spec/swagger_v2/description_not_initialized.rb +3 -3
- data/spec/swagger_v2/float_api_spec.rb +1 -1
- data/spec/swagger_v2/form_params_spec.rb +4 -4
- data/spec/swagger_v2/hide_api_spec.rb +48 -51
- data/spec/swagger_v2/host.rb +1 -1
- data/spec/swagger_v2/mounted_target_class_spec.rb +31 -33
- data/spec/swagger_v2/namespace_tags_prefix_spec.rb +23 -21
- data/spec/swagger_v2/namespace_tags_spec.rb +23 -20
- data/spec/swagger_v2/param_type_spec.rb +5 -6
- data/spec/swagger_v2/param_values_spec.rb +31 -37
- data/spec/swagger_v2/params_array_spec.rb +17 -15
- data/spec/swagger_v2/params_hash_spec.rb +17 -15
- data/spec/swagger_v2/params_nested_spec.rb +12 -10
- data/spec/swagger_v2/reference_entity.rb +9 -9
- data/spec/swagger_v2/response_model_spec.rb +58 -62
- data/spec/swagger_v2/simple_mounted_api_spec.rb +179 -147
- metadata +5 -10
- data/spec/params_entity_spec.rb +0 -49
    
        data/example/api/entities.rb
    CHANGED
    
    | @@ -6,7 +6,7 @@ module Api | |
| 6 6 | 
             
                  expose :id, documentation: { type: Integer, desc: 'identity of a resource' }
         | 
| 7 7 | 
             
                  expose :x, documentation: { type: Float, desc: 'x-value' }
         | 
| 8 8 | 
             
                  expose :y, documentation: { type: Float, desc: 'y-value' }
         | 
| 9 | 
            -
                  expose :path, documentation: { type: String, desc: 'the requested resource'}
         | 
| 9 | 
            +
                  expose :path, documentation: { type: String, desc: 'the requested resource' }
         | 
| 10 10 |  | 
| 11 11 | 
             
                  private
         | 
| 12 12 |  | 
    
        data/example/config.ru
    CHANGED
    
    | @@ -31,14 +31,12 @@ class Base < Grape::API | |
| 31 31 | 
             
                error_response(message: "Internal server error: #{e}", status: 500)
         | 
| 32 32 | 
             
              end
         | 
| 33 33 |  | 
| 34 | 
            -
              add_swagger_documentation : | 
| 35 | 
            -
                                        : | 
| 36 | 
            -
                                        : | 
| 37 | 
            -
                                          title:  | 
| 38 | 
            -
                                          description:  | 
| 34 | 
            +
              add_swagger_documentation hide_documentation_path: true,
         | 
| 35 | 
            +
                                        api_version: 'v1',
         | 
| 36 | 
            +
                                        info: {
         | 
| 37 | 
            +
                                          title: 'Horses and Hussars',
         | 
| 38 | 
            +
                                          description: 'Demo app for dev of grape swagger 2.0'
         | 
| 39 39 | 
             
                                        }
         | 
| 40 | 
            -
             | 
| 41 40 | 
             
            end
         | 
| 42 41 |  | 
| 43 | 
            -
             | 
| 44 42 | 
             
            run Base.new
         | 
    
        data/grape-swagger.gemspec
    CHANGED
    
    | @@ -11,7 +11,7 @@ Gem::Specification.new do |s| | |
| 11 11 | 
             
              s.summary     = 'A simple way to add auto generated documentation to your Grape API that can be displayed with Swagger.'
         | 
| 12 12 | 
             
              s.license     = 'MIT'
         | 
| 13 13 |  | 
| 14 | 
            -
              s.add_runtime_dependency 'grape',  | 
| 14 | 
            +
              s.add_runtime_dependency 'grape', '>= 0.12.0'
         | 
| 15 15 | 
             
              s.add_runtime_dependency 'grape-entity'
         | 
| 16 16 | 
             
              s.add_runtime_dependency 'awesome_print'
         | 
| 17 17 |  | 
    
        data/lib/grape-swagger.rb
    CHANGED
    
    | @@ -1,4 +1,7 @@ | |
| 1 1 | 
             
            require 'grape'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'grape-swagger/grape/route'
         | 
| 4 | 
            +
             | 
| 2 5 | 
             
            require 'grape-swagger/version'
         | 
| 3 6 | 
             
            require 'grape-swagger/endpoint'
         | 
| 4 7 | 
             
            require 'grape-swagger/errors'
         | 
| @@ -48,8 +51,8 @@ module Grape | |
| 48 51 |  | 
| 49 52 | 
             
                  def combine_routes(app, doc_klass)
         | 
| 50 53 | 
             
                    app.routes.each do |route|
         | 
| 51 | 
            -
                      route_path = route. | 
| 52 | 
            -
                      route_match = route_path.split(/^.*?#{route. | 
| 54 | 
            +
                      route_path = route.path
         | 
| 55 | 
            +
                      route_match = route_path.split(/^.*?#{route.prefix.to_s}/).last
         | 
| 53 56 | 
             
                      next unless route_match
         | 
| 54 57 | 
             
                      route_match = route_match.match('\/([\w|-]*?)[\.\/\(]') || route_match.match('\/([\w|-]*)$')
         | 
| 55 58 | 
             
                      next unless route_match
         | 
| @@ -57,7 +60,7 @@ module Grape | |
| 57 60 | 
             
                      next if resource.empty?
         | 
| 58 61 | 
             
                      resource.downcase!
         | 
| 59 62 | 
             
                      @target_class.combined_routes[resource] ||= []
         | 
| 60 | 
            -
                      next if doc_klass.hide_documentation_path && route. | 
| 63 | 
            +
                      next if doc_klass.hide_documentation_path && route.path.match(/#{doc_klass.mount_path}($|\/|\(\.)/)
         | 
| 61 64 | 
             
                      @target_class.combined_routes[resource] << route
         | 
| 62 65 | 
             
                    end
         | 
| 63 66 | 
             
                  end
         | 
| @@ -141,10 +144,10 @@ module Grape | |
| 141 144 | 
             
                  end
         | 
| 142 145 |  | 
| 143 146 | 
             
                  def route_path_start_with?(route, name)
         | 
| 144 | 
            -
                    route_prefix = route. | 
| 145 | 
            -
                    route_versioned_prefix = route. | 
| 147 | 
            +
                    route_prefix = route.prefix ? "/#{route.prefix}/#{name}" : "/#{name}"
         | 
| 148 | 
            +
                    route_versioned_prefix = route.prefix ? "/#{route.prefix}/:version/#{name}" : "/:version/#{name}"
         | 
| 146 149 |  | 
| 147 | 
            -
                    route. | 
| 150 | 
            +
                    route.path.start_with?(route_prefix, route_versioned_prefix)
         | 
| 148 151 | 
             
                  end
         | 
| 149 152 |  | 
| 150 153 | 
             
                  def standalone_sub_namespaces(name, namespaces)
         | 
| @@ -4,10 +4,10 @@ module GrapeSwagger | |
| 4 4 | 
             
                  class << self
         | 
| 5 5 | 
             
                    def add(path, definitions, route)
         | 
| 6 6 | 
             
                      @route = route
         | 
| 7 | 
            -
                      description = route. | 
| 7 | 
            +
                      description = route.settings[:description]
         | 
| 8 8 | 
             
                      add_extension_to(path[method], extension(description)) if description && extended?(description, :x)
         | 
| 9 9 |  | 
| 10 | 
            -
                      settings = route. | 
| 10 | 
            +
                      settings = route.settings
         | 
| 11 11 | 
             
                      add_extensions_to_path(settings, path) if settings && extended?(settings, :x_path)
         | 
| 12 12 | 
             
                      add_extensions_to_definition(settings, path, definitions) if settings && extended?(settings, :x_def)
         | 
| 13 13 | 
             
                    end
         | 
| @@ -67,7 +67,7 @@ module GrapeSwagger | |
| 67 67 | 
             
                    end
         | 
| 68 68 |  | 
| 69 69 | 
             
                    def method
         | 
| 70 | 
            -
                      @route. | 
| 70 | 
            +
                      @route.request_method.downcase.to_sym
         | 
| 71 71 | 
             
                    end
         | 
| 72 72 | 
             
                  end
         | 
| 73 73 | 
             
                end
         | 
| @@ -4,8 +4,12 @@ module GrapeSwagger | |
| 4 4 | 
             
                  class << self
         | 
| 5 5 | 
             
                    def to_definition(paths, definitions)
         | 
| 6 6 | 
             
                      @definitions = definitions
         | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 7 | 
            +
             | 
| 8 | 
            +
                      find_post_put(paths) do |method_definition|
         | 
| 9 | 
            +
                        verb = method_definition.keys.first
         | 
| 10 | 
            +
                        method_object = method_definition[verb]
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                        find_definition_and_params(method_object, verb)
         | 
| 9 13 | 
             
                      end
         | 
| 10 14 | 
             
                    end
         | 
| 11 15 |  | 
| @@ -16,25 +20,29 @@ module GrapeSwagger | |
| 16 20 | 
             
                      end
         | 
| 17 21 | 
             
                    end
         | 
| 18 22 |  | 
| 19 | 
            -
                    def find_definition_and_params(path)
         | 
| 20 | 
            -
                       | 
| 21 | 
            -
                        params = path[verb][:parameters]
         | 
| 23 | 
            +
                    def find_definition_and_params(path, verb)
         | 
| 24 | 
            +
                      params = path[:parameters]
         | 
| 22 25 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 26 | 
            +
                      return if params.nil?
         | 
| 27 | 
            +
                      return unless should_move?(params)
         | 
| 25 28 |  | 
| 26 | 
            -
             | 
| 29 | 
            +
                      unify!(params)
         | 
| 27 30 |  | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
                        referenced_definition = parse_model(response[:schema]['$ref'])
         | 
| 31 | 
            +
                      status_code = GrapeSwagger::DocMethods::StatusCodes.get[verb.to_sym][:code]
         | 
| 32 | 
            +
                      response = path[:responses][status_code]
         | 
| 31 33 |  | 
| 34 | 
            +
                      if response[:schema] && response[:schema]['$ref']
         | 
| 35 | 
            +
                        referenced_definition = parse_model(response[:schema]['$ref'])
         | 
| 32 36 | 
             
                        name = build_definition(referenced_definition, verb)
         | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
                         | 
| 36 | 
            -
                        path[verb][:parameters] << build_body_parameter(response.dup, name)
         | 
| 37 | 
            +
                      else
         | 
| 38 | 
            +
                        referenced_definition = path[:operationId]
         | 
| 39 | 
            +
                        name = build_definition(referenced_definition)
         | 
| 37 40 | 
             
                      end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                      move_params_to_new(name, params)
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                      @definitions[name][:description] = path[:description]
         | 
| 45 | 
            +
                      path[:parameters] << build_body_parameter(response.dup, name)
         | 
| 38 46 | 
             
                    end
         | 
| 39 47 |  | 
| 40 48 | 
             
                    def move_params_to_new(name, params)
         | 
| @@ -88,9 +96,10 @@ module GrapeSwagger | |
| 88 96 | 
             
                    private
         | 
| 89 97 |  | 
| 90 98 | 
             
                    def build_body_parameter(response, name = false)
         | 
| 99 | 
            +
                      entity = response[:schema] ? parse_model(response[:schema]['$ref']) : name
         | 
| 91 100 | 
             
                      body_param = {}
         | 
| 92 101 | 
             
                      body_param.tap do |x|
         | 
| 93 | 
            -
                        x[:name] =  | 
| 102 | 
            +
                        x[:name] = entity
         | 
| 94 103 | 
             
                        x[:in] = 'body'
         | 
| 95 104 | 
             
                        x[:required] = true
         | 
| 96 105 | 
             
                        x[:schema] = { '$ref' => response[:schema]['$ref'] } unless name
         | 
| @@ -2,8 +2,8 @@ module GrapeSwagger | |
| 2 2 | 
             
              module DocMethods
         | 
| 3 3 | 
             
                class OperationId
         | 
| 4 4 | 
             
                  class << self
         | 
| 5 | 
            -
                    def build( | 
| 6 | 
            -
                      verb =  | 
| 5 | 
            +
                    def build(route, path = nil)
         | 
| 6 | 
            +
                      verb = route.request_method.to_s.downcase
         | 
| 7 7 |  | 
| 8 8 | 
             
                      operation = manipulate(path) unless path.nil?
         | 
| 9 9 |  | 
| @@ -3,8 +3,8 @@ module GrapeSwagger | |
| 3 3 | 
             
                class ParseParams
         | 
| 4 4 | 
             
                  class << self
         | 
| 5 5 | 
             
                    def call(param, settings, route)
         | 
| 6 | 
            -
                      path = route. | 
| 7 | 
            -
                      method = route. | 
| 6 | 
            +
                      path = route.path
         | 
| 7 | 
            +
                      method = route.request_method
         | 
| 8 8 |  | 
| 9 9 | 
             
                      data_type = GrapeSwagger::DocMethods::DataType.call(settings)
         | 
| 10 10 | 
             
                      additional_documentation = settings[:documentation]
         | 
| @@ -14,12 +14,14 @@ module GrapeSwagger | |
| 14 14 |  | 
| 15 15 | 
             
                      value_type = settings.merge(data_type: data_type, path: path, param_name: param, method: method)
         | 
| 16 16 |  | 
| 17 | 
            +
                      # required properties
         | 
| 17 18 | 
             
                      @parsed_param = {
         | 
| 18 | 
            -
                        in: | 
| 19 | 
            -
                        name: | 
| 20 | 
            -
                        description:   settings[:desc] || settings[:description] || nil
         | 
| 19 | 
            +
                        in:   param_type(value_type),
         | 
| 20 | 
            +
                        name: settings[:full_name] || param
         | 
| 21 21 | 
             
                      }
         | 
| 22 22 |  | 
| 23 | 
            +
                      # optional properties
         | 
| 24 | 
            +
                      document_description(settings)
         | 
| 23 25 | 
             
                      document_type_and_format(data_type)
         | 
| 24 26 | 
             
                      document_array_param(value_type)
         | 
| 25 27 | 
             
                      document_default_value(settings)
         | 
| @@ -31,6 +33,11 @@ module GrapeSwagger | |
| 31 33 |  | 
| 32 34 | 
             
                    private
         | 
| 33 35 |  | 
| 36 | 
            +
                    def document_description(settings)
         | 
| 37 | 
            +
                      description = settings[:desc] || settings[:description]
         | 
| 38 | 
            +
                      @parsed_param[:description] = description if description
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
             | 
| 34 41 | 
             
                    def document_required(settings)
         | 
| 35 42 | 
             
                      @parsed_param[:required] = settings[:required] || false
         | 
| 36 43 | 
             
                      @parsed_param[:required] = true if @parsed_param[:in] == 'path'
         | 
| @@ -14,7 +14,7 @@ module GrapeSwagger | |
| 14 14 | 
             
                      item = path.gsub(%r{/{(.+?)}}, '').split('/').last.singularize.underscore.camelize || 'Item'
         | 
| 15 15 |  | 
| 16 16 | 
             
                      if options[:version] && options[:add_version]
         | 
| 17 | 
            -
                        path.sub!('{version}', options[:version])
         | 
| 17 | 
            +
                        path.sub!('{version}', options[:version].to_s)
         | 
| 18 18 | 
             
                      else
         | 
| 19 19 | 
             
                        path.sub!('/{version}', '')
         | 
| 20 20 | 
             
                      end
         | 
| @@ -8,7 +8,9 @@ module GrapeSwagger | |
| 8 8 | 
             
                        post: { code: 201, message: 'created {item}' },
         | 
| 9 9 | 
             
                        put: { code: 200, message: 'updated {item}' },
         | 
| 10 10 | 
             
                        patch: { code: 200, message: 'patched {item}' },
         | 
| 11 | 
            -
                        delete: { code: 200, message: 'deleted {item}' }
         | 
| 11 | 
            +
                        delete: { code: 200, message: 'deleted {item}' },
         | 
| 12 | 
            +
                        head: { code: 200, message: 'head {item}' },
         | 
| 13 | 
            +
                        options: { code: 200, message: 'option {item}' }
         | 
| 12 14 | 
             
                      }
         | 
| 13 15 | 
             
                    end
         | 
| 14 16 | 
             
                  end
         | 
| @@ -8,7 +8,7 @@ module GrapeSwagger | |
| 8 8 | 
             
                      namespace_routes = target_class.combined_namespace_routes
         | 
| 9 9 |  | 
| 10 10 | 
             
                      namespace_routes.keys.map do |local_route|
         | 
| 11 | 
            -
                        next if namespace_routes[local_route].map | 
| 11 | 
            +
                        next if namespace_routes[local_route].map { |route| route.options[:hidden] }.all? { |value| value.respond_to?(:call) ? value.call : value }
         | 
| 12 12 |  | 
| 13 13 | 
             
                        original_namespace_name = target_class.combined_namespace_identifiers.key?(local_route) ? target_class.combined_namespace_identifiers[local_route] : local_route
         | 
| 14 14 | 
             
                        description = namespaces[original_namespace_name] && namespaces[original_namespace_name].options[:desc]
         | 
| @@ -20,7 +20,7 @@ module Grape | |
| 20 20 | 
             
                # required keys for SwaggerObject
         | 
| 21 21 | 
             
                def swagger_object(target_class, request, options)
         | 
| 22 22 | 
             
                  {
         | 
| 23 | 
            -
                    info:           info_object(options[:info].merge(version: options[: | 
| 23 | 
            +
                    info:           info_object(options[:info].merge(version: options[:doc_version])),
         | 
| 24 24 | 
             
                    swagger:        '2.0',
         | 
| 25 25 | 
             
                    produces:       content_types_for(target_class),
         | 
| 26 26 | 
             
                    authorizations: options[:authorizations],
         | 
| @@ -86,19 +86,18 @@ module Grape | |
| 86 86 | 
             
                  routes.each do |route|
         | 
| 87 87 | 
             
                    next if hidden?(route)
         | 
| 88 88 |  | 
| 89 | 
            -
                    @item, path = GrapeSwagger::DocMethods::PathString.build(route. | 
| 90 | 
            -
                    @entity = route. | 
| 89 | 
            +
                    @item, path = GrapeSwagger::DocMethods::PathString.build(route.path, options)
         | 
| 90 | 
            +
                    @entity = route.entity || route.options[:success]
         | 
| 91 91 |  | 
| 92 | 
            -
                     | 
| 93 | 
            -
                    request_params = method_object(route, options, path)
         | 
| 92 | 
            +
                    verb, method_object = method_object(route, options, path)
         | 
| 94 93 |  | 
| 95 | 
            -
                    if @paths.key?(path. | 
| 96 | 
            -
                      @paths[path. | 
| 94 | 
            +
                    if @paths.key?(path.to_s)
         | 
| 95 | 
            +
                      @paths[path.to_s][verb] = method_object
         | 
| 97 96 | 
             
                    else
         | 
| 98 | 
            -
                      @paths[path. | 
| 97 | 
            +
                      @paths[path.to_s] = { verb => method_object }
         | 
| 99 98 | 
             
                    end
         | 
| 100 99 |  | 
| 101 | 
            -
                    GrapeSwagger::DocMethods::Extensions.add(@paths[path. | 
| 100 | 
            +
                    GrapeSwagger::DocMethods::Extensions.add(@paths[path.to_s], @definitions, route)
         | 
| 102 101 | 
             
                  end
         | 
| 103 102 | 
             
                end
         | 
| 104 103 |  | 
| @@ -109,16 +108,18 @@ module Grape | |
| 109 108 | 
             
                  method[:consumes]    = consumes_object(route, options[:format])
         | 
| 110 109 | 
             
                  method[:parameters]  = params_object(route)
         | 
| 111 110 | 
             
                  method[:responses]   = response_object(route, options[:markdown])
         | 
| 112 | 
            -
                  method[:tags]        = tag_object(route, options[:version])
         | 
| 113 | 
            -
                  method[:operationId] = GrapeSwagger::DocMethods::OperationId.build(route | 
| 111 | 
            +
                  method[:tags]        = tag_object(route, options[:version].to_s)
         | 
| 112 | 
            +
                  method[:operationId] = GrapeSwagger::DocMethods::OperationId.build(route, path)
         | 
| 114 113 | 
             
                  method.delete_if { |_, value| value.blank? }
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                  [route.request_method.downcase.to_sym, method]
         | 
| 115 116 | 
             
                end
         | 
| 116 117 |  | 
| 117 118 | 
             
                def description_object(route, markdown)
         | 
| 118 | 
            -
                  description = route. | 
| 119 | 
            -
                  description = route. | 
| 119 | 
            +
                  description = route.options[:desc] if route.options.key?(:desc)
         | 
| 120 | 
            +
                  description = route.description if route.description.present?
         | 
| 120 121 | 
             
                  description = "# #{description} " if markdown
         | 
| 121 | 
            -
                  description += "\n #{route. | 
| 122 | 
            +
                  description += "\n #{route.options[:detail]}" if route.options.key?(:detail)
         | 
| 122 123 | 
             
                  description = markdown.markdown(description.to_s).chomp if markdown
         | 
| 123 124 |  | 
| 124 125 | 
             
                  description
         | 
| @@ -127,8 +128,8 @@ module Grape | |
| 127 128 | 
             
                def produces_object(route, format)
         | 
| 128 129 | 
             
                  mime_types = GrapeSwagger::DocMethods::ProducesConsumes.call(format)
         | 
| 129 130 |  | 
| 130 | 
            -
                  route_mime_types = [: | 
| 131 | 
            -
                    possible = route. | 
| 131 | 
            +
                  route_mime_types = [:formats, :content_types, :produces].map do |producer|
         | 
| 132 | 
            +
                    possible = route.options[producer]
         | 
| 132 133 | 
             
                    GrapeSwagger::DocMethods::ProducesConsumes.call(possible) if possible.present?
         | 
| 133 134 | 
             
                  end.flatten.compact.uniq
         | 
| 134 135 |  | 
| @@ -136,8 +137,8 @@ module Grape | |
| 136 137 | 
             
                end
         | 
| 137 138 |  | 
| 138 139 | 
             
                def consumes_object(route, format)
         | 
| 139 | 
            -
                  method = route. | 
| 140 | 
            -
                  format = route. | 
| 140 | 
            +
                  method = route.request_method.downcase.to_sym
         | 
| 141 | 
            +
                  format = route.settings[:description][:consumes] if route.settings[:description] && route.settings[:description][:consumes]
         | 
| 141 142 | 
             
                  mime_types = GrapeSwagger::DocMethods::ProducesConsumes.call(format) if [:post, :put].include?(method)
         | 
| 142 143 |  | 
| 143 144 | 
             
                  mime_types
         | 
| @@ -152,11 +153,11 @@ module Grape | |
| 152 153 | 
             
                end
         | 
| 153 154 |  | 
| 154 155 | 
             
                def response_object(route, markdown)
         | 
| 155 | 
            -
                  default_code = GrapeSwagger::DocMethods::StatusCodes.get[route. | 
| 156 | 
            +
                  default_code = GrapeSwagger::DocMethods::StatusCodes.get[route.request_method.downcase.to_sym]
         | 
| 156 157 | 
             
                  default_code[:model] = @entity if @entity
         | 
| 157 | 
            -
                  default_code[:message] = route. | 
| 158 | 
            +
                  default_code[:message] = route.description || default_code[:message].sub('{item}', @item)
         | 
| 158 159 |  | 
| 159 | 
            -
                  codes = [default_code] + (route. | 
| 160 | 
            +
                  codes = [default_code] + (route.http_codes || route.options[:failure] || [])
         | 
| 160 161 | 
             
                  codes.map! { |x| x.is_a?(Array) ? { code: x[0], message: x[1], model: x[2] } : x }
         | 
| 161 162 |  | 
| 162 163 | 
             
                  codes.each_with_object({}) do |value, memo|
         | 
| @@ -165,7 +166,7 @@ module Grape | |
| 165 166 | 
             
                    response_model = @item
         | 
| 166 167 | 
             
                    response_model = expose_params_from_model(value[:model]) if value[:model]
         | 
| 167 168 |  | 
| 168 | 
            -
                    if memo.key?(200) && route. | 
| 169 | 
            +
                    if memo.key?(200) && route.request_method == 'DELETE' && value[:model].nil?
         | 
| 169 170 | 
             
                      memo[204] = memo.delete(200)
         | 
| 170 171 | 
             
                      value[:code] = 204
         | 
| 171 172 | 
             
                    end
         | 
| @@ -176,7 +177,7 @@ module Grape | |
| 176 177 |  | 
| 177 178 | 
             
                    @definitions[response_model][:description] = description_object(route, markdown)
         | 
| 178 179 | 
             
                    # TODO: proof that the definition exist, if model isn't specified
         | 
| 179 | 
            -
                    memo[value[:code]][:schema] = if route. | 
| 180 | 
            +
                    memo[value[:code]][:schema] = if route.options[:is_array]
         | 
| 180 181 | 
             
                                                    { 'type' => 'array', 'items' => { '$ref' => "#/definitions/#{response_model}" } }
         | 
| 181 182 | 
             
                                                  else
         | 
| 182 183 | 
             
                                                    { '$ref' => "#/definitions/#{response_model}" }
         | 
| @@ -185,35 +186,23 @@ module Grape | |
| 185 186 | 
             
                end
         | 
| 186 187 |  | 
| 187 188 | 
             
                def tag_object(route, version)
         | 
| 188 | 
            -
                  Array(route. | 
| 189 | 
            +
                  Array(route.path.split('{')[0].split('/').reject(&:empty?).delete_if { |i| ((i == route.prefix.to_s) || (i == version)) }.first)
         | 
| 189 190 | 
             
                end
         | 
| 190 191 |  | 
| 191 192 | 
             
                private
         | 
| 192 193 |  | 
| 193 194 | 
             
                def partition_params(route)
         | 
| 194 | 
            -
                  declared_params = route. | 
| 195 | 
            -
                  required, exposed = route. | 
| 196 | 
            -
                  required.concat GrapeSwagger::DocMethods::Headers.parse(route) unless route. | 
| 195 | 
            +
                  declared_params = route.settings[:declared_params] if route.settings[:declared_params].present?
         | 
| 196 | 
            +
                  required, exposed = route.params.partition { |x| x.first.is_a? String }
         | 
| 197 | 
            +
                  required.concat GrapeSwagger::DocMethods::Headers.parse(route) unless route.headers.nil?
         | 
| 197 198 | 
             
                  default_type(required)
         | 
| 198 199 | 
             
                  default_type(exposed)
         | 
| 199 200 |  | 
| 200 | 
            -
                  unless declared_params.nil? && route. | 
| 201 | 
            +
                  unless declared_params.nil? && route.headers.nil?
         | 
| 201 202 | 
             
                    request_params = parse_request_params(required)
         | 
| 202 203 | 
             
                  end
         | 
| 203 | 
            -
                  if !exposed.empty?
         | 
| 204 | 
            -
                    exposed_params = exposed.each_with_object({}) { |x, memo| memo[x.first] = x.last }
         | 
| 205 | 
            -
                    properties = parse_response_params(exposed_params)
         | 
| 206 | 
            -
                  else
         | 
| 207 | 
            -
                    properties = parse_response_params(required)
         | 
| 208 | 
            -
                  end
         | 
| 209 | 
            -
             | 
| 210 | 
            -
                  key = model_name(@entity || @item)
         | 
| 211 204 |  | 
| 212 | 
            -
                   | 
| 213 | 
            -
                    @definitions[key] = { type: 'object', properties: properties } unless @definitions.key?(key)
         | 
| 214 | 
            -
                    @definitions[key][:properties].merge!(properties) if @definitions.key?(key)
         | 
| 215 | 
            -
                  end
         | 
| 216 | 
            -
                  return route.route_params if route.route_params.present? && !route.route_settings[:declared_params].present?
         | 
| 205 | 
            +
                  return route.params if route.params.present? && !route.settings[:declared_params].present?
         | 
| 217 206 | 
             
                  request_params || {}
         | 
| 218 207 | 
             
                end
         | 
| 219 208 |  | 
| @@ -306,11 +295,9 @@ module Grape | |
| 306 295 | 
             
                end
         | 
| 307 296 |  | 
| 308 297 | 
             
                def hidden?(route)
         | 
| 309 | 
            -
                   | 
| 310 | 
            -
             | 
| 311 | 
            -
                   | 
| 312 | 
            -
             | 
| 313 | 
            -
                  false
         | 
| 298 | 
            +
                  route_hidden = route.options[:hidden]
         | 
| 299 | 
            +
                  route_hidden = route_hidden.call if route_hidden.is_a?(Proc)
         | 
| 300 | 
            +
                  route_hidden
         | 
| 314 301 | 
             
                end
         | 
| 315 302 | 
             
              end
         | 
| 316 303 | 
             
            end
         |