swagger-docs 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +1 -0
- data.tar.gz.sig +2 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +334 -0
- data/Rakefile +1 -0
- data/certs/gem-public_cert.pem +21 -0
- data/lib/swagger/docs.rb +12 -0
- data/lib/swagger/docs/config.rb +15 -0
- data/lib/swagger/docs/dsl.rb +56 -0
- data/lib/swagger/docs/generator.rb +93 -0
- data/lib/swagger/docs/impotent_methods.rb +21 -0
- data/lib/swagger/docs/methods.rb +39 -0
- data/lib/swagger/docs/task.rb +9 -0
- data/lib/swagger/docs/version.rb +5 -0
- data/lib/tasks/swagger.rake +10 -0
- data/spec/fixtures/controllers/application_controller.rb +3 -0
- data/spec/fixtures/controllers/ignored_controller.rb +6 -0
- data/spec/fixtures/controllers/sample_controller.rb +52 -0
- data/spec/lib/swagger/docs/generator_spec.rb +154 -0
- data/spec/spec_helper.rb +16 -0
- data/swagger-docs.gemspec +29 -0
- metadata +149 -0
- metadata.gz.sig +2 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f911cef6a9a1c31b6a3eb7b20a9475708d84b450
|
4
|
+
data.tar.gz: 7c7561937304375ceacc3738e4fcd68c4b3cc228
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 862ec9249db73769611ae420128215e7ac356911cf42983560eb22083f9a8dc11ff9c46c4bbb20daecc09afe613b930dddf18c0bdd0e741b8a4edb21c229c14d
|
7
|
+
data.tar.gz: 878c2194761ad4d6ce4be794fa782dbb8c2dff643ebd239d368c466090b2f7fe2025cf953c27048a8360c24429896a41a538219f632908cdffdbaea56bd810ef
|
checksums.yaml.gz.sig
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
�����9�4�~�o,�"�W��������(z��6;�:#�x�9�ƺ%�h�'�_P��u�����[�V�'��j�A~}��؟�_��Wq��QE�IfQ�W֪a�\�1ߛ���Z���0�}����Aܙ9�y^6��v�j�CM{|���&����%ddB�m���y���-�ۗS��y�eW��͞ir~�_-�Y,ط�9 ;)��H��`[�1B���)=�E�s��ř�0k��
|
data.tar.gz.sig
ADDED
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Rich Hollis
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,334 @@
|
|
1
|
+
# Swagger::Docs
|
2
|
+
|
3
|
+
Generates swagger-ui json files for rails apps with APIs. You add the swagger DSL to your controller classes and then run one rake task to generate the json files.
|
4
|
+
|
5
|
+
Here is an extract of the DSL from a user controller API class:
|
6
|
+
|
7
|
+
```
|
8
|
+
swagger_controller :users, "User Management"
|
9
|
+
|
10
|
+
swagger_api :index do
|
11
|
+
summary "Fetches all User items"
|
12
|
+
param :query, :page, :integer, :optional, "Page number"
|
13
|
+
response :unauthorized
|
14
|
+
response :not_acceptable
|
15
|
+
response :requested_range_not_satisfiable
|
16
|
+
end
|
17
|
+
```
|
18
|
+
|
19
|
+
## Installation
|
20
|
+
|
21
|
+
Add this line to your application's Gemfile:
|
22
|
+
|
23
|
+
gem 'swagger-docs'
|
24
|
+
|
25
|
+
And then execute:
|
26
|
+
|
27
|
+
$ bundle
|
28
|
+
|
29
|
+
Or install it yourself as:
|
30
|
+
|
31
|
+
$ gem install swagger-docs
|
32
|
+
|
33
|
+
## Usage
|
34
|
+
|
35
|
+
### Create Initializer
|
36
|
+
|
37
|
+
Create an initializer in config/initializers (e.g. swagger_docs.rb) and define your APIs:
|
38
|
+
|
39
|
+
```
|
40
|
+
Swagger::Docs::Config.register_apis({
|
41
|
+
"1.0" => {:controller_base_path => "api/v1", :api_file_path => "public/api/v1/"}
|
42
|
+
})
|
43
|
+
```
|
44
|
+
|
45
|
+
### Documenting a controller
|
46
|
+
|
47
|
+
```
|
48
|
+
class Api::V1::UsersController < ApiController
|
49
|
+
|
50
|
+
swagger_controller :users, "User Management"
|
51
|
+
|
52
|
+
swagger_api :index do
|
53
|
+
summary "Fetches all User items"
|
54
|
+
param :query, :page, :integer, :optional, "Page number"
|
55
|
+
response :unauthorized
|
56
|
+
response :not_acceptable
|
57
|
+
response :requested_range_not_satisfiable
|
58
|
+
end
|
59
|
+
|
60
|
+
swagger_api :show do
|
61
|
+
summary "Fetches a single User item"
|
62
|
+
param :path, :id, :integer, :optional, "User Id"
|
63
|
+
response :unauthorized
|
64
|
+
response :not_acceptable
|
65
|
+
response :not_found
|
66
|
+
end
|
67
|
+
|
68
|
+
swagger_api :create do
|
69
|
+
summary "Creates a new User"
|
70
|
+
param :form, :first_name, :string, :required, "First name"
|
71
|
+
param :form, :last_name, :string, :required, "Last name"
|
72
|
+
param :form, :email, :string, :required, "Email address"
|
73
|
+
response :unauthorized
|
74
|
+
response :not_acceptable
|
75
|
+
end
|
76
|
+
|
77
|
+
swagger_api :update do
|
78
|
+
summary "Updates an existing User"
|
79
|
+
param :path, :id, :integer, :required, "User Id"
|
80
|
+
param :form, :first_name, :string, :optional, "First name"
|
81
|
+
param :form, :last_name, :string, :optional, "Last name"
|
82
|
+
param :form, :email, :string, :optional, "Email address"
|
83
|
+
response :unauthorized
|
84
|
+
response :not_found
|
85
|
+
response :not_acceptable
|
86
|
+
end
|
87
|
+
|
88
|
+
swagger_api :destroy do
|
89
|
+
summary "Deletes an existing User item"
|
90
|
+
param :path, :id, :integer, :optional, "User Id"
|
91
|
+
response :unauthorized
|
92
|
+
response :not_found
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
```
|
97
|
+
|
98
|
+
### Run rake task to generate docs
|
99
|
+
|
100
|
+
```
|
101
|
+
rake swagger:docs
|
102
|
+
```
|
103
|
+
|
104
|
+
### Swagger-ui JSON files should now be present in your api_file_path (e.g. ./public/api/v1)
|
105
|
+
|
106
|
+
api-docs.json output:
|
107
|
+
|
108
|
+
|
109
|
+
```
|
110
|
+
{
|
111
|
+
"apiVersion": "1.0",
|
112
|
+
"swaggerVersion": "1.2",
|
113
|
+
"basePath": "/api/v1",
|
114
|
+
"apis": [
|
115
|
+
{
|
116
|
+
"path": "/users.{format}",
|
117
|
+
"description": "User Management"
|
118
|
+
}
|
119
|
+
]
|
120
|
+
}
|
121
|
+
```
|
122
|
+
|
123
|
+
users.json output:
|
124
|
+
|
125
|
+
```
|
126
|
+
{
|
127
|
+
"apiVersion": "1.0",
|
128
|
+
"swaggerVersion": "1.2",
|
129
|
+
"basePath": "/api/v1",
|
130
|
+
"resourcePath": "/users",
|
131
|
+
"apis": [
|
132
|
+
{
|
133
|
+
"path": "/users",
|
134
|
+
"operations": [
|
135
|
+
{
|
136
|
+
"summary": "Fetches all User items",
|
137
|
+
"parameters": [
|
138
|
+
{
|
139
|
+
"paramType": "query",
|
140
|
+
"name": "page",
|
141
|
+
"type": "integer",
|
142
|
+
"description": "Page number",
|
143
|
+
"required": false
|
144
|
+
}
|
145
|
+
],
|
146
|
+
"responseMessages": [
|
147
|
+
{
|
148
|
+
"code": 401,
|
149
|
+
"message": "Unauthorized"
|
150
|
+
},
|
151
|
+
{
|
152
|
+
"code": 406,
|
153
|
+
"message": "Not Acceptable"
|
154
|
+
},
|
155
|
+
{
|
156
|
+
"code": 416,
|
157
|
+
"message": "Requested Range Not Satisfiable"
|
158
|
+
}
|
159
|
+
],
|
160
|
+
"method": "get",
|
161
|
+
"nickname": "Api::V1::Users#index"
|
162
|
+
}
|
163
|
+
]
|
164
|
+
},
|
165
|
+
{
|
166
|
+
"path": "/users",
|
167
|
+
"operations": [
|
168
|
+
{
|
169
|
+
"summary": "Creates a new User",
|
170
|
+
"parameters": [
|
171
|
+
{
|
172
|
+
"paramType": "form",
|
173
|
+
"name": "first_name",
|
174
|
+
"type": "string",
|
175
|
+
"description": "First name",
|
176
|
+
"required": true
|
177
|
+
},
|
178
|
+
{
|
179
|
+
"paramType": "form",
|
180
|
+
"name": "last_name",
|
181
|
+
"type": "string",
|
182
|
+
"description": "Last name",
|
183
|
+
"required": true
|
184
|
+
},
|
185
|
+
{
|
186
|
+
"paramType": "form",
|
187
|
+
"name": "email",
|
188
|
+
"type": "string",
|
189
|
+
"description": "Email address",
|
190
|
+
"required": true
|
191
|
+
}
|
192
|
+
],
|
193
|
+
"responseMessages": [
|
194
|
+
{
|
195
|
+
"code": 401,
|
196
|
+
"message": "Unauthorized"
|
197
|
+
},
|
198
|
+
{
|
199
|
+
"code": 406,
|
200
|
+
"message": "Not Acceptable"
|
201
|
+
}
|
202
|
+
],
|
203
|
+
"method": "post",
|
204
|
+
"nickname": "Api::V1::Users#create"
|
205
|
+
}
|
206
|
+
]
|
207
|
+
},
|
208
|
+
{
|
209
|
+
"path": "/users/{id}",
|
210
|
+
"operations": [
|
211
|
+
{
|
212
|
+
"summary": "Fetches a single User item",
|
213
|
+
"parameters": [
|
214
|
+
{
|
215
|
+
"paramType": "path",
|
216
|
+
"name": "id",
|
217
|
+
"type": "integer",
|
218
|
+
"description": "User Id",
|
219
|
+
"required": false
|
220
|
+
}
|
221
|
+
],
|
222
|
+
"responseMessages": [
|
223
|
+
{
|
224
|
+
"code": 401,
|
225
|
+
"message": "Unauthorized"
|
226
|
+
},
|
227
|
+
{
|
228
|
+
"code": 404,
|
229
|
+
"message": "Not Found"
|
230
|
+
},
|
231
|
+
{
|
232
|
+
"code": 406,
|
233
|
+
"message": "Not Acceptable"
|
234
|
+
}
|
235
|
+
],
|
236
|
+
"method": "get",
|
237
|
+
"nickname": "Api::V1::Users#show"
|
238
|
+
}
|
239
|
+
]
|
240
|
+
},
|
241
|
+
{
|
242
|
+
"path": "/users/{id}",
|
243
|
+
"operations": [
|
244
|
+
{
|
245
|
+
"summary": "Updates an existing User",
|
246
|
+
"parameters": [
|
247
|
+
{
|
248
|
+
"paramType": "path",
|
249
|
+
"name": "id",
|
250
|
+
"type": "integer",
|
251
|
+
"description": "User Id",
|
252
|
+
"required": true
|
253
|
+
},
|
254
|
+
{
|
255
|
+
"paramType": "form",
|
256
|
+
"name": "first_name",
|
257
|
+
"type": "string",
|
258
|
+
"description": "First name",
|
259
|
+
"required": false
|
260
|
+
},
|
261
|
+
{
|
262
|
+
"paramType": "form",
|
263
|
+
"name": "last_name",
|
264
|
+
"type": "string",
|
265
|
+
"description": "Last name",
|
266
|
+
"required": false
|
267
|
+
},
|
268
|
+
{
|
269
|
+
"paramType": "form",
|
270
|
+
"name": "email",
|
271
|
+
"type": "string",
|
272
|
+
"description": "Email address",
|
273
|
+
"required": false
|
274
|
+
}
|
275
|
+
],
|
276
|
+
"responseMessages": [
|
277
|
+
{
|
278
|
+
"code": 401,
|
279
|
+
"message": "Unauthorized"
|
280
|
+
},
|
281
|
+
{
|
282
|
+
"code": 404,
|
283
|
+
"message": "Not Found"
|
284
|
+
},
|
285
|
+
{
|
286
|
+
"code": 406,
|
287
|
+
"message": "Not Acceptable"
|
288
|
+
}
|
289
|
+
],
|
290
|
+
"method": "put",
|
291
|
+
"nickname": "Api::V1::Users#update"
|
292
|
+
}
|
293
|
+
]
|
294
|
+
},
|
295
|
+
{
|
296
|
+
"path": "/users/{id}",
|
297
|
+
"operations": [
|
298
|
+
{
|
299
|
+
"summary": "Deletes an existing User item",
|
300
|
+
"parameters": [
|
301
|
+
{
|
302
|
+
"paramType": "path",
|
303
|
+
"name": "id",
|
304
|
+
"type": "integer",
|
305
|
+
"description": "User Id",
|
306
|
+
"required": false
|
307
|
+
}
|
308
|
+
],
|
309
|
+
"responseMessages": [
|
310
|
+
{
|
311
|
+
"code": 401,
|
312
|
+
"message": "Unauthorized"
|
313
|
+
},
|
314
|
+
{
|
315
|
+
"code": 404,
|
316
|
+
"message": "Not Found"
|
317
|
+
}
|
318
|
+
],
|
319
|
+
"method": "delete",
|
320
|
+
"nickname": "Api::V1::Users#destroy"
|
321
|
+
}
|
322
|
+
]
|
323
|
+
}
|
324
|
+
]
|
325
|
+
}
|
326
|
+
```
|
327
|
+
|
328
|
+
## Contributing
|
329
|
+
|
330
|
+
1. Fork it
|
331
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
332
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
333
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
334
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMRMwEQYDVQQDDApyaWNo
|
3
|
+
aG9sbGlzMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNj
|
4
|
+
b20wHhcNMTMxMDIyMTMwMzI3WhcNMTQxMDIyMTMwMzI3WjBBMRMwEQYDVQQDDApy
|
5
|
+
aWNoaG9sbGlzMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
|
6
|
+
FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDppQTU++yinAuC
|
7
|
+
ydu87c/vDGTmE5Go9/zI48/T0kTco+JbUn4BPUaK0DWCEpZULvqwQAqVQm8JQnIU
|
8
|
+
6Z3k1tAQbhtgbG2oWNIxyC7SyXMQw/ag5qoAhw6k3DFE+jGKrREzADFb7vG+nPYp
|
9
|
+
4yinx27jCTIAv7/z2AVt6HoHOYh1s0HniJQWCebi7QgNXboMY8MpFxSwNkcFjl14
|
10
|
+
KMSf9SX7iOyiwqgcJmN0fN4be8pH5j/EdinUL1rWlwldcUo2+6LChBswRPmtdaZv
|
11
|
+
UyICuX5VfVJA0KrA/ihIMLaZVO5esFso+YrpP+QgbvhLwhn5e/sB5dr3a+y0+GJZ
|
12
|
+
zPGtm60bAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
13
|
+
BBShIiKLL1E1JG++RUVAOSPO7rZV0TAfBgNVHREEGDAWgRRyaWNoaG9sbGlzQGdt
|
14
|
+
YWlsLmNvbTAfBgNVHRIEGDAWgRRyaWNoaG9sbGlzQGdtYWlsLmNvbTANBgkqhkiG
|
15
|
+
9w0BAQUFAAOCAQEAe4P1TzJlVhUn60Wx/431wNnuHZS9K4gSzmNr4zuZU6lP3rxx
|
16
|
+
rMsSY1nJY1nTBqX9W62hO+KS14ncbZvNU59ao5YVXHDflEB3Yz20DP9E2Uws64Bx
|
17
|
+
ify0Dwuq4VV2PiQbczuTGhGupzQpkMttWNZqVdjDbH5k8sGx3MumNX7YUJwUerhZ
|
18
|
+
bTBme5soNyJzAeWBqCBPT9p98rC6vqhcBfAVF6RbERYL6MPyoBZWqGeuMR4H2X/v
|
19
|
+
RYcsqDfanYBx7QcftOnbeQq7/Ep7Zx+W9+Ph3TiJLMLdAr7bLkgN1SjvrjTL5mQR
|
20
|
+
FuQtYvE4LKiUQpG7vLTRB78dQBlSj9fnv2OM9w==
|
21
|
+
-----END CERTIFICATE-----
|
data/lib/swagger/docs.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "swagger/docs/config"
|
2
|
+
require "swagger/docs/dsl"
|
3
|
+
require "swagger/docs/generator"
|
4
|
+
require "swagger/docs/impotent_methods"
|
5
|
+
require "swagger/docs/methods"
|
6
|
+
require "swagger/docs/task"
|
7
|
+
require "swagger/docs/version"
|
8
|
+
|
9
|
+
module Swagger
|
10
|
+
module Docs
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Swagger
|
2
|
+
module Docs
|
3
|
+
class Config
|
4
|
+
class << self
|
5
|
+
def register_apis(versions)
|
6
|
+
ApplicationController.send(:include, ImpotentMethods)
|
7
|
+
@versions = versions
|
8
|
+
end
|
9
|
+
def registered_apis
|
10
|
+
@versions ||= {}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Swagger
|
2
|
+
module Docs
|
3
|
+
class SwaggerDSL
|
4
|
+
# http://stackoverflow.com/questions/5851127/change-the-context-binding-inside-a-block-in-ruby/5851325#5851325
|
5
|
+
def self.call(action, caller, &blk)
|
6
|
+
# Create a new CommandDSL instance, and instance_eval the block to it
|
7
|
+
instance = new
|
8
|
+
instance.instance_eval(&blk)
|
9
|
+
# Now return all of the set instance variables as a Hash
|
10
|
+
instance.instance_variables.inject({}) { |result_hash, instance_variable|
|
11
|
+
result_hash[instance_variable] = instance.instance_variable_get(instance_variable)
|
12
|
+
result_hash # Gotta have the block return the result_hash
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def summary(text)
|
17
|
+
@summary = text
|
18
|
+
end
|
19
|
+
|
20
|
+
def method(method)
|
21
|
+
@method = method
|
22
|
+
end
|
23
|
+
|
24
|
+
def type(type)
|
25
|
+
@type = type
|
26
|
+
end
|
27
|
+
|
28
|
+
def nickname(nickname)
|
29
|
+
@nickname = nickname
|
30
|
+
end
|
31
|
+
|
32
|
+
def parameters
|
33
|
+
@parameters ||= []
|
34
|
+
end
|
35
|
+
|
36
|
+
def param(param_type, name, type, required, description = nil, hash={})
|
37
|
+
parameters << {:param_type => param_type, :name => name, :type => type,
|
38
|
+
:description => description, :required => required == :required ? true : false}.merge(hash)
|
39
|
+
end
|
40
|
+
|
41
|
+
def response_messages
|
42
|
+
@response_messages ||= []
|
43
|
+
end
|
44
|
+
|
45
|
+
def response(status, text = nil, model = nil)
|
46
|
+
if status.is_a? Symbol
|
47
|
+
status_code = Rack::Utils.status_code(status)
|
48
|
+
response_messages << {:code => status_code, :message => status.to_s.titleize}
|
49
|
+
else
|
50
|
+
response_messages << {:code => status, :message => text}
|
51
|
+
end
|
52
|
+
response_messages.sort_by!{|i| i[:code]}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Swagger
|
2
|
+
module Docs
|
3
|
+
class Generator
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def camelize_keys_deep!(h)
|
7
|
+
h.keys.each do |k|
|
8
|
+
ks = k.to_s.camelize(:lower)
|
9
|
+
h[ks] = h.delete k
|
10
|
+
camelize_keys_deep! h[ks] if h[ks].kind_of? Hash
|
11
|
+
if h[ks].kind_of? Array
|
12
|
+
h[ks].each do |a|
|
13
|
+
next unless a.kind_of? Hash
|
14
|
+
camelize_keys_deep! a
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_api_path(spec)
|
21
|
+
path_api = spec.to_s.gsub("(.:format)", "")
|
22
|
+
parts_new = []
|
23
|
+
path_api.split("/").each do |path_part|
|
24
|
+
part = path_part
|
25
|
+
if part[0] == ":"
|
26
|
+
part[0] = "{"
|
27
|
+
part << "}"
|
28
|
+
end
|
29
|
+
parts_new << part
|
30
|
+
end
|
31
|
+
path_api = parts_new*"/"
|
32
|
+
end
|
33
|
+
|
34
|
+
def set_real_methods
|
35
|
+
ApplicationController.send(:include, Methods) # replace impotent methods with live ones
|
36
|
+
end
|
37
|
+
|
38
|
+
def write_docs(apis)
|
39
|
+
results = {}
|
40
|
+
set_real_methods
|
41
|
+
Config.registered_apis.each do |api_version,config|
|
42
|
+
results[api_version] = write_doc(api_version, config)
|
43
|
+
end
|
44
|
+
results
|
45
|
+
end
|
46
|
+
|
47
|
+
def write_doc(api_version, config)
|
48
|
+
base_path = config[:controller_base_path]
|
49
|
+
api_file_path = config[:api_file_path]
|
50
|
+
results = {:processed => [], :skipped => []}
|
51
|
+
|
52
|
+
FileUtils.mkdir_p(api_file_path) # recursively create out output path
|
53
|
+
Dir.foreach(api_file_path) {|f| fn = File.join(api_file_path, f); File.delete(fn) if !File.directory?(fn)} # clean output path
|
54
|
+
|
55
|
+
header = { :api_version => api_version, :swagger_version => "1.2", :base_path => "/#{base_path}"}
|
56
|
+
resources = header.merge({:apis => []})
|
57
|
+
|
58
|
+
paths = Rails.application.routes.routes.map{|i| "#{i.defaults[:controller]}" }
|
59
|
+
paths = paths.uniq.select{|i| i.start_with?(base_path)}
|
60
|
+
paths.each do |path|
|
61
|
+
klass = "#{path.to_s.camelize}Controller".constantize
|
62
|
+
if !klass.methods.include?(:swagger_config) or !klass.swagger_config[:controller]
|
63
|
+
results[:skipped] << path
|
64
|
+
next
|
65
|
+
end
|
66
|
+
apis = []
|
67
|
+
Rails.application.routes.routes.select{|i| i.defaults[:controller] == path}.each do |route|
|
68
|
+
action = route.defaults[:action]
|
69
|
+
verb = route.verb.source.to_s.delete('$'+'^').downcase.to_sym
|
70
|
+
next if !operations = klass.swagger_actions[action.to_sym]
|
71
|
+
operations = Hash[operations.map {|k, v| [k.to_s.gsub("@","").to_sym, v] }] # rename :@instance hash keys
|
72
|
+
operations[:method] = verb
|
73
|
+
operations[:nickname] = "#{path.camelize}##{action}"
|
74
|
+
apis << {:path => get_api_path(route.path.spec).gsub("/#{base_path}",""), :operations => [operations]}
|
75
|
+
end
|
76
|
+
demod = "#{path.to_s.camelize}".demodulize.camelize.underscore
|
77
|
+
resource = header.merge({:resource_path => "/#{demod}", :apis => apis})
|
78
|
+
camelize_keys_deep!(resource)
|
79
|
+
# write controller resource file
|
80
|
+
File.open("#{api_file_path}#{demod}.json", 'w') { |file| file.write(resource.to_json) }
|
81
|
+
# append resource to resources array (for writing out at end)
|
82
|
+
resources[:apis] << {path: "/#{demod}.{format}", description: klass.swagger_config[:description]}
|
83
|
+
results[:processed] << path
|
84
|
+
end
|
85
|
+
# write master resource file
|
86
|
+
camelize_keys_deep!(resources)
|
87
|
+
File.open("#{api_file_path}api-docs.json", 'w') { |file| file.write(resources.to_json) }
|
88
|
+
results
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Swagger
|
2
|
+
module Docs
|
3
|
+
module ImpotentMethods
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
private
|
11
|
+
|
12
|
+
def swagger_api(action, &block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def swagger_controller(controller, description)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Swagger
|
2
|
+
module Docs
|
3
|
+
module Methods
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def swagger_controller(controller, description)
|
10
|
+
swagger_config[:controller] = controller
|
11
|
+
swagger_config[:description] = description
|
12
|
+
end
|
13
|
+
|
14
|
+
def swagger_model(model)
|
15
|
+
swagger_config[:model] = model
|
16
|
+
end
|
17
|
+
|
18
|
+
def swagger_actions
|
19
|
+
@swagger_dsl
|
20
|
+
end
|
21
|
+
|
22
|
+
def swagger_config
|
23
|
+
@swagger_config ||= {}
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def swagger_api(action, &block)
|
29
|
+
@swagger_dsl ||= {}
|
30
|
+
controller_action = "#{name}##{action} #{self.class}"
|
31
|
+
return if @swagger_dsl[action]
|
32
|
+
route = Rails.application.routes.routes.select{|i| "#{i.defaults[:controller].to_s.camelize}Controller##{i.defaults[:action]}" == controller_action }.first
|
33
|
+
dsl = SwaggerDSL.call(action, self, &block)
|
34
|
+
@swagger_dsl[action] = dsl
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
namespace :swagger do
|
2
|
+
|
3
|
+
desc "Generate Swagger documentation files"
|
4
|
+
task :docs => [:environment] do |t,args|
|
5
|
+
results = Swagger::Docs::Generator.write_docs(Swagger::Docs::Config.registered_apis)
|
6
|
+
results.each do |k,v|
|
7
|
+
puts "#{k}: #{v[:processed].count} processed / #{v[:skipped].count} skipped"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Api
|
2
|
+
module V1
|
3
|
+
class SampleController < ApplicationController
|
4
|
+
|
5
|
+
swagger_controller :users, "User Management"
|
6
|
+
|
7
|
+
swagger_api :index do
|
8
|
+
summary "Fetches all User items"
|
9
|
+
param :query, :page, :integer, :optional, "Page number"
|
10
|
+
response :unauthorized
|
11
|
+
response :not_acceptable
|
12
|
+
response :requested_range_not_satisfiable
|
13
|
+
end
|
14
|
+
|
15
|
+
swagger_api :show do
|
16
|
+
summary "Fetches a single User item"
|
17
|
+
param :path, :id, :integer, :optional, "User Id"
|
18
|
+
response :unauthorized
|
19
|
+
response :not_acceptable
|
20
|
+
response :not_found
|
21
|
+
end
|
22
|
+
|
23
|
+
swagger_api :create do
|
24
|
+
summary "Creates a new User"
|
25
|
+
param :form, :first_name, :string, :required, "First name"
|
26
|
+
param :form, :last_name, :string, :required, "Last name"
|
27
|
+
param :form, :email, :string, :required, "Email address"
|
28
|
+
response :unauthorized
|
29
|
+
response :not_acceptable
|
30
|
+
end
|
31
|
+
|
32
|
+
swagger_api :update do
|
33
|
+
summary "Updates an existing User"
|
34
|
+
param :path, :id, :integer, :required, "User Id"
|
35
|
+
param :form, :first_name, :string, :optional, "First name"
|
36
|
+
param :form, :last_name, :string, :optional, "Last name"
|
37
|
+
param :form, :email, :string, :optional, "Email address"
|
38
|
+
response :unauthorized
|
39
|
+
response :not_found
|
40
|
+
response :not_acceptable
|
41
|
+
end
|
42
|
+
|
43
|
+
swagger_api :destroy do
|
44
|
+
summary "Deletes an existing User item"
|
45
|
+
param :path, :id, :integer, :optional, "User Id"
|
46
|
+
response :unauthorized
|
47
|
+
response :not_found
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Swagger::Docs::Generator do
|
4
|
+
|
5
|
+
require "fixtures/controllers/application_controller"
|
6
|
+
require "fixtures/controllers/ignored_controller"
|
7
|
+
|
8
|
+
def stub_route(verb, action, controller, spec)
|
9
|
+
double("route", :verb => double("verb", :source => verb),
|
10
|
+
:defaults => {:action => action, :controller => controller},
|
11
|
+
:path => double("path", :spec => spec)
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
before(:each) do
|
16
|
+
FileUtils.rm_rf(TMP_DIR)
|
17
|
+
routes = [
|
18
|
+
stub_route("^GET$", "index", "api/v1/ignored", "/api/v1/ignored(.:format)"),
|
19
|
+
stub_route("^GET$", "index", "api/v1/sample", "/api/v1/sample(.:format)"),
|
20
|
+
stub_route("^POST$", "create", "api/v1/sample", "/api/v1/sample(.:format)"),
|
21
|
+
stub_route("^GET$", "show", "api/v1/sample", "/api/v1/sample/:id(.:format)"),
|
22
|
+
stub_route("^PUT$", "update", "api/v1/sample", "/api/v1/sample/:id(.:format)"),
|
23
|
+
stub_route("^DELETE$", "destroy", "api/v1/sample", "/api/v1/sample/:id(.:format)")
|
24
|
+
]
|
25
|
+
@config = Swagger::Docs::Config.register_apis({
|
26
|
+
"1.0" => {:controller_base_path => "api/v1", :api_file_path => "#{TMP_DIR}api/v1/"}
|
27
|
+
})
|
28
|
+
Rails.stub_chain(:application, :routes, :routes).and_return(routes)
|
29
|
+
Swagger::Docs::Generator.set_real_methods
|
30
|
+
require "fixtures/controllers/sample_controller"
|
31
|
+
end
|
32
|
+
|
33
|
+
context "test suite initialization" do
|
34
|
+
it "the resources file does not exist" do
|
35
|
+
expect(File.exists?(FILE_RESOURCES)).to be_false
|
36
|
+
end
|
37
|
+
it "the resource file does not exist" do
|
38
|
+
expect(File.exists?(FILE_RESOURCE)).to be_false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#write_docs" do
|
43
|
+
let(:generate) { Swagger::Docs::Generator::write_docs(@config) }
|
44
|
+
before(:each) do
|
45
|
+
generate
|
46
|
+
end
|
47
|
+
it "writes the resources file" do
|
48
|
+
expect(File.exists?(FILE_RESOURCES)).to be_true
|
49
|
+
end
|
50
|
+
it "writes the resource file" do
|
51
|
+
expect(File.exists?(FILE_RESOURCE)).to be_true
|
52
|
+
end
|
53
|
+
it "returns results hash" do
|
54
|
+
results = generate
|
55
|
+
expect(results["1.0"][:processed].count).to eq 1
|
56
|
+
expect(results["1.0"][:skipped].count).to eq 1
|
57
|
+
end
|
58
|
+
context "resources files" do
|
59
|
+
let(:resources) { File.read(FILE_RESOURCES)}
|
60
|
+
let(:response) { JSON.parse(resources) }
|
61
|
+
it "writes version correctly" do
|
62
|
+
expect(response["apiVersion"]).to eq "1.0"
|
63
|
+
end
|
64
|
+
it "writes swaggerVersion correctly" do
|
65
|
+
expect(response["swaggerVersion"]).to eq "1.2"
|
66
|
+
end
|
67
|
+
it "writes basePath correctly" do
|
68
|
+
expect(response["basePath"]).to eq "/api/v1"
|
69
|
+
end
|
70
|
+
it "writes apis correctly" do
|
71
|
+
expect(response["apis"].count).to eq 1
|
72
|
+
end
|
73
|
+
it "writes api path correctly" do
|
74
|
+
expect(response["apis"][0]["path"]).to eq "/sample.{format}"
|
75
|
+
end
|
76
|
+
it "writes api description correctly" do
|
77
|
+
expect(response["apis"][0]["description"]).to eq "User Management"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
context "resource file" do
|
81
|
+
let(:resource) { File.read(FILE_RESOURCE)}
|
82
|
+
let(:response) { JSON.parse(resource) }
|
83
|
+
let(:first) { response["apis"].first }
|
84
|
+
let(:operations) { first["operations"] }
|
85
|
+
let(:params) { operations.first["parameters"] }
|
86
|
+
let(:response_msgs) { operations.first["responseMessages"] }
|
87
|
+
# {"apiVersion":"1.0","swaggerVersion":"1.2","basePath":"/api/v1","resourcePath":"/sample"
|
88
|
+
it "writes version correctly" do
|
89
|
+
expect(response["apiVersion"]).to eq "1.0"
|
90
|
+
end
|
91
|
+
it "writes swaggerVersion correctly" do
|
92
|
+
expect(response["swaggerVersion"]).to eq "1.2"
|
93
|
+
end
|
94
|
+
it "writes basePath correctly" do
|
95
|
+
expect(response["basePath"]).to eq "/api/v1"
|
96
|
+
end
|
97
|
+
it "writes resourcePath correctly" do
|
98
|
+
expect(response["resourcePath"]).to eq "/sample"
|
99
|
+
end
|
100
|
+
it "writes out expected api count" do
|
101
|
+
expect(response["apis"].count).to eq 5
|
102
|
+
end
|
103
|
+
context "first api" do
|
104
|
+
#"apis":[{"path":" /sample","operations":[{"summary":"Fetches all User items"
|
105
|
+
#,"method":"get","nickname":"Api::V1::Sample#index"}]
|
106
|
+
it "writes path correctly" do
|
107
|
+
expect(first["path"]).to eq "/sample"
|
108
|
+
end
|
109
|
+
it "writes summary correctly" do
|
110
|
+
expect(operations.first["summary"]).to eq "Fetches all User items"
|
111
|
+
end
|
112
|
+
it "writes method correctly" do
|
113
|
+
expect(operations.first["method"]).to eq "get"
|
114
|
+
end
|
115
|
+
it "writes nickname correctly" do
|
116
|
+
expect(operations.first["nickname"]).to eq "Api::V1::Sample#index"
|
117
|
+
end
|
118
|
+
#"parameters":[{"paramType":"query","name":"page","type":"integer","description":"Page number","required":false}]
|
119
|
+
context "parameters" do
|
120
|
+
it "has correct count" do
|
121
|
+
expect(params.count).to eq 1
|
122
|
+
end
|
123
|
+
it "writes paramType correctly" do
|
124
|
+
expect(params.first["paramType"]).to eq "query"
|
125
|
+
end
|
126
|
+
it "writes name correctly" do
|
127
|
+
expect(params.first["name"]).to eq "page"
|
128
|
+
end
|
129
|
+
it "writes type correctly" do
|
130
|
+
expect(params.first["type"]).to eq "integer"
|
131
|
+
end
|
132
|
+
it "writes description correctly" do
|
133
|
+
expect(params.first["description"]).to eq "Page number"
|
134
|
+
end
|
135
|
+
it "writes required correctly" do
|
136
|
+
expect(params.first["required"]).to be_false
|
137
|
+
end
|
138
|
+
end
|
139
|
+
#"responseMessages":[{"code":401,"message":"Unauthorized"},{"code":406,"message":"Not Acceptable"},{"code":416,"message":"Requested Range Not Satisfiable"}]
|
140
|
+
context "response messages" do
|
141
|
+
it "has correct count" do
|
142
|
+
expect(response_msgs.count).to eq 3
|
143
|
+
end
|
144
|
+
it "writes code correctly" do
|
145
|
+
expect(response_msgs.first["code"]).to eq 401
|
146
|
+
end
|
147
|
+
it "writes message correctly" do
|
148
|
+
expect(response_msgs.first["message"]).to eq "Unauthorized"
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "rails"
|
2
|
+
require "swagger/docs"
|
3
|
+
require "ostruct"
|
4
|
+
require "json"
|
5
|
+
|
6
|
+
TMP_DIR = "/tmp/swagger-docs/"
|
7
|
+
TMP_API_DIR = "/tmp/swagger-docs/api/v1/"
|
8
|
+
FILE_RESOURCES = "#{TMP_API_DIR}api-docs.json"
|
9
|
+
FILE_RESOURCE = "#{TMP_API_DIR}sample.json"
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.expect_with :rspec do |c|
|
13
|
+
c.syntax = :expect
|
14
|
+
end
|
15
|
+
config.color_enabled = true
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'swagger/docs/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "swagger-docs"
|
8
|
+
spec.version = Swagger::Docs::VERSION
|
9
|
+
spec.authors = ["Rich Hollis"]
|
10
|
+
spec.email = ["richhollis@gmail.com"]
|
11
|
+
spec.description = %q{Generates json files for rails apps to use with swagger-ui}
|
12
|
+
spec.summary = %q{Generates swagger-ui json files for rails apps with APIs. You add the swagger DSL to your controller classes and then run one rake task to generate the json files.
|
13
|
+
}
|
14
|
+
spec.homepage = "https://github.com/richhollis/swagger-docs"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files`.split($/)
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.cert_chain = ['certs/gem-public_cert.pem']
|
23
|
+
spec.signing_key = File.expand_path("~/.gemcert/gem-private_key.pem") if $0 =~ /gem\z/
|
24
|
+
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
26
|
+
spec.add_development_dependency "rake"
|
27
|
+
spec.add_development_dependency "rspec"
|
28
|
+
spec.add_development_dependency "rails"
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: swagger-docs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rich Hollis
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMRMwEQYDVQQDDApyaWNo
|
14
|
+
aG9sbGlzMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNj
|
15
|
+
b20wHhcNMTMxMDIyMTMwMzI3WhcNMTQxMDIyMTMwMzI3WjBBMRMwEQYDVQQDDApy
|
16
|
+
aWNoaG9sbGlzMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
|
17
|
+
FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDppQTU++yinAuC
|
18
|
+
ydu87c/vDGTmE5Go9/zI48/T0kTco+JbUn4BPUaK0DWCEpZULvqwQAqVQm8JQnIU
|
19
|
+
6Z3k1tAQbhtgbG2oWNIxyC7SyXMQw/ag5qoAhw6k3DFE+jGKrREzADFb7vG+nPYp
|
20
|
+
4yinx27jCTIAv7/z2AVt6HoHOYh1s0HniJQWCebi7QgNXboMY8MpFxSwNkcFjl14
|
21
|
+
KMSf9SX7iOyiwqgcJmN0fN4be8pH5j/EdinUL1rWlwldcUo2+6LChBswRPmtdaZv
|
22
|
+
UyICuX5VfVJA0KrA/ihIMLaZVO5esFso+YrpP+QgbvhLwhn5e/sB5dr3a+y0+GJZ
|
23
|
+
zPGtm60bAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
24
|
+
BBShIiKLL1E1JG++RUVAOSPO7rZV0TAfBgNVHREEGDAWgRRyaWNoaG9sbGlzQGdt
|
25
|
+
YWlsLmNvbTAfBgNVHRIEGDAWgRRyaWNoaG9sbGlzQGdtYWlsLmNvbTANBgkqhkiG
|
26
|
+
9w0BAQUFAAOCAQEAe4P1TzJlVhUn60Wx/431wNnuHZS9K4gSzmNr4zuZU6lP3rxx
|
27
|
+
rMsSY1nJY1nTBqX9W62hO+KS14ncbZvNU59ao5YVXHDflEB3Yz20DP9E2Uws64Bx
|
28
|
+
ify0Dwuq4VV2PiQbczuTGhGupzQpkMttWNZqVdjDbH5k8sGx3MumNX7YUJwUerhZ
|
29
|
+
bTBme5soNyJzAeWBqCBPT9p98rC6vqhcBfAVF6RbERYL6MPyoBZWqGeuMR4H2X/v
|
30
|
+
RYcsqDfanYBx7QcftOnbeQq7/Ep7Zx+W9+Ph3TiJLMLdAr7bLkgN1SjvrjTL5mQR
|
31
|
+
FuQtYvE4LKiUQpG7vLTRB78dQBlSj9fnv2OM9w==
|
32
|
+
-----END CERTIFICATE-----
|
33
|
+
date: 2013-10-22 00:00:00.000000000 Z
|
34
|
+
dependencies:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: bundler
|
37
|
+
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.3'
|
42
|
+
type: :development
|
43
|
+
prerelease: false
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ~>
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.3'
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: rake
|
51
|
+
requirement: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rspec
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: rails
|
79
|
+
requirement: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
type: :development
|
85
|
+
prerelease: false
|
86
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
description: Generates json files for rails apps to use with swagger-ui
|
92
|
+
email:
|
93
|
+
- richhollis@gmail.com
|
94
|
+
executables: []
|
95
|
+
extensions: []
|
96
|
+
extra_rdoc_files: []
|
97
|
+
files:
|
98
|
+
- .gitignore
|
99
|
+
- Gemfile
|
100
|
+
- LICENSE.txt
|
101
|
+
- README.md
|
102
|
+
- Rakefile
|
103
|
+
- certs/gem-public_cert.pem
|
104
|
+
- lib/swagger/docs.rb
|
105
|
+
- lib/swagger/docs/config.rb
|
106
|
+
- lib/swagger/docs/dsl.rb
|
107
|
+
- lib/swagger/docs/generator.rb
|
108
|
+
- lib/swagger/docs/impotent_methods.rb
|
109
|
+
- lib/swagger/docs/methods.rb
|
110
|
+
- lib/swagger/docs/task.rb
|
111
|
+
- lib/swagger/docs/version.rb
|
112
|
+
- lib/tasks/swagger.rake
|
113
|
+
- spec/fixtures/controllers/application_controller.rb
|
114
|
+
- spec/fixtures/controllers/ignored_controller.rb
|
115
|
+
- spec/fixtures/controllers/sample_controller.rb
|
116
|
+
- spec/lib/swagger/docs/generator_spec.rb
|
117
|
+
- spec/spec_helper.rb
|
118
|
+
- swagger-docs.gemspec
|
119
|
+
homepage: https://github.com/richhollis/swagger-docs
|
120
|
+
licenses:
|
121
|
+
- MIT
|
122
|
+
metadata: {}
|
123
|
+
post_install_message:
|
124
|
+
rdoc_options: []
|
125
|
+
require_paths:
|
126
|
+
- lib
|
127
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - '>='
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
requirements: []
|
138
|
+
rubyforge_project:
|
139
|
+
rubygems_version: 2.0.6
|
140
|
+
signing_key:
|
141
|
+
specification_version: 4
|
142
|
+
summary: Generates swagger-ui json files for rails apps with APIs. You add the swagger
|
143
|
+
DSL to your controller classes and then run one rake task to generate the json files.
|
144
|
+
test_files:
|
145
|
+
- spec/fixtures/controllers/application_controller.rb
|
146
|
+
- spec/fixtures/controllers/ignored_controller.rb
|
147
|
+
- spec/fixtures/controllers/sample_controller.rb
|
148
|
+
- spec/lib/swagger/docs/generator_spec.rb
|
149
|
+
- spec/spec_helper.rb
|
metadata.gz.sig
ADDED