Skip to content

Commit c6ad35c

Browse files
authored
[feature] Add option to disable stripping of common prefix enum (#5166)
1 parent 4208f3d commit c6ad35c

File tree

6 files changed

+162
-79
lines changed

6 files changed

+162
-79
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,4 +288,8 @@ public interface CodegenConfig {
288288
FeatureSet getFeatureSet();
289289

290290
void setFeatureSet(FeatureSet featureSet);
291+
292+
boolean isRemoveEnumValuePrefix();
293+
294+
void setRemoveEnumValuePrefix(boolean removeEnumValuePrefix);
291295
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,4 +342,7 @@ public static enum ENUM_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case,
342342

343343
public static final String PACKAGE_TAGS = "packageTags";
344344
public static final String PACKAGE_TAGS_DESC = "Tags to identify the package";
345+
346+
public static final String REMOVE_ENUM_VALUE_PREFIX = "removeEnumValuePrefix";
347+
public static final String REMOVE_ENUM_VALUE_PREFIX_DESC = "Remove the common prefix of enum values";
345348
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java

Lines changed: 56 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ apiTemplateFiles are for API outputs only (controllers/handlers).
193193

194194
// acts strictly upon a spec, potentially modifying it to have consistent behavior across generators.
195195
protected boolean strictSpecBehavior = true;
196+
// flag to indicate whether enum value prefixes are removed
197+
protected boolean removeEnumValuePrefix = true;
196198

197199
// make openapi available to all methods
198200
protected OpenAPI openAPI;
@@ -276,6 +278,11 @@ public void processOpts() {
276278
ModelUtils.setGenerateAliasAsModel(Boolean.valueOf(additionalProperties
277279
.get(CodegenConstants.GENERATE_ALIAS_AS_MODEL).toString()));
278280
}
281+
282+
if (additionalProperties.containsKey(CodegenConstants.REMOVE_ENUM_VALUE_PREFIX)) {
283+
this.setRemoveEnumValuePrefix(Boolean.valueOf(additionalProperties
284+
.get(CodegenConstants.REMOVE_ENUM_VALUE_PREFIX).toString()));
285+
}
279286
}
280287

281288
/***
@@ -480,25 +487,7 @@ public Map<String, Object> postProcessModelsEnum(Map<String, Object> objs) {
480487
if (Boolean.TRUE.equals(cm.isEnum) && cm.allowableValues != null) {
481488
Map<String, Object> allowableValues = cm.allowableValues;
482489
List<Object> values = (List<Object>) allowableValues.get("values");
483-
List<Map<String, Object>> enumVars = new ArrayList<Map<String, Object>>();
484-
String commonPrefix = findCommonPrefixOfVars(values);
485-
int truncateIdx = commonPrefix.length();
486-
for (Object value : values) {
487-
Map<String, Object> enumVar = new HashMap<String, Object>();
488-
String enumName;
489-
if (truncateIdx == 0) {
490-
enumName = value.toString();
491-
} else {
492-
enumName = value.toString().substring(truncateIdx);
493-
if ("".equals(enumName)) {
494-
enumName = value.toString();
495-
}
496-
}
497-
enumVar.put("name", toEnumVarName(enumName, cm.dataType));
498-
enumVar.put("value", toEnumValue(value.toString(), cm.dataType));
499-
enumVar.put("isString", isDataTypeString(cm.dataType));
500-
enumVars.add(enumVar);
501-
}
490+
List<Map<String, Object>> enumVars = buildEnumVars(values, cm.dataType);
502491
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
503492
updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions());
504493
cm.allowableValues.put("enumVars", enumVars);
@@ -4572,28 +4561,8 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
45724561
.map(Map.Entry::getValue)
45734562
.findFirst();
45744563
String dataType = (referencedSchema.isPresent()) ? getTypeDeclaration(referencedSchema.get()) : varDataType;
4564+
List<Map<String, Object>> enumVars = buildEnumVars(values, dataType);
45754565

4576-
// put "enumVars" map into `allowableValues", including `name` and `value`
4577-
List<Map<String, Object>> enumVars = new ArrayList<>();
4578-
String commonPrefix = findCommonPrefixOfVars(values);
4579-
int truncateIdx = commonPrefix.length();
4580-
for (Object value : values) {
4581-
Map<String, Object> enumVar = new HashMap<>();
4582-
String enumName;
4583-
if (truncateIdx == 0) {
4584-
enumName = value.toString();
4585-
} else {
4586-
enumName = value.toString().substring(truncateIdx);
4587-
if ("".equals(enumName)) {
4588-
enumName = value.toString();
4589-
}
4590-
}
4591-
4592-
enumVar.put("name", toEnumVarName(enumName, dataType));
4593-
enumVar.put("value", toEnumValue(value.toString(), dataType));
4594-
enumVar.put("isString", isDataTypeString(dataType));
4595-
enumVars.add(enumVar);
4596-
}
45974566
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
45984567
Map<String, Object> extensions = var.mostInnerItems != null ? var.mostInnerItems.getVendorExtensions() : var.getVendorExtensions();
45994568
if (referencedSchema.isPresent()) {
@@ -4623,6 +4592,34 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
46234592
}
46244593
}
46254594

4595+
protected List<Map<String, Object>> buildEnumVars(List<Object> values, String dataType) {
4596+
List<Map<String, Object>> enumVars = new ArrayList<>();
4597+
int truncateIdx = 0;
4598+
if (isRemoveEnumValuePrefix()) {
4599+
String commonPrefix = findCommonPrefixOfVars(values);
4600+
truncateIdx = commonPrefix.length();
4601+
}
4602+
for (Object value : values) {
4603+
Map<String, Object> enumVar = new HashMap<>();
4604+
String enumName;
4605+
if (truncateIdx == 0) {
4606+
enumName = value.toString();
4607+
}
4608+
else {
4609+
enumName = value.toString().substring(truncateIdx);
4610+
if ("".equals(enumName)) {
4611+
enumName = value.toString();
4612+
}
4613+
}
4614+
4615+
enumVar.put("name", toEnumVarName(enumName, dataType));
4616+
enumVar.put("value", toEnumValue(value.toString(), dataType));
4617+
enumVar.put("isString", isDataTypeString(dataType));
4618+
enumVars.add(enumVar);
4619+
}
4620+
return enumVars;
4621+
}
4622+
46264623
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions) {
46274624
if (vendorExtensions != null) {
46284625
updateEnumVarsWithExtensions(enumVars, vendorExtensions, "x-enum-varnames", "name");
@@ -5519,4 +5516,22 @@ public FeatureSet getFeatureSet() {
55195516
public void setFeatureSet(final FeatureSet featureSet) {
55205517
this.featureSet = featureSet == null ? DefaultFeatureSet : featureSet;
55215518
}
5522-
}
5519+
5520+
/**
5521+
* Get the boolean value indicating whether to remove enum value prefixes
5522+
*/
5523+
@Override
5524+
public boolean isRemoveEnumValuePrefix() {
5525+
return this.removeEnumValuePrefix;
5526+
}
5527+
5528+
/**
5529+
* Set the boolean value indicating whether to remove enum value prefixes
5530+
*
5531+
* @param removeEnumValuePrefix true to enable enum value prefix removal
5532+
*/
5533+
@Override
5534+
public void setRemoveEnumValuePrefix(final boolean removeEnumValuePrefix) {
5535+
this.removeEnumValuePrefix = removeEnumValuePrefix;
5536+
}
5537+
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -469,25 +469,7 @@ private boolean buildEnumFromValues(CodegenModel cm) {
469469
}
470470
Map<String, Object> allowableValues = cm.allowableValues;
471471
List<Object> values = (List<Object>) allowableValues.get("values");
472-
List<Map<String, String>> enumVars =
473-
new ArrayList<Map<String, String>>();
474-
String commonPrefix = findCommonPrefixOfVars(values);
475-
int truncateIdx = commonPrefix.length();
476-
for (Object value : values) {
477-
Map<String, String> enumVar = new HashMap<String, String>();
478-
String enumName;
479-
if (truncateIdx == 0) {
480-
enumName = value.toString();
481-
} else {
482-
enumName = value.toString().substring(truncateIdx);
483-
if ("".equals(enumName)) {
484-
enumName = value.toString();
485-
}
486-
}
487-
enumVar.put("name", toEnumVarName(enumName, cm.dataType));
488-
enumVar.put("value", toEnumValue(value.toString(), cm.dataType));
489-
enumVars.add(enumVar);
490-
}
472+
List<Map<String, Object>> enumVars = buildEnumVars(values, cm.dataType);
491473
cm.allowableValues.put("enumVars", enumVars);
492474
return true;
493475
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -463,26 +463,8 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
463463
String dataType = (referencedSchema.isPresent()) ? getTypeDeclaration(referencedSchema.get()) : varDataType;
464464

465465
// put "enumVars" map into `allowableValues", including `name` and `value`
466-
List<Map<String, Object>> enumVars = new ArrayList<>();
467-
String commonPrefix = findCommonPrefixOfVars(values);
468-
int truncateIdx = commonPrefix.length();
469-
for (Object value : values) {
470-
Map<String, Object> enumVar = new HashMap<>();
471-
String enumName;
472-
if (truncateIdx == 0) {
473-
enumName = value.toString();
474-
} else {
475-
enumName = value.toString().substring(truncateIdx);
476-
if ("".equals(enumName)) {
477-
enumName = value.toString();
478-
}
479-
}
466+
List<Map<String, Object>> enumVars = buildEnumVars(values, dataType);
480467

481-
enumVar.put("name", toEnumVarName(enumName, dataType));
482-
enumVar.put("value", toEnumValue(value.toString(), dataType));
483-
enumVar.put("isString", isDataTypeString(dataType));
484-
enumVars.add(enumVar);
485-
}
486468
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
487469
Map<String, Object> extensions = var.mostInnerItems != null ? var.mostInnerItems.getVendorExtensions() : var.getVendorExtensions();
488470
if (referencedSchema.isPresent()) {

modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,79 @@ public void updateCodegenPropertyEnumWithExtention() {
388388
}
389389
}
390390

391+
@Test
392+
public void updateCodegenPropertyEnumWithPrefixRemoved() {
393+
final DefaultCodegen codegen = new DefaultCodegen();
394+
CodegenProperty enumProperty = codegenProperty(Arrays.asList("animal_dog", "animal_cat"));
395+
396+
codegen.updateCodegenPropertyEnum(enumProperty);
397+
398+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) enumProperty.getItems().getAllowableValues().get("enumVars");
399+
Assert.assertNotNull(enumVars);
400+
Assert.assertNotNull(enumVars.get(0));
401+
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOG");
402+
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\"");
403+
Assert.assertNotNull(enumVars.get(1));
404+
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CAT");
405+
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\"");
406+
}
407+
408+
@Test
409+
public void updateCodegenPropertyEnumWithoutPrefixRemoved() {
410+
final DefaultCodegen codegen = new DefaultCodegen();
411+
codegen.setRemoveEnumValuePrefix(false);
412+
413+
CodegenProperty enumProperty = codegenProperty(Arrays.asList("animal_dog", "animal_cat"));
414+
415+
codegen.updateCodegenPropertyEnum(enumProperty);
416+
417+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) enumProperty.getItems().getAllowableValues().get("enumVars");
418+
Assert.assertNotNull(enumVars);
419+
Assert.assertNotNull(enumVars.get(0));
420+
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "ANIMAL_DOG");
421+
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\"");
422+
Assert.assertNotNull(enumVars.get(1));
423+
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "ANIMAL_CAT");
424+
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\"");
425+
}
426+
427+
@Test
428+
public void postProcessModelsEnumWithPrefixRemoved() {
429+
final DefaultCodegen codegen = new DefaultCodegen();
430+
Map<String, Object> objs = codegenModel(Arrays.asList("animal_dog", "animal_cat"));
431+
CodegenModel cm = (CodegenModel) ((Map<String, Object>) ((List<Object>) objs.get("models")).get(0)).get("model");
432+
433+
codegen.postProcessModelsEnum(objs);
434+
435+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) cm.getAllowableValues().get("enumVars");
436+
Assert.assertNotNull(enumVars);
437+
Assert.assertNotNull(enumVars.get(0));
438+
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOG");
439+
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\"");
440+
Assert.assertNotNull(enumVars.get(1));
441+
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CAT");
442+
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\"");
443+
}
444+
445+
@Test
446+
public void postProcessModelsEnumWithoutPrefixRemoved() {
447+
final DefaultCodegen codegen = new DefaultCodegen();
448+
codegen.setRemoveEnumValuePrefix(false);
449+
Map<String, Object> objs = codegenModel(Arrays.asList("animal_dog", "animal_cat"));
450+
CodegenModel cm = (CodegenModel) ((Map<String, Object>) ((List<Object>) objs.get("models")).get(0)).get("model");
451+
452+
codegen.postProcessModelsEnum(objs);
453+
454+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) cm.getAllowableValues().get("enumVars");
455+
Assert.assertNotNull(enumVars);
456+
Assert.assertNotNull(enumVars.get(0));
457+
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "ANIMAL_DOG");
458+
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\"");
459+
Assert.assertNotNull(enumVars.get(1));
460+
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "ANIMAL_CAT");
461+
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\"");
462+
}
463+
391464
@Test
392465
public void postProcessModelsEnumWithExtention() {
393466
final DefaultCodegen codegen = new DefaultCodegen();
@@ -902,6 +975,19 @@ private CodegenProperty codegenPropertyWithArrayOfIntegerValues() {
902975
return array;
903976
}
904977

978+
private CodegenProperty codegenProperty(List<String> values) {
979+
CodegenProperty array = new CodegenProperty();
980+
final CodegenProperty items = new CodegenProperty();
981+
final HashMap<String, Object> allowableValues = new HashMap<>();
982+
allowableValues.put("values", values);
983+
items.setAllowableValues(allowableValues);
984+
items.dataType = "String";
985+
array.items = items;
986+
array.mostInnerItems = items;
987+
array.dataType = "Array";
988+
return array;
989+
}
990+
905991
private CodegenProperty codegenPropertyWithXEnumVarName(List<String> values, List<String> aliases) {
906992
final CodegenProperty var = new CodegenProperty();
907993
final HashMap<String, Object> allowableValues = new HashMap<>();
@@ -913,6 +999,17 @@ private CodegenProperty codegenPropertyWithXEnumVarName(List<String> values, Lis
913999
return var;
9141000
}
9151001

1002+
private Map<String, Object> codegenModel(List<String> values) {
1003+
final CodegenModel cm = new CodegenModel();
1004+
cm.isEnum = true;
1005+
final HashMap<String, Object> allowableValues = new HashMap<>();
1006+
allowableValues.put("values", values);
1007+
cm.setAllowableValues(allowableValues);
1008+
cm.dataType = "String";
1009+
Map<String, Object> objs = Collections.singletonMap("models", Collections.singletonList(Collections.singletonMap("model", cm)));
1010+
return objs;
1011+
}
1012+
9161013
private Map<String, Object> codegenModelWithXEnumVarName() {
9171014
final CodegenModel cm = new CodegenModel();
9181015
cm.isEnum = true;

0 commit comments

Comments
 (0)