swagger_rails 1.0.0.pre.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +24 -0
- data/app/controllers/swagger_rails/application_controller.rb +8 -0
- data/app/controllers/swagger_rails/swagger_ui_controller.rb +14 -0
- data/app/helpers/swagger_rails/application_helper.rb +4 -0
- data/app/views/swagger_rails/swagger_ui/index.html.erb +145 -0
- data/bower_components/swagger-ui/dist/css/print.css +1172 -0
- data/bower_components/swagger-ui/dist/css/reset.css +125 -0
- data/bower_components/swagger-ui/dist/css/screen.css +1279 -0
- data/bower_components/swagger-ui/dist/css/style.css +250 -0
- data/bower_components/swagger-ui/dist/css/typography.css +26 -0
- data/bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-700.eot +0 -0
- data/bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-700.svg +411 -0
- data/bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-700.ttf +0 -0
- data/bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-700.woff +0 -0
- data/bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-700.woff2 +0 -0
- data/bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-regular.eot +0 -0
- data/bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-regular.svg +403 -0
- data/bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-regular.ttf +0 -0
- data/bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-regular.woff +0 -0
- data/bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-regular.woff2 +0 -0
- data/bower_components/swagger-ui/dist/images/explorer_icons.png +0 -0
- data/bower_components/swagger-ui/dist/images/favicon-16x16.png +0 -0
- data/bower_components/swagger-ui/dist/images/favicon-32x32.png +0 -0
- data/bower_components/swagger-ui/dist/images/favicon.ico +0 -0
- data/bower_components/swagger-ui/dist/images/logo_small.png +0 -0
- data/bower_components/swagger-ui/dist/images/pet_store_api.png +0 -0
- data/bower_components/swagger-ui/dist/images/throbber.gif +0 -0
- data/bower_components/swagger-ui/dist/images/wordnik_api.png +0 -0
- data/bower_components/swagger-ui/dist/index.html +119 -0
- data/bower_components/swagger-ui/dist/lang/en.js +53 -0
- data/bower_components/swagger-ui/dist/lang/es.js +52 -0
- data/bower_components/swagger-ui/dist/lang/pt.js +53 -0
- data/bower_components/swagger-ui/dist/lang/ru.js +52 -0
- data/bower_components/swagger-ui/dist/lang/translator.js +39 -0
- data/bower_components/swagger-ui/dist/lib/backbone-min.js +15 -0
- data/bower_components/swagger-ui/dist/lib/handlebars-2.0.0.js +28 -0
- data/bower_components/swagger-ui/dist/lib/highlight.7.3.pack.js +1 -0
- data/bower_components/swagger-ui/dist/lib/jquery-1.8.0.min.js +2 -0
- data/bower_components/swagger-ui/dist/lib/jquery.ba-bbq.min.js +18 -0
- data/bower_components/swagger-ui/dist/lib/jquery.slideto.min.js +1 -0
- data/bower_components/swagger-ui/dist/lib/jquery.wiggle.min.js +8 -0
- data/bower_components/swagger-ui/dist/lib/marked.js +1272 -0
- data/bower_components/swagger-ui/dist/lib/swagger-oauth.js +290 -0
- data/bower_components/swagger-ui/dist/lib/underscore-min.js +6 -0
- data/bower_components/swagger-ui/dist/lib/underscore-min.map +1 -0
- data/bower_components/swagger-ui/dist/o2c.html +20 -0
- data/bower_components/swagger-ui/dist/swagger-ui.js +32187 -0
- data/bower_components/swagger-ui/dist/swagger-ui.min.js +14 -0
- data/config/routes.rb +4 -0
- data/lib/generators/swagger_rails/custom_ui/USAGE +8 -0
- data/lib/generators/swagger_rails/custom_ui/custom_ui_generator.rb +9 -0
- data/lib/generators/swagger_rails/custom_ui/files/index.html.erb +145 -0
- data/lib/generators/swagger_rails/install/USAGE +9 -0
- data/lib/generators/swagger_rails/install/install_generator.rb +20 -0
- data/lib/generators/swagger_rails/install/templates/swagger.json +45 -0
- data/lib/generators/swagger_rails/install/templates/swagger_rails.rb +13 -0
- data/lib/swagger_rails/engine.rb +13 -0
- data/lib/swagger_rails/middleware/swagger_docs.rb +4 -0
- data/lib/swagger_rails/middleware/swagger_ui.rb +14 -0
- data/lib/swagger_rails/rspec/dsl.rb +63 -0
- data/lib/swagger_rails/rspec/formatter.rb +61 -0
- data/lib/swagger_rails/test_visitor.rb +59 -0
- data/lib/swagger_rails/version.rb +3 -0
- data/lib/swagger_rails.rb +24 -0
- data/lib/tasks/swagger_rails_tasks.rake +12 -0
- metadata +152 -0
data/config/routes.rb
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<title>Swagger UI</title>
|
|
6
|
+
<link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32" />
|
|
7
|
+
<link rel="icon" type="image/png" href="images/favicon-16x16.png" sizes="16x16" />
|
|
8
|
+
<link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
|
|
9
|
+
<link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
|
|
10
|
+
<link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
|
|
11
|
+
<link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>
|
|
12
|
+
<link href='css/print.css' media='print' rel='stylesheet' type='text/css'/>
|
|
13
|
+
<script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>
|
|
14
|
+
<script src='lib/jquery.slideto.min.js' type='text/javascript'></script>
|
|
15
|
+
<script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>
|
|
16
|
+
<script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
|
|
17
|
+
<script src='lib/handlebars-2.0.0.js' type='text/javascript'></script>
|
|
18
|
+
<script src='lib/underscore-min.js' type='text/javascript'></script>
|
|
19
|
+
<script src='lib/backbone-min.js' type='text/javascript'></script>
|
|
20
|
+
<script src='swagger-ui.js' type='text/javascript'></script>
|
|
21
|
+
<script src='lib/highlight.7.3.pack.js' type='text/javascript'></script>
|
|
22
|
+
<script src='lib/marked.js' type='text/javascript'></script>
|
|
23
|
+
<script src='lib/swagger-oauth.js' type='text/javascript'></script>
|
|
24
|
+
|
|
25
|
+
<!-- Some basic translations -->
|
|
26
|
+
<!-- <script src='lang/translator.js' type='text/javascript'></script> -->
|
|
27
|
+
<!-- <script src='lang/ru.js' type='text/javascript'></script> -->
|
|
28
|
+
<!-- <script src='lang/en.js' type='text/javascript'></script> -->
|
|
29
|
+
|
|
30
|
+
<script type="text/javascript">
|
|
31
|
+
$(function () {
|
|
32
|
+
var url = window.location.search.match(/url=([^&]+)/);
|
|
33
|
+
if (url && url.length > 1) {
|
|
34
|
+
url = decodeURIComponent(url[1]);
|
|
35
|
+
} else {
|
|
36
|
+
url = "<%= @discovery_paths.values.first %>";
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Pre load translate...
|
|
40
|
+
if(window.SwaggerTranslator) {
|
|
41
|
+
window.SwaggerTranslator.translate();
|
|
42
|
+
}
|
|
43
|
+
window.swaggerUi = new SwaggerUi({
|
|
44
|
+
url: url,
|
|
45
|
+
dom_id: "swagger-ui-container",
|
|
46
|
+
supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
|
|
47
|
+
onComplete: function(swaggerApi, swaggerUi){
|
|
48
|
+
if(typeof initOAuth == "function") {
|
|
49
|
+
initOAuth({
|
|
50
|
+
clientId: "your-client-id",
|
|
51
|
+
clientSecret: "your-client-secret",
|
|
52
|
+
realm: "your-realms",
|
|
53
|
+
appName: "your-app-name",
|
|
54
|
+
scopeSeparator: ","
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if(window.SwaggerTranslator) {
|
|
59
|
+
window.SwaggerTranslator.translate();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
$('pre code').each(function(i, e) {
|
|
63
|
+
hljs.highlightBlock(e)
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
addApiKeyAuthorization();
|
|
67
|
+
},
|
|
68
|
+
onFailure: function(data) {
|
|
69
|
+
log("Unable to Load SwaggerUI");
|
|
70
|
+
},
|
|
71
|
+
docExpansion: "list",
|
|
72
|
+
apisSorter: "alpha",
|
|
73
|
+
showRequestHeaders: false
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
function addApiKeyAuthorization(){
|
|
77
|
+
var key = encodeURIComponent($('#input_apiKey')[0].value);
|
|
78
|
+
if(key && key.trim() != "") {
|
|
79
|
+
var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization("api_key", key, "query");
|
|
80
|
+
window.swaggerUi.api.clientAuthorizations.add("api_key", apiKeyAuth);
|
|
81
|
+
log("added key " + key);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
$('#input_apiKey').change(addApiKeyAuthorization);
|
|
86
|
+
|
|
87
|
+
// if you have an apiKey you would like to pre-populate on the page for demonstration purposes...
|
|
88
|
+
/*
|
|
89
|
+
var apiKey = "myApiKeyXXXX123456789";
|
|
90
|
+
$('#input_apiKey').val(apiKey);
|
|
91
|
+
*/
|
|
92
|
+
|
|
93
|
+
window.swaggerUi.load();
|
|
94
|
+
|
|
95
|
+
function log() {
|
|
96
|
+
if ('console' in window) {
|
|
97
|
+
console.log.apply(console, arguments);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
</script>
|
|
102
|
+
</head>
|
|
103
|
+
|
|
104
|
+
<body class="swagger-section">
|
|
105
|
+
<div id='header'>
|
|
106
|
+
<div class="swagger-ui-wrap">
|
|
107
|
+
<a id="logo" href="http://swagger.io">swagger</a>
|
|
108
|
+
<form id='api_selector'>
|
|
109
|
+
<div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text" disabled="disabled"/></div>
|
|
110
|
+
<div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
|
|
111
|
+
<div class='input'>
|
|
112
|
+
<select id="select_version">
|
|
113
|
+
<% @discovery_paths.each do |name, path| %>
|
|
114
|
+
<option value="<%= path %>"><%= name %></option>
|
|
115
|
+
<% end %>
|
|
116
|
+
</select>
|
|
117
|
+
<script type="text/javascript">
|
|
118
|
+
$('#select_version').change(function () {
|
|
119
|
+
$('#input_baseUrl').val($(this).val());
|
|
120
|
+
window.swaggerUi.headerView.showCustom();
|
|
121
|
+
});
|
|
122
|
+
</script>
|
|
123
|
+
<style>
|
|
124
|
+
#select_version {
|
|
125
|
+
border: none;
|
|
126
|
+
-moz-border-radius: 4px;
|
|
127
|
+
-webkit-border-radius: 4px;
|
|
128
|
+
-o-border-radius: 4px;
|
|
129
|
+
-ms-border-radius: 4px;
|
|
130
|
+
-khtml-border-radius: 4px;
|
|
131
|
+
border-radius: 4px;
|
|
132
|
+
color: white;
|
|
133
|
+
background-color: #547f00;
|
|
134
|
+
font-size: 0.9em;
|
|
135
|
+
}
|
|
136
|
+
</style>
|
|
137
|
+
</div>
|
|
138
|
+
</form>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<div id="message-bar" class="swagger-ui-wrap" data-sw-translate> </div>
|
|
143
|
+
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
|
|
144
|
+
</body>
|
|
145
|
+
</html>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'rails/generators'
|
|
2
|
+
|
|
3
|
+
module SwaggerRails
|
|
4
|
+
|
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
7
|
+
|
|
8
|
+
def add_swagger_dir
|
|
9
|
+
empty_directory('config/swagger/v1')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def add_initializer
|
|
13
|
+
template('swagger_rails.rb', 'config/initializers/swagger_rails.rb')
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def add_routes
|
|
17
|
+
route("mount SwaggerRails::Engine => '/api-docs'")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"swagger": "2.0",
|
|
3
|
+
"info": {
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"title": "[Enter a description for your API here]",
|
|
6
|
+
"description": "The docs below are powered by the default swagger.json that gets installed with swagger_rails. You'll need to 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"
|
|
7
|
+
},
|
|
8
|
+
"paths": {
|
|
9
|
+
"/a/sample/resource": {
|
|
10
|
+
"post": {
|
|
11
|
+
"tags": [
|
|
12
|
+
"a/sample/resource"
|
|
13
|
+
],
|
|
14
|
+
"description": "Create a new sample resource",
|
|
15
|
+
"parameters": [
|
|
16
|
+
{
|
|
17
|
+
"name": "body",
|
|
18
|
+
"in": "body",
|
|
19
|
+
"schema": {
|
|
20
|
+
"$ref": "#/definitions/CreateSampleResource"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"responses": {
|
|
25
|
+
"200": {
|
|
26
|
+
"description": "Ok"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"definitions": {
|
|
33
|
+
"CreateSampleResource": {
|
|
34
|
+
"properties": {
|
|
35
|
+
"name": {
|
|
36
|
+
"type": "string"
|
|
37
|
+
},
|
|
38
|
+
"date_time": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"format": "date-time"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
SwaggerRails.configure do |c|
|
|
2
|
+
|
|
3
|
+
# Define your swagger documents and provide global metadata
|
|
4
|
+
# Describe actual operations in your spec/test files
|
|
5
|
+
c.swagger_doc 'v1/swagger.json' do
|
|
6
|
+
{
|
|
7
|
+
info: {
|
|
8
|
+
title: 'API V1',
|
|
9
|
+
version: 'v1'
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'swagger_rails/middleware/swagger_docs'
|
|
2
|
+
require 'swagger_rails/middleware/swagger_ui'
|
|
3
|
+
|
|
4
|
+
module SwaggerRails
|
|
5
|
+
class Engine < ::Rails::Engine
|
|
6
|
+
isolate_namespace SwaggerRails
|
|
7
|
+
|
|
8
|
+
initializer 'swagger_rails.initialize' do |app|
|
|
9
|
+
middleware.use SwaggerDocs, File.join(app.root, 'config', 'swagger')
|
|
10
|
+
middleware.use SwaggerUi, "#{root}/bower_components/swagger-ui/dist"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module SwaggerRails
|
|
2
|
+
class SwaggerUi < ActionDispatch::Static
|
|
3
|
+
IGNORE_PATHS = [ '', '/', '/index.html' ]
|
|
4
|
+
|
|
5
|
+
def call(env)
|
|
6
|
+
# Serve index.html via swagger_ui_controller
|
|
7
|
+
if IGNORE_PATHS.include?(env['PATH_INFO'])
|
|
8
|
+
@app.call(env)
|
|
9
|
+
else
|
|
10
|
+
super(env)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'swagger_rails/test_visitor'
|
|
2
|
+
|
|
3
|
+
module SwaggerRails
|
|
4
|
+
module RSpec
|
|
5
|
+
module DSL
|
|
6
|
+
|
|
7
|
+
def path(path_template, &block)
|
|
8
|
+
metadata = {
|
|
9
|
+
path_template: path_template
|
|
10
|
+
}
|
|
11
|
+
describe(path_template, metadata, &block)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def operation(http_verb, summary=nil, &block)
|
|
15
|
+
metadata = {
|
|
16
|
+
http_verb: http_verb,
|
|
17
|
+
summary: summary,
|
|
18
|
+
parameters: []
|
|
19
|
+
}
|
|
20
|
+
describe(http_verb, metadata, &block)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
[ :get, :post, :patch, :put, :delete, :head ].each do |http_verb|
|
|
24
|
+
define_method(http_verb) do |summary=nil, &block|
|
|
25
|
+
operation(http_verb, summary, &block)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def consumes(*mime_types)
|
|
30
|
+
metadata[:consumes] = mime_types
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def produces(*mime_types)
|
|
34
|
+
metadata[:produces] = mime_types
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def parameter(name, attributes={})
|
|
38
|
+
metadata[:parameters] << { name: name.to_s }.merge(attributes)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def response(code, description, &block)
|
|
42
|
+
metadata = {
|
|
43
|
+
response_code: code,
|
|
44
|
+
response: {
|
|
45
|
+
description: description
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
context(description, metadata, &block)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def run_test!
|
|
52
|
+
before do |example|
|
|
53
|
+
SwaggerRails::TestVisitor.instance.submit_request!(self, example.metadata)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "returns a #{metadata[:response_code]} status" do |example|
|
|
57
|
+
SwaggerRails::TestVisitor.instance.assert_response!(self, example.metadata)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'rspec/core/formatters/base_text_formatter'
|
|
2
|
+
require 'rails_helper'
|
|
3
|
+
|
|
4
|
+
module SwaggerRails
|
|
5
|
+
module RSpec
|
|
6
|
+
|
|
7
|
+
class Formatter
|
|
8
|
+
::RSpec::Core::Formatters.register self,
|
|
9
|
+
:example_group_finished,
|
|
10
|
+
:stop
|
|
11
|
+
|
|
12
|
+
def initialize(output)
|
|
13
|
+
@output = output
|
|
14
|
+
@swagger_docs = SwaggerRails.swagger_docs
|
|
15
|
+
|
|
16
|
+
@output.puts 'Generating Swagger Docs ...'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def example_group_finished(notification)
|
|
20
|
+
metadata = notification.group.metadata
|
|
21
|
+
return unless metadata.has_key?(:response_code)
|
|
22
|
+
|
|
23
|
+
swagger_data = swagger_data_from(metadata)
|
|
24
|
+
swagger_doc = @swagger_docs[metadata[:docs_path]] || @swagger_docs.values.first
|
|
25
|
+
swagger_doc.deep_merge!(swagger_data)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def stop(notification)
|
|
29
|
+
@swagger_docs.each do |path, doc|
|
|
30
|
+
file_path = File.join(Rails.root, 'config/swagger', path)
|
|
31
|
+
|
|
32
|
+
File.open(file_path, 'w') do |file|
|
|
33
|
+
file.write(JSON.pretty_generate(doc))
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
@output.puts 'Swagger Doc generated'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
def swagger_data_from(metadata)
|
|
43
|
+
{
|
|
44
|
+
paths: {
|
|
45
|
+
metadata[:path_template] => {
|
|
46
|
+
metadata[:http_verb] => operation_from(metadata)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def operation_from(metadata)
|
|
53
|
+
metadata.slice(:summary, :consumes, :produces, :parameters).tap do |operation|
|
|
54
|
+
operation[:responses] = {
|
|
55
|
+
metadata[:response_code] => metadata[:response]
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'singleton'
|
|
2
|
+
|
|
3
|
+
module SwaggerRails
|
|
4
|
+
class TestVisitor
|
|
5
|
+
include Singleton
|
|
6
|
+
|
|
7
|
+
def submit_request!(test, metadata)
|
|
8
|
+
params_data = params_data_for(test, metadata[:parameters])
|
|
9
|
+
|
|
10
|
+
path = build_path(metadata[:path_template], params_data)
|
|
11
|
+
body_or_params = build_body_or_params(params_data)
|
|
12
|
+
headers = build_headers(params_data, metadata[:consumes], metadata[:produces])
|
|
13
|
+
|
|
14
|
+
test.send(metadata[:http_verb], path, body_or_params, headers)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def assert_response!(test, metadata)
|
|
18
|
+
test.assert_response(metadata[:response_code].to_i)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def params_data_for(test, parameters)
|
|
24
|
+
parameters.map do |parameter|
|
|
25
|
+
parameter
|
|
26
|
+
.slice(:name, :in)
|
|
27
|
+
.merge(value: test.send(parameter[:name].to_s.underscore))
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def build_path(path_template, params_data)
|
|
32
|
+
path_params_data = params_data.select { |p| p[:in] == :path }
|
|
33
|
+
|
|
34
|
+
path_template.dup.tap do |path|
|
|
35
|
+
path_params_data.each do |param_data|
|
|
36
|
+
path.sub!("\{#{param_data[:name]}\}", param_data[:value].to_s)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def build_body_or_params(params_data)
|
|
42
|
+
body_params_data = params_data.select { |p| p[:in] == :body }
|
|
43
|
+
return body_params_data.first[:value].to_json if body_params_data.any?
|
|
44
|
+
|
|
45
|
+
query_params_data = params_data.select { |p| p[:in] == :query }
|
|
46
|
+
Hash[query_params_data.map { |p| [ p[:name], p[:value] ] }]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def build_headers(params_data, consumes, produces)
|
|
50
|
+
header_params_data = params_data.select { |p| p[:in] == :header }
|
|
51
|
+
headers = Hash[header_params_data.map { |p| [ p[:name], p[:value] ] }]
|
|
52
|
+
|
|
53
|
+
headers['ACCEPT'] = produces.join(';') if produces.present?
|
|
54
|
+
headers['CONTENT_TYPE'] = consumes.join(';') if consumes.present?
|
|
55
|
+
|
|
56
|
+
return headers
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require "swagger_rails/engine"
|
|
2
|
+
|
|
3
|
+
module SwaggerRails
|
|
4
|
+
|
|
5
|
+
def self.configure
|
|
6
|
+
yield self
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
@@swagger_docs = {}
|
|
11
|
+
|
|
12
|
+
def swagger_doc(path, &block)
|
|
13
|
+
@@swagger_docs[path] = block
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def swagger_docs
|
|
17
|
+
Hash[
|
|
18
|
+
@@swagger_docs.map do |path, factory|
|
|
19
|
+
[ path, factory.call.merge(swagger: '2.0') ]
|
|
20
|
+
end
|
|
21
|
+
]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# desc "Explaining what the task does"
|
|
2
|
+
# task :swagger_rails do
|
|
3
|
+
# # Task goes here
|
|
4
|
+
# end
|
|
5
|
+
|
|
6
|
+
require 'rspec/core/rake_task'
|
|
7
|
+
|
|
8
|
+
desc 'Generate Swagger JSON files from integration specs'
|
|
9
|
+
RSpec::Core::RakeTask.new('swaggerize') do |t|
|
|
10
|
+
t.pattern = 'spec/integration/**/*_spec.rb'
|
|
11
|
+
t.rspec_opts = [ '--format SwaggerRails::RSpec::Formatter', '--dry-run' ]
|
|
12
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: swagger_rails
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0.pre.beta
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- domaindrivendev
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2016-04-26 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rails
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '3.1'
|
|
20
|
+
- - "<"
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: '5'
|
|
23
|
+
type: :runtime
|
|
24
|
+
prerelease: false
|
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
26
|
+
requirements:
|
|
27
|
+
- - ">="
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '3.1'
|
|
30
|
+
- - "<"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '5'
|
|
33
|
+
- !ruby/object:Gem::Dependency
|
|
34
|
+
name: rspec-rails
|
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '3.0'
|
|
40
|
+
type: :development
|
|
41
|
+
prerelease: false
|
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '3.0'
|
|
47
|
+
description: Use the provided DSL to accurately test and describe API operations in
|
|
48
|
+
your spec files. Then, you can easily generate corresponding swagger.json files
|
|
49
|
+
and serve them up with an embedded version of swagger-ui. This means you can complement
|
|
50
|
+
your API with a slick discovery UI to assist consumers with their integration efforts.
|
|
51
|
+
Best of all, it requires minimal coding and maintenance, allowing you to focus on
|
|
52
|
+
building an awesome API!
|
|
53
|
+
email:
|
|
54
|
+
- domaindrivendev@gmail.com
|
|
55
|
+
executables: []
|
|
56
|
+
extensions: []
|
|
57
|
+
extra_rdoc_files: []
|
|
58
|
+
files:
|
|
59
|
+
- MIT-LICENSE
|
|
60
|
+
- README.rdoc
|
|
61
|
+
- Rakefile
|
|
62
|
+
- app/controllers/swagger_rails/application_controller.rb
|
|
63
|
+
- app/controllers/swagger_rails/swagger_ui_controller.rb
|
|
64
|
+
- app/helpers/swagger_rails/application_helper.rb
|
|
65
|
+
- app/views/swagger_rails/swagger_ui/index.html.erb
|
|
66
|
+
- bower_components/swagger-ui/dist/css/print.css
|
|
67
|
+
- bower_components/swagger-ui/dist/css/reset.css
|
|
68
|
+
- bower_components/swagger-ui/dist/css/screen.css
|
|
69
|
+
- bower_components/swagger-ui/dist/css/style.css
|
|
70
|
+
- bower_components/swagger-ui/dist/css/typography.css
|
|
71
|
+
- bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-700.eot
|
|
72
|
+
- bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-700.svg
|
|
73
|
+
- bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-700.ttf
|
|
74
|
+
- bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-700.woff
|
|
75
|
+
- bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-700.woff2
|
|
76
|
+
- bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-regular.eot
|
|
77
|
+
- bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-regular.svg
|
|
78
|
+
- bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-regular.ttf
|
|
79
|
+
- bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-regular.woff
|
|
80
|
+
- bower_components/swagger-ui/dist/fonts/droid-sans-v6-latin-regular.woff2
|
|
81
|
+
- bower_components/swagger-ui/dist/images/explorer_icons.png
|
|
82
|
+
- bower_components/swagger-ui/dist/images/favicon-16x16.png
|
|
83
|
+
- bower_components/swagger-ui/dist/images/favicon-32x32.png
|
|
84
|
+
- bower_components/swagger-ui/dist/images/favicon.ico
|
|
85
|
+
- bower_components/swagger-ui/dist/images/logo_small.png
|
|
86
|
+
- bower_components/swagger-ui/dist/images/pet_store_api.png
|
|
87
|
+
- bower_components/swagger-ui/dist/images/throbber.gif
|
|
88
|
+
- bower_components/swagger-ui/dist/images/wordnik_api.png
|
|
89
|
+
- bower_components/swagger-ui/dist/index.html
|
|
90
|
+
- bower_components/swagger-ui/dist/lang/en.js
|
|
91
|
+
- bower_components/swagger-ui/dist/lang/es.js
|
|
92
|
+
- bower_components/swagger-ui/dist/lang/pt.js
|
|
93
|
+
- bower_components/swagger-ui/dist/lang/ru.js
|
|
94
|
+
- bower_components/swagger-ui/dist/lang/translator.js
|
|
95
|
+
- bower_components/swagger-ui/dist/lib/backbone-min.js
|
|
96
|
+
- bower_components/swagger-ui/dist/lib/handlebars-2.0.0.js
|
|
97
|
+
- bower_components/swagger-ui/dist/lib/highlight.7.3.pack.js
|
|
98
|
+
- bower_components/swagger-ui/dist/lib/jquery-1.8.0.min.js
|
|
99
|
+
- bower_components/swagger-ui/dist/lib/jquery.ba-bbq.min.js
|
|
100
|
+
- bower_components/swagger-ui/dist/lib/jquery.slideto.min.js
|
|
101
|
+
- bower_components/swagger-ui/dist/lib/jquery.wiggle.min.js
|
|
102
|
+
- bower_components/swagger-ui/dist/lib/marked.js
|
|
103
|
+
- bower_components/swagger-ui/dist/lib/swagger-oauth.js
|
|
104
|
+
- bower_components/swagger-ui/dist/lib/underscore-min.js
|
|
105
|
+
- bower_components/swagger-ui/dist/lib/underscore-min.map
|
|
106
|
+
- bower_components/swagger-ui/dist/o2c.html
|
|
107
|
+
- bower_components/swagger-ui/dist/swagger-ui.js
|
|
108
|
+
- bower_components/swagger-ui/dist/swagger-ui.min.js
|
|
109
|
+
- config/routes.rb
|
|
110
|
+
- lib/generators/swagger_rails/custom_ui/USAGE
|
|
111
|
+
- lib/generators/swagger_rails/custom_ui/custom_ui_generator.rb
|
|
112
|
+
- lib/generators/swagger_rails/custom_ui/files/index.html.erb
|
|
113
|
+
- lib/generators/swagger_rails/install/USAGE
|
|
114
|
+
- lib/generators/swagger_rails/install/install_generator.rb
|
|
115
|
+
- lib/generators/swagger_rails/install/templates/swagger.json
|
|
116
|
+
- lib/generators/swagger_rails/install/templates/swagger_rails.rb
|
|
117
|
+
- lib/swagger_rails.rb
|
|
118
|
+
- lib/swagger_rails/engine.rb
|
|
119
|
+
- lib/swagger_rails/middleware/swagger_docs.rb
|
|
120
|
+
- lib/swagger_rails/middleware/swagger_ui.rb
|
|
121
|
+
- lib/swagger_rails/rspec/dsl.rb
|
|
122
|
+
- lib/swagger_rails/rspec/formatter.rb
|
|
123
|
+
- lib/swagger_rails/test_visitor.rb
|
|
124
|
+
- lib/swagger_rails/version.rb
|
|
125
|
+
- lib/tasks/swagger_rails_tasks.rake
|
|
126
|
+
homepage: https://github.com/domaindrivendev/swagger_rails
|
|
127
|
+
licenses:
|
|
128
|
+
- MIT
|
|
129
|
+
metadata: {}
|
|
130
|
+
post_install_message:
|
|
131
|
+
rdoc_options: []
|
|
132
|
+
require_paths:
|
|
133
|
+
- lib
|
|
134
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - ">="
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '0'
|
|
139
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
|
+
requirements:
|
|
141
|
+
- - ">"
|
|
142
|
+
- !ruby/object:Gem::Version
|
|
143
|
+
version: 1.3.1
|
|
144
|
+
requirements: []
|
|
145
|
+
rubyforge_project:
|
|
146
|
+
rubygems_version: 2.4.8
|
|
147
|
+
signing_key:
|
|
148
|
+
specification_version: 4
|
|
149
|
+
summary: Leverage your api/integration test specs to generate swagger descriptions
|
|
150
|
+
for Rails-based API's
|
|
151
|
+
test_files: []
|
|
152
|
+
has_rdoc:
|