From c6ad35cac826a889f7baa1ba54b0d92f25458a2c Mon Sep 17 00:00:00 2001 From: John Flanigan Date: Sat, 8 Feb 2020 15:29:50 -0500 Subject: [PATCH] [feature] Add option to disable stripping of common prefix enum (#5166) --- .../openapitools/codegen/CodegenConfig.java | 4 + .../codegen/CodegenConstants.java | 3 + .../openapitools/codegen/DefaultCodegen.java | 97 +++++++++++-------- .../codegen/languages/DartClientCodegen.java | 20 +--- .../PythonClientExperimentalCodegen.java | 20 +--- .../codegen/DefaultCodegenTest.java | 97 +++++++++++++++++++ 6 files changed, 162 insertions(+), 79 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java index 2d8d1b9e379..d00cc2b8b05 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java @@ -288,4 +288,8 @@ public interface CodegenConfig { FeatureSet getFeatureSet(); void setFeatureSet(FeatureSet featureSet); + + boolean isRemoveEnumValuePrefix(); + + void setRemoveEnumValuePrefix(boolean removeEnumValuePrefix); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java index 5a039966b2c..b0de908f084 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java @@ -342,4 +342,7 @@ public class CodegenConstants { public static final String PACKAGE_TAGS = "packageTags"; public static final String PACKAGE_TAGS_DESC = "Tags to identify the package"; + + public static final String REMOVE_ENUM_VALUE_PREFIX = "removeEnumValuePrefix"; + public static final String REMOVE_ENUM_VALUE_PREFIX_DESC = "Remove the common prefix of enum values"; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 40954fb1fe5..4227e0b2b23 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -193,6 +193,8 @@ public class DefaultCodegen implements CodegenConfig { // acts strictly upon a spec, potentially modifying it to have consistent behavior across generators. protected boolean strictSpecBehavior = true; + // flag to indicate whether enum value prefixes are removed + protected boolean removeEnumValuePrefix = true; // make openapi available to all methods protected OpenAPI openAPI; @@ -276,6 +278,11 @@ public class DefaultCodegen implements CodegenConfig { ModelUtils.setGenerateAliasAsModel(Boolean.valueOf(additionalProperties .get(CodegenConstants.GENERATE_ALIAS_AS_MODEL).toString())); } + + if (additionalProperties.containsKey(CodegenConstants.REMOVE_ENUM_VALUE_PREFIX)) { + this.setRemoveEnumValuePrefix(Boolean.valueOf(additionalProperties + .get(CodegenConstants.REMOVE_ENUM_VALUE_PREFIX).toString())); + } } /*** @@ -480,25 +487,7 @@ public class DefaultCodegen implements CodegenConfig { if (Boolean.TRUE.equals(cm.isEnum) && cm.allowableValues != null) { Map allowableValues = cm.allowableValues; List values = (List) allowableValues.get("values"); - List> enumVars = new ArrayList>(); - String commonPrefix = findCommonPrefixOfVars(values); - int truncateIdx = commonPrefix.length(); - for (Object value : values) { - Map enumVar = new HashMap(); - String enumName; - if (truncateIdx == 0) { - enumName = value.toString(); - } else { - enumName = value.toString().substring(truncateIdx); - if ("".equals(enumName)) { - enumName = value.toString(); - } - } - enumVar.put("name", toEnumVarName(enumName, cm.dataType)); - enumVar.put("value", toEnumValue(value.toString(), cm.dataType)); - enumVar.put("isString", isDataTypeString(cm.dataType)); - enumVars.add(enumVar); - } + List> enumVars = buildEnumVars(values, cm.dataType); // if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions()); cm.allowableValues.put("enumVars", enumVars); @@ -4572,28 +4561,8 @@ public class DefaultCodegen implements CodegenConfig { .map(Map.Entry::getValue) .findFirst(); String dataType = (referencedSchema.isPresent()) ? getTypeDeclaration(referencedSchema.get()) : varDataType; + List> enumVars = buildEnumVars(values, dataType); - // put "enumVars" map into `allowableValues", including `name` and `value` - List> enumVars = new ArrayList<>(); - String commonPrefix = findCommonPrefixOfVars(values); - int truncateIdx = commonPrefix.length(); - for (Object value : values) { - Map enumVar = new HashMap<>(); - String enumName; - if (truncateIdx == 0) { - enumName = value.toString(); - } else { - enumName = value.toString().substring(truncateIdx); - if ("".equals(enumName)) { - enumName = value.toString(); - } - } - - enumVar.put("name", toEnumVarName(enumName, dataType)); - enumVar.put("value", toEnumValue(value.toString(), dataType)); - enumVar.put("isString", isDataTypeString(dataType)); - enumVars.add(enumVar); - } // if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames Map extensions = var.mostInnerItems != null ? var.mostInnerItems.getVendorExtensions() : var.getVendorExtensions(); if (referencedSchema.isPresent()) { @@ -4623,6 +4592,34 @@ public class DefaultCodegen implements CodegenConfig { } } + protected List> buildEnumVars(List values, String dataType) { + List> enumVars = new ArrayList<>(); + int truncateIdx = 0; + if (isRemoveEnumValuePrefix()) { + String commonPrefix = findCommonPrefixOfVars(values); + truncateIdx = commonPrefix.length(); + } + for (Object value : values) { + Map enumVar = new HashMap<>(); + String enumName; + if (truncateIdx == 0) { + enumName = value.toString(); + } + else { + enumName = value.toString().substring(truncateIdx); + if ("".equals(enumName)) { + enumName = value.toString(); + } + } + + enumVar.put("name", toEnumVarName(enumName, dataType)); + enumVar.put("value", toEnumValue(value.toString(), dataType)); + enumVar.put("isString", isDataTypeString(dataType)); + enumVars.add(enumVar); + } + return enumVars; + } + protected void updateEnumVarsWithExtensions(List> enumVars, Map vendorExtensions) { if (vendorExtensions != null) { updateEnumVarsWithExtensions(enumVars, vendorExtensions, "x-enum-varnames", "name"); @@ -5519,4 +5516,22 @@ public class DefaultCodegen implements CodegenConfig { public void setFeatureSet(final FeatureSet featureSet) { this.featureSet = featureSet == null ? DefaultFeatureSet : featureSet; } -} + + /** + * Get the boolean value indicating whether to remove enum value prefixes + */ + @Override + public boolean isRemoveEnumValuePrefix() { + return this.removeEnumValuePrefix; + } + + /** + * Set the boolean value indicating whether to remove enum value prefixes + * + * @param removeEnumValuePrefix true to enable enum value prefix removal + */ + @Override + public void setRemoveEnumValuePrefix(final boolean removeEnumValuePrefix) { + this.removeEnumValuePrefix = removeEnumValuePrefix; + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java index 8a2ce0f2897..5bdaf70e5c5 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java @@ -469,25 +469,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { } Map allowableValues = cm.allowableValues; List values = (List) allowableValues.get("values"); - List> enumVars = - new ArrayList>(); - String commonPrefix = findCommonPrefixOfVars(values); - int truncateIdx = commonPrefix.length(); - for (Object value : values) { - Map enumVar = new HashMap(); - String enumName; - if (truncateIdx == 0) { - enumName = value.toString(); - } else { - enumName = value.toString().substring(truncateIdx); - if ("".equals(enumName)) { - enumName = value.toString(); - } - } - enumVar.put("name", toEnumVarName(enumName, cm.dataType)); - enumVar.put("value", toEnumValue(value.toString(), cm.dataType)); - enumVars.add(enumVar); - } + List> enumVars = buildEnumVars(values, cm.dataType); cm.allowableValues.put("enumVars", enumVars); return true; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java index 33472480b13..b229641dd44 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java @@ -463,26 +463,8 @@ public class PythonClientExperimentalCodegen extends PythonClientCodegen { String dataType = (referencedSchema.isPresent()) ? getTypeDeclaration(referencedSchema.get()) : varDataType; // put "enumVars" map into `allowableValues", including `name` and `value` - List> enumVars = new ArrayList<>(); - String commonPrefix = findCommonPrefixOfVars(values); - int truncateIdx = commonPrefix.length(); - for (Object value : values) { - Map enumVar = new HashMap<>(); - String enumName; - if (truncateIdx == 0) { - enumName = value.toString(); - } else { - enumName = value.toString().substring(truncateIdx); - if ("".equals(enumName)) { - enumName = value.toString(); - } - } + List> enumVars = buildEnumVars(values, dataType); - enumVar.put("name", toEnumVarName(enumName, dataType)); - enumVar.put("value", toEnumValue(value.toString(), dataType)); - enumVar.put("isString", isDataTypeString(dataType)); - enumVars.add(enumVar); - } // if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames Map extensions = var.mostInnerItems != null ? var.mostInnerItems.getVendorExtensions() : var.getVendorExtensions(); if (referencedSchema.isPresent()) { diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 0511b10f723..a5507dcc521 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -388,6 +388,79 @@ public class DefaultCodegenTest { } } + @Test + public void updateCodegenPropertyEnumWithPrefixRemoved() { + final DefaultCodegen codegen = new DefaultCodegen(); + CodegenProperty enumProperty = codegenProperty(Arrays.asList("animal_dog", "animal_cat")); + + codegen.updateCodegenPropertyEnum(enumProperty); + + List> enumVars = (List>) enumProperty.getItems().getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOG"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CAT"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\""); + } + + @Test + public void updateCodegenPropertyEnumWithoutPrefixRemoved() { + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setRemoveEnumValuePrefix(false); + + CodegenProperty enumProperty = codegenProperty(Arrays.asList("animal_dog", "animal_cat")); + + codegen.updateCodegenPropertyEnum(enumProperty); + + List> enumVars = (List>) enumProperty.getItems().getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "ANIMAL_DOG"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "ANIMAL_CAT"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\""); + } + + @Test + public void postProcessModelsEnumWithPrefixRemoved() { + final DefaultCodegen codegen = new DefaultCodegen(); + Map objs = codegenModel(Arrays.asList("animal_dog", "animal_cat")); + CodegenModel cm = (CodegenModel) ((Map) ((List) objs.get("models")).get(0)).get("model"); + + codegen.postProcessModelsEnum(objs); + + List> enumVars = (List>) cm.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOG"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CAT"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\""); + } + + @Test + public void postProcessModelsEnumWithoutPrefixRemoved() { + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setRemoveEnumValuePrefix(false); + Map objs = codegenModel(Arrays.asList("animal_dog", "animal_cat")); + CodegenModel cm = (CodegenModel) ((Map) ((List) objs.get("models")).get(0)).get("model"); + + codegen.postProcessModelsEnum(objs); + + List> enumVars = (List>) cm.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "ANIMAL_DOG"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "ANIMAL_CAT"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\""); + } + @Test public void postProcessModelsEnumWithExtention() { final DefaultCodegen codegen = new DefaultCodegen(); @@ -902,6 +975,19 @@ public class DefaultCodegenTest { return array; } + private CodegenProperty codegenProperty(List values) { + CodegenProperty array = new CodegenProperty(); + final CodegenProperty items = new CodegenProperty(); + final HashMap allowableValues = new HashMap<>(); + allowableValues.put("values", values); + items.setAllowableValues(allowableValues); + items.dataType = "String"; + array.items = items; + array.mostInnerItems = items; + array.dataType = "Array"; + return array; + } + private CodegenProperty codegenPropertyWithXEnumVarName(List values, List aliases) { final CodegenProperty var = new CodegenProperty(); final HashMap allowableValues = new HashMap<>(); @@ -913,6 +999,17 @@ public class DefaultCodegenTest { return var; } + private Map codegenModel(List values) { + final CodegenModel cm = new CodegenModel(); + cm.isEnum = true; + final HashMap allowableValues = new HashMap<>(); + allowableValues.put("values", values); + cm.setAllowableValues(allowableValues); + cm.dataType = "String"; + Map objs = Collections.singletonMap("models", Collections.singletonList(Collections.singletonMap("model", cm))); + return objs; + } + private Map codegenModelWithXEnumVarName() { final CodegenModel cm = new CodegenModel(); cm.isEnum = true;