Add upgrades for consumes and produces in content with schemas

This commit is contained in:
Greg Myers
2020-03-26 23:37:00 +00:00
parent c739228c89
commit 405ccca494
5 changed files with 43 additions and 30 deletions

View File

@@ -149,11 +149,6 @@ module Rswag
def schema(value)
metadata[:response][:schema] = value
end
## OA3
# def schema(value, content_type: 'application/json')
# content_hash = {content_type => {schema: value}}
# metadata[:response][:content] = content_hash
# end
def header(name, attributes)
metadata[:response][:headers] ||= {}

View File

@@ -41,13 +41,10 @@ module Rswag
def validate_body!(metadata, swagger_doc, body)
response_schema = metadata[:response][:schema]
return if response_schema.nil?
## OA3
# test_schemas = extract_schemas(metadata)
# return if test_schemas.nil? || test_schemas.empty?
version = @config.get_swagger_doc_version(metadata[:swagger_doc])
schemas = definitions_or_component_schemas(swagger_doc, version)
# validation_schema = test_schemas[:schema] # response_schema
validation_schema = response_schema
.merge('$schema' => 'http://tempuri.org/rswag/specs/extended_schema')
.merge(schemas)
@@ -55,15 +52,6 @@ module Rswag
errors = JSON::Validator.fully_validate(validation_schema, body)
raise UnexpectedResponse, "Expected response body to match schema: #{errors[0]}" if errors.any?
end
## OA3
# def extract_schemas(metadata)
# metadata[:operation] = {produces: []} if metadata[:operation].nil?
# produces = Array(metadata[:operation][:produces])
# producer_content = produces.first || 'application/json'
# response_content = metadata[:response][:content] || {producer_content => {}}
# response_content[producer_content]
# end
def definitions_or_component_schemas(swagger_doc, version)
if version.start_with?('2')

View File

@@ -37,6 +37,8 @@ module Rswag
upgrade_request_type!(metadata)
upgrade_servers!(swagger_doc)
upgrade_oauth!(swagger_doc)
upgrade_request_consumes!(swagger_doc, metadata)
upgrade_response_produces!(swagger_doc, metadata)
end
swagger_doc.deep_merge!(metadata_to_swagger(metadata))
@@ -79,6 +81,32 @@ module Rswag
private
def upgrade_request_consumes!(swagger_doc, metadata)
# Content-Type header
mime_list = Array(metadata[:operation].delete(:consumes) || swagger_doc[:consumes])
target_node = metadata[:response]
upgrade_content!(mime_list, target_node)
end
def upgrade_response_produces!(swagger_doc, metadata)
# Accept header
mime_list = Array(metadata[:operation].delete(:produces) || swagger_doc[:produces])
target_node = metadata[:response]
upgrade_content!(mime_list, target_node)
metadata[:response].delete(:schema)
end
def upgrade_content!(mime_list, target_node)
target_node.merge!(content: {})
schema = target_node[:schema]
return if mime_list.empty?
mime_list.each do |mime_type|
# TODO upgrade to have content-type specific schema
target_node[:content][mime_type] = { schema: schema }
end
end
def pretty_generate(doc)
if @config.swagger_format == :yaml
clean_doc = yaml_prepare(doc)