add upgrade parameters refs to openapi3

This commit is contained in:
Greg Myers 2020-03-21 22:34:13 +00:00
parent 70eb277e04
commit 9414ca16b6
4 changed files with 74 additions and 11 deletions

View File

@ -3,6 +3,7 @@
require 'active_support/core_ext/hash/slice'
require 'active_support/core_ext/hash/conversions'
require 'json'
require 'byebug'
module Rswag
module Specs
@ -54,12 +55,39 @@ module Rswag
end
def resolve_parameter(ref, swagger_doc)
key = ref.sub('#/parameters/', '').to_sym
definitions = swagger_doc[:parameters]
key = key_version(ref, swagger_doc)
definitions = definition_version(swagger_doc)
raise "Referenced parameter '#{ref}' must be defined" unless definitions && definitions[key]
definitions[key]
end
def key_version(ref, swagger_doc)
if doc_version(swagger_doc).start_with?('2')
ref.sub('#/parameters/', '').to_sym
else # Openapi3
if ref.start_with?('#/parameters/')
ActiveSupport::Deprecation.warn('Rswag::Specs: WARNING: #/parameters/ refs are replaced in OpenAPI3! Rename to #/components/parameters/')
ref.sub('#/parameters/', '').to_sym
else
ref.sub('#/components/parameters/', '').to_sym
end
end
end
def definition_version(swagger_doc)
if doc_version(swagger_doc).start_with?('2')
swagger_doc[:parameters]
else # Openapi3
if swagger_doc.has_key?(:parameters)
swagger_doc[:parameters]
else
components = swagger_doc[:components] || {}
components[:parameters]
end
end
end
def add_verb(request, metadata)
request[:verb] = metadata[:operation][:verb]
end
@ -167,6 +195,10 @@ module Rswag
# source_body_param ||= body_param[:param_value]
# source_body_param ? source_body_param.to_json : nil
# end
def doc_version(doc)
doc[:openapi] || doc[:swagger] || '3'
end
end
end
end

View File

@ -66,7 +66,7 @@ module Rswag
# end
def definitions_or_component_schemas(swagger_doc, version)
if version.starts_with?('2')
if version.start_with?('2')
swagger_doc.slice(:definitions)
else # Openapi3
if swagger_doc.has_key?(:definitions)

View File

@ -34,7 +34,7 @@ module Rswag
swagger_doc = @config.get_swagger_doc(metadata[:swagger_doc])
if doc_version(swagger_doc).starts_with?('3')
if !doc_version(swagger_doc).start_with?('2')
upgrade_request_type!(metadata)
end

View File

@ -12,7 +12,7 @@ module Rswag
allow(config).to receive(:get_swagger_doc).and_return(swagger_doc)
end
let(:config) { double('config') }
let(:swagger_doc) { {} }
let(:swagger_doc) { { swagger: '2.0' } }
let(:example) { double('example') }
let(:metadata) do
{
@ -314,14 +314,45 @@ module Rswag
end
context 'referenced parameters' do
before do
swagger_doc[:parameters] = { q1: { name: 'q1', in: :query, type: :string } }
metadata[:operation][:parameters] = [ { '$ref' => '#/parameters/q1' } ]
allow(example).to receive(:q1).and_return('foo')
context 'swagger 2.0' do
before do
swagger_doc[:parameters] = { q1: { name: 'q1', in: :query, type: :string } }
metadata[:operation][:parameters] = [ { '$ref' => '#/parameters/q1' } ]
allow(example).to receive(:q1).and_return('foo')
end
it 'uses the referenced metadata to build the request' do
expect(request[:path]).to eq('/blogs?q1=foo')
end
end
it 'uses the referenced metadata to build the request' do
expect(request[:path]).to eq('/blogs?q1=foo')
context 'openapi 3.0.1' do
let(:swagger_doc) { { openapi: '3.0.1' } }
before do
swagger_doc[:components] = { parameters: { q1: { name: 'q1', in: :query, type: :string } } }
metadata[:operation][:parameters] = [ { '$ref' => '#/components/parameters/q1' } ]
allow(example).to receive(:q1).and_return('foo')
end
it 'uses the referenced metadata to build the request' do
expect(request[:path]).to eq('/blogs?q1=foo')
end
end
context 'openapi 3.0.1 upgrade notice' do
let(:swagger_doc) { { openapi: '3.0.1' } }
before do
allow(ActiveSupport::Deprecation).to receive(:warn)
swagger_doc[:parameters] = { q1: { name: 'q1', in: :query, type: :string } }
metadata[:operation][:parameters] = [ { '$ref' => '#/parameters/q1' } ]
allow(example).to receive(:q1).and_return('foo')
end
it 'warns the user to upgrade' do
expect(request[:path]).to eq('/blogs?q1=foo')
expect(ActiveSupport::Deprecation).to have_received(:warn)
.with('Rswag::Specs: WARNING: #/parameters/ refs are replaced in OpenAPI3! Rename to #/components/parameters/')
end
end
end