From dc161fe27530de043e19f415d1f6dbce63bc4550 Mon Sep 17 00:00:00 2001 From: Greg Myers Date: Sat, 2 Nov 2019 13:57:47 +0000 Subject: [PATCH] Serve yaml files as yaml instead of converting them to json --- rswag-api/lib/rswag/api/middleware.rb | 19 +++++++++++++++---- rswag-api/spec/rswag/api/middleware_spec.rb | 4 ++-- .../rswag/ui/install/templates/rswag-ui.rb | 6 +++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/rswag-api/lib/rswag/api/middleware.rb b/rswag-api/lib/rswag/api/middleware.rb index 7256794..637d42d 100644 --- a/rswag-api/lib/rswag/api/middleware.rb +++ b/rswag-api/lib/rswag/api/middleware.rb @@ -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 diff --git a/rswag-api/spec/rswag/api/middleware_spec.rb b/rswag-api/spec/rswag/api/middleware_spec.rb index f784f25..3ff0594 100644 --- a/rswag-api/spec/rswag/api/middleware_spec.rb +++ b/rswag-api/spec/rswag/api/middleware_spec.rb @@ -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 diff --git a/rswag-ui/lib/generators/rswag/ui/install/templates/rswag-ui.rb b/rswag-ui/lib/generators/rswag/ui/install/templates/rswag-ui.rb index 084a512..3a7fe3e 100644 --- a/rswag-ui/lib/generators/rswag/ui/install/templates/rswag-ui.rb +++ b/rswag-ui/lib/generators/rswag/ui/install/templates/rswag-ui.rb @@ -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