From df4b9c80c97c3fb49a19e935a0b04e7f7c25839c Mon Sep 17 00:00:00 2001 From: domaindrivendev Date: Wed, 3 Feb 2016 23:41:31 -0800 Subject: [PATCH] Serve Swagger docs via middleware --- .gitignore | 1 + .../swagger_rails/swagger_docs_controller.rb | 15 ------ .../swagger_rails/swagger_ui_controller.rb | 1 - .../swagger_rails/swagger_ui/index.html.erb | 32 +++++++++-- config/routes.rb | 1 - .../install/templates/swagger_rails.rb | 8 +-- lib/swagger_rails.rb | 6 ++- lib/swagger_rails/engine.rb | 6 ++- lib/swagger_rails/middleware/swagger_docs.rb | 4 ++ .../config/initializers/swagger_rails.rb | 9 ++-- .../tmp/config/initializers/swagger_rails.rb | 6 --- .../tmp/config/swagger/v1/swagger.json | 54 ------------------- 12 files changed, 54 insertions(+), 89 deletions(-) delete mode 100644 app/controllers/swagger_rails/swagger_docs_controller.rb create mode 100644 lib/swagger_rails/middleware/swagger_docs.rb delete mode 100644 spec/generators/swagger_rails/tmp/config/initializers/swagger_rails.rb delete mode 100644 spec/generators/swagger_rails/tmp/config/swagger/v1/swagger.json diff --git a/.gitignore b/.gitignore index be11bd6..aa6323a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ spec/dummy/db/*.sqlite3-journal spec/dummy/log/*.log spec/dummy/tmp/ spec/dummy/.sass-cache +spec/generators/swagger_rails/tmp bower_components/* !bower_components/swagger-ui bower_components/swagger-ui/* diff --git a/app/controllers/swagger_rails/swagger_docs_controller.rb b/app/controllers/swagger_rails/swagger_docs_controller.rb deleted file mode 100644 index d2581bc..0000000 --- a/app/controllers/swagger_rails/swagger_docs_controller.rb +++ /dev/null @@ -1,15 +0,0 @@ -module SwaggerRails - class SwaggerDocsController < ApplicationController - - def show - render json: swagger_json_for(params[:api_version]), layout: false - end - - private - - def swagger_json_for(api_version) - path = File.join(Rails.root, 'config', 'swagger', api_version, 'swagger.json') - File.read(path) - end - end -end diff --git a/app/controllers/swagger_rails/swagger_ui_controller.rb b/app/controllers/swagger_rails/swagger_ui_controller.rb index a2a464e..13882cd 100644 --- a/app/controllers/swagger_rails/swagger_ui_controller.rb +++ b/app/controllers/swagger_rails/swagger_ui_controller.rb @@ -2,7 +2,6 @@ module SwaggerRails class SwaggerUiController < ApplicationController def index - @discovery_path = swagger_path(SwaggerRails.target_api_version) render :index, layout: false end end diff --git a/app/views/swagger_rails/swagger_ui/index.html.erb b/app/views/swagger_rails/swagger_ui/index.html.erb index 7a42222..e72ca9f 100644 --- a/app/views/swagger_rails/swagger_ui/index.html.erb +++ b/app/views/swagger_rails/swagger_ui/index.html.erb @@ -33,7 +33,7 @@ if (url && url.length > 1) { url = decodeURIComponent(url[1]); } else { - url = "<%= @discovery_path %>"; + url = "<%= SwaggerRails.swagger_docs.values.first %>"; } // Pre load translate... @@ -106,9 +106,35 @@
-
+
- +
+ + + +
diff --git a/config/routes.rb b/config/routes.rb index 5c056b8..bedd5cf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,3 @@ SwaggerRails::Engine.routes.draw do get '/index.html', to: 'swagger_ui#index', as: :swagger_ui - get '/:api_version/swagger.json', to: 'swagger_docs#show', as: :swagger end diff --git a/lib/generators/swagger_rails/install/templates/swagger_rails.rb b/lib/generators/swagger_rails/install/templates/swagger_rails.rb index cfa28ed..805b9ae 100644 --- a/lib/generators/swagger_rails/install/templates/swagger_rails.rb +++ b/lib/generators/swagger_rails/install/templates/swagger_rails.rb @@ -1,6 +1,8 @@ SwaggerRails.configure do |c| - # Specify the API version and hence discovery_url (e.g. swagger/v1/swagger.json) - # that will be used to power the embedded swagger-ui - c.target_api_version = 'v1' + # List the names and paths of Swagger + # documents you'd like to expose in your swagger-ui + c.swagger_docs = { + 'API V1' => '/swagger/v1/swagger.json' + } end diff --git a/lib/swagger_rails.rb b/lib/swagger_rails.rb index bd5c778..856263a 100644 --- a/lib/swagger_rails.rb +++ b/lib/swagger_rails.rb @@ -7,9 +7,11 @@ module SwaggerRails end class << self - attr_accessor :target_api_version + attr_accessor :swagger_docs #Defaults - @@target_api_version = 'v1' + @@swagger_docs = { + 'V1' => '/swagger/v1/swagger.json' + } end end diff --git a/lib/swagger_rails/engine.rb b/lib/swagger_rails/engine.rb index 3fb05d2..b5e698a 100644 --- a/lib/swagger_rails/engine.rb +++ b/lib/swagger_rails/engine.rb @@ -1,9 +1,13 @@ +require 'swagger_rails/middleware/swagger_docs' require 'swagger_rails/middleware/swagger_ui' module SwaggerRails class Engine < ::Rails::Engine isolate_namespace SwaggerRails - middleware.use SwaggerUi, "#{root}/bower_components/swagger-ui/dist" + initializer 'swagger_rails.initialize' do |app| + middleware.use SwaggerDocs, File.join(app.root, 'config', 'swagger') + middleware.use SwaggerUi, "#{root}/bower_components/swagger-ui/dist" + end end end diff --git a/lib/swagger_rails/middleware/swagger_docs.rb b/lib/swagger_rails/middleware/swagger_docs.rb new file mode 100644 index 0000000..b4c7c85 --- /dev/null +++ b/lib/swagger_rails/middleware/swagger_docs.rb @@ -0,0 +1,4 @@ +module SwaggerRails + class SwaggerDocs < ActionDispatch::Static + end +end diff --git a/spec/dummy/config/initializers/swagger_rails.rb b/spec/dummy/config/initializers/swagger_rails.rb index cfa28ed..9a2d6c8 100644 --- a/spec/dummy/config/initializers/swagger_rails.rb +++ b/spec/dummy/config/initializers/swagger_rails.rb @@ -1,6 +1,9 @@ SwaggerRails.configure do |c| - # Specify the API version and hence discovery_url (e.g. swagger/v1/swagger.json) - # that will be used to power the embedded swagger-ui - c.target_api_version = 'v1' + # List the names and paths of Swagger + # documents you'd like to expose in your swagger-ui + c.swagger_docs = { + 'API V1' => '/swagger/v1/swagger.json', + 'API V2' => '/swagger/v2/swagger.json' + } end diff --git a/spec/generators/swagger_rails/tmp/config/initializers/swagger_rails.rb b/spec/generators/swagger_rails/tmp/config/initializers/swagger_rails.rb deleted file mode 100644 index cfa28ed..0000000 --- a/spec/generators/swagger_rails/tmp/config/initializers/swagger_rails.rb +++ /dev/null @@ -1,6 +0,0 @@ -SwaggerRails.configure do |c| - - # Specify the API version and hence discovery_url (e.g. swagger/v1/swagger.json) - # that will be used to power the embedded swagger-ui - c.target_api_version = 'v1' -end diff --git a/spec/generators/swagger_rails/tmp/config/swagger/v1/swagger.json b/spec/generators/swagger_rails/tmp/config/swagger/v1/swagger.json deleted file mode 100644 index 25b1314..0000000 --- a/spec/generators/swagger_rails/tmp/config/swagger/v1/swagger.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "version": "0.0.0", - "title": "[Enter a description for your API here]", - "description": "The docs below are powered by the default swagger.json that was installed with swagger_rails. You can update it to describe your API. See here for the complete swagger spec - https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md" - }, - "paths": { - "/a/sample/resource": { - "post": { - "tags": [ - "a/sample/resource" - ], - "description": "Create a new sample resource", - "parameters": [ - { - "name": "body", - "in": "body", - "schema": { - "$ref": "#/definitions/CreateSampleResource" - } - } - ], - "responses": { - "200": { - "description": "Ok" - } - } - } - } - }, - "definitions": { - "ClinicPatientLink": { - "properties": { - "clinic_patient_link": { - "schema": { - "$ref": "#/definitions/ClinicPatientLink" - } - } - } - } - "ClinicPatientLink": { - "properties": { - "name": { - "type": "string" - }, - "date_time": { - "type": "string", - "format": "date-time" - } - } - } - } -}