Skip to content

Commit c714b1a

Browse files
ramzimaalejwing328
authored andcommitted
Strip package name from the class name (#6293)
1 parent 23d0fed commit c714b1a

File tree

6 files changed

+173
-32
lines changed

6 files changed

+173
-32
lines changed

modules/swagger-codegen/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,12 @@
278278
<artifactId>commonmark</artifactId>
279279
<version>0.9.0</version>
280280
</dependency>
281+
<dependency>
282+
<groupId>org.mockito</groupId>
283+
<artifactId>mockito-core</artifactId>
284+
<version>2.8.47</version>
285+
<scope>test</scope>
286+
</dependency>
281287

282288
</dependencies>
283289
<repositories>

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractScalaCodegen.java

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import io.swagger.models.properties.MapProperty;
2121
import io.swagger.models.properties.Property;
2222
import io.swagger.models.properties.StringProperty;
23+
import org.apache.commons.lang3.StringUtils;
2324

2425
public abstract class AbstractScalaCodegen extends DefaultCodegen {
2526

@@ -31,18 +32,18 @@ public AbstractScalaCodegen() {
3132
super();
3233

3334
languageSpecificPrimitives.addAll(Arrays.asList(
34-
"String",
35-
"boolean",
36-
"Boolean",
37-
"Double",
38-
"Int",
39-
"Long",
40-
"Float",
41-
"Object",
42-
"Any",
43-
"List",
44-
"Seq",
45-
"Map"));
35+
"String",
36+
"boolean",
37+
"Boolean",
38+
"Double",
39+
"Int",
40+
"Long",
41+
"Float",
42+
"Object",
43+
"Any",
44+
"List",
45+
"Seq",
46+
"Map"));
4647

4748
cliOptions.add(new CliOption(CodegenConstants.MODEL_PACKAGE, CodegenConstants.MODEL_PACKAGE_DESC));
4849
cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC));
@@ -67,8 +68,8 @@ public String getSourceFolder() {
6768
}
6869

6970
@Override
70-
public String escapeReservedWord(String name) {
71-
if(this.reservedWordsMappings().containsKey(name)) {
71+
public String escapeReservedWord(String name) {
72+
if (this.reservedWordsMappings().containsKey(name)) {
7273
return this.reservedWordsMappings().get(name);
7374
}
7475
return "_" + name;
@@ -93,7 +94,7 @@ public String getTypeDeclaration(Property p) {
9394
} else if (p instanceof MapProperty) {
9495
MapProperty mp = (MapProperty) p;
9596
Property inner = mp.getAdditionalProperties();
96-
97+
9798
return getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]";
9899
}
99100
return super.getTypeDeclaration(p);
@@ -184,4 +185,22 @@ public String escapeUnsafeCharacters(String input) {
184185
return input.replace("*/", "*_/").replace("/*", "/_*");
185186
}
186187

188+
protected String formatIdentifier(String name, boolean capitalized) {
189+
String identifier = camelize(sanitizeName(name), true);
190+
if (capitalized) {
191+
identifier = StringUtils.capitalize(identifier);
192+
}
193+
if (identifier.matches("[a-zA-Z_$][\\w_$]+") && !isReservedWord(identifier)) {
194+
return identifier;
195+
}
196+
return escapeReservedWord(identifier);
197+
}
198+
199+
protected String stripPackageName(String input) {
200+
if (StringUtils.isEmpty(input) || input.lastIndexOf(".") < 0)
201+
return input;
202+
203+
int lastIndexOfDot = input.lastIndexOf(".");
204+
return input.substring(lastIndexOfDot + 1);
205+
}
187206
}

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -230,17 +230,6 @@ public String toOperationId(String operationId) {
230230
return super.toOperationId(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, operationId));
231231
}
232232

233-
private String formatIdentifier(String name, boolean capitalized) {
234-
String identifier = camelize(sanitizeName(name), true);
235-
if (capitalized) {
236-
identifier = StringUtils.capitalize(identifier);
237-
}
238-
if (identifier.matches("[a-zA-Z_$][\\w_$]+") && !isReservedWord(identifier)) {
239-
return identifier;
240-
}
241-
return escapeReservedWord(identifier);
242-
}
243-
244233
@Override
245234
public String toParamName(String name) {
246235
return formatIdentifier(name, false);

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package io.swagger.codegen.languages;
22

3-
import io.swagger.codegen.CliOption;
4-
import io.swagger.codegen.CodegenConfig;
5-
import io.swagger.codegen.CodegenConstants;
6-
import io.swagger.codegen.CodegenType;
7-
import io.swagger.codegen.SupportingFile;
3+
import io.swagger.codegen.*;
84

95
import java.io.File;
106
import java.util.Arrays;
@@ -210,7 +206,7 @@ public String toOperationId(String operationId) {
210206

211207
@Override
212208
public String toModelName(final String name) {
213-
final String sanitizedName = sanitizeName(modelNamePrefix + name + modelNameSuffix);
209+
final String sanitizedName = sanitizeName(modelNamePrefix + this.stripPackageName(name) + modelNameSuffix);
214210

215211
// camelize the model name
216212
// phone_number => PhoneNumber
@@ -233,6 +229,11 @@ public String toModelName(final String name) {
233229
return camelizedName;
234230
}
235231

232+
@Override
233+
public String toEnumName(CodegenProperty property) {
234+
return formatIdentifier(stripPackageName(property.baseName), true);
235+
}
236+
236237
@Override
237238
public String escapeQuotationMark(String input) {
238239
// remove " to avoid code injection
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package io.swagger.codegen.languages;
2+
3+
import org.testng.annotations.BeforeTest;
4+
import org.testng.annotations.Test;
5+
import org.testng.Assert;
6+
7+
public class AbstractScalaCodegenTest {
8+
9+
private AbstractScalaCodegen abstractScalaCodegen;
10+
11+
@BeforeTest
12+
public void setup() {
13+
this.abstractScalaCodegen = new FakeScalaCodeGen();
14+
}
15+
16+
@Test
17+
public void shouldCamelCase() {
18+
String className = "models.WebsiteBodyModel";
19+
20+
String result = abstractScalaCodegen.formatIdentifier(className, false);
21+
22+
Assert.assertTrue("modelsWebsiteBodyModel".equals(result));
23+
}
24+
25+
@Test
26+
public void shouldCamelCaseAndUpperCase() {
27+
String className = "models.WebsiteBodyModel";
28+
29+
String result = abstractScalaCodegen.formatIdentifier(className, true);
30+
31+
Assert.assertTrue("ModelsWebsiteBodyModel".equals(result));
32+
}
33+
34+
@Test
35+
public void shouldEscapeReservedWords() {
36+
String className = "ReservedWord";
37+
38+
String result = abstractScalaCodegen.formatIdentifier(className, true);
39+
40+
Assert.assertTrue("_ReservedWord".equals(result));
41+
}
42+
43+
@Test
44+
public void shouldReturnSameInputWhenNull() {
45+
String result = abstractScalaCodegen.stripPackageName(null);
46+
47+
Assert.assertNull(result);
48+
}
49+
50+
@Test
51+
public void shouldReturnSameInputWhenEmpty() {
52+
String input = "";
53+
String result = abstractScalaCodegen.stripPackageName(input);
54+
55+
Assert.assertSame(result, input);
56+
}
57+
58+
@Test
59+
public void shouldReturnSameInputWhenValid() {
60+
String input = "WebsiteBodyModel";
61+
String result = abstractScalaCodegen.stripPackageName(input);
62+
63+
Assert.assertSame(result, input);
64+
}
65+
66+
@Test
67+
public void shouldStripPackageName() {
68+
String input = "models.WebsiteBodyModel";
69+
String result = abstractScalaCodegen.stripPackageName(input);
70+
71+
Assert.assertEquals(result, "WebsiteBodyModel");
72+
}
73+
74+
private class FakeScalaCodeGen extends AbstractScalaCodegen {
75+
public FakeScalaCodeGen() {
76+
super();
77+
this.reservedWords.add("reservedword");
78+
}
79+
}
80+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.swagger.codegen.languages;
2+
3+
import io.swagger.codegen.CodegenProperty;
4+
import org.mockito.Mockito;
5+
import org.testng.Assert;
6+
import org.testng.annotations.BeforeTest;
7+
import org.testng.annotations.Test;
8+
9+
import static org.mockito.ArgumentMatchers.anyBoolean;
10+
import static org.mockito.ArgumentMatchers.anyString;
11+
import static org.mockito.Mockito.times;
12+
import static org.mockito.Mockito.verify;
13+
14+
public class ScalaCodegenTest {
15+
16+
private ScalaClientCodegen scalaClientCodegen;
17+
18+
@BeforeTest
19+
public void setup() {
20+
this.scalaClientCodegen = new ScalaClientCodegen();
21+
}
22+
23+
@Test
24+
public void shouldCallFormatIdentifierOnGetModelName() {
25+
String className = "models.WebsiteBodyModel";
26+
27+
ScalaClientCodegen scalaClientCodegenSpy = Mockito.spy(this.scalaClientCodegen);
28+
29+
String result = scalaClientCodegenSpy.toModelName(className);
30+
31+
verify(scalaClientCodegenSpy, times(1)).stripPackageName(anyString());
32+
Assert.assertEquals("WebsiteBodyModel", result);
33+
}
34+
35+
@Test
36+
public void shouldCallFormatIdentifierOnToEnumName() {
37+
String className = "models.WebsiteBodyModel";
38+
ScalaClientCodegen scalaClientCodegenSpy = Mockito.spy(this.scalaClientCodegen);
39+
CodegenProperty property = new CodegenProperty();
40+
property.baseName = className;
41+
String result = scalaClientCodegenSpy.toEnumName(property);
42+
verify(scalaClientCodegenSpy, times(1)).stripPackageName(anyString());
43+
verify(scalaClientCodegenSpy, times(1)).formatIdentifier(anyString(), anyBoolean());
44+
Assert.assertEquals("WebsiteBodyModel", result);
45+
}
46+
}

0 commit comments

Comments
 (0)