swaggard 0.5.1 → 0.5.2
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 +4 -4
- data/README.md +65 -60
- data/lib/swaggard/engine.rb +4 -3
- data/lib/swaggard/swagger/operation.rb +14 -5
- data/lib/swaggard/swagger/parameters/body.rb +1 -1
- data/lib/swaggard/swagger/property.rb +1 -1
- data/lib/swaggard/swagger/response.rb +69 -34
- data/lib/swaggard/version.rb +1 -1
- data/lib/swaggard.rb +2 -0
- metadata +2 -3
- data/lib/swaggard/swagger/default_response.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb687a1c23c74e8d1e4ba9c61ee2cf721825dd5e
|
4
|
+
data.tar.gz: e5ce9def3e2218ab2de5aed5464cb3c58444845d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e080901eb5706ca5f0a878a7c820281b0ee88a69e6f7b37f1a7b8cffc1cdee25ddbdba5778d24df0713b51d8ee035631f5aba64db68a12b6f25c2e8124d8d14c
|
7
|
+
data.tar.gz: 36d8dd883ecebd67b634e0cc13bac4fbae700b67eef630628d46f538d4f2be1f0332b1e72f4ff940b3fc09360df69032a0842d30b70b08f0be2f133f50528cab
|
data/README.md
CHANGED
@@ -1,41 +1,25 @@
|
|
1
|
-
Swaggard
|
2
|
-
========
|
1
|
+
# Swaggard
|
3
2
|
|
4
3
|
Swaggard is a Rails Engine that can be used to document a REST api. It does this by generating a json that is compliant with [Swagger](http://swagger.io) and displaying it using [Swagger-ui](https://github.com/wordnik/swagger-ui).
|
5
4
|
This gem is inspired and based on [SwaggerYard](https://github.com/synctv/swagger_yard) by [Chris Trinh](https://github.com/chtrinh).
|
6
5
|
|
7
|
-
Compatibility
|
8
|
-
-------------
|
9
|
-
This table tracks the version of Swagger UI used on each Swaggard version and
|
10
|
-
the supported rails version.
|
11
|
-
|
12
|
-
Swaggard Version | Swagger UI Version | Supported Rails Versions
|
13
|
-
---------------- | -------------------| ------------------------
|
14
|
-
0.5.0 | 2.2.8 | 4 - 5
|
15
|
-
0.4.0 | 2.2.8 | 4
|
16
|
-
0.3.0 | 2.1.3 | 4
|
17
|
-
0.2.1 | 2.1.3 | 4
|
18
|
-
0.2.0 | 2.1.3 | 4
|
19
|
-
0.1.1 | 2.1.3 | 4
|
20
|
-
0.1.0 | 2.1.3 | 4
|
21
|
-
0.0.4 | 2.1.8-M1 | 4
|
22
6
|
|
23
|
-
|
24
|
-
-----------------------
|
7
|
+
## Compatibility
|
25
8
|
|
26
|
-
|
27
|
-
|
9
|
+
This table tracks the version of Swagger UI used on each Swaggard version and
|
10
|
+
the supported rails version.
|
28
11
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
12
|
+
Swaggard Version | Swagger UI Version | Supported Rails Versions
|
13
|
+
---------------- | ------------------- | ------------------------
|
14
|
+
0.5.x | 2.2.8 | 4 - 5
|
15
|
+
0.4.x | 2.2.8 | 4
|
16
|
+
0.3.x | 2.1.3 | 4
|
17
|
+
0.2.x | 2.1.3 | 4
|
18
|
+
0.1.x | 2.1.3 | 4
|
19
|
+
0.0.x | 2.1.8-M1 | 4
|
35
20
|
|
36
21
|
|
37
|
-
Installation
|
38
|
-
------------
|
22
|
+
## Installation
|
39
23
|
|
40
24
|
Put Swaggard in your Gemfile:
|
41
25
|
|
@@ -46,8 +30,7 @@ Install the gem with Bundler:
|
|
46
30
|
bundle install
|
47
31
|
|
48
32
|
|
49
|
-
Getting Started
|
50
|
-
-----------------
|
33
|
+
## Getting Started
|
51
34
|
|
52
35
|
Place your configuration in a your rails initializers
|
53
36
|
|
@@ -74,8 +57,8 @@ Access the raw swagger json
|
|
74
57
|
|
75
58
|
open http://localhost:3000/swagger.json
|
76
59
|
|
77
|
-
|
78
|
-
|
60
|
+
|
61
|
+
## Example
|
79
62
|
|
80
63
|
By just using Swaggard you'll get documentation for the endpoints that exist on your service:
|
81
64
|
http method, path, path params. And grouping will be done based on the controller that holds
|
@@ -86,15 +69,23 @@ of the expected inputs and outputs or even change the grouping of the endpoints.
|
|
86
69
|
|
87
70
|
Here is a example of how to use Swaggard
|
88
71
|
|
72
|
+
# config/routes.rb
|
73
|
+
|
74
|
+
resources :users, only: [] do
|
75
|
+
resources :posts, controller: 'users/posts', only: [:index, :create]
|
76
|
+
end
|
77
|
+
|
78
|
+
|
89
79
|
# app/controllers/users/posts_controller.rb
|
90
80
|
|
91
|
-
#
|
92
|
-
#
|
81
|
+
# @tag UsersPosts
|
93
82
|
# API for creating, deleting, and listing user posts.
|
94
|
-
class
|
83
|
+
class Users::PostsController < ActionController::Base
|
95
84
|
|
96
85
|
# Returns the list of user posts
|
97
86
|
#
|
87
|
+
# @response_status 201
|
88
|
+
# @response_root posts
|
98
89
|
# @response_class Array<PostSerializer>
|
99
90
|
def index
|
100
91
|
...
|
@@ -155,10 +146,26 @@ Will generate
|
|
155
146
|

|
156
147
|
|
157
148
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
149
|
+
## Available tags
|
150
|
+
|
151
|
+
### Controllers
|
152
|
+
|
153
|
+
- `@tag name` This is used to indicate under what `name` tag this controller needs to be grouped. If not provided it will use the full controller class name.
|
154
|
+
- `@query_parameter [type] name` This is used to indicate that your action receives the `name` parameter of `type` on the query string.
|
155
|
+
- `@body_parameter [type] name` This is used to indicate that your action receives the `name` parameter of `type` on the body.
|
156
|
+
- `@response_class type` This is used to indicate that your action returns a response of `type`.
|
157
|
+
- `@response_status 200` This is used to indicate the response code of your action when everything goes well.
|
158
|
+
- `@response_root name` This is used to indicate that your action returns its response inside a root key element `name`. If not provided the root is omitted and the response its returned directly.
|
159
|
+
- `@form_parameter`
|
160
|
+
- `@parameter_list`
|
161
|
+
|
162
|
+
### Models
|
163
|
+
|
164
|
+
- `@attr [type] name` This is used to indicate that your models has an attribute `name` of `type`.
|
165
|
+
|
166
|
+
## Primitives
|
167
|
+
|
168
|
+
When one of these types is given Swaggard will handle them directly instead of searching for a definition:
|
162
169
|
|
163
170
|
- integer
|
164
171
|
- long
|
@@ -173,8 +180,8 @@ a definition:
|
|
173
180
|
- password
|
174
181
|
- hash
|
175
182
|
|
176
|
-
|
177
|
-
|
183
|
+
|
184
|
+
## Authentication
|
178
185
|
|
179
186
|
Swaggard supports two types of authentication: header and query.
|
180
187
|
|
@@ -189,8 +196,8 @@ You can configure it as follows:
|
|
189
196
|
|
190
197
|
Even if you provide a authentication_value you can later change it from the ui.
|
191
198
|
|
192
|
-
|
193
|
-
|
199
|
+
|
200
|
+
## Access authorization
|
194
201
|
|
195
202
|
Swaggard supports access authorization.
|
196
203
|
|
@@ -205,8 +212,7 @@ You can configure it as follows:
|
|
205
212
|
If you not set `access_username`, everyone will have access to Swagger documentation.
|
206
213
|
|
207
214
|
|
208
|
-
Additional parameters
|
209
|
-
--------------
|
215
|
+
## Additional parameters
|
210
216
|
|
211
217
|
Swaggard supports additional parameters to be sent on every request, either as a header or as part of the query.
|
212
218
|
|
@@ -221,8 +227,8 @@ type can be 'header' or 'query'.
|
|
221
227
|
If value is provided then it will be used as a default.
|
222
228
|
You can change/set the value for the parameters in the ui.
|
223
229
|
|
224
|
-
|
225
|
-
|
230
|
+
|
231
|
+
## Default content type
|
226
232
|
|
227
233
|
You can set default content type in Swaggard configuration as follows:
|
228
234
|
|
@@ -233,8 +239,8 @@ You can set default content type in Swaggard configuration as follows:
|
|
233
239
|
|
234
240
|
If you set `default_content_type`, Swagger will use it in example request.
|
235
241
|
|
236
|
-
|
237
|
-
|
242
|
+
|
243
|
+
## Language
|
238
244
|
|
239
245
|
You can set the language for SwaggerUI as follows:
|
240
246
|
|
@@ -260,8 +266,8 @@ Supported values are:
|
|
260
266
|
- tr
|
261
267
|
- zh-cn
|
262
268
|
|
263
|
-
|
264
|
-
|
269
|
+
|
270
|
+
## Caching
|
265
271
|
|
266
272
|
You can improve Swagger performance by using caching. You can enable `use_cache` in Swaggard configuration as follows:
|
267
273
|
|
@@ -274,8 +280,9 @@ If you set `use_cache` as `Rails.env.production?`, Swagger will use cache only i
|
|
274
280
|
|
275
281
|
Note. For cache clearing you can execute `rake swaggard:clear_cache`.
|
276
282
|
|
277
|
-
|
278
|
-
|
283
|
+
|
284
|
+
## Documentation Scoping
|
285
|
+
|
279
286
|
Its possible to only generate Swagger documentation for a subset of your application controllers
|
280
287
|
to do this you just need to use the `controllers_path` config option.
|
281
288
|
For instance to only generate documentation for the controllers under `app/controllers/api` you
|
@@ -290,22 +297,20 @@ need do this:
|
|
290
297
|
|
291
298
|
The default value for `controllers_path` is `"#{Rails.root}/app/controllers/**/*.rb"`.
|
292
299
|
|
293
|
-
|
294
|
-
|
300
|
+
|
301
|
+
## More Information
|
295
302
|
|
296
303
|
- [Swagger](http://swagger.io)
|
297
304
|
- [Swagger-ui](https://github.com/wordnik/swagger-ui)
|
298
305
|
- [Yard](https://github.com/lsegal/yard)
|
299
306
|
|
300
307
|
|
301
|
-
Author
|
302
|
-
------
|
308
|
+
## Author
|
303
309
|
|
304
310
|
[Adrian Gomez](https://github.com/adrian-gomez)
|
305
311
|
|
306
312
|
|
307
|
-
Credits
|
308
|
-
-------
|
313
|
+
## Credits
|
309
314
|
|
310
315
|
[Chris Trinh](https://github.com/chtrinh) author of [SwaggerYard](https://github.com/synctv/swagger_yard) in which this gem is
|
311
316
|
inspired and used a base.
|
data/lib/swaggard/engine.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
unless Rails::Application.instance_methods.include?(:assets_manifest)
|
2
2
|
warn <<-END
|
3
|
-
[Swaggard] It seems you are using an api only rails setup but swaggard
|
4
|
-
[Swaggard] neeeds sprockets in order to work
|
5
|
-
[Swaggard]
|
3
|
+
[Swaggard] It seems you are using an api only rails setup, but swaggard
|
4
|
+
[Swaggard] neeeds sprockets in order to work so its going to require it.
|
5
|
+
[Swaggard] This might have undesired side effects, if thats not the case
|
6
|
+
[Swaggard] you can ignore this warning.
|
6
7
|
END
|
7
8
|
require 'sprockets/railtie'
|
8
9
|
end
|
@@ -5,7 +5,6 @@ require_relative 'parameters/path'
|
|
5
5
|
require_relative 'parameters/query'
|
6
6
|
|
7
7
|
require_relative 'response'
|
8
|
-
require_relative 'default_response'
|
9
8
|
|
10
9
|
module Swaggard
|
11
10
|
module Swagger
|
@@ -37,7 +36,11 @@ module Swaggard
|
|
37
36
|
when 'parameter_list'
|
38
37
|
@parameters << Parameters::List.new(value)
|
39
38
|
when 'response_class'
|
40
|
-
|
39
|
+
success_response.response_class = value
|
40
|
+
when 'response_status'
|
41
|
+
success_response.status_code = value
|
42
|
+
when 'response_root'
|
43
|
+
success_response.response_root = value
|
41
44
|
end
|
42
45
|
end
|
43
46
|
|
@@ -45,7 +48,7 @@ module Swaggard
|
|
45
48
|
|
46
49
|
@parameters.sort_by { |parameter| parameter.name }
|
47
50
|
|
48
|
-
@responses <<
|
51
|
+
@responses << success_response
|
49
52
|
end
|
50
53
|
|
51
54
|
def valid?
|
@@ -69,11 +72,17 @@ module Swaggard
|
|
69
72
|
end
|
70
73
|
|
71
74
|
def definitions
|
72
|
-
@
|
75
|
+
@responses.map(&:definition).compact.tap do |definitions|
|
76
|
+
definitions << @body_parameter.definition if @body_parameter
|
77
|
+
end
|
73
78
|
end
|
74
79
|
|
75
80
|
private
|
76
81
|
|
82
|
+
def success_response
|
83
|
+
@success_response ||= Response.new("#{@tag.controller_class.to_s}.#{@name}")
|
84
|
+
end
|
85
|
+
|
77
86
|
def body_parameter
|
78
87
|
return @body_parameter if @body_parameter
|
79
88
|
|
@@ -98,4 +107,4 @@ module Swaggard
|
|
98
107
|
|
99
108
|
end
|
100
109
|
end
|
101
|
-
end
|
110
|
+
end
|
@@ -2,52 +2,87 @@ module Swaggard
|
|
2
2
|
module Swagger
|
3
3
|
class Response
|
4
4
|
|
5
|
-
|
5
|
+
DEFAULT_STATUS_CODE = 'default'
|
6
|
+
DEFAULT_DESCRIPTION = 'successful operation'
|
7
|
+
PRIMITIVE_TYPES = %w[integer long float double string byte binary boolean date date-time password hash]
|
6
8
|
|
7
|
-
|
9
|
+
attr_writer :status_code, :description
|
8
10
|
|
9
|
-
def initialize(
|
10
|
-
@
|
11
|
-
|
11
|
+
def initialize(operation_name)
|
12
|
+
@operation_name = operation_name
|
13
|
+
@response_model = ResponseModel.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def definition
|
17
|
+
return unless @response_root.present?
|
18
|
+
|
19
|
+
@definition ||= Definition.new("#{@operation_name}_response").tap do |definition|
|
20
|
+
definition.add_property(@response_model)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def status_code
|
25
|
+
@status_code || DEFAULT_STATUS_CODE
|
26
|
+
end
|
27
|
+
|
28
|
+
def response_class=(value)
|
29
|
+
@response_model.parse(value)
|
30
|
+
end
|
31
|
+
|
32
|
+
def response_root=(root)
|
33
|
+
@response_root = root
|
34
|
+
@response_model.id = root
|
35
|
+
end
|
36
|
+
|
37
|
+
def description
|
38
|
+
@description || DEFAULT_DESCRIPTION
|
12
39
|
end
|
13
40
|
|
14
41
|
def to_doc
|
15
|
-
{
|
16
|
-
|
17
|
-
|
18
|
-
|
42
|
+
{ 'description' => description }.tap do |doc|
|
43
|
+
schema = if @response_root.present?
|
44
|
+
{ '$ref' => "#/definitions/#{definition.id}" }
|
45
|
+
elsif @response_model.response_class.present?
|
46
|
+
@response_model.to_doc
|
47
|
+
end
|
48
|
+
|
49
|
+
doc.merge!('schema' => schema) if schema
|
50
|
+
end
|
19
51
|
end
|
20
52
|
|
21
53
|
private
|
22
54
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
if @is_array_response
|
34
|
-
{
|
35
|
-
'type' => 'array',
|
36
|
-
'items' => response_class_type
|
37
|
-
}
|
38
|
-
else
|
39
|
-
response_class_type
|
55
|
+
class ResponseModel
|
56
|
+
attr_accessor :id, :response_class
|
57
|
+
|
58
|
+
def parse(value)
|
59
|
+
@is_array_response = value =~ /Array/
|
60
|
+
@response_class = if @is_array_response
|
61
|
+
value.match(/^Array<(.*)>$/)[1]
|
62
|
+
else
|
63
|
+
value
|
64
|
+
end
|
40
65
|
end
|
41
|
-
end
|
42
66
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
67
|
+
def to_doc
|
68
|
+
if @is_array_response
|
69
|
+
{
|
70
|
+
'type' => 'array',
|
71
|
+
'items' => response_class_type
|
72
|
+
}
|
73
|
+
else
|
74
|
+
response_class_type
|
75
|
+
end
|
48
76
|
end
|
49
|
-
end
|
50
77
|
|
78
|
+
def response_class_type
|
79
|
+
if PRIMITIVE_TYPES.include?(@response_class)
|
80
|
+
{ 'type' => @response_class }
|
81
|
+
else
|
82
|
+
{ '$ref' => "#/definitions/#@response_class" }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
51
86
|
end
|
52
87
|
end
|
53
|
-
end
|
88
|
+
end
|
data/lib/swaggard/version.rb
CHANGED
data/lib/swaggard.rb
CHANGED
@@ -28,6 +28,8 @@ module Swaggard
|
|
28
28
|
::YARD::Tags::Library.define_tag('Body parameter', :body_parameter)
|
29
29
|
::YARD::Tags::Library.define_tag('Parameter list', :parameter_list)
|
30
30
|
::YARD::Tags::Library.define_tag('Response class', :response_class)
|
31
|
+
::YARD::Tags::Library.define_tag('Response Root', :response_root)
|
32
|
+
::YARD::Tags::Library.define_tag('Response Status', :response_status)
|
31
33
|
end
|
32
34
|
|
33
35
|
def get_doc(host)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swaggard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrian Gomez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -167,7 +167,6 @@ files:
|
|
167
167
|
- lib/swaggard/parsers/controllers.rb
|
168
168
|
- lib/swaggard/parsers/models.rb
|
169
169
|
- lib/swaggard/parsers/routes.rb
|
170
|
-
- lib/swaggard/swagger/default_response.rb
|
171
170
|
- lib/swaggard/swagger/definition.rb
|
172
171
|
- lib/swaggard/swagger/operation.rb
|
173
172
|
- lib/swaggard/swagger/parameters/base.rb
|