Skip to content

Commit 0d3735e

Browse files
author
Jonathan Gordon
authored
Fix #156, various parameter issues (#157)
1 parent 9d0eda5 commit 0d3735e

2 files changed

Lines changed: 68 additions & 4 deletions

File tree

openapi2conv/openapi2_conv.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,11 @@ func ToV3Parameter(parameter *openapi2.Parameter) (*openapi3.ParameterRef, *open
156156
if parameter == nil {
157157
return nil, nil, nil
158158
}
159+
if ref := parameter.Ref; len(ref) > 0 {
160+
return &openapi3.ParameterRef{
161+
Ref: ToV3Ref(ref),
162+
}, nil, nil
163+
}
159164
in := parameter.In
160165
if in == "body" {
161166
result := &openapi3.RequestBody{
@@ -251,6 +256,7 @@ func ToV3SchemaRef(schema *openapi3.SchemaRef) *openapi3.SchemaRef {
251256
var ref2To3 = map[string]string{
252257
"#/definitions/": "#/components/schemas/",
253258
"#/responses/": "#/components/responses/",
259+
"#/parameters/": "#/components/parameters/",
254260
}
255261

256262
func ToV3Ref(ref string) string {
@@ -367,6 +373,7 @@ func FromV3Swagger(swagger *openapi3.Swagger) (*openapi2.Swagger, error) {
367373
if pathItem == nil {
368374
continue
369375
}
376+
result.AddOperation(path, "GET", nil)
370377
for method, operation := range pathItem.Operations() {
371378
if operation == nil {
372379
continue
@@ -377,6 +384,22 @@ func FromV3Swagger(swagger *openapi3.Swagger) (*openapi2.Swagger, error) {
377384
}
378385
result.AddOperation(path, method, resultOperation)
379386
}
387+
params := openapi2.Parameters{}
388+
for _, param := range pathItem.Parameters {
389+
p, err := FromV3Parameter(param)
390+
if err != nil {
391+
return nil, err
392+
}
393+
params = append(params, p)
394+
}
395+
result.Paths[path].Parameters = params
396+
}
397+
result.Parameters = map[string]*openapi2.Parameter{}
398+
for name, param := range swagger.Components.Parameters {
399+
result.Parameters[name], err = FromV3Parameter(param)
400+
if err != nil {
401+
return nil, err
402+
}
380403
}
381404
if m := swagger.Components.SecuritySchemes; m != nil {
382405
resultSecuritySchemes := make(map[string]*openapi2.SecurityScheme)

openapi2conv/openapi2_conv_test.go

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
package openapi2conv_test
1+
package openapi2conv
22

33
import (
44
"encoding/json"
55
"testing"
66

77
"github.com/getkin/kin-openapi/openapi2"
8-
"github.com/getkin/kin-openapi/openapi2conv"
98
"github.com/getkin/kin-openapi/openapi3"
109
"github.com/stretchr/testify/require"
1110
)
@@ -15,7 +14,7 @@ func TestConvOpenAPIV3ToV2(t *testing.T) {
1514
err := json.Unmarshal([]byte(exampleV3), &swagger3)
1615
require.NoError(t, err)
1716

18-
actualV2, err := openapi2conv.FromV3Swagger(&swagger3)
17+
actualV2, err := FromV3Swagger(&swagger3)
1918
require.NoError(t, err)
2019
data, err := json.Marshal(actualV2)
2120
require.NoError(t, err)
@@ -27,7 +26,7 @@ func TestConvOpenAPIV2ToV3(t *testing.T) {
2726
err := json.Unmarshal([]byte(exampleV2), &swagger2)
2827
require.NoError(t, err)
2928

30-
actualV3, err := openapi2conv.ToV3Swagger(&swagger2)
29+
actualV3, err := ToV3Swagger(&swagger2)
3130
require.NoError(t, err)
3231
data, err := json.Marshal(actualV3)
3332
require.NoError(t, err)
@@ -47,6 +46,19 @@ const exampleV2 = `
4746
}
4847
],
4948
"paths": {
49+
"/another/{banana}/{id}": {
50+
"parameters": [
51+
{
52+
"$ref": "#/parameters/banana"
53+
},
54+
{
55+
"in": "path",
56+
"name": "id",
57+
"type": "integer",
58+
"required": true
59+
}
60+
]
61+
},
5062
"/example": {
5163
"delete": {
5264
"description": "example delete",
@@ -185,6 +197,12 @@ const exampleV2 = `
185197
}
186198
}
187199
},
200+
"parameters": {
201+
"banana": {
202+
"in": "path",
203+
"type": "string"
204+
}
205+
},
188206
"security": [
189207
{
190208
"default_security_0": [
@@ -214,6 +232,14 @@ const exampleV3 = `
214232
"description": "Insufficient permission to perform the requested action."
215233
}
216234
},
235+
"parameters": {
236+
"banana": {
237+
"in": "path",
238+
"schema": {
239+
"type": "string"
240+
}
241+
}
242+
},
217243
"schemas": {
218244
"Item": {
219245
"type": "object",
@@ -255,6 +281,21 @@ const exampleV3 = `
255281
}
256282
],
257283
"paths": {
284+
"/another/{banana}/{id}": {
285+
"parameters": [
286+
{
287+
"$ref": "#/components/parameters/banana"
288+
},
289+
{
290+
"in": "path",
291+
"name": "id",
292+
"schema": {
293+
"type": "integer"
294+
},
295+
"required": true
296+
}
297+
]
298+
},
258299
"/example": {
259300
"delete": {
260301
"description": "example delete",

0 commit comments

Comments
 (0)