diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..dda7175 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "swagger-ui"] + path = swagger-ui + url = https://github.com/swagger-api/swagger-ui.git diff --git a/Gemfile.lock b/Gemfile.lock index 59a786d..1af466c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,6 +2,8 @@ PATH remote: . specs: swagger_rails (0.0.1) + coffee-rails + haml-rails rails (~> 4.2.0) GEM @@ -44,10 +46,32 @@ GEM tzinfo (~> 1.1) arel (6.0.0) builder (3.2.2) + coffee-rails (4.1.0) + coffee-script (>= 2.2.0) + railties (>= 4.0.0, < 5.0) + coffee-script (2.3.0) + coffee-script-source + execjs + coffee-script-source (1.8.0) erubis (2.7.0) + execjs (2.2.2) globalid (0.3.0) activesupport (>= 4.1.0) + haml (4.1.0.beta.1) + tilt + haml-rails (0.7.0) + actionpack (>= 4.0.1) + activesupport (>= 4.0.1) + haml (>= 3.1, < 5.0) + html2haml (>= 1.0.1) + railties (>= 4.0.1) hike (1.2.3) + hpricot (0.8.6) + html2haml (1.0.1) + erubis (~> 2.7.0) + haml (>= 4.0.0.rc.1) + hpricot (~> 0.8.6) + ruby_parser (~> 3.1.1) i18n (0.7.0) json (1.8.2) loofah (2.0.1) @@ -88,6 +112,9 @@ GEM rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) rake (10.4.2) + ruby_parser (3.1.3) + sexp_processor (~> 4.1) + sexp_processor (4.4.4) sprockets (2.12.3) hike (~> 1.2) multi_json (~> 1.0) diff --git a/app/assets/javascripts/swagger_rails/application.js b/app/assets/javascripts/swagger_rails/application.js index c28e5ba..ef74ee6 100644 --- a/app/assets/javascripts/swagger_rails/application.js +++ b/app/assets/javascripts/swagger_rails/application.js @@ -11,3 +11,15 @@ // about supported directives. // //= require_tree . +//= require swagger-ui/lib/shred.bundle.js +//= require swagger-ui/lib/jquery-1.8.0.min.js +//= require swagger-ui/lib/jquery.slideto.min.js +//= require swagger-ui/lib/jquery.wiggle.min.js +//= require swagger-ui/lib/jquery.ba-bbq.min.js +//= require swagger-ui/lib/handlebars-1.0.0.js +//= require swagger-ui/lib/underscore-min.js +//= require swagger-ui/lib/backbone-min.js +//= require swagger-ui/lib/swagger.js +//= require swagger-ui/lib/swagger-client.js +//= require swagger-ui/swagger-ui.min.js +//= require swagger-ui/lib/highlight.7.3.pack.js diff --git a/app/assets/stylesheets/swagger_rails/application.css b/app/assets/stylesheets/swagger_rails/application.css index f9cd5b3..72b66df 100644 --- a/app/assets/stylesheets/swagger_rails/application.css +++ b/app/assets/stylesheets/swagger_rails/application.css @@ -12,4 +12,6 @@ * *= require_tree . *= require_self + *= require swagger-ui/reset.css + *= require swagger-ui/screen.css */ diff --git a/app/controllers/swagger_rails/swagger_docs_controller.rb b/app/controllers/swagger_rails/swagger_docs_controller.rb new file mode 100644 index 0000000..6d5e169 --- /dev/null +++ b/app/controllers/swagger_rails/swagger_docs_controller.rb @@ -0,0 +1,14 @@ +module SwaggerRails + class SwaggerDocsController < ApplicationController + + def show + render file: swagger_file_path_for(params[:api_version]), layout: false + end + + private + + def swagger_file_path_for(api_version) + File.join(Rails.root, 'config', 'swagger', "#{api_version}.json") + end + end +end diff --git a/app/controllers/swagger_rails/swagger_ui_controller.rb b/app/controllers/swagger_rails/swagger_ui_controller.rb new file mode 100644 index 0000000..3d48c49 --- /dev/null +++ b/app/controllers/swagger_rails/swagger_ui_controller.rb @@ -0,0 +1,8 @@ +module SwaggerRails + class SwaggerUiController < ApplicationController + + def show + @discovery_url = request.path.gsub('/ui', '/docs/v1') + end + end +end diff --git a/app/views/layouts/swagger_rails/application.html.erb b/app/views/layouts/swagger_rails/application.html.erb deleted file mode 100644 index 35cc810..0000000 --- a/app/views/layouts/swagger_rails/application.html.erb +++ /dev/null @@ -1,14 +0,0 @@ - - - - SwaggerRails - <%= stylesheet_link_tag "swagger_rails/application", media: "all" %> - <%= javascript_include_tag "swagger_rails/application" %> - <%= csrf_meta_tags %> - - - -<%= yield %> - - - diff --git a/app/views/layouts/swagger_rails/application.html.haml b/app/views/layouts/swagger_rails/application.html.haml new file mode 100644 index 0000000..a937681 --- /dev/null +++ b/app/views/layouts/swagger_rails/application.html.haml @@ -0,0 +1,10 @@ + +%html + %head + %title SwaggerRails + %link{ href: '//fonts.googleapis.com/css?family=Droid+Sans:400,700', rel: 'stylesheet', type: 'text/css' } + =stylesheet_link_tag "swagger_rails/application" + =javascript_include_tag "swagger_rails/application" + =csrf_meta_tags + %body.swagger-section + =yield diff --git a/app/views/swagger_rails/swagger_ui/show.html.haml b/app/views/swagger_rails/swagger_ui/show.html.haml new file mode 100644 index 0000000..4a24a83 --- /dev/null +++ b/app/views/swagger_rails/swagger_ui/show.html.haml @@ -0,0 +1,30 @@ +#header + .swagger-ui-wrap + %a#logo{ href: 'http://swagger.io'} swagger + %form#api_selector + .input + %input#input_baseUrl{ name: 'baseUrl' } + .input + %input#input_apiKey{ name: 'apiKey' } + .input + %a#input_apiKey{ name: 'apiKey' } + +#message-bar.swagger-ui-wrap + +#swagger-ui-container.swagger-ui-wrap{ data: { discovery_url: @discovery_url } } + +:coffeescript + window.swaggerUi = new SwaggerUi( + url: $('#swagger-ui-container').data('discoveryUrl') + dom_id: 'swagger-ui-container' + onComplete: (swaggerApi, swaggerUi) -> + log('Loaded SwaggerUi') + $('pre code').each (i, e) -> + hljs.highlighBlock(e) + onFailure: (data) -> + log('Unable to load Swagger UI') + docExpansion: 'none' + sorter: 'alpha' + ) + + window.swaggerUi.load() diff --git a/config/routes.rb b/config/routes.rb index 06d0d64..2afe579 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,2 +1,5 @@ SwaggerRails::Engine.routes.draw do + + get '/ui', to: 'swagger_ui#show' + get '/docs/:api_version', to: 'swagger_docs#show' end diff --git a/lib/swagger_rails/engine.rb b/lib/swagger_rails/engine.rb index d4767e4..3e3ce93 100644 --- a/lib/swagger_rails/engine.rb +++ b/lib/swagger_rails/engine.rb @@ -1,3 +1,6 @@ +require 'haml-rails' +require 'coffee-rails' + module SwaggerRails class Engine < ::Rails::Engine isolate_namespace SwaggerRails diff --git a/spec/dummy/config/swagger/v1.json b/spec/dummy/config/swagger/v1.json new file mode 100644 index 0000000..1552e6f --- /dev/null +++ b/spec/dummy/config/swagger/v1.json @@ -0,0 +1,98 @@ +{ + "swagger": "2.0", + "info": { + "version": "0.0.0", + "title": "Dummy app for testing swagger_rails" + }, + "paths": { + "/events": { + "post": { + "tags": [ + "events" + ], + "description": "Create a new Event", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateEventBody" + } + } + ], + "responses": { + "200": { + "description": "Ok" + } + } + } + } + }, + "definitions": { + "CreateEventBody": { + "properties": { + "name": { + "type": "string" + }, + "date_time": { + "type": "string", + "format": "date-time" + }, + "repeat": { + "$ref": "#/definitions/EventRepeatOptions" + }, + "notification": { + "$ref": "#/definitions/EventNotificationOptions" + } + } + }, + "EventRepeatOptions": { + "properties": { + "frequency": { + "type": "string", + "enum": [ + "daily" + ] + }, + "ending_on": { + "type": "string", + "format": "date-time" + } + } + }, + "EventNotificationOptions": { + "properties": { + "intervals": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "targets": { + "type": "array", + "items": { + "$ref": "#/definitions/NotificationTarget" + } + } + } + }, + "NotificationTarget": { + "properties": { + "type": { + "type": "string", + "enum": [ + "sms", + "email" + ] + }, + "phone": { + "type": "string" + }, + "email": { + "type": "string" + } + } + } + } +} diff --git a/swagger_rails.gemspec b/swagger_rails.gemspec index c20cd9e..f80cb30 100644 --- a/swagger_rails.gemspec +++ b/swagger_rails.gemspec @@ -9,12 +9,14 @@ Gem::Specification.new do |s| s.version = SwaggerRails::VERSION s.authors = ["domaindrivendev"] s.email = ["domaindrivendev@gmail.com"] - s.homepage = "TODO" - s.summary = "TODO: Summary of SwaggerRails." - s.description = "TODO: Description of SwaggerRails." + s.homepage = "https://github.com/domaindrivendev/swagger-rails" + s.summary = "Seamlessly adds a Swagger to Rails-based API's" + s.description = "Seamlessly adds a Swagger to Rails-based API's" s.license = "MIT" s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"] s.add_dependency "rails", "~> 4.2.0" + s.add_dependency 'haml-rails' + s.add_dependency 'coffee-rails' end diff --git a/vendor/assets/javascripts/swagger-ui/lib b/vendor/assets/javascripts/swagger-ui/lib new file mode 120000 index 0000000..0e754bf --- /dev/null +++ b/vendor/assets/javascripts/swagger-ui/lib @@ -0,0 +1 @@ +../../../../swagger-ui/dist/lib \ No newline at end of file diff --git a/vendor/assets/javascripts/swagger-ui/swagger-ui.min.js b/vendor/assets/javascripts/swagger-ui/swagger-ui.min.js new file mode 120000 index 0000000..bc80202 --- /dev/null +++ b/vendor/assets/javascripts/swagger-ui/swagger-ui.min.js @@ -0,0 +1 @@ +../../../../swagger-ui/dist/swagger-ui.min.js \ No newline at end of file diff --git a/vendor/assets/stylesheets/swagger-ui/reset.css b/vendor/assets/stylesheets/swagger-ui/reset.css new file mode 120000 index 0000000..00fef1a --- /dev/null +++ b/vendor/assets/stylesheets/swagger-ui/reset.css @@ -0,0 +1 @@ +../../../../swagger-ui/dist/css/reset.css \ No newline at end of file diff --git a/vendor/assets/stylesheets/swagger-ui/screen.css b/vendor/assets/stylesheets/swagger-ui/screen.css new file mode 120000 index 0000000..01dce50 --- /dev/null +++ b/vendor/assets/stylesheets/swagger-ui/screen.css @@ -0,0 +1 @@ +../../../../swagger-ui/dist/css/screen.css \ No newline at end of file