swagger-blocks 1.0.1 → 1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/README.md +168 -75
- data/README_v1_2.md +141 -0
- data/lib/swagger/blocks.rb +432 -90
- data/lib/swagger/blocks/version.rb +1 -1
- data/spec/lib/swagger_blocks_spec.rb +2 -2
- data/spec/lib/swagger_v2_api_declaration.json +224 -0
- data/spec/lib/swagger_v2_blocks_spec.rb +256 -0
- metadata +21 -16
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZjUzZjViYWFkYTk0MGVkN2RmNWZlYWIzZjI1NzQ1MDUxNTIzYjA5Nw==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e0c8a26e0663e8e18c42ed476d2dd128e7184c15
|
4
|
+
data.tar.gz: 3dc1e0bb361a8f961465147a7d17b380a880a4d8
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
YjRkZjM5NDJhNDIxYzcxZTJkMjRhNGRhMzFjNTNmZjBmZjUzNzg0Y2FkMTMz
|
11
|
-
YzIyODRlODdkM2Y4NWVkY2M0ZjYzNWY1ZjU3ZGI0MWE5MWVmODE=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NjQzZDFhYzllNmUyNDg0NTQ3NzgzYjI0ZTNmODdmMzBjN2I5MDU4NWNiZDEw
|
14
|
-
NDQ4OGJlZTA0MzNlNTdmNjRjMzc0YWZjODIxOWM5Y2VlMzA2NDhmMDczMjE1
|
15
|
-
NjJkZmQ1ZTU3Y2FlM2NmOGIzZGU4MWIwZWY3YmUyMjRjZWUyYjM=
|
6
|
+
metadata.gz: 20d0a772640b989d013bd24571080428811255eb74aa62458341c4bd1ae0641ccbc43fa08f9d9ba4983baf9bbebb9d900b5b88464b6effcacc89d31ba039895b
|
7
|
+
data.tar.gz: e9fe5b2e5e4ac9ac7bd86ec124ae13d1fe2ef076f94b8c9ba6b65f2d6bfbcfad83d93672fe80b0566dd7dc5086ba8a86db9951f35a0cb6b0c987e28cb80dba4a
|
data/README.md
CHANGED
@@ -11,8 +11,8 @@ It helps you write API docs in the [Swagger](https://helloreverb.com/developers/
|
|
11
11
|
|
12
12
|
* Supports **live updating** by design. Change code, refresh your API docs.
|
13
13
|
* **Works with all Ruby web frameworks** including Rails, Sinatra, etc.
|
14
|
-
* **100% support** for all features of the [Swagger 1.2
|
15
|
-
* Flexible—you can use Swagger::Blocks anywhere, split up blocks to fit your style preferences, etc. Since it's pure Ruby and serves definitions dynamically, you can easily use initializers/config objects to change values or even show
|
14
|
+
* **100% support** for all features of the [Swagger 1.2](https://github.com/wordnik/swagger-spec/blob/master/versions/1.2.md) and [Swagger 2.0](https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md) specs.
|
15
|
+
* Flexible—you can use Swagger::Blocks anywhere, split up blocks to fit your style preferences, etc. Since it's pure Ruby and serves definitions dynamically, you can easily use initializers/config objects to change values or even **show different APIs based on environment**.
|
16
16
|
* 1:1 naming with the Swagger spec—block names and nesting should match almost exactly with the swagger spec, with rare exceptions to make things more convenient.
|
17
17
|
|
18
18
|
## Swagger UI demo
|
@@ -26,101 +26,190 @@ http://petstore.swagger.wordnik.com/#!/pet
|
|
26
26
|
Add this line to your application's Gemfile:
|
27
27
|
|
28
28
|
gem 'swagger-blocks'
|
29
|
-
|
30
|
-
Or install directly with `gem install swagger-blocks`.
|
31
29
|
|
32
|
-
|
30
|
+
Or install directly with `gem install swagger-blocks`.
|
33
31
|
|
34
|
-
|
32
|
+
## Swagger 2.0 example (Rails)
|
35
33
|
|
36
|
-
|
34
|
+
This is a simplified example based on the objects in the Petstore [Swagger Sample App](http://petstore.swagger.wordnik.com/#!/pet). For a more complex and complete example, see the [swagger_v2_blocks_spec.rb](https://github.com/fotinakis/swagger-blocks/blob/master/spec/lib/swagger_v2_blocks_spec.rb) file, or see the [v1.2 docs](https://github.com/fotinakis/swagger-blocks/blob/master/README_v1_2.md).
|
37
35
|
|
38
|
-
|
36
|
+
Also note that **Rails is not required**, you can use Swagger::Blocks in plain Ruby objects.
|
39
37
|
|
40
|
-
|
38
|
+
### PetsController
|
41
39
|
|
42
40
|
```Ruby
|
43
41
|
class PetsController < ActionController::Base
|
44
42
|
include Swagger::Blocks
|
45
43
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
key :
|
55
|
-
key :
|
56
|
-
key :
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
key :
|
62
|
-
|
63
|
-
|
64
|
-
|
44
|
+
swagger_path '/pets/{id}' do
|
45
|
+
operation :get do
|
46
|
+
key :description, 'Returns a single pet if the user has access'
|
47
|
+
key :operationId, 'findPetById'
|
48
|
+
parameter do
|
49
|
+
key :name, :id
|
50
|
+
key :in, :path
|
51
|
+
key :description, 'ID of pet to fetch'
|
52
|
+
key :required, true
|
53
|
+
key :type, :integer
|
54
|
+
key :format, :int64
|
55
|
+
end
|
56
|
+
response 200 do
|
57
|
+
key :description, 'pet response'
|
58
|
+
schema do
|
59
|
+
key :'$ref', :Pet
|
60
|
+
end
|
61
|
+
end
|
62
|
+
response :default do
|
63
|
+
key :description, 'unexpected error'
|
64
|
+
schema do
|
65
|
+
key :'$ref', :ErrorModel
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
swagger_path '/pets' do
|
71
|
+
operation :get do
|
72
|
+
key :description, 'Returns all pets from the system that the user has access to'
|
73
|
+
key :operationId, 'findPets'
|
74
|
+
key :produces, [
|
75
|
+
'application/json',
|
76
|
+
'text/html',
|
77
|
+
]
|
78
|
+
parameter do
|
79
|
+
key :name, :tags
|
80
|
+
key :in, :query
|
81
|
+
key :description, 'tags to filter by'
|
82
|
+
key :required, false
|
83
|
+
key :type, :array
|
84
|
+
items do
|
85
|
+
key :type, :string
|
65
86
|
end
|
66
|
-
|
67
|
-
|
68
|
-
|
87
|
+
key :collectionFormat, :csv
|
88
|
+
end
|
89
|
+
parameter do
|
90
|
+
key :name, :limit
|
91
|
+
key :in, :query
|
92
|
+
key :description, 'maximum number of results to return'
|
93
|
+
key :required, false
|
94
|
+
key :type, :integer
|
95
|
+
key :format, :int32
|
96
|
+
end
|
97
|
+
response 200 do
|
98
|
+
key :description, 'pet response'
|
99
|
+
schema do
|
100
|
+
key :type, :array
|
101
|
+
items do
|
102
|
+
key :'$ref', :Pet
|
103
|
+
end
|
69
104
|
end
|
70
|
-
|
71
|
-
|
72
|
-
|
105
|
+
end
|
106
|
+
response :default do
|
107
|
+
key :description, 'unexpected error'
|
108
|
+
schema do
|
109
|
+
key :'$ref', :ErrorModel
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
operation :post do
|
114
|
+
key :description, 'Creates a new pet in the store. Duplicates are allowed'
|
115
|
+
key :operationId, 'addPet'
|
116
|
+
key :produces, [
|
117
|
+
'application/json'
|
118
|
+
]
|
119
|
+
parameter do
|
120
|
+
key :name, :pet
|
121
|
+
key :in, :body
|
122
|
+
key :description, 'Pet to add to the store'
|
123
|
+
key :required, true
|
124
|
+
schema do
|
125
|
+
key :'$ref', :PetInput
|
126
|
+
end
|
127
|
+
end
|
128
|
+
response 200 do
|
129
|
+
key :description, 'pet response'
|
130
|
+
schema do
|
131
|
+
key :'$ref', :Pet
|
132
|
+
end
|
133
|
+
end
|
134
|
+
response :default do
|
135
|
+
key :description, 'unexpected error'
|
136
|
+
schema do
|
137
|
+
key :'$ref', :ErrorModel
|
73
138
|
end
|
74
139
|
end
|
75
140
|
end
|
76
141
|
end
|
77
|
-
|
142
|
+
|
78
143
|
# ...
|
79
144
|
end
|
80
145
|
```
|
81
146
|
|
147
|
+
### Models
|
148
|
+
|
82
149
|
#### Pet model
|
83
150
|
|
84
151
|
```Ruby
|
85
152
|
class Pet < ActiveRecord::Base
|
86
153
|
include Swagger::Blocks
|
87
154
|
|
88
|
-
|
89
|
-
key :id, :Pet
|
155
|
+
swagger_schema :Pet do
|
90
156
|
key :required, [:id, :name]
|
91
157
|
property :id do
|
92
158
|
key :type, :integer
|
93
159
|
key :format, :int64
|
94
|
-
key :description, 'unique identifier for the pet'
|
95
|
-
key :minimum, '0.0'
|
96
|
-
key :maximum, '100.0'
|
97
160
|
end
|
98
161
|
property :name do
|
99
162
|
key :type, :string
|
100
163
|
end
|
101
|
-
property :
|
102
|
-
key :type, :
|
103
|
-
|
104
|
-
|
164
|
+
property :tag do
|
165
|
+
key :type, :string
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
swagger_schema :PetInput do
|
170
|
+
allOf do
|
171
|
+
schema do
|
172
|
+
key :'$ref', :Pet
|
105
173
|
end
|
174
|
+
schema do
|
175
|
+
key :required, [:name]
|
176
|
+
property :id do
|
177
|
+
key :type, :integer
|
178
|
+
key :format, :int64
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
# ...
|
185
|
+
end
|
186
|
+
```
|
187
|
+
|
188
|
+
#### Error model
|
189
|
+
|
190
|
+
``` Ruby
|
191
|
+
class ErrorModel # Notice, this is just a plain ruby object.
|
192
|
+
include Swagger::Blocks
|
193
|
+
|
194
|
+
swagger_schema :ErrorModel do
|
195
|
+
key :required, [:code, :message]
|
196
|
+
property :code do
|
197
|
+
key :type, :integer
|
198
|
+
key :format, :int32
|
106
199
|
end
|
107
|
-
property :
|
200
|
+
property :message do
|
108
201
|
key :type, :string
|
109
|
-
key :description, 'pet status in the store'
|
110
|
-
key :enum, [:available, :pending, :sold]
|
111
202
|
end
|
112
203
|
end
|
113
|
-
|
114
|
-
# ...
|
115
204
|
end
|
116
205
|
```
|
117
206
|
|
118
|
-
|
207
|
+
### Docs controller
|
119
208
|
|
120
209
|
To integrate these definitions with Swagger UI, we need a docs controller that can serve the JSON definitions.
|
121
210
|
|
122
211
|
```Ruby
|
123
|
-
resources :apidocs, only: [:index
|
212
|
+
resources :apidocs, only: [:index]
|
124
213
|
```
|
125
214
|
|
126
215
|
```Ruby
|
@@ -128,52 +217,53 @@ class ApidocsController < ActionController::Base
|
|
128
217
|
include Swagger::Blocks
|
129
218
|
|
130
219
|
swagger_root do
|
131
|
-
key :
|
132
|
-
key :apiVersion, '1.0.0'
|
220
|
+
key :swagger, '2.0'
|
133
221
|
info do
|
134
|
-
key :
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
key :
|
222
|
+
key :version, '1.0.0'
|
223
|
+
key :title, 'Swagger Petstore'
|
224
|
+
key :description, 'A sample API that uses a petstore as an example to ' \
|
225
|
+
'demonstrate features in the swagger-2.0 specification'
|
226
|
+
key :termsOfService, 'http://helloreverb.com/terms/'
|
227
|
+
contact do
|
228
|
+
key :name, 'Wordnik API Team'
|
229
|
+
end
|
230
|
+
license do
|
231
|
+
key :name, 'MIT'
|
232
|
+
end
|
139
233
|
end
|
234
|
+
key :host, 'petstore.swagger.wordnik.com'
|
235
|
+
key :basePath, '/api'
|
236
|
+
key :consumes, ['application/json']
|
237
|
+
key :produces, ['application/json']
|
140
238
|
end
|
141
|
-
|
239
|
+
|
142
240
|
# A list of all classes that have swagger_* declarations.
|
143
241
|
SWAGGERED_CLASSES = [
|
144
242
|
PetsController,
|
145
|
-
|
243
|
+
Pet,
|
244
|
+
ErrorModel,
|
146
245
|
self,
|
147
246
|
].freeze
|
148
|
-
|
247
|
+
|
149
248
|
def index
|
150
249
|
render json: Swagger::Blocks.build_root_json(SWAGGERED_CLASSES)
|
151
250
|
end
|
152
|
-
|
153
|
-
def show
|
154
|
-
render json: Swagger::Blocks.build_api_json(params[:id], SWAGGERED_CLASSES)
|
155
|
-
end
|
156
251
|
end
|
157
|
-
|
158
252
|
```
|
159
253
|
|
160
|
-
The special part of this controller
|
161
|
-
|
162
|
-
```Ruby
|
163
|
-
render json: Swagger::Blocks.build_root_json(SWAGGERED_CLASSES)
|
164
|
-
```
|
254
|
+
The special part of this controller is this line:
|
165
255
|
|
166
256
|
```Ruby
|
167
|
-
render json: Swagger::Blocks.
|
257
|
+
render json: Swagger::Blocks.build_root_json(swaggered_classes)
|
168
258
|
```
|
169
259
|
|
170
|
-
|
260
|
+
That is the only line necessary to build the full [root Swagger object](https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#schema) JSON and all definitions underneath it. You simply pass in a list of all the "swaggered" classes in your app.
|
171
261
|
|
172
262
|
Now, simply point Swagger UI at `/apidocs` and everything should Just Work™. If you change any of the Swagger block definitions, you can simply refresh Swagger UI to see the changes.
|
173
263
|
|
174
264
|
## Reference
|
175
265
|
|
176
|
-
See the [
|
266
|
+
See the [swagger_v2_blocks_spec.rb](https://github.com/fotinakis/swagger-blocks/blob/master/spec/lib/swagger_v2_blocks_spec.rb) for examples of more complex features and declarations possible.
|
177
267
|
|
178
268
|
## Contributing
|
179
269
|
|
@@ -185,9 +275,12 @@ See the [swagger_blocks_spec.rb](https://github.com/fotinakis/swagger-blocks/blo
|
|
185
275
|
|
186
276
|
## Release notes
|
187
277
|
|
278
|
+
* v1.1: Support for Swagger 2.0 spec.
|
188
279
|
* v1.0.1: Make backwards-compatible with Ruby 1.9.3.
|
189
280
|
* v1.0.0: Initial major release.
|
190
281
|
|
191
282
|
## Credits
|
192
283
|
|
193
|
-
|
284
|
+
Thanks to [@ali-graham](https://github.com/ali-graham) for contributing support for Swagger 2.0.
|
285
|
+
|
286
|
+
Original idea inspired by [@richhollis](https://github.com/richhollis/)'s [swagger-docs](https://github.com/richhollis/swagger-docs/) gem.
|
data/README_v1_2.md
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
# Swagger 1.2 example (Rails)
|
2
|
+
|
3
|
+
This is a simplified example based on the objects in the Petstore [Swagger Sample App](http://petstore.swagger.wordnik.com/#!/pet). For a more complex and complete example, see the [swagger_blocks_spec.rb](https://github.com/fotinakis/swagger-blocks/blob/master/spec/lib/swagger_blocks_spec.rb) file.
|
4
|
+
|
5
|
+
Also note that Rails is not required, you can use Swagger::Blocks with any Ruby web framework.
|
6
|
+
|
7
|
+
### PetsController
|
8
|
+
|
9
|
+
Parameters and features below are defined by the [Swagger 1.2 spec](https://github.com/wordnik/swagger-spec/blob/master/versions/1.2.md).
|
10
|
+
|
11
|
+
```Ruby
|
12
|
+
class PetsController < ActionController::Base
|
13
|
+
include Swagger::Blocks
|
14
|
+
|
15
|
+
swagger_api_root :pets do
|
16
|
+
key :swaggerVersion, '1.2'
|
17
|
+
key :apiVersion, '1.0.0'
|
18
|
+
key :basePath, 'http://petstore.swagger.wordnik.com/api'
|
19
|
+
key :resourcePath, '/pets'
|
20
|
+
api do
|
21
|
+
key :path, '/pets/{petId}'
|
22
|
+
operation do
|
23
|
+
key :method, 'GET'
|
24
|
+
key :summary, 'Find pet by ID'
|
25
|
+
key :notes, 'Returns a pet based on ID'
|
26
|
+
key :type, :Pet
|
27
|
+
key :nickname, :getPetById
|
28
|
+
parameter do
|
29
|
+
key :paramType, :path
|
30
|
+
key :name, :petId
|
31
|
+
key :description, 'ID of pet that needs to be fetched'
|
32
|
+
key :required, true
|
33
|
+
key :type, :integer
|
34
|
+
end
|
35
|
+
response_message do
|
36
|
+
key :code, 400
|
37
|
+
key :message, 'Invalid ID supplied'
|
38
|
+
end
|
39
|
+
response_message do
|
40
|
+
key :code, 404
|
41
|
+
key :message, 'Pet not found'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# ...
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
### Pet model
|
52
|
+
|
53
|
+
```Ruby
|
54
|
+
class Pet < ActiveRecord::Base
|
55
|
+
include Swagger::Blocks
|
56
|
+
|
57
|
+
swagger_model :Pet do
|
58
|
+
key :id, :Pet
|
59
|
+
key :required, [:id, :name]
|
60
|
+
property :id do
|
61
|
+
key :type, :integer
|
62
|
+
key :format, :int64
|
63
|
+
key :description, 'unique identifier for the pet'
|
64
|
+
key :minimum, '0.0'
|
65
|
+
key :maximum, '100.0'
|
66
|
+
end
|
67
|
+
property :name do
|
68
|
+
key :type, :string
|
69
|
+
end
|
70
|
+
property :photoUrls do
|
71
|
+
key :type, :array
|
72
|
+
items do
|
73
|
+
key :type, :string
|
74
|
+
end
|
75
|
+
end
|
76
|
+
property :status do
|
77
|
+
key :type, :string
|
78
|
+
key :description, 'pet status in the store'
|
79
|
+
key :enum, [:available, :pending, :sold]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# ...
|
84
|
+
end
|
85
|
+
```
|
86
|
+
|
87
|
+
### Docs controller
|
88
|
+
|
89
|
+
To integrate these definitions with Swagger UI, we need a docs controller that can serve the JSON definitions.
|
90
|
+
|
91
|
+
```Ruby
|
92
|
+
resources :apidocs, only: [:index, :show]
|
93
|
+
```
|
94
|
+
|
95
|
+
```Ruby
|
96
|
+
class ApidocsController < ActionController::Base
|
97
|
+
include Swagger::Blocks
|
98
|
+
|
99
|
+
swagger_root do
|
100
|
+
key :swaggerVersion, '1.2'
|
101
|
+
key :apiVersion, '1.0.0'
|
102
|
+
info do
|
103
|
+
key :title, 'Swagger Sample App'
|
104
|
+
end
|
105
|
+
api do
|
106
|
+
key :path, '/pets'
|
107
|
+
key :description, 'Operations about pets'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# A list of all classes that have swagger_* declarations.
|
112
|
+
SWAGGERED_CLASSES = [
|
113
|
+
PetsController,
|
114
|
+
Pets,
|
115
|
+
self,
|
116
|
+
].freeze
|
117
|
+
|
118
|
+
def index
|
119
|
+
render json: Swagger::Blocks.build_root_json(SWAGGERED_CLASSES)
|
120
|
+
end
|
121
|
+
|
122
|
+
def show
|
123
|
+
render json: Swagger::Blocks.build_api_json(params[:id], SWAGGERED_CLASSES)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
```
|
128
|
+
|
129
|
+
The special part of this controller are these lines:
|
130
|
+
|
131
|
+
```Ruby
|
132
|
+
render json: Swagger::Blocks.build_root_json(SWAGGERED_CLASSES)
|
133
|
+
```
|
134
|
+
|
135
|
+
```Ruby
|
136
|
+
render json: Swagger::Blocks.build_api_json(params[:id], SWAGGERED_CLASSES)
|
137
|
+
```
|
138
|
+
|
139
|
+
Those are the only lines necessary to build the root Swagger [Resource Listing](https://github.com/wordnik/swagger-spec/blob/master/versions/1.2.md#51-resource-listing) JSON and the JSON for each Swagger [API Declaration](https://github.com/wordnik/swagger-spec/blob/master/versions/1.2.md#52-api-declaration). You simply pass in a list of all the "swaggered" classes in your app.
|
140
|
+
|
141
|
+
Now, simply point Swagger UI at `/apidocs` and everything should Just Work™. If you change any of the Swagger block definitions, you can simply refresh Swagger UI to see the changes.
|