Serve yaml files as yaml instead of converting them to json

This commit is contained in:
Greg Myers 2019-11-02 13:57:47 +00:00
parent eeb1026691
commit dc161fe275
3 changed files with 20 additions and 9 deletions

View File

@ -1,9 +1,10 @@
require 'json'
require 'yaml'
require 'rack/mime'
module Rswag
module Api
class Middleware
class Middleware
def initialize(app, config)
@app = app
@ -17,14 +18,16 @@ module Rswag
if env['REQUEST_METHOD'] == 'GET' && File.file?(filename)
swagger = parse_file(filename)
@config.swagger_filter.call(swagger, env) unless @config.swagger_filter.nil?
mime = Rack::Mime.mime_type(::File.extname(path), 'text/plain')
body = unload_swagger(filename, swagger)
return [
'200',
{ 'Content-Type' => 'application/json' },
[ JSON.dump(swagger) ]
{ 'Content-Type' => mime },
[ body ]
]
end
return @app.call(env)
end
@ -45,6 +48,14 @@ module Rswag
def load_json(filename)
JSON.parse(File.read(filename))
end
def unload_swagger(filename, swagger)
if /\.ya?ml$/ === filename
YAML.dump(swagger)
else
JSON.dump(swagger)
end
end
end
end
end

View File

@ -87,8 +87,8 @@ module Rswag
it 'returns contents of the swagger file' do
expect(response.length).to eql(3)
expect(response[1]).to include( 'Content-Type' => 'application/json')
expect(response[2].join).to include('"title":"API V1"')
expect(response[1]).to include( 'Content-Type' => 'text/yaml')
expect(response[2].join).to include('title: API V1')
end
end
end

View File

@ -2,9 +2,9 @@ Rswag::Ui.configure do |c|
# List the Swagger endpoints that you want to be documented through the swagger-ui
# The first parameter is the path (absolute or relative to the UI host) to the corresponding
# JSON endpoint and the second is a title that will be displayed in the document selector
# NOTE: If you're using rspec-api to expose Swagger files (under swagger_root) as JSON endpoints,
# endpoint and the second is a title that will be displayed in the document selector
# NOTE: If you're using rspec-api to expose Swagger files (under swagger_root) as JSON or YAML endpoints,
# then the list below should correspond to the relative paths for those endpoints
c.swagger_endpoint '/api-docs/v1/swagger.json', 'API V1 Docs'
c.swagger_endpoint '/api-docs/v1/swagger.yaml', 'API V1 Docs'
end