From c714b1ab00a6276c91248be4dc5b1a9bee9d26c1 Mon Sep 17 00:00:00 2001 From: Ramzi Maalej Date: Mon, 14 Aug 2017 05:02:45 -0400 Subject: [PATCH] Strip package name from the class name (#6293) --- modules/swagger-codegen/pom.xml | 6 ++ .../languages/AbstractScalaCodegen.java | 49 ++++++++---- .../languages/AkkaScalaClientCodegen.java | 11 --- .../codegen/languages/ScalaClientCodegen.java | 13 +-- .../languages/AbstractScalaCodegenTest.java | 80 +++++++++++++++++++ .../codegen/languages/ScalaCodegenTest.java | 46 +++++++++++ 6 files changed, 173 insertions(+), 32 deletions(-) create mode 100644 modules/swagger-codegen/src/test/java/io/swagger/codegen/languages/AbstractScalaCodegenTest.java create mode 100644 modules/swagger-codegen/src/test/java/io/swagger/codegen/languages/ScalaCodegenTest.java diff --git a/modules/swagger-codegen/pom.xml b/modules/swagger-codegen/pom.xml index 658e8524fa45..f745c673b8cd 100644 --- a/modules/swagger-codegen/pom.xml +++ b/modules/swagger-codegen/pom.xml @@ -278,6 +278,12 @@ commonmark 0.9.0 + + org.mockito + mockito-core + 2.8.47 + test + diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractScalaCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractScalaCodegen.java index cd9a5fd34320..3ef8b2e06bb5 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractScalaCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractScalaCodegen.java @@ -20,6 +20,7 @@ import io.swagger.models.properties.LongProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; import io.swagger.models.properties.StringProperty; +import org.apache.commons.lang3.StringUtils; public abstract class AbstractScalaCodegen extends DefaultCodegen { @@ -31,18 +32,18 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { super(); languageSpecificPrimitives.addAll(Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Int", - "Long", - "Float", - "Object", - "Any", - "List", - "Seq", - "Map")); + "String", + "boolean", + "Boolean", + "Double", + "Int", + "Long", + "Float", + "Object", + "Any", + "List", + "Seq", + "Map")); cliOptions.add(new CliOption(CodegenConstants.MODEL_PACKAGE, CodegenConstants.MODEL_PACKAGE_DESC)); cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); @@ -67,8 +68,8 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { } @Override - public String escapeReservedWord(String name) { - if(this.reservedWordsMappings().containsKey(name)) { + public String escapeReservedWord(String name) { + if (this.reservedWordsMappings().containsKey(name)) { return this.reservedWordsMappings().get(name); } return "_" + name; @@ -93,7 +94,7 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { } else if (p instanceof MapProperty) { MapProperty mp = (MapProperty) p; Property inner = mp.getAdditionalProperties(); - + return getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; } return super.getTypeDeclaration(p); @@ -184,4 +185,22 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { return input.replace("*/", "*_/").replace("/*", "/_*"); } + protected String formatIdentifier(String name, boolean capitalized) { + String identifier = camelize(sanitizeName(name), true); + if (capitalized) { + identifier = StringUtils.capitalize(identifier); + } + if (identifier.matches("[a-zA-Z_$][\\w_$]+") && !isReservedWord(identifier)) { + return identifier; + } + return escapeReservedWord(identifier); + } + + protected String stripPackageName(String input) { + if (StringUtils.isEmpty(input) || input.lastIndexOf(".") < 0) + return input; + + int lastIndexOfDot = input.lastIndexOf("."); + return input.substring(lastIndexOfDot + 1); + } } \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java index 1ead8de061f2..ead20e5a0852 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java @@ -230,17 +230,6 @@ public class AkkaScalaClientCodegen extends AbstractScalaCodegen implements Code return super.toOperationId(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, operationId)); } - private String formatIdentifier(String name, boolean capitalized) { - String identifier = camelize(sanitizeName(name), true); - if (capitalized) { - identifier = StringUtils.capitalize(identifier); - } - if (identifier.matches("[a-zA-Z_$][\\w_$]+") && !isReservedWord(identifier)) { - return identifier; - } - return escapeReservedWord(identifier); - } - @Override public String toParamName(String name) { return formatIdentifier(name, false); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java index c97f1f5a434a..14f8f4e182a6 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java @@ -1,10 +1,6 @@ package io.swagger.codegen.languages; -import io.swagger.codegen.CliOption; -import io.swagger.codegen.CodegenConfig; -import io.swagger.codegen.CodegenConstants; -import io.swagger.codegen.CodegenType; -import io.swagger.codegen.SupportingFile; +import io.swagger.codegen.*; import java.io.File; import java.util.Arrays; @@ -210,7 +206,7 @@ public class ScalaClientCodegen extends AbstractScalaCodegen implements CodegenC @Override public String toModelName(final String name) { - final String sanitizedName = sanitizeName(modelNamePrefix + name + modelNameSuffix); + final String sanitizedName = sanitizeName(modelNamePrefix + this.stripPackageName(name) + modelNameSuffix); // camelize the model name // phone_number => PhoneNumber @@ -233,6 +229,11 @@ public class ScalaClientCodegen extends AbstractScalaCodegen implements CodegenC return camelizedName; } + @Override + public String toEnumName(CodegenProperty property) { + return formatIdentifier(stripPackageName(property.baseName), true); + } + @Override public String escapeQuotationMark(String input) { // remove " to avoid code injection diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/languages/AbstractScalaCodegenTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/languages/AbstractScalaCodegenTest.java new file mode 100644 index 000000000000..415f346c1d49 --- /dev/null +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/languages/AbstractScalaCodegenTest.java @@ -0,0 +1,80 @@ +package io.swagger.codegen.languages; + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; +import org.testng.Assert; + +public class AbstractScalaCodegenTest { + + private AbstractScalaCodegen abstractScalaCodegen; + + @BeforeTest + public void setup() { + this.abstractScalaCodegen = new FakeScalaCodeGen(); + } + + @Test + public void shouldCamelCase() { + String className = "models.WebsiteBodyModel"; + + String result = abstractScalaCodegen.formatIdentifier(className, false); + + Assert.assertTrue("modelsWebsiteBodyModel".equals(result)); + } + + @Test + public void shouldCamelCaseAndUpperCase() { + String className = "models.WebsiteBodyModel"; + + String result = abstractScalaCodegen.formatIdentifier(className, true); + + Assert.assertTrue("ModelsWebsiteBodyModel".equals(result)); + } + + @Test + public void shouldEscapeReservedWords() { + String className = "ReservedWord"; + + String result = abstractScalaCodegen.formatIdentifier(className, true); + + Assert.assertTrue("_ReservedWord".equals(result)); + } + + @Test + public void shouldReturnSameInputWhenNull() { + String result = abstractScalaCodegen.stripPackageName(null); + + Assert.assertNull(result); + } + + @Test + public void shouldReturnSameInputWhenEmpty() { + String input = ""; + String result = abstractScalaCodegen.stripPackageName(input); + + Assert.assertSame(result, input); + } + + @Test + public void shouldReturnSameInputWhenValid() { + String input = "WebsiteBodyModel"; + String result = abstractScalaCodegen.stripPackageName(input); + + Assert.assertSame(result, input); + } + + @Test + public void shouldStripPackageName() { + String input = "models.WebsiteBodyModel"; + String result = abstractScalaCodegen.stripPackageName(input); + + Assert.assertEquals(result, "WebsiteBodyModel"); + } + + private class FakeScalaCodeGen extends AbstractScalaCodegen { + public FakeScalaCodeGen() { + super(); + this.reservedWords.add("reservedword"); + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/languages/ScalaCodegenTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/languages/ScalaCodegenTest.java new file mode 100644 index 000000000000..4a49806bf412 --- /dev/null +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/languages/ScalaCodegenTest.java @@ -0,0 +1,46 @@ +package io.swagger.codegen.languages; + +import io.swagger.codegen.CodegenProperty; +import org.mockito.Mockito; +import org.testng.Assert; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class ScalaCodegenTest { + + private ScalaClientCodegen scalaClientCodegen; + + @BeforeTest + public void setup() { + this.scalaClientCodegen = new ScalaClientCodegen(); + } + + @Test + public void shouldCallFormatIdentifierOnGetModelName() { + String className = "models.WebsiteBodyModel"; + + ScalaClientCodegen scalaClientCodegenSpy = Mockito.spy(this.scalaClientCodegen); + + String result = scalaClientCodegenSpy.toModelName(className); + + verify(scalaClientCodegenSpy, times(1)).stripPackageName(anyString()); + Assert.assertEquals("WebsiteBodyModel", result); + } + + @Test + public void shouldCallFormatIdentifierOnToEnumName() { + String className = "models.WebsiteBodyModel"; + ScalaClientCodegen scalaClientCodegenSpy = Mockito.spy(this.scalaClientCodegen); + CodegenProperty property = new CodegenProperty(); + property.baseName = className; + String result = scalaClientCodegenSpy.toEnumName(property); + verify(scalaClientCodegenSpy, times(1)).stripPackageName(anyString()); + verify(scalaClientCodegenSpy, times(1)).formatIdentifier(anyString(), anyBoolean()); + Assert.assertEquals("WebsiteBodyModel", result); + } +}