[C#] allow customization of generated enum suffixes (#4301)

* [C#] allow customization of generated enum suffixes
This commit is contained in:
scott dallamura
2020-01-05 10:25:08 -05:00
committed by Jim Schubert
parent 38185d8558
commit 9b893ef3c1
5 changed files with 79 additions and 5 deletions

View File

@@ -27,6 +27,8 @@ sidebar_label: aspnetcore
|useNewtonsoft|Uses the Newtonsoft JSON library.| |true|
|newtonsoftVersion|Version for Microsoft.AspNetCore.Mvc.NewtonsoftJson for ASP.NET Core 3.0+| |3.0.0-preview5-19227-01|
|useDefaultRouting|Use default routing for the ASP.NET Core version. For 3.0 turn off default because it is not yet supported.| |true|
|enumNameSuffix|Suffix that will be appended to all enum names.| |Enum|
|enumValueNameSuffix|Suffix that will be appended to all enum value names.| |Enum|
|classModifier|Class Modifier can be empty, abstract| ||
|operationModifier|Operation Modifier can be virtual, abstract or partial| |virtual|
|buildTarget|Target to build an application or library| |program|

View File

@@ -224,6 +224,12 @@ public class CodegenConstants {
public static final String MODEL_NAME_SUFFIX = "modelNameSuffix";
public static final String MODEL_NAME_SUFFIX_DESC = "Suffix that will be appended to all model names.";
public static final String ENUM_NAME_SUFFIX = "enumNameSuffix";
public static final String ENUM_NAME_SUFFIX_DESC = "Suffix that will be appended to all enum names.";
public static final String ENUM_VALUE_NAME_SUFFIX = "enumValueNameSuffix";
public static final String ENUM_VALUE_NAME_SUFFIX_DESC = "Suffix that will be appended to all enum value names.";
public static final String GIT_HOST = "gitHost";
public static final String GIT_HOST_DESC = "Git host, e.g. gitlab.com.";

View File

@@ -62,6 +62,8 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
protected String packageAuthors = "OpenAPI";
protected String interfacePrefix = "I";
protected String enumNameSuffix = "Enum";
protected String enumValueNameSuffix = "Enum";
protected String sourceFolder = "src";
@@ -361,6 +363,14 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
}
}
if (additionalProperties().containsKey(CodegenConstants.ENUM_NAME_SUFFIX)) {
setEnumNameSuffix(additionalProperties.get(CodegenConstants.ENUM_NAME_SUFFIX).toString());
}
if (additionalProperties().containsKey(CodegenConstants.ENUM_VALUE_NAME_SUFFIX)) {
setEnumValueNameSuffix(additionalProperties.get(CodegenConstants.ENUM_VALUE_NAME_SUFFIX).toString());
}
// This either updates additionalProperties with the above fixes, or sets the default if the option was not specified.
additionalProperties.put(CodegenConstants.INTERFACE_PREFIX, interfacePrefix);
}
@@ -1003,6 +1013,14 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
this.interfacePrefix = interfacePrefix;
}
public void setEnumNameSuffix(final String enumNameSuffix) {
this.enumNameSuffix = enumNameSuffix;
}
public void setEnumValueNameSuffix(final String enumValueNameSuffix) {
this.enumValueNameSuffix = enumValueNameSuffix;
}
public boolean isSupportNullable() {
return supportNullable;
}
@@ -1040,7 +1058,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
enumName = enumName.replaceFirst("^_", "");
enumName = enumName.replaceFirst("_$", "");
enumName = camelize(enumName) + "Enum";
enumName = camelize(enumName) + this.enumValueNameSuffix;
if (enumName.matches("\\d.*")) { // starts with number
return "_" + enumName;
@@ -1051,7 +1069,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
@Override
public String toEnumName(CodegenProperty property) {
return sanitizeName(camelize(property.name)) + "Enum";
return sanitizeName(camelize(property.name)) + this.enumNameSuffix;
}
public String testPackageName() {

View File

@@ -206,11 +206,18 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen {
"Version for Microsoft.AspNetCore.Mvc.NewtonsoftJson for ASP.NET Core 3.0+",
newtonsoftVersion);
addSwitch(USE_DEFAULT_ROUTING,
"Use default routing for the ASP.NET Core version. For 3.0 turn off default because it is not yet supported.",
useDefaultRouting);
addOption(CodegenConstants.ENUM_NAME_SUFFIX,
CodegenConstants.ENUM_NAME_SUFFIX_DESC,
enumNameSuffix);
addOption(CodegenConstants.ENUM_VALUE_NAME_SUFFIX,
CodegenConstants.ENUM_VALUE_NAME_SUFFIX_DESC,
enumValueNameSuffix);
classModifier.addEnum("", "Keep class default with no modifier");
classModifier.addEnum("abstract", "Make class abstract");
classModifier.setDefault("");
@@ -348,7 +355,6 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen {
supportingFiles.add(new SupportingFile("Project.nuspec.mustache", packageFolder, packageName + ".nuspec"));
}
if (useSwashbuckle) {
supportingFiles.add(new SupportingFile("Filters" + File.separator + "BasePathFilter.mustache",
packageFolder + File.separator + "Filters", "BasePathFilter.cs"));

View File

@@ -16,15 +16,21 @@
*/
package org.openapitools.codegen.csharp;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
import org.openapitools.codegen.CodegenModel;
import org.openapitools.codegen.CodegenProperty;
import org.openapitools.codegen.DefaultCodegen;
import org.openapitools.codegen.TestUtils;
import org.openapitools.codegen.languages.AspNetCoreServerCodegen;
import org.openapitools.codegen.languages.CSharpClientCodegen;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CsharpModelEnumTest {
@@ -86,4 +92,40 @@ public class CsharpModelEnumTest {
Assert.assertTrue(enumVar.isEnum);
*/
}
@Test(description = "use default suffixes for enums")
public void useDefaultEnumSuffixes() {
final AspNetCoreServerCodegen codegen = new AspNetCoreServerCodegen();
OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
codegen.setOpenAPI(openAPI);
final Schema petSchema = openAPI.getComponents().getSchemas().get("Pet");
final CodegenModel cm = codegen.fromModel("Pet", petSchema);
final CodegenProperty statusProperty = cm.vars.get(5);
Assert.assertEquals(statusProperty.name, "Status");
Assert.assertTrue(statusProperty.isEnum);
Assert.assertEquals(statusProperty.datatypeWithEnum, "StatusEnum");
Assert.assertEquals(codegen.toEnumVarName("Aaaa", ""), "AaaaEnum");
}
@Test(description = "use custom suffixes for enums")
public void useCustomEnumSuffixes() {
final AspNetCoreServerCodegen codegen = new AspNetCoreServerCodegen();
codegen.setEnumNameSuffix("EnumName");
codegen.setEnumValueNameSuffix("EnumValue");
OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
codegen.setOpenAPI(openAPI);
final Schema petSchema = openAPI.getComponents().getSchemas().get("Pet");
final CodegenModel cm = codegen.fromModel("Pet", petSchema);
final CodegenProperty statusProperty = cm.vars.get(5);
Assert.assertEquals(statusProperty.name, "Status");
Assert.assertTrue(statusProperty.isEnum);
Assert.assertEquals(statusProperty.datatypeWithEnum, "StatusEnumName");
Assert.assertEquals(codegen.toEnumVarName("Aaaa", ""), "AaaaEnumValue");
}
}