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