From 417d69425ace530c0db2d9eb5adf6ebfc64a1d85 Mon Sep 17 00:00:00 2001 From: bgong-mdsol Date: Tue, 1 Mar 2022 11:32:25 -0500 Subject: [PATCH] [scala-sttp] fix enumeration operator constant name collision (#10596) * fix enumeration operator onstant name collision * test to verify OperatorName --- .../languages/AbstractScalaCodegen.java | 11 ++++ .../codegen/scala/SttpCodegenTest.java | 50 +++++++++++++++++++ .../3_0/scala/issue_10187_operatorName.yaml | 50 +++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 modules/openapi-generator/src/test/resources/3_0/scala/issue_10187_operatorName.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java index 44b17558017..21e7d80d7ab 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java @@ -166,6 +166,13 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { dateLibrary.setEnum(dateOptions); cliOptions.add(dateLibrary); + specialCharReplacements.put("=", "Equal"); + specialCharReplacements.put("!=", "Not_Equal"); + specialCharReplacements.put(">", "Greater_Than"); + specialCharReplacements.put("<", "Less_Than"); + specialCharReplacements.put(">=", "Greater_Than_Or_Equal_To"); + specialCharReplacements.put("<=", "Less_Than_Or_Equal_To"); + } @Override @@ -454,6 +461,7 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { prop.containerType = "set"; } } + return prop; } @@ -508,6 +516,9 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { } protected String formatIdentifier(String name, boolean capitalized) { + if (specialCharReplacements.containsKey(name)) { + name = specialCharReplacements.get(name); + } String identifier = camelize(sanitizeName(name), true); if (capitalized) { identifier = StringUtils.capitalize(identifier); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/scala/SttpCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/scala/SttpCodegenTest.java index 653fc342d82..01a86c04d4c 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/scala/SttpCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/scala/SttpCodegenTest.java @@ -1,10 +1,26 @@ package org.openapitools.codegen.scala; +import static org.openapitools.codegen.TestUtils.assertFileContains; +import static org.openapitools.codegen.TestUtils.assertFileNotContains; + +import org.openapitools.codegen.ClientOptInput; +import org.openapitools.codegen.CodegenConstants; +import org.openapitools.codegen.DefaultGenerator; import org.openapitools.codegen.languages.ScalaSttpClientCodegen; +import org.openapitools.codegen.languages.features.CXFServerFeatures; import org.testng.Assert; import org.testng.annotations.Test; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import io.swagger.parser.OpenAPIParser; +import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.parser.core.models.ParseOptions; public class SttpCodegenTest { @@ -29,4 +45,38 @@ public class SttpCodegenTest { Assert.assertEquals(type, "Array[Byte]"); } + @Test + public void verifyOperatorName() throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + String outputPath = output.getAbsolutePath().replace('\\', '/'); + + OpenAPI openAPI = new OpenAPIParser() + .readLocation("src/test/resources/3_0/scala/issue_10187_operatorName.yaml", null, new ParseOptions()).getOpenAPI(); + + ScalaSttpClientCodegen codegen = new ScalaSttpClientCodegen(); + codegen.setOutputDir(output.getAbsolutePath()); + codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); + + ClientOptInput input = new ClientOptInput(); + input.openAPI(openAPI); + input.config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); + generator.opts(input).generate(); + + Path path = Paths.get(outputPath + "/src/main/scala/org/openapitools/client/model/Condition.scala"); + assertFileContains(path, "object ConditionEnums"); + assertFileContains(path, "val Equal = Value(\"=\")"); + assertFileContains(path, "val NotEqual = Value(\"!=\")"); + assertFileNotContains(path, "val X3D = Value(\"=\")"); + assertFileNotContains(path, "val X3D = Value(\"!=\")"); + } + } diff --git a/modules/openapi-generator/src/test/resources/3_0/scala/issue_10187_operatorName.yaml b/modules/openapi-generator/src/test/resources/3_0/scala/issue_10187_operatorName.yaml new file mode 100644 index 00000000000..3a40bc8fbbb --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/scala/issue_10187_operatorName.yaml @@ -0,0 +1,50 @@ +openapi: 3.0.1 +info: + version: 1.0.0 + title: Example - The comparison operator + license: + name: MIT +servers: + - url: http://api.example.xyz/v1 +paths: + /report: + get: + operationId: getReport + responses: + '200': + description: get Report + content: + application/json: + schema: + $ref: '#/components/schemas/Reports' +components: + schemas: + Reports: + properties: + name: + type: string + expression: + items: + $ref: '#/components/schemas/Condition' + type: array + Condition: + example: + variable: variable + operator: = + comparison_value: comparison_value + properties: + variable: + type: string + comparison_value: + type: string + operator: + description: The comparison operator. + enum: + - = + - '!=' + - > + - < + - '>=' + - <= + type: string + type: object