From fbfe31dd8ce05aafea53b153d30661f54ccc7d4a Mon Sep 17 00:00:00 2001 From: Andrew Young Date: Thu, 26 Jan 2023 13:42:47 -0800 Subject: [PATCH] Fix allOf merges using external refs --- pkg/codegen/codegen_test.go | 5 ++++- pkg/codegen/filter_test.go | 10 ++++++++-- pkg/codegen/merge_schemas.go | 4 ++-- pkg/codegen/test_schema.json | 15 +++++++++++++++ pkg/codegen/test_spec.yaml | 28 ++++++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 pkg/codegen/test_schema.json diff --git a/pkg/codegen/codegen_test.go b/pkg/codegen/codegen_test.go index e3878f58dd..6ae61211a9 100644 --- a/pkg/codegen/codegen_test.go +++ b/pkg/codegen/codegen_test.go @@ -145,8 +145,11 @@ func TestExampleOpenAPICodeGeneration(t *testing.T) { }, } + loader := openapi3.NewLoader() + loader.IsExternalRefsAllowed = true + // Get a spec from the test definition in this file: - swagger, err := openapi3.NewLoader().LoadFromData([]byte(testOpenAPIDefinition)) + swagger, err := loader.LoadFromData([]byte(testOpenAPIDefinition)) assert.NoError(t, err) // Run our code generation: diff --git a/pkg/codegen/filter_test.go b/pkg/codegen/filter_test.go index d3a5aec546..774d016a84 100644 --- a/pkg/codegen/filter_test.go +++ b/pkg/codegen/filter_test.go @@ -23,8 +23,11 @@ func TestFilterOperationsByTag(t *testing.T) { }, } + loader := openapi3.NewLoader() + loader.IsExternalRefsAllowed = true + // Get a spec from the test definition in this file: - swagger, err := openapi3.NewLoader().LoadFromData([]byte(testOpenAPIDefinition)) + swagger, err := loader.LoadFromData([]byte(testOpenAPIDefinition)) assert.NoError(t, err) // Run our code generation: @@ -49,8 +52,11 @@ func TestFilterOperationsByTag(t *testing.T) { }, } + loader := openapi3.NewLoader() + loader.IsExternalRefsAllowed = true + // Get a spec from the test definition in this file: - swagger, err := openapi3.NewLoader().LoadFromData([]byte(testOpenAPIDefinition)) + swagger, err := loader.LoadFromData([]byte(testOpenAPIDefinition)) assert.NoError(t, err) // Run our code generation: diff --git a/pkg/codegen/merge_schemas.go b/pkg/codegen/merge_schemas.go index 466e55c549..8cfbe13a00 100644 --- a/pkg/codegen/merge_schemas.go +++ b/pkg/codegen/merge_schemas.go @@ -53,10 +53,10 @@ func valueWithPropagatedRef(ref *openapi3.SchemaRef) (openapi3.Schema, error) { } pathParts := strings.Split(ref.Ref, "#") - if len(pathParts) != 2 { + if len(pathParts) < 1 || len(pathParts) > 2 { return openapi3.Schema{}, fmt.Errorf("unsupported reference: %s", ref.Ref) } - remoteComponent, _ := pathParts[0], pathParts[1] + remoteComponent := pathParts[0] // remote ref schema := *ref.Value diff --git a/pkg/codegen/test_schema.json b/pkg/codegen/test_schema.json new file mode 100644 index 0000000000..d64939498e --- /dev/null +++ b/pkg/codegen/test_schema.json @@ -0,0 +1,15 @@ +{ + "title": "node", + "type": "object", + "description": "Represents a node", + "properties": { + "id": { + "type": "string", + "format": "uri-reference" + }, + "type": { + "type": "string", + "pattern": "^[A-Z][a-zA-Z0-9]*$" + } + } +} \ No newline at end of file diff --git a/pkg/codegen/test_spec.yaml b/pkg/codegen/test_spec.yaml index 7491c69c31..b50f7491c5 100644 --- a/pkg/codegen/test_spec.yaml +++ b/pkg/codegen/test_spec.yaml @@ -108,6 +108,25 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' + /user: + get: + tags: + - mergeAllOf + summary: Merges allOf ref-ing a JSON schema + operationId: getUser + responses: + 200: + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/User' + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' components: schemas: @@ -177,3 +196,12 @@ components: - na - single - double + User: + allOf: + - $ref: ./test_schema.json + - type: object + additionalProperties: false + properties: + name: + type: string + description: User name