swagger-blocks 1.2.0 → 1.3.0
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/.travis.yml +4 -0
- data/README.md +55 -1
- data/lib/swagger/blocks.rb +107 -102
- data/lib/swagger/blocks/version.rb +1 -1
- data/spec/lib/swagger_blocks_spec.rb +18 -40
- data/spec/lib/swagger_v2_blocks_spec.rb +10 -21
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c7496406adf0203039b05240d05884c3797dbe6
|
4
|
+
data.tar.gz: 04a0a51888a8984b63b0ba0e5afd1e7b1e1f69d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8741eca62a459b7efa76feafd0437f4659d964013776ac719cf84d654139917ea2d64827583dd2b1236014bdf728d49b37138e081f7d7dffe59340da783d5d38
|
7
|
+
data.tar.gz: aa8fa55c5e433bf6dd0aa02ab64a527639985a9409ec8e518e300db2b972b35c17134b92260375ae6bec2dc51b0e2774d70382a338793028938dc78f62f3cbb1
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -17,7 +17,7 @@ It helps you write API docs in the [Swagger](https://helloreverb.com/developers/
|
|
17
17
|
|
18
18
|
## Swagger UI demo
|
19
19
|
|
20
|
-
http://petstore.swagger.
|
20
|
+
http://petstore.swagger.io/
|
21
21
|
|
22
22
|

|
23
23
|
|
@@ -331,6 +331,37 @@ The `key` block simply takes the value you give and puts it directly into the fi
|
|
331
331
|
key :foo, {some_complex: {nested_object: true}}
|
332
332
|
```
|
333
333
|
|
334
|
+
#### Inline keys
|
335
|
+
|
336
|
+
It is possible to omit numerous `key` calls using inline hash keys on any block.
|
337
|
+
|
338
|
+
All three calls are equivalent:
|
339
|
+
|
340
|
+
```ruby
|
341
|
+
parameter do
|
342
|
+
key :paramType, :path
|
343
|
+
key :name, :petId
|
344
|
+
key :description, 'ID of pet that needs to be fetched'
|
345
|
+
key :type, :string
|
346
|
+
end
|
347
|
+
```
|
348
|
+
|
349
|
+
```ruby
|
350
|
+
parameter paramType: :path, name: :petId do
|
351
|
+
key :description, 'ID of pet that needs to be fetched'
|
352
|
+
key :type, :string
|
353
|
+
end
|
354
|
+
```
|
355
|
+
|
356
|
+
```ruby
|
357
|
+
parameter paramType: :path,
|
358
|
+
name: :petId,
|
359
|
+
description: 'ID of pet that needs to be fetched',
|
360
|
+
type: :string
|
361
|
+
```
|
362
|
+
|
363
|
+
These inline keys can be used on any block, not just `parameter` blocks.
|
364
|
+
|
334
365
|
#### Writing JSON to a file
|
335
366
|
|
336
367
|
If you are not serving the JSON directly and need to write it to a file for some reason, you can easily use `build_root_json` for that as well:
|
@@ -340,6 +371,16 @@ swagger_data = Swagger::Blocks.build_root_json(SWAGGERED_CLASSES)
|
|
340
371
|
File.open('swagger.json', 'w') { |file| file.write(swagger_data.to_json) }
|
341
372
|
```
|
342
373
|
|
374
|
+
#### Overriding attributes
|
375
|
+
|
376
|
+
If certain attributes must be customized on-the-fly, you can merge a hash containing the customized values on the returned JSON. You can wrap ```build_root_json``` inside your own method:
|
377
|
+
|
378
|
+
```Ruby
|
379
|
+
def build_and_override_root_json(overrides = {})
|
380
|
+
Swagger::Blocks.build_root_json(SWAGGERED_CLASSES).merge(overrides)
|
381
|
+
end
|
382
|
+
```
|
383
|
+
|
343
384
|
### Swagger 1.2 example (Rails)
|
344
385
|
|
345
386
|
See the [v1.2 docs](https://github.com/fotinakis/swagger-blocks/blob/master/README_v1_2.md).
|
@@ -358,8 +399,21 @@ See the [swagger_v2_blocks_spec.rb](https://github.com/fotinakis/swagger-blocks/
|
|
358
399
|
|
359
400
|
Throw a ★ on it! :)
|
360
401
|
|
402
|
+
## Filing issues
|
403
|
+
|
404
|
+
**Please DO [file an issue](https://github.com/fotinakis/swagger-blocks/issues)**:
|
405
|
+
|
406
|
+
- If you find a bug or some part of the Swagger 2.0 spec that swagger-blocks does not support.
|
407
|
+
- To propose and discuss a code change before submitting a PR for it.
|
408
|
+
- To talk about anything related specifically to swagger-blocks, not Swagger itself.
|
409
|
+
|
410
|
+
**Please DO NOT file an issue**:
|
411
|
+
|
412
|
+
- If you have a question about Swagger or Swagger UI. We simply cannot support all Swagger-related questions. Check out the http://swagger.io/community/ for help.
|
413
|
+
|
361
414
|
## Release notes
|
362
415
|
|
416
|
+
* v1.3.0: Added support for condensed syntax via inline keys on every block.
|
363
417
|
* v1.2.0: Improved support for `$ref` Path Item Object parameters.
|
364
418
|
* v1.1.3: Rename tags directive to tag for consistency.
|
365
419
|
* v1.1.2: Bugfix for security definition support.
|
data/lib/swagger/blocks.rb
CHANGED
@@ -113,8 +113,8 @@ module Swagger
|
|
113
113
|
# v1.2: http://goo.gl/PvwUXj#51-resource-listing
|
114
114
|
# v2.0: Defines a Swagger Object
|
115
115
|
# v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#swagger-object
|
116
|
-
def swagger_root(&block)
|
117
|
-
@swagger_root_node ||= Swagger::Blocks::RootNode.call(&block)
|
116
|
+
def swagger_root(inline_keys = nil, &block)
|
117
|
+
@swagger_root_node ||= Swagger::Blocks::RootNode.call(inline_keys: inline_keys, &block)
|
118
118
|
end
|
119
119
|
|
120
120
|
# v1.2: Defines a Swagger API Declaration.
|
@@ -122,7 +122,7 @@ module Swagger
|
|
122
122
|
# v1.2:
|
123
123
|
# v1.2: @param resource_name [Symbol] An identifier for this API. All swagger_api_root declarations
|
124
124
|
# v1.2: with the same resource_name will be into a single API root node.
|
125
|
-
def swagger_api_root(resource_name, &block)
|
125
|
+
def swagger_api_root(resource_name, inline_keys = nil, &block)
|
126
126
|
resource_name = resource_name.to_sym
|
127
127
|
|
128
128
|
# Map of path names to ApiDeclarationNodes.
|
@@ -136,7 +136,7 @@ module Swagger
|
|
136
136
|
api_node.instance_eval(&block)
|
137
137
|
else
|
138
138
|
# First time we've seen this `swagger_api_root :resource_name`.
|
139
|
-
api_node = Swagger::Blocks::ApiDeclarationNode.call(version: '1.2', &block)
|
139
|
+
api_node = Swagger::Blocks::ApiDeclarationNode.call(version: '1.2', inline_keys: inline_keys, &block)
|
140
140
|
end
|
141
141
|
|
142
142
|
# Add it into the resource_name to node map (may harmlessly overwrite the same object).
|
@@ -165,16 +165,16 @@ module Swagger
|
|
165
165
|
|
166
166
|
# v1.2: Defines a Swagger Model.
|
167
167
|
# v1.2: http://goo.gl/PvwUXj#526-models-object
|
168
|
-
def swagger_model(name, &block)
|
168
|
+
def swagger_model(name, inline_keys = nil, &block)
|
169
169
|
@swagger_models_node ||= Swagger::Blocks::ModelsNode.new
|
170
170
|
@swagger_models_node.version = '1.2'
|
171
|
-
@swagger_models_node.model(name, &block)
|
171
|
+
@swagger_models_node.model(name, inline_keys, &block)
|
172
172
|
end
|
173
173
|
|
174
174
|
# v2.0: Defines a Swagger Definition Schema,
|
175
175
|
# v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#definitionsObject and
|
176
176
|
# v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#schema-object
|
177
|
-
def swagger_schema(name, &block)
|
177
|
+
def swagger_schema(name, inline_keys = nil, &block)
|
178
178
|
@swagger_schema_node_map ||= {}
|
179
179
|
|
180
180
|
schema_node = @swagger_schema_node_map[name]
|
@@ -183,7 +183,7 @@ module Swagger
|
|
183
183
|
schema_node.instance_eval(&block)
|
184
184
|
else
|
185
185
|
# First time we've seen this schema_node
|
186
|
-
@swagger_schema_node_map[name] = Swagger::Blocks::SchemaNode.call(version: '2.0', &block)
|
186
|
+
@swagger_schema_node_map[name] = Swagger::Blocks::SchemaNode.call(version: '2.0', inline_keys: inline_keys, &block)
|
187
187
|
end
|
188
188
|
end
|
189
189
|
|
@@ -217,7 +217,8 @@ module Swagger
|
|
217
217
|
instance = new
|
218
218
|
instance.name = options[:name] if options[:name]
|
219
219
|
instance.version = options[:version]
|
220
|
-
instance.
|
220
|
+
instance.keys options[:inline_keys]
|
221
|
+
instance.instance_eval(&block) if block
|
221
222
|
instance
|
222
223
|
end
|
223
224
|
|
@@ -248,6 +249,10 @@ module Swagger
|
|
248
249
|
@data ||= {}
|
249
250
|
end
|
250
251
|
|
252
|
+
def keys(data)
|
253
|
+
self.data.merge!(data) if data
|
254
|
+
end
|
255
|
+
|
251
256
|
def key(key, value)
|
252
257
|
self.data[key] = value
|
253
258
|
end
|
@@ -288,60 +293,60 @@ module Swagger
|
|
288
293
|
api_paths.include?(api_path)
|
289
294
|
end
|
290
295
|
|
291
|
-
def authorization(name, &block)
|
296
|
+
def authorization(name, inline_keys = nil, &block)
|
292
297
|
raise NotSupportedError unless is_swagger_1_2?
|
293
298
|
|
294
299
|
self.data[:authorizations] ||= Swagger::Blocks::ResourceListingAuthorizationsNode.new
|
295
300
|
self.data[:authorizations].version = version
|
296
|
-
self.data[:authorizations].authorization(name, &block)
|
301
|
+
self.data[:authorizations].authorization(name, inline_keys, &block)
|
297
302
|
end
|
298
303
|
|
299
|
-
def info(&block)
|
300
|
-
self.data[:info] = Swagger::Blocks::InfoNode.call(version: version, &block)
|
304
|
+
def info(inline_keys = nil, &block)
|
305
|
+
self.data[:info] = Swagger::Blocks::InfoNode.call(version: version, inline_keys: inline_keys, &block)
|
301
306
|
end
|
302
307
|
|
303
|
-
def api(&block)
|
308
|
+
def api(inline_keys = nil, &block)
|
304
309
|
raise NotSupportedError unless is_swagger_1_2?
|
305
310
|
|
306
311
|
self.data[:apis] ||= []
|
307
|
-
self.data[:apis] << Swagger::Blocks::ResourceNode.call(version: version,
|
312
|
+
self.data[:apis] << Swagger::Blocks::ResourceNode.call(version: version, inline_keys: inline_keys ,&block)
|
308
313
|
end
|
309
314
|
|
310
|
-
def parameter(param, &block)
|
315
|
+
def parameter(param, inline_keys = nil, &block)
|
311
316
|
raise NotSupportedError unless is_swagger_2_0?
|
312
317
|
|
313
318
|
# TODO validate 'param' is as per spec
|
314
319
|
self.data[:parameters] ||= {}
|
315
|
-
self.data[:parameters][param] = Swagger::Blocks::ParameterNode.call(version: version, &block)
|
320
|
+
self.data[:parameters][param] = Swagger::Blocks::ParameterNode.call(version: version, inline_keys: inline_keys, &block)
|
316
321
|
end
|
317
322
|
|
318
|
-
def response(resp, &block)
|
323
|
+
def response(resp, inline_keys = nil, &block)
|
319
324
|
raise NotSupportedError unless is_swagger_2_0?
|
320
325
|
|
321
326
|
# TODO validate 'resp' is as per spec
|
322
327
|
self.data[:responses] ||= {}
|
323
|
-
self.data[:responses][resp] = Swagger::Blocks::ResponseNode.call(version: version, &block)
|
328
|
+
self.data[:responses][resp] = Swagger::Blocks::ResponseNode.call(version: version, inline_keys: inline_keys, &block)
|
324
329
|
end
|
325
330
|
|
326
|
-
def security_definition(name, &block)
|
331
|
+
def security_definition(name, inline_keys = nil, &block)
|
327
332
|
raise NotSupportedError unless is_swagger_2_0?
|
328
333
|
|
329
334
|
self.data[:securityDefinitions] ||= {}
|
330
|
-
self.data[:securityDefinitions][name] = Swagger::Blocks::SecuritySchemeNode.call(version: version, &block)
|
335
|
+
self.data[:securityDefinitions][name] = Swagger::Blocks::SecuritySchemeNode.call(version: version, inline_keys: inline_keys, &block)
|
331
336
|
end
|
332
337
|
|
333
|
-
def security(&block)
|
338
|
+
def security(inline_keys = nil, &block)
|
334
339
|
raise NotSupportedError unless is_swagger_2_0?
|
335
340
|
|
336
341
|
self.data[:security] ||= []
|
337
|
-
self.data[:security] << Swagger::Blocks::SecurityRequirementNode.call(version: version, &block)
|
342
|
+
self.data[:security] << Swagger::Blocks::SecurityRequirementNode.call(version: version, inline_keys: inline_keys, &block)
|
338
343
|
end
|
339
344
|
|
340
|
-
def tag(&block)
|
345
|
+
def tag(inline_keys = nil, &block)
|
341
346
|
raise NotSupportedError unless is_swagger_2_0?
|
342
347
|
|
343
348
|
self.data[:tags] ||= []
|
344
|
-
self.data[:tags] << Swagger::Blocks::TagNode.call(version: version, &block)
|
349
|
+
self.data[:tags] << Swagger::Blocks::TagNode.call(version: version, inline_keys: inline_keys, &block)
|
345
350
|
end
|
346
351
|
|
347
352
|
# Use 'tag' instead.
|
@@ -355,8 +360,8 @@ module Swagger
|
|
355
360
|
# v1.2: NOTE: in the spec this is different than API Declaration authorizations.
|
356
361
|
# v1.2: http://goo.gl/PvwUXj#514-authorizations-object
|
357
362
|
class ResourceListingAuthorizationsNode < Node
|
358
|
-
def authorization(name, &block)
|
359
|
-
self.data[name] = Swagger::Blocks::ResourceListingAuthorizationNode.call(version: version, &block)
|
363
|
+
def authorization(name, inline_keys = nil, &block)
|
364
|
+
self.data[name] = Swagger::Blocks::ResourceListingAuthorizationNode.call(version: version, inline_keys: inline_keys, &block)
|
360
365
|
end
|
361
366
|
end
|
362
367
|
|
@@ -365,33 +370,33 @@ module Swagger
|
|
365
370
|
class ResourceListingAuthorizationNode < Node
|
366
371
|
GRANT_TYPES = [:implicit, :authorization_code].freeze
|
367
372
|
|
368
|
-
def scope(&block)
|
373
|
+
def scope(inline_keys = nil, &block)
|
369
374
|
self.data[:scopes] ||= []
|
370
|
-
self.data[:scopes] << Swagger::Blocks::ScopeNode.call(version: version, &block)
|
375
|
+
self.data[:scopes] << Swagger::Blocks::ScopeNode.call(version: version, inline_keys: inline_keys, &block)
|
371
376
|
end
|
372
377
|
|
373
|
-
def grant_type(name, &block)
|
378
|
+
def grant_type(name, inline_keys = nil, &block)
|
374
379
|
raise ArgumentError.new("#{name} not in #{GRANT_TYPES}") if !GRANT_TYPES.include?(name)
|
375
380
|
self.data[:grantTypes] ||= Swagger::Blocks::GrantTypesNode.new
|
376
381
|
self.data[:grantTypes].version = version
|
377
|
-
self.data[:grantTypes].implicit(&block) if name == :implicit
|
378
|
-
self.data[:grantTypes].authorization_code(&block) if name == :authorization_code
|
382
|
+
self.data[:grantTypes].implicit(inline_keys, &block) if name == :implicit
|
383
|
+
self.data[:grantTypes].authorization_code(inline_keys, &block) if name == :authorization_code
|
379
384
|
end
|
380
385
|
end
|
381
386
|
|
382
387
|
# v1.2: http://goo.gl/PvwUXj#513-info-object
|
383
388
|
# v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#infoObject
|
384
389
|
class InfoNode < Node
|
385
|
-
def contact(&block)
|
390
|
+
def contact(inline_keys = nil, &block)
|
386
391
|
raise NotSupportedError unless is_swagger_2_0?
|
387
392
|
|
388
|
-
self.data[:contact] = Swagger::Blocks::ContactNode.call(version: version, &block)
|
393
|
+
self.data[:contact] = Swagger::Blocks::ContactNode.call(version: version, inline_keys: inline_keys, &block)
|
389
394
|
end
|
390
395
|
|
391
|
-
def license(&block)
|
396
|
+
def license(inline_keys = nil, &block)
|
392
397
|
raise NotSupportedError unless is_swagger_2_0?
|
393
398
|
|
394
|
-
self.data[:license] = Swagger::Blocks::LicenseNode.call(version: version, &block)
|
399
|
+
self.data[:license] = Swagger::Blocks::LicenseNode.call(version: version, inline_keys: inline_keys, &block)
|
395
400
|
end
|
396
401
|
end
|
397
402
|
|
@@ -409,12 +414,12 @@ module Swagger
|
|
409
414
|
|
410
415
|
# v1.2: http://goo.gl/PvwUXj#517-grant-types-object
|
411
416
|
class GrantTypesNode < Node
|
412
|
-
def implicit(&block)
|
413
|
-
self.data[:implicit] = Swagger::Blocks::ImplicitNode.call(version: version, &block)
|
417
|
+
def implicit(inline_keys, &block)
|
418
|
+
self.data[:implicit] = Swagger::Blocks::ImplicitNode.call(inline_keys: inline_keys, version: version, &block)
|
414
419
|
end
|
415
420
|
|
416
|
-
def authorization_code(&block)
|
417
|
-
self.data[:authorization_code] = Swagger::Blocks::AuthorizationCodeNode.call(version: version, &block)
|
421
|
+
def authorization_code(inline_keys, &block)
|
422
|
+
self.data[:authorization_code] = Swagger::Blocks::AuthorizationCodeNode.call(inline_keys: inline_keys, version: version, &block)
|
418
423
|
end
|
419
424
|
end
|
420
425
|
|
@@ -430,12 +435,12 @@ module Swagger
|
|
430
435
|
|
431
436
|
# v1.2: http://goo.gl/PvwUXj#519-authorization-code-object
|
432
437
|
class AuthorizationCodeNode < Node
|
433
|
-
def token_request_endpoint(&block)
|
434
|
-
self.data[:tokenRequestEndpoint] = Swagger::Blocks::TokenRequestEndpointNode.call(version: version, &block)
|
438
|
+
def token_request_endpoint(inline_keys = nil, &block)
|
439
|
+
self.data[:tokenRequestEndpoint] = Swagger::Blocks::TokenRequestEndpointNode.call(version: version, inline_keys: inline_keys, &block)
|
435
440
|
end
|
436
441
|
|
437
|
-
def token_endpoint(&block)
|
438
|
-
self.data[:tokenEndpoint] = Swagger::Blocks::TokenEndpointNode.call(version: version, &block)
|
442
|
+
def token_endpoint(inline_keys = nil, &block)
|
443
|
+
self.data[:tokenEndpoint] = Swagger::Blocks::TokenEndpointNode.call(version: version, inline_keys: inline_keys, &block)
|
439
444
|
end
|
440
445
|
end
|
441
446
|
|
@@ -451,7 +456,7 @@ module Swagger
|
|
451
456
|
|
452
457
|
# v1.2: http://goo.gl/PvwUXj#52-api-declaration
|
453
458
|
class ApiDeclarationNode < Node
|
454
|
-
def api(&block)
|
459
|
+
def api(inline_keys = nil, &block)
|
455
460
|
self.data[:apis] ||= []
|
456
461
|
|
457
462
|
# Important: to conform with the Swagger spec, merge with any previous API declarations
|
@@ -461,7 +466,7 @@ module Swagger
|
|
461
466
|
# http://goo.gl/PvwUXj#522-api-object
|
462
467
|
# - The API Object describes one or more operations on a single path. In the apis array,
|
463
468
|
# there MUST be only one API Object per path.
|
464
|
-
temp_api_node = Swagger::Blocks::ApiNode.call(version: version, &block)
|
469
|
+
temp_api_node = Swagger::Blocks::ApiNode.call(version: version, inline_keys: inline_keys, &block)
|
465
470
|
api_node = self.data[:apis].select do |api|
|
466
471
|
api.data[:path] == temp_api_node.data[:path]
|
467
472
|
end[0] # Embrace Ruby wtfs.
|
@@ -478,9 +483,9 @@ module Swagger
|
|
478
483
|
|
479
484
|
# v1.2: http://goo.gl/PvwUXj#522-api-object
|
480
485
|
class ApiNode < Node
|
481
|
-
def operation(&block)
|
486
|
+
def operation(inline_keys = nil, &block)
|
482
487
|
self.data[:operations] ||= []
|
483
|
-
self.data[:operations] << Swagger::Blocks::OperationNode.call(version: version, &block)
|
488
|
+
self.data[:operations] << Swagger::Blocks::OperationNode.call(version: version, inline_keys: inline_keys, &block)
|
484
489
|
end
|
485
490
|
end
|
486
491
|
|
@@ -489,10 +494,10 @@ module Swagger
|
|
489
494
|
OPERATION_TYPES = [:get, :put, :post, :delete, :options, :head, :patch].freeze
|
490
495
|
|
491
496
|
# TODO support ^x- Vendor Extensions
|
492
|
-
def operation(op, &block)
|
497
|
+
def operation(op, inline_keys = nil, &block)
|
493
498
|
op = op.to_sym
|
494
499
|
raise ArgumentError.new("#{name} not in #{OPERATION_TYPES}") if !OPERATION_TYPES.include?(op)
|
495
|
-
self.data[op] = Swagger::Blocks::OperationNode.call(version: version, &block)
|
500
|
+
self.data[op] = Swagger::Blocks::OperationNode.call(version: version, inline_keys: inline_keys, &block)
|
496
501
|
end
|
497
502
|
end
|
498
503
|
|
@@ -500,51 +505,51 @@ module Swagger
|
|
500
505
|
# v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#operation-object
|
501
506
|
class OperationNode < Node
|
502
507
|
|
503
|
-
def parameter(&block)
|
508
|
+
def parameter(inline_keys = nil, &block)
|
504
509
|
self.data[:parameters] ||= []
|
505
|
-
self.data[:parameters] << Swagger::Blocks::ParameterNode.call(version: version, &block)
|
510
|
+
self.data[:parameters] << Swagger::Blocks::ParameterNode.call(version: version, inline_keys: inline_keys, &block)
|
506
511
|
end
|
507
512
|
|
508
|
-
def response_message(&block)
|
513
|
+
def response_message(inline_keys = nil, &block)
|
509
514
|
raise NotSupportedError unless is_swagger_1_2?
|
510
515
|
|
511
516
|
self.data[:responseMessages] ||= []
|
512
|
-
self.data[:responseMessages] << Swagger::Blocks::Node.call(version: version, &block)
|
517
|
+
self.data[:responseMessages] << Swagger::Blocks::Node.call(version: version, inline_keys: inline_keys, &block)
|
513
518
|
end
|
514
519
|
|
515
|
-
def authorization(name, &block)
|
520
|
+
def authorization(name, inline_keys = nil, &block)
|
516
521
|
raise NotSupportedError unless is_swagger_1_2?
|
517
522
|
|
518
523
|
self.data[:authorizations] ||= Swagger::Blocks::ApiAuthorizationsNode.new
|
519
524
|
self.data[:authorizations].version = version
|
520
|
-
self.data[:authorizations].authorization(name, &block)
|
525
|
+
self.data[:authorizations].authorization(name, inline_keys, &block)
|
521
526
|
end
|
522
527
|
|
523
|
-
def items(&block)
|
528
|
+
def items(inline_keys = nil, &block)
|
524
529
|
raise NotSupportedError unless is_swagger_1_2?
|
525
530
|
|
526
|
-
self.data[:items] = Swagger::Blocks::ItemsNode.call(version: version, &block)
|
531
|
+
self.data[:items] = Swagger::Blocks::ItemsNode.call(version: version, inline_keys: inline_keys, &block)
|
527
532
|
end
|
528
533
|
|
529
|
-
def response(resp, &block)
|
534
|
+
def response(resp, inline_keys = nil, &block)
|
530
535
|
raise NotSupportedError unless is_swagger_2_0?
|
531
536
|
|
532
537
|
# TODO validate 'resp' is as per spec
|
533
538
|
self.data[:responses] ||= {}
|
534
|
-
self.data[:responses][resp] = Swagger::Blocks::ResponseNode.call(version: version, &block)
|
539
|
+
self.data[:responses][resp] = Swagger::Blocks::ResponseNode.call(version: version, inline_keys: inline_keys, &block)
|
535
540
|
end
|
536
541
|
|
537
|
-
def externalDocs(&block)
|
542
|
+
def externalDocs(inline_keys = nil, &block)
|
538
543
|
raise NotSupportedError unless is_swagger_2_0?
|
539
544
|
|
540
|
-
self.data[:externalDocs] = Swagger::Blocks::ExternalDocsNode.call(version: version, &block)
|
545
|
+
self.data[:externalDocs] = Swagger::Blocks::ExternalDocsNode.call(version: version, inline_keys: inline_keys, &block)
|
541
546
|
end
|
542
547
|
|
543
|
-
def security(&block)
|
548
|
+
def security(inline_keys = nil, &block)
|
544
549
|
raise NotSupportedError unless is_swagger_2_0?
|
545
550
|
|
546
551
|
self.data[:security] ||= []
|
547
|
-
self.data[:security] << Swagger::Blocks::SecurityRequirementNode.call(version: version, &block)
|
552
|
+
self.data[:security] << Swagger::Blocks::SecurityRequirementNode.call(version: version, inline_keys: inline_keys, &block)
|
548
553
|
end
|
549
554
|
end
|
550
555
|
|
@@ -558,16 +563,16 @@ module Swagger
|
|
558
563
|
class SecuritySchemeNode < Node
|
559
564
|
# TODO support ^x- Vendor Extensions
|
560
565
|
|
561
|
-
def scopes(&block)
|
562
|
-
self.data[:scopes] = Swagger::Blocks::ScopesNode.call(version: version, &block)
|
566
|
+
def scopes(inline_keys = nil, &block)
|
567
|
+
self.data[:scopes] = Swagger::Blocks::ScopesNode.call(version: version, inline_keys: inline_keys, &block)
|
563
568
|
end
|
564
569
|
end
|
565
570
|
|
566
571
|
# v1.2: NOTE: in the spec this is different than Resource Listing's authorizations.
|
567
572
|
# v1.2: http://goo.gl/PvwUXj#514-authorizations-object
|
568
573
|
class ApiAuthorizationsNode < Node
|
569
|
-
def authorization(name, &block)
|
570
|
-
self.data[name] ||= Swagger::Blocks::ApiAuthorizationNode.call(version: version, &block)
|
574
|
+
def authorization(name, inline_keys, &block)
|
575
|
+
self.data[name] ||= Swagger::Blocks::ApiAuthorizationNode.call(version: version, inline_keys: inline_keys, &block)
|
571
576
|
end
|
572
577
|
end
|
573
578
|
|
@@ -581,9 +586,9 @@ module Swagger
|
|
581
586
|
self.data[:_scopes].map { |s| s.as_json }
|
582
587
|
end
|
583
588
|
|
584
|
-
def scope(&block)
|
589
|
+
def scope(inline_keys = nil, &block)
|
585
590
|
self.data[:_scopes] ||= []
|
586
|
-
self.data[:_scopes] << Swagger::Blocks::ApiAuthorizationScopeNode.call(version: version, &block)
|
591
|
+
self.data[:_scopes] << Swagger::Blocks::ApiAuthorizationScopeNode.call(version: version, inline_keys: inline_keys, &block)
|
587
592
|
end
|
588
593
|
end
|
589
594
|
|
@@ -593,20 +598,20 @@ module Swagger
|
|
593
598
|
|
594
599
|
# v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#responseObject
|
595
600
|
class ResponseNode < Node
|
596
|
-
def schema(&block)
|
597
|
-
self.data[:schema] = Swagger::Blocks::SchemaNode.call(version: version, &block)
|
601
|
+
def schema(inline_keys = nil, &block)
|
602
|
+
self.data[:schema] = Swagger::Blocks::SchemaNode.call(version: version, inline_keys: inline_keys, &block)
|
598
603
|
end
|
599
604
|
|
600
|
-
def header(head, &block)
|
605
|
+
def header(head, inline_keys = nil, &block)
|
601
606
|
# TODO validate 'head' is as per spec
|
602
607
|
self.data[:headers] ||= {}
|
603
|
-
self.data[:headers][head] = Swagger::Blocks::HeaderNode.call(version: version, &block)
|
608
|
+
self.data[:headers][head] = Swagger::Blocks::HeaderNode.call(version: version, inline_keys: inline_keys, &block)
|
604
609
|
end
|
605
610
|
|
606
|
-
def example(exam, &block)
|
611
|
+
def example(exam, inline_keys = nil, &block)
|
607
612
|
# TODO validate 'exam' is as per spec
|
608
613
|
self.data[:examples] ||= {}
|
609
|
-
self.data[:examples][exam] = Swagger::Blocks::ExampleNode.call(version: version, &block)
|
614
|
+
self.data[:examples][exam] = Swagger::Blocks::ExampleNode.call(version: version, inline_keys: inline_keys, &block)
|
610
615
|
end
|
611
616
|
end
|
612
617
|
|
@@ -642,40 +647,40 @@ module Swagger
|
|
642
647
|
raise NotSupportedError
|
643
648
|
end
|
644
649
|
|
645
|
-
def schema(&block)
|
646
|
-
data << Swagger::Blocks::SchemaNode.call(version: version, &block)
|
650
|
+
def schema(inline_keys = nil, &block)
|
651
|
+
data << Swagger::Blocks::SchemaNode.call(version: version, inline_keys: inline_keys, &block)
|
647
652
|
end
|
648
653
|
end
|
649
654
|
|
650
655
|
# v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#schema-object
|
651
656
|
class SchemaNode < Node
|
652
|
-
def items(&block)
|
653
|
-
self.data[:items] = Swagger::Blocks::ItemsNode.call(version: version, &block)
|
657
|
+
def items(inline_keys = nil, &block)
|
658
|
+
self.data[:items] = Swagger::Blocks::ItemsNode.call(version: version, inline_keys: inline_keys, &block)
|
654
659
|
end
|
655
660
|
|
656
661
|
def allOf(&block)
|
657
662
|
self.data[:allOf] = Swagger::Blocks::AllOfNode.call(version: version, &block)
|
658
663
|
end
|
659
664
|
|
660
|
-
def property(name, &block)
|
665
|
+
def property(name, inline_keys = nil, &block)
|
661
666
|
self.data[:properties] ||= Swagger::Blocks::PropertiesNode.new
|
662
667
|
self.data[:properties].version = version
|
663
|
-
self.data[:properties].property(name, &block)
|
668
|
+
self.data[:properties].property(name, inline_keys, &block)
|
664
669
|
end
|
665
670
|
|
666
|
-
def xml(&block)
|
667
|
-
self.data[:xml] = Swagger::Blocks::XmlNode.call(version: version, &block)
|
671
|
+
def xml(inline_keys = nil, &block)
|
672
|
+
self.data[:xml] = Swagger::Blocks::XmlNode.call(version: version, inline_keys: inline_keys, &block)
|
668
673
|
end
|
669
674
|
|
670
|
-
def externalDocs(&block)
|
671
|
-
self.data[:externalDocs] = Swagger::Blocks::ExternalDocsNode.call(version: version, &block)
|
675
|
+
def externalDocs(inline_keys = nil, &block)
|
676
|
+
self.data[:externalDocs] = Swagger::Blocks::ExternalDocsNode.call(version: version, inline_keys: inline_keys, &block)
|
672
677
|
end
|
673
678
|
end
|
674
679
|
|
675
680
|
# v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#headerObject
|
676
681
|
class HeaderNode < Node
|
677
|
-
def items(&block)
|
678
|
-
self.data[:items] = Swagger::Blocks::ItemsNode.call(version: version, &block)
|
682
|
+
def items(inline_keys = nil, &block)
|
683
|
+
self.data[:items] = Swagger::Blocks::ItemsNode.call(version: version, inline_keys: inline_keys, &block)
|
679
684
|
end
|
680
685
|
end
|
681
686
|
|
@@ -692,16 +697,16 @@ module Swagger
|
|
692
697
|
# v1.2: http://goo.gl/PvwUXj#524-parameter-object
|
693
698
|
# v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#parameter-object
|
694
699
|
class ParameterNode < Node
|
695
|
-
def schema(&block)
|
700
|
+
def schema(inline_keys = nil, &block)
|
696
701
|
raise NotSupportedError unless is_swagger_2_0?
|
697
702
|
|
698
|
-
self.data[:schema] = Swagger::Blocks::SchemaNode.call(version: version, &block)
|
703
|
+
self.data[:schema] = Swagger::Blocks::SchemaNode.call(version: version, inline_keys: inline_keys, &block)
|
699
704
|
end
|
700
705
|
|
701
|
-
def items(&block)
|
706
|
+
def items(inline_keys = nil, &block)
|
702
707
|
raise NotSupportedError unless is_swagger_2_0?
|
703
708
|
|
704
|
-
self.data[:items] = Swagger::Blocks::ItemsNode.call(version: version, &block)
|
709
|
+
self.data[:items] = Swagger::Blocks::ItemsNode.call(version: version, inline_keys: inline_keys, &block)
|
705
710
|
end
|
706
711
|
end
|
707
712
|
|
@@ -710,8 +715,8 @@ module Swagger
|
|
710
715
|
|
711
716
|
# TODO support ^x- Vendor Extensions
|
712
717
|
|
713
|
-
def externalDocs(&block)
|
714
|
-
self.data[:externalDocs] = Swagger::Blocks::ExternalDocsNode.call(version: version, &block)
|
718
|
+
def externalDocs(inline_keys = nil, &block)
|
719
|
+
self.data[:externalDocs] = Swagger::Blocks::ExternalDocsNode.call(version: version, inline_keys: inline_keys, &block)
|
715
720
|
end
|
716
721
|
end
|
717
722
|
|
@@ -725,31 +730,31 @@ module Swagger
|
|
725
730
|
self.data.merge!(other_models_node.data)
|
726
731
|
end
|
727
732
|
|
728
|
-
def model(name, &block)
|
729
|
-
self.data[name] ||= Swagger::Blocks::ModelNode.call(version: version, &block)
|
733
|
+
def model(name, inline_keys, &block)
|
734
|
+
self.data[name] ||= Swagger::Blocks::ModelNode.call(version: version, inline_keys: inline_keys, &block)
|
730
735
|
end
|
731
736
|
end
|
732
737
|
|
733
738
|
# v1.2: http://goo.gl/PvwUXj#527-model-object
|
734
739
|
class ModelNode < Node
|
735
|
-
def property(name, &block)
|
740
|
+
def property(name, inline_keys = nil, &block)
|
736
741
|
self.data[:properties] ||= Swagger::Blocks::PropertiesNode.new
|
737
742
|
self.data[:properties].version = version
|
738
|
-
self.data[:properties].property(name, &block)
|
743
|
+
self.data[:properties].property(name, inline_keys, &block)
|
739
744
|
end
|
740
745
|
end
|
741
746
|
|
742
747
|
# v1.2: http://goo.gl/PvwUXj#527-model-object
|
743
748
|
class PropertiesNode < Node
|
744
|
-
def property(name, &block)
|
745
|
-
self.data[name] = Swagger::Blocks::PropertyNode.call(version: version, &block)
|
749
|
+
def property(name, inline_keys = nil, &block)
|
750
|
+
self.data[name] = Swagger::Blocks::PropertyNode.call(version: version, inline_keys: inline_keys, &block)
|
746
751
|
end
|
747
752
|
end
|
748
753
|
|
749
754
|
# v1.2: http://goo.gl/PvwUXj#527-model-object
|
750
755
|
class PropertyNode < Node
|
751
|
-
def items(&block)
|
752
|
-
self.data[:items] = Swagger::Blocks::ItemsNode.call(version: version, &block)
|
756
|
+
def items(inline_keys = nil, &block)
|
757
|
+
self.data[:items] = Swagger::Blocks::ItemsNode.call(version: version, inline_keys: inline_keys, &block)
|
753
758
|
end
|
754
759
|
end
|
755
760
|
end
|
@@ -10,21 +10,16 @@ API_DECLARATION_JSON = open(File.expand_path('../swagger_api_declaration.json',
|
|
10
10
|
class PetController
|
11
11
|
include Swagger::Blocks
|
12
12
|
|
13
|
-
swagger_root do
|
14
|
-
key :swaggerVersion, '1.2'
|
13
|
+
swagger_root swaggerVersion: '1.2'do
|
15
14
|
key :apiVersion, '1.0.0'
|
16
|
-
info do
|
17
|
-
key :title, 'Swagger Sample App'
|
15
|
+
info title: 'Swagger Sample App' do
|
18
16
|
key :description, "This is a sample server Petstore server. You can find out more about Swagger \n at <a href=\"http://swagger.wordnik.com\">http://swagger.wordnik.com</a> or on irc.freenode.net, #swagger. For this sample,\n you can use the api key \"special-key\" to test the authorization filters"
|
19
17
|
key :termsOfServiceUrl, 'http://helloreverb.com/terms/'
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
api do
|
25
|
-
key :path, '/pet'
|
26
|
-
key :description, 'Operations about pets'
|
18
|
+
keys contact: 'apiteam@wordnik.com',
|
19
|
+
license: 'Apache 2.0',
|
20
|
+
licenseUrl: 'http://www.apache.org/licenses/LICENSE-2.0.html'
|
27
21
|
end
|
22
|
+
api path: '/pet', description: 'Operations about pets'
|
28
23
|
api do
|
29
24
|
key :path, '/user'
|
30
25
|
key :description, 'Operations about user'
|
@@ -33,39 +28,31 @@ class PetController
|
|
33
28
|
key :path, '/store'
|
34
29
|
key :description, 'Operations about store'
|
35
30
|
end
|
36
|
-
authorization :oauth2 do
|
37
|
-
|
38
|
-
scope do
|
39
|
-
key :scope, 'email'
|
40
|
-
key :description, 'Access to your email address'
|
41
|
-
end
|
31
|
+
authorization :oauth2, type: 'oauth2' do
|
32
|
+
scope scope: 'email', description: 'Access to your email address'
|
42
33
|
scope do
|
43
34
|
key :scope, 'pets'
|
44
35
|
key :description, 'Access to your pets'
|
45
36
|
end
|
46
|
-
grant_type :implicit do
|
37
|
+
grant_type :implicit, tokenName: 'access_token' do
|
47
38
|
login_endpoint do
|
48
39
|
key :url, 'http://petstore.swagger.wordnik.com/oauth/dialog'
|
49
40
|
end
|
50
|
-
key :tokenName, 'access_token'
|
51
41
|
end
|
52
42
|
grant_type :authorization_code do
|
53
|
-
token_request_endpoint do
|
43
|
+
token_request_endpoint clientSecretName: 'client_secret' do
|
54
44
|
key :url, 'http://petstore.swagger.wordnik.com/oauth/requestToken'
|
55
45
|
key :clientIdName, 'client_id'
|
56
|
-
key :clientSecretName, 'client_secret'
|
57
46
|
end
|
58
|
-
token_endpoint do
|
47
|
+
token_endpoint tokenName: 'access_code' do
|
59
48
|
key :url, 'http://petstore.swagger.wordnik.com/oauth/token'
|
60
|
-
key :tokenName, 'access_code'
|
61
49
|
end
|
62
50
|
end
|
63
51
|
end
|
64
52
|
end
|
65
53
|
|
66
54
|
# All swagger_api_root declarations with the same key will be merged.
|
67
|
-
swagger_api_root :pets do
|
68
|
-
key :swaggerVersion, '1.2'
|
55
|
+
swagger_api_root :pets, swaggerVersion: '1.2' do
|
69
56
|
key :apiVersion, '1.0.0'
|
70
57
|
key :basePath, 'http://petstore.swagger.wordnik.com/api'
|
71
58
|
key :resourcePath, '/pet'
|
@@ -131,8 +118,7 @@ class PetController
|
|
131
118
|
key :description, 'anything'
|
132
119
|
end
|
133
120
|
end
|
134
|
-
parameter do
|
135
|
-
key :paramType, :path
|
121
|
+
parameter paramType: :path do
|
136
122
|
key :name, :petId
|
137
123
|
key :description, 'ID of pet that needs to be fetched'
|
138
124
|
key :required, true
|
@@ -145,8 +131,7 @@ class PetController
|
|
145
131
|
key :required, true
|
146
132
|
key :type, :Pet
|
147
133
|
end
|
148
|
-
response_message do
|
149
|
-
key :code, 400
|
134
|
+
response_message code: 400 do
|
150
135
|
key :message, 'Invalid tag value'
|
151
136
|
end
|
152
137
|
end
|
@@ -156,15 +141,12 @@ class PetController
|
|
156
141
|
swagger_api_root :pets do
|
157
142
|
api do
|
158
143
|
key :path, '/pet/findByStatus'
|
159
|
-
operation do
|
160
|
-
key :method, 'GET'
|
144
|
+
operation method: 'GET' do
|
161
145
|
key :summary, 'Finds Pets by status'
|
162
146
|
key :notes, 'Multiple status values can be provided with comma seperated strings'
|
163
147
|
key :type, :array
|
164
148
|
key :nickname, :findPetsByStatus
|
165
|
-
items
|
166
|
-
key :'$ref', :Pet
|
167
|
-
end
|
149
|
+
items :'$ref' => :Pet
|
168
150
|
parameter do
|
169
151
|
key :paramType, :query
|
170
152
|
key :name, :status
|
@@ -178,10 +160,7 @@ class PetController
|
|
178
160
|
'sold',
|
179
161
|
]
|
180
162
|
end
|
181
|
-
response_message
|
182
|
-
key :code, 400
|
183
|
-
key :message, 'Invalid status value'
|
184
|
-
end
|
163
|
+
response_message code: 400, message: 'Invalid status value'
|
185
164
|
end
|
186
165
|
end
|
187
166
|
end
|
@@ -225,8 +204,7 @@ end
|
|
225
204
|
class OtherModelsContainer
|
226
205
|
include Swagger::Blocks
|
227
206
|
|
228
|
-
swagger_model :Pet do
|
229
|
-
key :id, :Pet
|
207
|
+
swagger_model :Pet, id: :Pet do
|
230
208
|
key :required, [:id, :name]
|
231
209
|
property :id do
|
232
210
|
key :type, :integer
|
@@ -8,10 +8,9 @@ RESOURCE_LISTING_JSON_V2 = open(File.expand_path('../swagger_v2_api_declaration.
|
|
8
8
|
class PetControllerV2
|
9
9
|
include Swagger::Blocks
|
10
10
|
|
11
|
-
swagger_root do
|
11
|
+
swagger_root host: 'petstore.swagger.wordnik.com' do
|
12
12
|
key :swagger, '2.0'
|
13
|
-
info do
|
14
|
-
key :version, '1.0.0'
|
13
|
+
info version: '1.0.0' do
|
15
14
|
key :title, 'Swagger Petstore'
|
16
15
|
key :description, 'A sample API that uses a petstore as an example to ' \
|
17
16
|
'demonstrate features in the swagger-2.0 specification'
|
@@ -23,13 +22,11 @@ class PetControllerV2
|
|
23
22
|
key :name, 'MIT'
|
24
23
|
end
|
25
24
|
end
|
26
|
-
key :host, 'petstore.swagger.wordnik.com'
|
27
25
|
key :basePath, '/api'
|
28
26
|
key :schemes, ['http']
|
29
27
|
key :consumes, ['application/json']
|
30
28
|
key :produces, ['application/json']
|
31
|
-
security_definition :api_key do
|
32
|
-
key :type, :apiKey
|
29
|
+
security_definition :api_key, type: :apiKey do
|
33
30
|
key :name, :api_key
|
34
31
|
key :in, :header
|
35
32
|
end
|
@@ -37,16 +34,13 @@ class PetControllerV2
|
|
37
34
|
key :type, :oauth2
|
38
35
|
key :authorizationUrl, 'http://swagger.io/api/oauth/dialog'
|
39
36
|
key :flow, :implicit
|
40
|
-
scopes do
|
41
|
-
key 'write:pets', 'modify pets in your account'
|
37
|
+
scopes 'write:pets' => 'modify pets in your account' do
|
42
38
|
key 'read:pets', 'read your pets'
|
43
39
|
end
|
44
40
|
end
|
45
|
-
tag do
|
46
|
-
key :name, 'pet'
|
41
|
+
tag name: 'pet' do
|
47
42
|
key :description, 'Pets operations'
|
48
|
-
externalDocs do
|
49
|
-
key :description, 'Find more info here'
|
43
|
+
externalDocs description: 'Find more info here' do
|
50
44
|
key :url, 'https://swagger.io'
|
51
45
|
end
|
52
46
|
end
|
@@ -83,8 +77,7 @@ class PetControllerV2
|
|
83
77
|
end
|
84
78
|
response 200 do
|
85
79
|
key :description, 'pet response'
|
86
|
-
schema do
|
87
|
-
key :type, :array
|
80
|
+
schema type: :array do
|
88
81
|
items do
|
89
82
|
key :'$ref', :Pet
|
90
83
|
end
|
@@ -119,8 +112,7 @@ class PetControllerV2
|
|
119
112
|
key :'$ref', '#/parameters/Pet'
|
120
113
|
end
|
121
114
|
end
|
122
|
-
response :default do
|
123
|
-
key :description, 'unexpected error'
|
115
|
+
response :default, description: 'unexpected error' do
|
124
116
|
schema do
|
125
117
|
key :'$ref', :ErrorModel
|
126
118
|
end
|
@@ -158,9 +150,7 @@ class PetControllerV2
|
|
158
150
|
key :'$ref', :ErrorModel
|
159
151
|
end
|
160
152
|
end
|
161
|
-
security
|
162
|
-
key :api_key, []
|
163
|
-
end
|
153
|
+
security api_key: []
|
164
154
|
security do
|
165
155
|
key :petstore_auth, ['write:pets', 'read:pets']
|
166
156
|
end
|
@@ -193,8 +183,7 @@ end
|
|
193
183
|
class PetV2
|
194
184
|
include Swagger::Blocks
|
195
185
|
|
196
|
-
swagger_schema :Pet do
|
197
|
-
key :required, [:id, :name]
|
186
|
+
swagger_schema :Pet, required: [:id, :name] do
|
198
187
|
property :id do
|
199
188
|
key :type, :integer
|
200
189
|
key :format, :int64
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swagger-blocks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Fotinakis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|