diff --git a/docs/customization.md b/docs/customization.md index 378ab2bff33..f7148019196 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -455,6 +455,7 @@ Note: Only arrayItemSuffix, mapItemSuffix are supported at the moment. There are 2 special values: - `SKIP_SCHEMA_REUSE=true` is a special value to skip reusing inline schemas. - `REFACTOR_ALLOF_INLINE_SCHEMAS=true` will restore the 6.x (or below) behaviour to refactor allOf inline schemas into $ref. (v7.0.0 will skip the refactoring of these allOf inline schmeas by default) +- `RESOLVE_INLINE_ENUMS=true` will refactor inline enum definitions into $ref ## OpenAPI Normalizer diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java index 7c023459a5b..17535f024ce 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java @@ -81,11 +81,13 @@ public class InlineModelResolver { } if (this.inlineSchemaNameDefaults.containsKey("REFACTOR_ALLOF_INLINE_SCHEMAS")) { - if (Boolean.valueOf(this.inlineSchemaNameDefaults.get("REFACTOR_ALLOF_INLINE_SCHEMAS"))) { - this.refactorAllOfInlineSchemas = true; - } else { // set to false - this.refactorAllOfInlineSchemas = false; - } + this.refactorAllOfInlineSchemas = Boolean.valueOf(this.inlineSchemaNameDefaults.get("REFACTOR_ALLOF_INLINE_SCHEMAS")); + } else { + // not set so default to null; + } + + if (this.inlineSchemaNameDefaults.containsKey("RESOLVE_INLINE_ENUMS")) { + this.resolveInlineEnums = Boolean.valueOf(this.inlineSchemaNameDefaults.get("RESOLVE_INLINE_ENUMS")); } else { // not set so default to null; } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java index 3a0b81ee1e3..99f9e21f9fb 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java @@ -23,6 +23,7 @@ import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.media.*; +import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.parameters.RequestBody; import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponses; @@ -1129,4 +1130,45 @@ public class InlineModelResolverTest { assertTrue((Schema) schema.getAnyOf().get(0) instanceof StringSchema); assertTrue((Schema) schema.getAnyOf().get(1) instanceof IntegerSchema); } + + @Test + public void resolveOperationInlineEnum() { + OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/inline_model_resolver.yaml"); + Parameter parameter = openAPI.getPaths().get("/resolve_parameter_inline_enum").getGet().getParameters().get(0); + assertNull(((ArraySchema) parameter.getSchema()).getItems().get$ref() ); + + InlineModelResolver resolver = new InlineModelResolver(); + Map inlineSchemaNameDefaults = new HashMap<>(); + inlineSchemaNameDefaults.put("RESOLVE_INLINE_ENUMS", "true"); + resolver.setInlineSchemaNameDefaults(inlineSchemaNameDefaults); + resolver.flatten(openAPI); + + Parameter parameter2 = openAPI.getPaths().get("/resolve_parameter_inline_enum").getGet().getParameters().get(0); + assertEquals("#/components/schemas/resolveParameterInlineEnum_status_inline_enum_parameter_inner", + ((ArraySchema) parameter2.getSchema()).getItems().get$ref() ); + + } + + @Test + public void resolveOperationInlineEnumFormParameters() { + OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/inline_model_resolver.yaml"); + Schema requestBody = openAPI.getPaths().get("/resolve_parameter_inline_enum_form_parameters").getPost().getRequestBody().getContent().get("application/x-www-form-urlencoded").getSchema(); + assertNull(requestBody.get$ref()); + + InlineModelResolver resolver = new InlineModelResolver(); + Map inlineSchemaNameDefaults = new HashMap<>(); + inlineSchemaNameDefaults.put("RESOLVE_INLINE_ENUMS", "true"); + resolver.setInlineSchemaNameDefaults(inlineSchemaNameDefaults); + resolver.flatten(openAPI); + + Schema requestBody2 = openAPI.getPaths().get("/resolve_parameter_inline_enum_form_parameters").getPost().getRequestBody().getContent().get("application/x-www-form-urlencoded").getSchema(); + assertEquals("#/components/schemas/resolve_parameter_inline_enum_form_parameters_request", requestBody2.get$ref()); + + Schema inlineFormParaemter = (Schema) openAPI.getComponents().getSchemas().get("resolve_parameter_inline_enum_form_parameters_request"); + assertNotNull(inlineFormParaemter); + assertEquals(2, inlineFormParaemter.getProperties().size()); + assertEquals("#/components/schemas/resolve_parameter_inline_enum_form_parameters_request_enum_form_string", + ((Schema) inlineFormParaemter.getProperties().get("enum_form_string")).get$ref()); + + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml b/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml index 5f4dc8243c2..6b0b89d36ef 100644 --- a/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml @@ -7,6 +7,58 @@ info: servers: - url: http://api.example.xyz/v1 paths: + /resolve_parameter_inline_enum: + get: + parameters: + - name: status_inline_enum + in: query + description: Status values that need to be considered for filter + required: true + style: form + explode: false + deprecated: true + schema: + type: array + items: + type: string + enum: + - available + - pending + - sold + default: available + operationId: resolveParameterInlineEnum + responses: + '200': + description: OK + /resolve_parameter_inline_enum_form_parameters: + post: + requestBody: + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + enum_form_string_array: + description: Form parameter enum test (string array) + type: array + items: + type: string + default: $ + enum: + - '>' + - $ + enum_form_string: + description: Form parameter enum test (string) + type: string + enum: + - _abc + - '-efg' + - (xyz) + default: '-efg' + operationId: resolve_parameter_inline_enum_form_parameters + responses: + '200': + description: OK /resolve_request_body_invalid_ref: post: requestBody: