swagger-blocks 2.0.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE.md +4 -0
  3. data/lib/swagger/blocks.rb +14 -0
  4. data/lib/swagger/blocks/class_methods.rb +16 -2
  5. data/lib/swagger/blocks/internal_helpers.rb +25 -0
  6. data/lib/swagger/blocks/node.rb +48 -10
  7. data/lib/swagger/blocks/nodes/all_of_node.rb +6 -5
  8. data/lib/swagger/blocks/nodes/callback_destination_node.rb +11 -0
  9. data/lib/swagger/blocks/nodes/callback_method_node.rb +16 -0
  10. data/lib/swagger/blocks/nodes/callback_node.rb +11 -0
  11. data/lib/swagger/blocks/nodes/component_node.rb +50 -0
  12. data/lib/swagger/blocks/nodes/content_node.rb +20 -0
  13. data/lib/swagger/blocks/nodes/example_node.rb +3 -1
  14. data/lib/swagger/blocks/nodes/flow_node.rb +11 -0
  15. data/lib/swagger/blocks/nodes/header_node.rb +4 -0
  16. data/lib/swagger/blocks/nodes/items_node.rb +1 -1
  17. data/lib/swagger/blocks/nodes/link_node.rb +11 -0
  18. data/lib/swagger/blocks/nodes/link_parameter_node.rb +8 -0
  19. data/lib/swagger/blocks/nodes/one_of_node.rb +11 -0
  20. data/lib/swagger/blocks/nodes/operation_node.rb +15 -0
  21. data/lib/swagger/blocks/nodes/parameter_node.rb +5 -0
  22. data/lib/swagger/blocks/nodes/path_node.rb +6 -0
  23. data/lib/swagger/blocks/nodes/property_node.rb +5 -0
  24. data/lib/swagger/blocks/nodes/request_body_node.rb +12 -0
  25. data/lib/swagger/blocks/nodes/response_node.rb +17 -4
  26. data/lib/swagger/blocks/nodes/root_node.rb +16 -2
  27. data/lib/swagger/blocks/nodes/schema_node.rb +9 -0
  28. data/lib/swagger/blocks/nodes/scopes_node.rb +0 -1
  29. data/lib/swagger/blocks/nodes/security_scheme_node.rb +5 -1
  30. data/lib/swagger/blocks/nodes/server_node.rb +12 -0
  31. data/lib/swagger/blocks/nodes/value_node.rb +8 -0
  32. data/lib/swagger/blocks/nodes/variable_node.rb +8 -0
  33. data/lib/swagger/blocks/nodes/vendor_extension_node.rb +9 -0
  34. data/lib/swagger/blocks/root.rb +8 -1
  35. data/lib/swagger/blocks/version.rb +1 -1
  36. data/spec/lib/swagger_v2_blocks_spec.rb +1 -1
  37. data/spec/lib/swagger_v3_api_declaration.json +592 -0
  38. data/spec/lib/swagger_v3_blocks_spec.rb +555 -0
  39. metadata +22 -4
@@ -0,0 +1,11 @@
1
+ module Swagger
2
+ module Blocks
3
+ module Nodes
4
+ class LinkNode < Node
5
+ def parameters(inline_keys = nil, &block)
6
+ self.data[:parameters] ||= Swagger::Blocks::Nodes::LinkParameterNode.call(version: version, inline_keys: inline_keys, &block)
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ module Swagger
2
+ module Blocks
3
+ module Nodes
4
+ class LinkParameterNode < Node
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ module Swagger
2
+ module Blocks
3
+ module Nodes
4
+ class OneOfNode < Node
5
+ def items(inline_keys = nil, &block)
6
+ self.data[:items] = Swagger::Blocks::Nodes::ItemsNode.call(version: version, inline_keys: inline_keys, &block)
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -24,6 +24,21 @@ module Swagger
24
24
  self.data[:security] ||= []
25
25
  self.data[:security] << Swagger::Blocks::Nodes::SecurityRequirementNode.call(version: version, inline_keys: inline_keys, &block)
26
26
  end
27
+
28
+ def request_body(inline_keys = nil, &block)
29
+ self.data[:requestBody] = Swagger::Blocks::Nodes::RequestBodyNode.call(version: version, inline_keys: inline_keys, &block)
30
+ end
31
+
32
+ def callback(event_name, inline_keys = nil, &block)
33
+ self.data[:callbacks] ||= {}
34
+ self.data[:callbacks][event_name] = Swagger::Blocks::Nodes::CallbackNode.call(version: version, inline_keys: inline_keys, &block)
35
+ end
36
+
37
+ def server(inline_keys = nil, &block)
38
+ raise NotSupportedError unless is_openapi_3_0?
39
+ self.data[:servers] ||= []
40
+ self.data[:servers] << Swagger::Blocks::Nodes::ServerNode.call(version: version, inline_keys: inline_keys, &block)
41
+ end
27
42
  end
28
43
  end
29
44
  end
@@ -10,6 +10,11 @@ module Swagger
10
10
  def items(inline_keys = nil, &block)
11
11
  self.data[:items] = Swagger::Blocks::Nodes::ItemsNode.call(version: version, inline_keys: inline_keys, &block)
12
12
  end
13
+
14
+ def example(name, inline_keys = nil, &block)
15
+ self.data[:examples] ||= {}
16
+ self.data[:examples][name] = Swagger::Blocks::Nodes::ExampleNode.call(version: version, inline_keys: inline_keys, &block)
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -18,6 +18,12 @@ module Swagger
18
18
  self.data[:parameters] ||= []
19
19
  self.data[:parameters] << Swagger::Blocks::Nodes::ParameterNode.call(version: version, inline_keys: inline_keys, &block)
20
20
  end
21
+
22
+ def server(inline_keys = nil, &block)
23
+ raise NotSupportedError unless is_openapi_3_0?
24
+ self.data[:servers] ||= []
25
+ self.data[:servers] << Swagger::Blocks::Nodes::ServerNode.call(version: version, inline_keys: inline_keys, &block)
26
+ end
21
27
  end
22
28
  end
23
29
  end
@@ -11,6 +11,11 @@ module Swagger
11
11
  self.data[:properties].version = version
12
12
  self.data[:properties].property(name, inline_keys, &block)
13
13
  end
14
+
15
+ def one_of(&block)
16
+ self.data[:oneOf] ||= []
17
+ self.data[:oneOf] << Swagger::Blocks::Nodes::OneOfNode.call(version: version, &block)
18
+ end
14
19
  end
15
20
  end
16
21
  end
@@ -0,0 +1,12 @@
1
+ module Swagger
2
+ module Blocks
3
+ module Nodes
4
+ class RequestBodyNode < Node
5
+ def content(type, inline_keys = nil, &block)
6
+ self.data[:content] ||= {}
7
+ self.data[:content][type] = Swagger::Blocks::Nodes::ContentNode.call(version: version, inline_keys: inline_keys, &block)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -13,10 +13,23 @@ module Swagger
13
13
  self.data[:headers][head] = Swagger::Blocks::Nodes::HeaderNode.call(version: version, inline_keys: inline_keys, &block)
14
14
  end
15
15
 
16
- def example(exam, inline_keys = nil, &block)
17
- # TODO validate 'exam' is as per spec
18
- self.data[:examples] ||= {}
19
- self.data[:examples][exam] = Swagger::Blocks::Nodes::ExampleNode.call(version: version, inline_keys: inline_keys, &block)
16
+ def content(type, inline_keys = nil, &block)
17
+ self.data[:content] ||= {}
18
+ self.data[:content][type] = Swagger::Blocks::Nodes::ContentNode.call(version: version, inline_keys: inline_keys, &block)
19
+ end
20
+
21
+ def example(name = nil, inline_keys = nil, &block)
22
+ if name.nil?
23
+ self.data[:example] = Swagger::Blocks::Nodes::ExampleNode.call(version: version, inline_keys: inline_keys, &block)
24
+ else
25
+ self.data[:examples] ||= {}
26
+ self.data[:examples][name] = Swagger::Blocks::Nodes::ExampleNode.call(version: version, inline_keys: inline_keys, &block)
27
+ end
28
+ end
29
+
30
+ def link(name, inline_keys = nil, &block)
31
+ self.data[:links] ||= {}
32
+ self.data[:links][name] = Swagger::Blocks::Nodes::LinkNode.call(version: version, inline_keys: inline_keys, &block)
20
33
  end
21
34
  end
22
35
  end
@@ -31,7 +31,7 @@ module Swagger
31
31
  end
32
32
 
33
33
  def security(inline_keys = nil, &block)
34
- raise NotSupportedError unless is_swagger_2_0?
34
+ raise NotSupportedError unless is_swagger_2_0? || is_openapi_3_0?
35
35
 
36
36
  self.data[:security] ||= []
37
37
  self.data[:security] << Swagger::Blocks::Nodes::SecurityRequirementNode.call(version: version, inline_keys: inline_keys, &block)
@@ -42,12 +42,26 @@ module Swagger
42
42
  end
43
43
 
44
44
  def tag(inline_keys = nil, &block)
45
- raise NotSupportedError unless is_swagger_2_0?
45
+ raise NotSupportedError unless is_swagger_2_0? || is_openapi_3_0?
46
46
 
47
47
  self.data[:tags] ||= []
48
48
  self.data[:tags] << Swagger::Blocks::Nodes::TagNode.call(version: version, inline_keys: inline_keys, &block)
49
49
  end
50
50
 
51
+ def server(inline_keys = nil, &block)
52
+ raise NotSupportedError unless is_openapi_3_0?
53
+
54
+ self.data[:servers] ||= []
55
+ self.data[:servers] << Swagger::Blocks::Nodes::ServerNode.call(version: version, inline_keys: inline_keys, &block)
56
+ end
57
+
58
+ def extension(name, inline_keys = nil, &block)
59
+ raise NotSupportedError unless is_openapi_3_0?
60
+
61
+ self.data[name] ||= []
62
+ self.data[name] << Swagger::Blocks::Nodes::VendorExtensionNode.call(version: version, inline_keys: inline_keys, &block)
63
+ end
64
+
51
65
  # Use 'tag' instead.
52
66
  # @deprecated
53
67
  alias_method :tags, :tag
@@ -24,6 +24,15 @@ module Swagger
24
24
  def externalDocs(inline_keys = nil, &block)
25
25
  self.data[:externalDocs] = Swagger::Blocks::Nodes::ExternalDocsNode.call(version: version, inline_keys: inline_keys, &block)
26
26
  end
27
+
28
+ def example(inline_keys = nil, &block)
29
+ self.data[:example] = Swagger::Blocks::Nodes::ExampleNode.call(version: version, inline_keys: inline_keys, &block)
30
+ end
31
+
32
+ def one_of(&block)
33
+ self.data[:oneOf] ||= []
34
+ self.data[:oneOf] << Swagger::Blocks::Nodes::OneOfNode.call(version: version, &block)
35
+ end
27
36
  end
28
37
  end
29
38
  end
@@ -1,7 +1,6 @@
1
1
  module Swagger
2
2
  module Blocks
3
3
  module Nodes
4
- # v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#scopes-object
5
4
  class ScopesNode < Node
6
5
  end
7
6
  end
@@ -1,13 +1,17 @@
1
1
  module Swagger
2
2
  module Blocks
3
3
  module Nodes
4
- # v2.0: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#security-scheme-object
5
4
  class SecuritySchemeNode < Node
6
5
  # TODO support ^x- Vendor Extensions
7
6
 
8
7
  def scopes(inline_keys = nil, &block)
9
8
  self.data[:scopes] = Swagger::Blocks::Nodes::ScopesNode.call(version: version, inline_keys: inline_keys, &block)
10
9
  end
10
+
11
+ def flow(name, inline_keys = nil, &block)
12
+ self.data[:flows] ||= {}
13
+ self.data[:flows][name] = Swagger::Blocks::Nodes::FlowNode.call(version: version, inline_keys: inline_keys, &block)
14
+ end
11
15
  end
12
16
  end
13
17
  end
@@ -0,0 +1,12 @@
1
+ module Swagger
2
+ module Blocks
3
+ module Nodes
4
+ class ServerNode < Node
5
+ def variable(name, inline_keys = nil, &block)
6
+ self.data[:variables] ||= {}
7
+ self.data[:variables][name] = Swagger::Blocks::Nodes::VariableNode.call(version: version, inline_keys: inline_keys, &block)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ module Swagger
2
+ module Blocks
3
+ module Nodes
4
+ class ValueNode < Node
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Swagger
2
+ module Blocks
3
+ module Nodes
4
+ class VariableNode < Node
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module Swagger
2
+ module Blocks
3
+ module Nodes
4
+ # v3.0: https://swagger.io/docs/specification/openapi-extensions/
5
+ class VendorExtensionNode < Node
6
+ end
7
+ end
8
+ end
9
+ end
@@ -19,7 +19,14 @@ module Swagger
19
19
  end
20
20
  end
21
21
 
22
- data[:root_node].as_json
22
+ if data[:root_node].is_openapi_3_0?
23
+ data[:root_node].key(:paths, data[:path_nodes]) # Required, so no empty check.
24
+ if data[:component_node] && !data[:component_node].data.empty?
25
+ data[:root_node].key(:components, data[:component_node])
26
+ end
27
+ end
28
+
29
+ data[:root_node].as_json(version: data[:root_node].version)
23
30
  end
24
31
  end
25
32
  end
@@ -1,5 +1,5 @@
1
1
  module Swagger
2
2
  module Blocks
3
- VERSION = '2.0.2'
3
+ VERSION = '3.0.0'
4
4
  end
5
5
  end
@@ -328,7 +328,7 @@ describe 'Swagger::Blocks v2' do
328
328
  Swagger::Blocks.build_root_json([])
329
329
  }.to raise_error(Swagger::Blocks::DeclarationError)
330
330
  end
331
- it 'errors if mulitple swagger_roots are declared' do
331
+ it 'errors if multiple swagger_roots are declared' do
332
332
  expect {
333
333
  Swagger::Blocks.build_root_json([PetControllerV2, PetControllerV2])
334
334
  }.to raise_error(Swagger::Blocks::DeclarationError)
@@ -0,0 +1,592 @@
1
+ {
2
+ "openapi": "3.0.0",
3
+ "info": {
4
+ "version": "1.0.1",
5
+ "title": "Swagger Petstore",
6
+ "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification",
7
+ "termsOfService": "http://helloreverb.com/terms/",
8
+ "contact": {
9
+ "name": "Wordnik API Team"
10
+ },
11
+ "license": {
12
+ "name": "MIT"
13
+ }
14
+ },
15
+ "servers": [
16
+ {
17
+ "url": "http://petstore.swagger.io/v1",
18
+ "description": "Petstore API"
19
+ },
20
+ {
21
+ "url": "https://{subdomain}.site.com/{version}",
22
+ "description": "The main prod server",
23
+ "variables": {
24
+ "subdomain": {
25
+ "default": "production"
26
+ },
27
+ "version": {
28
+ "enum": [
29
+ "v1",
30
+ "v2"
31
+ ],
32
+ "default": "v2"
33
+ }
34
+ }
35
+ }
36
+ ],
37
+ "security": [
38
+ {
39
+ "ApiKeyAuth": []
40
+ },
41
+ {
42
+ "OAuth2": [
43
+ "read",
44
+ "write"
45
+ ]
46
+ }
47
+ ],
48
+ "x-tagGroups": [
49
+ {
50
+ "name": "Pets",
51
+ "tags": ["dogs", "cats"]
52
+ }
53
+ ],
54
+ "tags": [
55
+ {
56
+ "name": "dogs",
57
+ "description": "Dogs"
58
+ },
59
+ {
60
+ "name": "cats",
61
+ "description": "Cats"
62
+ }
63
+ ],
64
+ "paths": {
65
+ "/pets": {
66
+ "description": "Perform actions on pet resources",
67
+ "servers": [
68
+ {
69
+ "url": "http://petstore.swagger.io/",
70
+ "description": "Petstore API (without version prefix)"
71
+ }
72
+ ],
73
+ "get": {
74
+ "summary": "List all pets",
75
+ "operationId": "listPets",
76
+ "tags": [
77
+ "pets"
78
+ ],
79
+ "parameters": [
80
+ {
81
+ "name": "limit",
82
+ "in": "query",
83
+ "description": "How many items to return at one time (max 100)",
84
+ "required": false,
85
+ "schema": {
86
+ "type": "integer",
87
+ "format": "int32"
88
+ },
89
+ "examples": {
90
+ "large": {
91
+ "value": 100,
92
+ "summary": "Return a maximum of 100 results"
93
+ },
94
+ "small": {
95
+ "value": 5,
96
+ "summary": "Return a maximum of 5 results"
97
+ }
98
+ }
99
+ }
100
+ ],
101
+ "servers": [
102
+ {
103
+ "url": "http://petstore.swagger.io/2.1/",
104
+ "description": "Petstore API (with version 2.1 prefix)"
105
+ }
106
+ ],
107
+ "responses": {
108
+ "200": {
109
+ "description": "A paged array of pets",
110
+ "headers": {
111
+ "x-next": {
112
+ "description": "A link to the next page of responses",
113
+ "schema": {
114
+ "type": "string"
115
+ }
116
+ }
117
+ },
118
+ "content": {
119
+ "application/json": {
120
+ "schema": {
121
+ "$ref": "#/components/schemas/Pets"
122
+ },
123
+ "examples": {
124
+ "Rabbit": {
125
+ "value": {
126
+ "id": 10,
127
+ "name": "Rabbit"
128
+ }
129
+ },
130
+ "Cat": {
131
+ "$ref": "#/components/examples/Cat"
132
+ }
133
+ }
134
+ }
135
+ },
136
+ "links": {
137
+ "getPetById": {
138
+ "$ref": "#/components/links/GetPetById"
139
+ }
140
+ }
141
+ },
142
+ "default": {
143
+ "description": "unexpected error",
144
+ "content": {
145
+ "application/json": {
146
+ "schema": {
147
+ "$ref": "#/components/schemas/Error"
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ },
154
+ "post": {
155
+ "summary": "Create a pet",
156
+ "operationId": "createPets",
157
+ "tags": [
158
+ "pets"
159
+ ],
160
+ "requestBody": {
161
+ "description": "Pet to add to the store",
162
+ "required": true,
163
+ "content": {
164
+ "application/json": {
165
+ "schema": {
166
+ "properties": {
167
+ "name": {
168
+ "type": "string"
169
+ }
170
+ },
171
+ "example": {
172
+ "name": "Fluffy"
173
+ }
174
+ }
175
+ }
176
+ }
177
+ },
178
+ "responses": {
179
+ "201": {
180
+ "description": "New Pet",
181
+ "content": {
182
+ "application/json": {
183
+ "schema": {
184
+ "$ref": "#/components/schemas/Pet"
185
+ }
186
+ }
187
+ },
188
+ "links": {
189
+ "getPetById": {
190
+ "operationId": "showPetById",
191
+ "parameters": {
192
+ "id": "$response.body#/id"
193
+ },
194
+ "description": "The `id` value returned in the response can be used as the `petId` parameter in `GET /pets/{petId}`."
195
+ }
196
+ }
197
+ },
198
+ "default": {
199
+ "description": "unexpected error",
200
+ "content": {
201
+ "application/json": {
202
+ "schema": {
203
+ "$ref": "#/components/schemas/Error"
204
+ }
205
+ }
206
+ }
207
+ }
208
+ }
209
+ }
210
+ },
211
+ "/pets/{petId}": {
212
+ "parameters": [
213
+ {
214
+ "name": "petId",
215
+ "in": "path",
216
+ "required": true,
217
+ "description": "The id of the pet to retrieve",
218
+ "schema": {
219
+ "type": "string"
220
+ }
221
+ }
222
+ ],
223
+ "get": {
224
+ "summary": "Info for a specific pet",
225
+ "operationId": "showPetById",
226
+ "tags": [
227
+ "pets"
228
+ ],
229
+ "responses": {
230
+ "200": {
231
+ "description": "Expected response to a valid request",
232
+ "content": {
233
+ "application/json": {
234
+ "schema": {
235
+ "$ref": "#/components/schemas/Pet"
236
+ }
237
+ }
238
+ }
239
+ },
240
+ "default": {
241
+ "description": "unexpected error",
242
+ "content": {
243
+ "application/json": {
244
+ "schema": {
245
+ "$ref": "#/components/schemas/Error"
246
+ }
247
+ }
248
+ }
249
+ }
250
+ }
251
+ },
252
+ "post": {
253
+ "summary": "Update info for a specific pet",
254
+ "operationId": "updatePetById",
255
+ "tags": [
256
+ "pets"
257
+ ],
258
+ "requestBody": {
259
+ "$ref": "#/components/requestBodies/PetBody"
260
+ },
261
+ "responses": {
262
+ "200": {
263
+ "$ref": "#/components/responses/UpdatePetBodyResponse"
264
+ },
265
+ "default": {
266
+ "description": "unexpected error",
267
+ "content": {
268
+ "application/json": {
269
+ "schema": {
270
+ "$ref": "#/components/schemas/Error"
271
+ }
272
+ }
273
+ }
274
+ }
275
+ }
276
+ },
277
+ "put": {
278
+ "summary": "Replace info for a specific pet",
279
+ "operationId": "replacePetById",
280
+ "tags": [
281
+ "pets"
282
+ ],
283
+ "requestBody": {
284
+ "$ref": "#/components/requestBodies/PetBody"
285
+ },
286
+ "responses": {
287
+ "200": {
288
+ "$ref": "#/components/responses/ReplacePetBodyResponse"
289
+ },
290
+ "default": {
291
+ "description": "unexpected error",
292
+ "content": {
293
+ "application/json": {
294
+ "schema": {
295
+ "$ref": "#/components/schemas/Error"
296
+ }
297
+ }
298
+ }
299
+ }
300
+ }
301
+ }
302
+ },
303
+ "/pets/{petId}/purchase": {
304
+ "post": {
305
+ "summary": "Purchase a specific pet",
306
+ "operationId": "purchasePetById",
307
+ "deprecated": true,
308
+ "tags": [
309
+ "pets"
310
+ ],
311
+ "parameters": [
312
+ {"$ref": "#/components/parameters/petId"}
313
+ ],
314
+ "requestBody": {
315
+ "description": "Pet order object",
316
+ "required": true,
317
+ "content": {
318
+ "application/json": {
319
+ "schema": {
320
+ "oneOf": [
321
+ {"$ref": "#/components/schemas/PetOrderRequest"},
322
+ {"$ref": "#/components/schemas/ComplexPetOrderRequest"}
323
+ ]
324
+ },
325
+ "example": {
326
+ "id": 10,
327
+ "name": "Fluffy"
328
+ }
329
+ }
330
+ }
331
+ },
332
+ "responses": {
333
+ "201": {
334
+ "description": "Expected response to a valid request",
335
+ "content": {
336
+ "application/json": {
337
+ "schema": {
338
+ "$ref": "#/components/schemas/PetOrder"
339
+ }
340
+ }
341
+ }
342
+ },
343
+ "default": {
344
+ "description": "unexpected error",
345
+ "content": {
346
+ "application/json": {
347
+ "schema": {
348
+ "$ref": "#/components/schemas/Error"
349
+ }
350
+ }
351
+ }
352
+ }
353
+ },
354
+ "callbacks": {
355
+ "orderUpdated": {
356
+ "{$request.body#/webhook_url}": {
357
+ "post": {
358
+ "requestBody": {
359
+ "required": true,
360
+ "content": {
361
+ "application/json": {
362
+ "schema": {
363
+ "$ref": "#/components/schemas/OrderUpdated"
364
+ }
365
+ }
366
+ }
367
+ },
368
+ "responses": {
369
+ "200": {
370
+ "description": "The server must return an HTTP 200, otherwise delivery will be reattempted."
371
+ }
372
+ }
373
+ }
374
+ }
375
+ }
376
+ }
377
+ }
378
+ }
379
+ },
380
+ "components": {
381
+ "schemas": {
382
+ "Pet": {
383
+ "required": [
384
+ "id",
385
+ "name"
386
+ ],
387
+ "properties": {
388
+ "id": {
389
+ "type": "integer",
390
+ "format": "int64"
391
+ },
392
+ "name": {
393
+ "type": "string"
394
+ },
395
+ "tag_ids": {
396
+ "type": "array",
397
+ "items": {
398
+ "type": "integer",
399
+ "format": "int64",
400
+ "example": 1
401
+ },
402
+ "example": [1, 2, 3]
403
+ }
404
+ }
405
+ },
406
+ "Pets": {
407
+ "type": "array",
408
+ "items": {
409
+ "$ref": "#/components/schemas/Pet"
410
+ },
411
+ "example": [{"id": 10, "name": "Rover"}, {"id": 20, "name": "Felicity"}]
412
+ },
413
+ "PetOrderRequest": {
414
+ "required": [
415
+ "phone_number"
416
+ ],
417
+ "properties": {
418
+ "phone_number": {
419
+ "type": "string"
420
+ },
421
+ "webhook_url": {
422
+ "type": "string"
423
+ }
424
+ }
425
+ },
426
+ "PetOrder": {
427
+ "required": [
428
+ "phone_number",
429
+ "id",
430
+ "status"
431
+ ],
432
+ "properties": {
433
+ "id": {
434
+ "type": "integer",
435
+ "format": "int64"
436
+ },
437
+ "phone_number": {
438
+ "type": "string"
439
+ },
440
+ "webhook_url": {
441
+ "type": "string"
442
+ },
443
+ "status": {
444
+ "type": "string"
445
+ }
446
+ }
447
+ },
448
+ "OrderUpdated": {
449
+ "required": [
450
+ "order_id",
451
+ "status",
452
+ "phone_number"
453
+ ],
454
+ "properties": {
455
+ "order_id": {
456
+ "type": "integer",
457
+ "format": "int64"
458
+ },
459
+ "phone_number": {
460
+ "type": "string"
461
+ },
462
+ "status": {
463
+ "type": "string"
464
+ }
465
+ },
466
+ "example": {
467
+ "order_id": 123,
468
+ "phone_number": "3125556666",
469
+ "status": "complete"
470
+ }
471
+ },
472
+ "Error": {
473
+ "required": [
474
+ "code",
475
+ "message"
476
+ ],
477
+ "properties": {
478
+ "code": {
479
+ "type": "integer",
480
+ "format": "int32"
481
+ },
482
+ "message": {
483
+ "type": "string"
484
+ }
485
+ }
486
+ }
487
+ },
488
+ "requestBodies": {
489
+ "PetBody": {
490
+ "description": "A JSON object containing pet information",
491
+ "required": true,
492
+ "content": {
493
+ "application/json": {
494
+ "schema": {
495
+ "$ref": "#/components/schemas/Pet"
496
+ }
497
+ }
498
+ }
499
+ }
500
+ },
501
+ "responses" : {
502
+ "UpdatePetBodyResponse": {
503
+ "description": "Expected response to a valid request",
504
+ "content": {
505
+ "application/json": {
506
+ "schema": {
507
+ "$ref": "#/components/schemas/Pet"
508
+ }
509
+ }
510
+ }
511
+ },
512
+ "ReplacePetBodyResponse": {
513
+ "description": "Expected response to a valid request",
514
+ "content": {
515
+ "application/json": {
516
+ "schema": {
517
+ "$ref": "#/components/schemas/Pet"
518
+ }
519
+ }
520
+ }
521
+ }
522
+ },
523
+ "links": {
524
+ "GetPetById": {
525
+ "operationId": "showPetById",
526
+ "parameters": {
527
+ "petId": "$response.body#/id"
528
+ }
529
+ }
530
+ },
531
+ "examples": {
532
+ "PetExample": {
533
+ "value": {
534
+ "id": 1,
535
+ "name": "Rover"
536
+ },
537
+ "summary": "An example pet response"
538
+ },
539
+ "Cat": {
540
+ "value": {
541
+ "id": 1,
542
+ "name": "Felicity"
543
+ },
544
+ "summary": "An example cat response"
545
+ }
546
+ },
547
+ "securitySchemes": {
548
+ "BasicAuth": {
549
+ "type": "http",
550
+ "scheme": "basic"
551
+ },
552
+ "BearerAuth": {
553
+ "type": "http",
554
+ "scheme": "bearer"
555
+ },
556
+ "ApiKeyAuth": {
557
+ "type": "apiKey",
558
+ "in": "header",
559
+ "name": "X-API-Key"
560
+ },
561
+ "OpenID": {
562
+ "type": "openIdConnect",
563
+ "openIdConnectUrl": "https://example.com/.well-known/openid-configuration"
564
+ },
565
+ "OAuth2": {
566
+ "type": "oauth2",
567
+ "flows": {
568
+ "authorizationCode": {
569
+ "authorizationUrl": "https://example.com/oauth/authorize",
570
+ "tokenUrl": "https://example.com/oauth/token",
571
+ "scopes": {
572
+ "read": "Grants read access",
573
+ "write": "Grants write access",
574
+ "admin": "Grants access to admin operations"
575
+ }
576
+ }
577
+ }
578
+ }
579
+ },
580
+ "parameters": {
581
+ "petId": {
582
+ "name": "petId",
583
+ "in": "path",
584
+ "required": true,
585
+ "description": "The id of the pet to retrieve",
586
+ "schema": {
587
+ "type": "string"
588
+ }
589
+ }
590
+ }
591
+ }
592
+ }