Skip to content

Commit 0ee8f8c

Browse files
author
LeFnord
committed
fixes issue by adding extensions to definitions
- if the given status code was not definied as response
1 parent 2136ec0 commit 0ee8f8c

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

lib/grape-swagger/doc_methods/extensions.rb

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ class Extensions
44
class << self
55
def add(path, definitions, route)
66
@route = route
7+
78
description = route.settings[:description]
89
add_extension_to(path[method], extension(description)) if description && extended?(description, :x)
910

@@ -20,29 +21,32 @@ def add_extensions_to_definition(settings, path, definitions)
2021
def_extension = extension(settings, :x_def)
2122

2223
if def_extension[:x_def].is_a?(Array)
23-
def_extension[:x_def].each do |extension|
24-
next unless extension.key?(:for)
25-
status = extension.delete(:for)
26-
definition = find_definition(status, path)
27-
add_extension_to(definitions[definition], x_def: extension)
28-
end
24+
def_extension[:x_def].each { |extension| setup_definition(extension, path, definitions) }
2925
else
30-
return unless def_extension[:x_def].key?(:for)
31-
status = def_extension[:x_def].delete(:for)
32-
definition = find_definition(status, path)
33-
add_extension_to(definitions[definition], def_extension)
26+
setup_definition(def_extension[:x_def], path, definitions)
3427
end
3528
end
3629

30+
def setup_definition(def_extension, path, definitions)
31+
return unless def_extension.key?(:for)
32+
status = def_extension[:for]
33+
34+
definition = find_definition(status, path)
35+
add_extension_to(definitions[definition], x_def: def_extension)
36+
end
37+
3738
def find_definition(status, path)
3839
response = path[method][:responses][status]
40+
return if response.nil?
3941

40-
response[:schema]['$ref'].split('/').last
42+
return response[:schema]['$ref'].split('/').last if response[:schema].key?('$ref')
43+
return response[:schema]['items']['$ref'].split('/').last if response[:schema].key?('items')
4144
end
4245

4346
def add_extension_to(part, extensions)
47+
return if part.nil?
4448
concatenate(extensions).each do |key, value|
45-
part[key] = value
49+
part[key] = value unless key.start_with?('x-for')
4650
end
4751
end
4852

spec/swagger_v2/api_swagger_v2_extensions_spec.rb

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
require 'spec_helper'
22

3-
describe 'extension' do
3+
describe 'extensions' do
44
include_context "#{MODEL_PARSER} swagger example"
55

66
before :all do
@@ -40,6 +40,14 @@ class ExtensionsApi < Grape::API
4040

4141
route_setting :x_def, [{ for: 422, other: 'stuff' }, { for: 200, some: 'stuff' }]
4242

43+
desc 'This returns something with extension on definition level',
44+
success: Entities::OtherItem
45+
get '/non_existend_status_definitions_extension' do
46+
{ 'declared_params' => declared(params) }
47+
end
48+
49+
route_setting :x_def, [{ for: 422, other: 'stuff' }, { for: 200, some: 'stuff' }]
50+
4351
desc 'This returns something with extension on definition level',
4452
success: Entities::OtherItem,
4553
failure: [{ code: 422, message: 'NotFound', model: Entities::SecondApiError }]
@@ -106,4 +114,17 @@ def app
106114
expect(subject['definitions']['SecondApiError']['x-other']).to eql 'stuff'
107115
end
108116
end
117+
118+
describe 'extension on definition level' do
119+
subject do
120+
get '/swagger_doc/non_existend_status_definitions_extension'
121+
JSON.parse(last_response.body)
122+
end
123+
124+
specify do
125+
expect(subject['definitions'].length).to eql 1
126+
expect(subject['definitions']['OtherItem']).to include 'x-some'
127+
expect(subject['definitions']['OtherItem']['x-some']).to eql 'stuff'
128+
end
129+
end
109130
end

0 commit comments

Comments
 (0)