Skip to content

Commit 9b6cb2a

Browse files
blakenumbata
blake
authored andcommitted
Add spec
1 parent 1f9c449 commit 9b6cb2a

13 files changed

+463
-155
lines changed

lib/grape-swagger.rb

+16-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
require 'grape-swagger/errors'
88
require 'grape-swagger/version'
99
require 'grape-swagger/model_parsers'
10+
require 'grape-swagger/swagger_2/endpoint'
11+
require 'grape-swagger/openapi_3/endpoint'
12+
require 'grape-swagger/openapi_3/doc_methods'
13+
require 'grape-swagger/swagger_2/doc_methods'
1014

1115
module GrapeSwagger
1216
class << self
@@ -140,6 +144,10 @@ def add_swagger_documentation(options = {})
140144
@target_class.combined_routes = combined_routes
141145
@target_class.combined_namespaces = combined_namespaces
142146

147+
endpoint_type = options[:openapi_version] == '3.0' ? Grape::OpenAPI3Endpoint : Grape::Swagger2Endpoint
148+
set_endpoint_type(@target_class, endpoint_type)
149+
set_endpoint_type(documentation_class, endpoint_type)
150+
143151
documentation_class
144152
end
145153

@@ -149,6 +157,13 @@ def version_for(options)
149157
options[:version] = version if version
150158
end
151159

160+
def set_endpoint_type(app, klass)
161+
app.endpoints.each do |endpoint|
162+
endpoint.class.include(klass)
163+
set_endpoint_type(endpoint.options[:app], klass) if endpoint.options[:app]
164+
end
165+
end
166+
152167
def combine_namespaces(app)
153168
combined_namespaces = {}
154169
endpoints = app.endpoints.clone
@@ -171,14 +186,10 @@ def combine_namespaces(app)
171186
end
172187

173188
def create_documentation_class(openapi_version)
174-
Class.new(Grape::API) do
189+
Class.new(GrapeInstance) do
175190
if openapi_version == '3.0'
176-
require 'grape-swagger/openapi_3/endpoint'
177-
require 'grape-swagger/openapi_3/doc_methods'
178191
extend GrapeOpenAPI::DocMethods
179192
else
180-
require 'grape-swagger/swagger_2/endpoint'
181-
require 'grape-swagger/swagger_2/doc_methods'
182193
extend GrapeSwagger::DocMethods
183194
end
184195
end

lib/grape-swagger/doc_methods/extensions.rb

+10-2
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,17 @@ def find_definition(status, path)
5555
response = path[method][:responses][status]
5656
return if response.nil?
5757

58-
return response[:schema]['$ref'].split('/').last if response[:schema].key?('$ref')
58+
# Swagger 2
59+
if response[:schema]
60+
return response[:schema]['$ref'].split('/').last if response[:schema].key?('$ref')
61+
return response[:schema]['items']['$ref'].split('/').last if response[:schema].key?('items')
62+
end
5963

60-
response[:schema]['items']['$ref'].split('/').last if response[:schema].key?('items')
64+
# OpenAPI 3
65+
response[:content].each do |_,v|
66+
return v[:schema]['$ref'].split('/').last if v[:schema].key?('$ref')
67+
return v[:schema]['items']['$ref'].split('/').last if v[:schema].key?('items')
68+
end
6169
end
6270

6371
def add_extension_to(part, extensions)

lib/grape-swagger/openapi_3/doc_methods.rb

+8
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ def setup(options)
3232
target_class = options[:target_class]
3333
guard = options[:swagger_endpoint_guard]
3434
formatter = options[:format]
35+
api_doc = options[:api_documentation].dup
36+
specific_api_doc = options[:specific_api_documentation].dup
3537

3638
class_variables_from(options)
3739

@@ -41,6 +43,8 @@ def setup(options)
4143
end
4244
end
4345

46+
desc api_doc.delete(:desc), api_doc
47+
4448
instance_eval(guard) unless guard.nil?
4549

4650
output_path_definitions = proc do |combi_routes, endpoint|
@@ -70,10 +74,14 @@ def setup(options)
7074
output_path_definitions.call(target_class.combined_namespace_routes, self)
7175
end
7276

77+
desc specific_api_doc.delete(:desc), { params:
78+
specific_api_doc.delete(:params) || {} }.merge(specific_api_doc)
79+
7380
params do
7481
requires :name, type: String, desc: 'Resource name of mounted API'
7582
optional :locale, type: Symbol, desc: 'Locale of API documentation'
7683
end
84+
7785
get "#{mount_path}/:name" do
7886
I18n.locale = params[:locale] || I18n.default_locale
7987

lib/grape-swagger/openapi_3/doc_methods/move_params.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
module GrapeSwagger
66
module DocMethods
7-
class MoveParams
7+
class OpenAPIMoveParams
88
class << self
99
attr_accessor :definitions
1010

lib/grape-swagger/openapi_3/doc_methods/parse_params.rb

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module GrapeSwagger
44
module DocMethods
5-
class ParseParams
5+
class OpenAPIParseParams
66
class << self
77
def call(param, settings, path, route, definitions)
88
method = route.request_method
@@ -44,11 +44,11 @@ def document_required(settings)
4444
def document_range_values(settings)
4545
values = settings[:values] || nil
4646
enum_or_range_values = parse_enum_or_range_values(values)
47-
@parsed_param.merge!(enum_or_range_values) if enum_or_range_values
47+
@parsed_param[:schema].merge!(enum_or_range_values) if enum_or_range_values
4848
end
4949

5050
def document_default_value(settings)
51-
@parsed_param[:default] = settings[:default] if settings[:default].present?
51+
@parsed_param[:schema][:default] = settings[:default] if settings[:default].present?
5252
end
5353

5454
def document_type_and_format(settings, data_type)
@@ -76,6 +76,7 @@ def document_array_param(value_type, definitions)
7676
if definitions[value_type[:data_type]]
7777
array_items['$ref'] = "#/components/schemas/#{@parsed_param[:schema][:type]}"
7878
else
79+
puts value_type.inspect
7980
array_items[:type] = type || @parsed_param[:schema][:type] == 'array' ? 'string' : @parsed_param[:schema][:type]
8081
end
8182
array_items[:format] = @parsed_param.delete(:format) if @parsed_param[:format]

lib/grape-swagger/openapi_3/doc_methods/parse_request_body.rb

-122
This file was deleted.

lib/grape-swagger/openapi_3/endpoint.rb

+15-15
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
require 'grape-swagger/endpoint/params_parser'
66

77
module Grape
8-
class Endpoint
8+
module OpenAPI3Endpoint
99
def content_types_for(target_class)
1010
content_types = (target_class.content_types || {}).values
1111

@@ -30,10 +30,10 @@ def swagger_object(_target_class, request, options)
3030
servers = servers.is_a?(Hash) ? [servers] : servers
3131

3232
object = {
33-
info: info_object(options[:info].merge(version: options[:doc_version])),
34-
openapi: '3.0.0',
35-
security: options[:security],
36-
authorizations: options[:authorizations],
33+
info: info_object(options[:info].merge(version: options[:doc_version])),
34+
openapi: '3.0.0',
35+
security: options[:security],
36+
authorizations: options[:authorizations],
3737
servers: servers
3838
}
3939

@@ -50,12 +50,12 @@ def swagger_object(_target_class, request, options)
5050
# building info object
5151
def info_object(infos)
5252
result = {
53-
title: infos[:title] || 'API title',
54-
description: infos[:description],
55-
termsOfService: infos[:terms_of_service_url],
56-
contact: contact_object(infos),
57-
license: license_object(infos),
58-
version: infos[:version]
53+
title: infos[:title] || 'API title',
54+
description: infos[:description],
55+
termsOfService: infos[:terms_of_service_url],
56+
contact: contact_object(infos),
57+
license: license_object(infos),
58+
version: infos[:version]
5959
}
6060

6161
GrapeSwagger::DocMethods::Extensions.add_extensions_to_info(infos, result)
@@ -68,7 +68,7 @@ def info_object(infos)
6868
def license_object(infos)
6969
{
7070
name: infos.delete(:license),
71-
url: infos.delete(:license_url)
71+
url: infos.delete(:license_url)
7272
}.delete_if { |_, value| value.blank? }
7373
end
7474

@@ -202,11 +202,11 @@ def params_object(route, options, path)
202202
elsif value[:documentation]
203203
expose_params(value[:documentation][:type])
204204
end
205-
GrapeSwagger::DocMethods::ParseParams.call(param, value, path, route, @definitions)
205+
GrapeSwagger::DocMethods::OpenAPIParseParams.call(param, value, path, route, @definitions)
206206
end
207207

208-
if GrapeSwagger::DocMethods::MoveParams.can_be_moved?(parameters, route.request_method)
209-
parameters = GrapeSwagger::DocMethods::MoveParams.to_definition(path, parameters, route, @definitions)
208+
if GrapeSwagger::DocMethods::OpenAPIMoveParams.can_be_moved?(parameters, route.request_method)
209+
parameters = GrapeSwagger::DocMethods::OpenAPIMoveParams.to_definition(path, parameters, route, @definitions)
210210
end
211211

212212
parameters

lib/grape-swagger/swagger_2/doc_methods.rb

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# frozen_string_literal: true
22

3-
# require 'grape-swagger/endpoint'
4-
53
require 'grape-swagger/doc_methods/status_codes'
64
require 'grape-swagger/doc_methods/produces_consumes'
75
require 'grape-swagger/doc_methods/data_type'

lib/grape-swagger/swagger_2/endpoint.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
require 'grape-swagger/endpoint/params_parser'
66

77
module Grape
8-
class Endpoint # rubocop:disable Metrics/ClassLength
8+
module Swagger2Endpoint # rubocop:disable Metrics/ClassLength
99
def content_types_for(target_class)
1010
content_types = (target_class.content_types || {}).values
1111

spec/openapi_3/guarded_endpoint_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def sample_auth(*scopes)
4141
description[:auth] = { scopes: scopes }
4242
end
4343

44-
Grape::API.extend self
44+
GrapeInstance.extend self
4545
end
4646

4747
describe 'a guarded api endpoint' do

0 commit comments

Comments
 (0)