Skip to content

Commit 0eb515c

Browse files
refactor(enum): centralize enum variable keys in code generation (#24390)
1 parent f9838e6 commit 0eb515c

30 files changed

Lines changed: 170 additions & 133 deletions

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,19 @@ public static enum ENUM_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case,
467467
public static final String DEFAULT_TO_EMPTY_CONTAINER = "defaultToEmptyContainer";
468468
public static final String DEFAULT_TO_EMPTY_CONTAINER_DESC = "Initialize containers (array/set/map) to empty containers instead of null by default. Usage: https://github.com/OpenAPITools/openapi-generator/blob/master/docs/customization.md#default-values";
469469

470+
// The raw enum values from the OpenAPI specification
471+
public static final String ENUM_VALUES = "values";
472+
// The map that stores all enum values and their metadata (name, value, enumDescription...)
473+
public static final String ENUM_VARS = "enumVars";
474+
// The name of the enum, for example NAME("value") in Java
475+
public static final String ENUM_NAME = "name";
476+
// The on-the-line value, i.e., the one present in the "values"
477+
public static final String ENUM_VALUE = "value";
478+
// If the enum is typed as a string
479+
public static final String ENUM_IS_STRING = "isString";
480+
// The description that should be attached to an entry in "enumVars"
481+
public static final String ENUM_DESCRIPTION = "enumDescription";
482+
470483
// Vendor extensions
471484
public static final String X_INTERNAL = "x-internal";
472485
public static final String X_PARENT = "x-parent";

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

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -857,12 +857,12 @@ public ModelsMap postProcessModelsEnum(ModelsMap objs) {
857857
// for enum model
858858
if (cm.isEnum && cm.allowableValues != null) {
859859
Map<String, Object> allowableValues = cm.allowableValues;
860-
List<Object> values = (List<Object>) allowableValues.get("values");
860+
List<Object> values = (List<Object>) allowableValues.get(ENUM_VALUES);
861861
List<Map<String, Object>> enumVars = buildEnumVars(values, cm.dataType);
862862
postProcessEnumVars(enumVars);
863863
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
864864
updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions(), cm.dataType);
865-
cm.allowableValues.put("enumVars", enumVars);
865+
cm.allowableValues.put(ENUM_VARS, enumVars);
866866
}
867867

868868
// update codegen property enum with proper naming convention
@@ -3160,7 +3160,7 @@ public CodegenModel fromModel(String name, Schema schema) {
31603160
m.isEnum = true;
31613161
// comment out below as allowableValues is not set in post processing model enum
31623162
m.allowableValues = new HashMap<>();
3163-
m.allowableValues.put("values", schema.getEnum());
3163+
m.allowableValues.put(ENUM_VALUES, schema.getEnum());
31643164
}
31653165
if (!ModelUtils.isArraySchema(schema)) {
31663166
m.dataType = getSchemaType(schema);
@@ -3293,7 +3293,7 @@ protected static String getEnumValueForProperty(
32933293
return e.getKey();
32943294
}
32953295
}
3296-
Object values = var.allowableValues.get("values");
3296+
Object values = var.allowableValues.get(ENUM_VALUES);
32973297
if (!(values instanceof List<?>)) {
32983298
return var.defaultValue;
32993299
}
@@ -3976,7 +3976,7 @@ public CodegenProperty fromProperty(String name, Schema p, boolean required, boo
39763976
property.isInnerEnum = true;
39773977

39783978
Map<String, Object> allowableValues = new HashMap<>();
3979-
allowableValues.put("values", _enum);
3979+
allowableValues.put(ENUM_VALUES, _enum);
39803980
if (!allowableValues.isEmpty()) {
39813981
property.allowableValues = allowableValues;
39823982
}
@@ -3991,7 +3991,7 @@ public CodegenProperty fromProperty(String name, Schema p, boolean required, boo
39913991
property.isEnumRef = true;
39923992

39933993
Map<String, Object> allowableValues = new HashMap<>();
3994-
allowableValues.put("values", _enum);
3994+
allowableValues.put(ENUM_VALUES, _enum);
39953995
if (allowableValues.size() > 0) {
39963996
property.allowableValues = allowableValues;
39973997
}
@@ -6734,7 +6734,7 @@ public void setParameterBooleanFlagWithCodegenProperty(CodegenParameter paramete
67346734
}
67356735

67366736
/**
6737-
* Update codegen property's enum by adding "enumVars" (with name and value)
6737+
* Update codegen property's enum by adding {@value CodegenConstants#ENUM_VARS} (with name and value)
67386738
*
67396739
* @param var list of CodegenProperty
67406740
*/
@@ -6750,7 +6750,7 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
67506750
return;
67516751
}
67526752

6753-
List<Object> values = (List<Object>) allowableValues.get("values");
6753+
List<Object> values = (List<Object>) allowableValues.get(ENUM_VALUES);
67546754
if (values == null) {
67556755
return;
67566756
}
@@ -6770,16 +6770,16 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
67706770
extensions = referencedSchema.get().getExtensions();
67716771
}
67726772
updateEnumVarsWithExtensions(enumVars, extensions, dataType);
6773-
allowableValues.put("enumVars", enumVars);
6773+
allowableValues.put(ENUM_VARS, enumVars);
67746774

67756775
// handle default value for enum, e.g. available => StatusEnum.AVAILABLE
67766776
if (var.defaultValue != null) {
67776777
final String enumDefaultValue = getEnumDefaultValue(var.defaultValue, dataType);
67786778

67796779
String enumName = null;
67806780
for (Map<String, Object> enumVar : enumVars) {
6781-
if (enumDefaultValue.equals(enumVar.get("value"))) {
6782-
enumName = (String) enumVar.get("name");
6781+
if (enumDefaultValue.equals(enumVar.get(ENUM_VALUE))) {
6782+
enumName = (String) enumVar.get(ENUM_NAME);
67836783
break;
67846784
}
67856785
}
@@ -6822,9 +6822,9 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
68226822

68236823
final String finalEnumName = toEnumVarName(enumName, dataType);
68246824

6825-
enumVar.put("name", finalEnumName);
6826-
enumVar.put("value", toEnumValue(String.valueOf(value), dataType));
6827-
enumVar.put("isString", isDataTypeString(dataType));
6825+
enumVar.put(ENUM_NAME, finalEnumName);
6826+
enumVar.put(ENUM_VALUE, toEnumValue(String.valueOf(value), dataType));
6827+
enumVar.put(ENUM_IS_STRING, isDataTypeString(dataType));
68286828
// TODO: add isNumeric
68296829
enumVars.add(enumVar);
68306830
}
@@ -6845,9 +6845,9 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
68456845
// https://github.com/OpenAPITools/openapi-generator/pull/11013
68466846
String.valueOf(11184809);
68476847

6848-
enumVar.put("name", toEnumVarName(enumName, dataType));
6849-
enumVar.put("value", toEnumValue(enumValue, dataType));
6850-
enumVar.put("isString", isDataTypeString(dataType));
6848+
enumVar.put(ENUM_NAME, toEnumVarName(enumName, dataType));
6849+
enumVar.put(ENUM_VALUE, toEnumValue(enumValue, dataType));
6850+
enumVar.put(ENUM_IS_STRING, isDataTypeString(dataType));
68516851
// TODO: add isNumeric
68526852
enumVars.add(enumVar);
68536853
}
@@ -6858,19 +6858,19 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
68586858
protected void postProcessEnumVars(List<Map<String, Object>> enumVars) {
68596859
Collections.reverse(enumVars);
68606860
enumVars.forEach(v -> {
6861-
String name = (String) v.get("name");
6862-
long count = enumVars.stream().filter(v1 -> v1.get("name").equals(name)).count();
6861+
String name = (String) v.get(ENUM_NAME);
6862+
long count = enumVars.stream().filter(v1 -> v1.get(ENUM_NAME).equals(name)).count();
68636863
if (count > 1) {
68646864
String uniqueEnumName = getUniqueEnumName(name, enumVars);
6865-
LOGGER.debug("Changing duplicate enumeration name from {} to {}", v.get("name"), uniqueEnumName);
6866-
v.put("name", uniqueEnumName);
6865+
LOGGER.debug("Changing duplicate enumeration name from {} to {}", v.get(ENUM_NAME), uniqueEnumName);
6866+
v.put(ENUM_NAME, uniqueEnumName);
68676867
}
68686868
});
68696869
Collections.reverse(enumVars);
68706870
}
68716871

68726872
private String getUniqueEnumName(String name, List<Map<String, Object>> enumVars) {
6873-
long count = enumVars.stream().filter(v -> v.get("name").equals(name)).count();
6873+
long count = enumVars.stream().filter(v -> v.get(ENUM_NAME).equals(name)).count();
68746874
return count > 1
68756875
? getUniqueEnumName(name + count, enumVars)
68766876
: name;
@@ -6885,8 +6885,8 @@ private String getUniqueEnumName(String name, List<Map<String, Object>> enumVars
68856885
*/
68866886
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
68876887
if (vendorExtensions != null) {
6888-
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_VARNAMES, "name", dataType);
6889-
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_DESCRIPTIONS, "enumDescription", dataType);
6888+
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_VARNAMES, ENUM_NAME, dataType);
6889+
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_DESCRIPTIONS, ENUM_DESCRIPTION, dataType);
68906890
}
68916891
}
68926892

@@ -6929,7 +6929,7 @@ protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
69296929
} else if (extensionValue instanceof Map) {
69306930
Map<String, String> valueMap = (Map<String, String>) extensionValue;
69316931
for (Map<String, Object> enumVar : enumVars) {
6932-
String enumValue = (String) enumVar.get("value");
6932+
String enumValue = (String) enumVar.get(ENUM_VALUE);
69336933
for (Map.Entry<String, String> entry : valueMap.entrySet()) {
69346934
if (toEnumValue(entry.getKey(), dataType).equals(enumValue)) {
69356935
enumVar.put(key, enumDataTypeMapping.apply(entry.getValue(), dataType));

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -488,8 +488,8 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert
488488
if (Boolean.TRUE.equals(this.zeroBasedEnums)) {
489489
property.vendorExtensions.put(AbstractCSharpCodegen.zeroBasedEnumVendorExtension, true);
490490
} else if (!Boolean.FALSE.equals(this.zeroBasedEnums)) {
491-
if (property.allowableValues.containsKey("values")) {
492-
final List<?> allowableValues = (List<?>) property.allowableValues.get("values");
491+
if (property.allowableValues.containsKey(ENUM_VALUES)) {
492+
final List<?> allowableValues = (List<?>) property.allowableValues.get(ENUM_VALUES);
493493
boolean isZeroBased = String.valueOf(allowableValues.get(0)).toLowerCase(Locale.ROOT).equals("unknown");
494494
property.vendorExtensions.put(AbstractCSharpCodegen.zeroBasedEnumVendorExtension, isZeroBased);
495495
}
@@ -587,8 +587,8 @@ public ModelsMap postProcessModels(ModelsMap objs) {
587587
if (Boolean.TRUE.equals(this.zeroBasedEnums)) {
588588
cm.vendorExtensions.put(AbstractCSharpCodegen.zeroBasedEnumVendorExtension, true);
589589
} else if (!Boolean.FALSE.equals(this.zeroBasedEnums)) {
590-
if (cm.allowableValues.containsKey("values")) {
591-
final List<?> allowableValues = (List<?>) cm.allowableValues.get("values");
590+
if (cm.allowableValues.containsKey(ENUM_VALUES)) {
591+
final List<?> allowableValues = (List<?>) cm.allowableValues.get(ENUM_VALUES);
592592
boolean isZeroBased = String.valueOf(allowableValues.get(0)).toLowerCase(Locale.ROOT).equals("unknown");
593593
cm.vendorExtensions.put(AbstractCSharpCodegen.zeroBasedEnumVendorExtension, isZeroBased);
594594
}
@@ -892,7 +892,7 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
892892
// this is inline with C# enums with string values
893893
if ("string?".equals(dataType)) {
894894
enumVars.forEach((enumVar) -> {
895-
enumVar.put("isString", true);
895+
enumVar.put(ENUM_IS_STRING, true);
896896
});
897897
}
898898

@@ -905,7 +905,7 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
905905
}
906906

907907
/**
908-
* Update codegen property's enum by adding "enumVars" (with name and value)
908+
* Update codegen property's enum by adding {@value CodegenConstants#ENUM_VARS} (with name and value)
909909
*
910910
* @param var list of CodegenProperty
911911
*/
@@ -1912,7 +1912,7 @@ public void setParameterExampleValue(CodegenParameter p) {
19121912
boolean hasAllowableValues = p.allowableValues != null && !p.allowableValues.isEmpty();
19131913
if (hasAllowableValues) {
19141914
//support examples for inline enums
1915-
final List<?> values = (List<?>) p.allowableValues.get("values");
1915+
final List<?> values = (List<?>) p.allowableValues.get(ENUM_VALUES);
19161916
example = String.valueOf(values.get(0));
19171917
} else if (p.defaultValue == null) {
19181918
example = p.example;

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.*;
2929
import java.util.stream.Stream;
3030

31+
import static org.openapitools.codegen.CodegenConstants.*;
3132
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
3233
import static org.openapitools.codegen.utils.StringUtils.*;
3334

@@ -860,9 +861,9 @@ protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
860861
List<Map<String, Object>> values = (List<Map<String, Object>>) extension;
861862
for (Map<String, Object> value : values) {
862863
Map<String, Object> enumVar = new HashMap<>();
863-
enumVar.put("name", toEnumVarName((String) value.get("identifier"), dataType));
864-
enumVar.put("value", toEnumValue(value.get("numericValue").toString(), dataType));
865-
enumVar.put("isString", isDataTypeString(dataType));
864+
enumVar.put(ENUM_NAME, toEnumVarName((String) value.get("identifier"), dataType));
865+
enumVar.put(ENUM_VALUE, toEnumValue(value.get("numericValue").toString(), dataType));
866+
enumVar.put(ENUM_IS_STRING, isDataTypeString(dataType));
866867
if (value.containsKey("description")) {
867868
enumVar.put("description", value.get("description").toString());
868869
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import java.io.File;
3838
import java.util.*;
3939

40+
import static org.openapitools.codegen.CodegenConstants.ENUM_VARS;
4041
import static org.openapitools.codegen.CodegenConstants.X_ENUM_BYTE;
4142
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
4243
import static org.openapitools.codegen.utils.StringUtils.camelize;
@@ -449,7 +450,7 @@ private void postProcessEnumRefs(final Map<String, ModelsMap> models) {
449450

450451
// Since we iterate enumVars for modelInnerEnum and enumClass templates, and CodegenModel is missing some of CodegenProperty's properties,
451452
// we can take advantage of Mustache's contextual lookup to add the same "properties" to the model's enumVars scope rather than CodegenProperty's scope.
452-
List<Map<String, String>> enumVars = (ArrayList<Map<String, String>>) model.allowableValues.get("enumVars");
453+
List<Map<String, String>> enumVars = (ArrayList<Map<String, String>>) model.allowableValues.get(ENUM_VARS);
453454
List<Map<String, Object>> newEnumVars = new ArrayList<>();
454455
for (Map<String, String> enumVar : enumVars) {
455456
Map<String, Object> mixedVars = new HashMap<>(enumVar);
@@ -463,7 +464,7 @@ private void postProcessEnumRefs(final Map<String, ModelsMap> models) {
463464
}
464465

465466
if (!newEnumVars.isEmpty()) {
466-
model.allowableValues.put("enumVars", newEnumVars);
467+
model.allowableValues.put(ENUM_VARS, newEnumVars);
467468
}
468469
}
469470
} else {
@@ -473,7 +474,7 @@ private void postProcessEnumRefs(final Map<String, ModelsMap> models) {
473474
}
474475

475476
/**
476-
* Update codegen property's enum by adding "enumVars" (with name and value)
477+
* Update codegen property's enum by adding {@value CodegenConstants#ENUM_VARS} (with name and value)
477478
*
478479
* @param var list of CodegenProperty
479480
*/

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@
7575
import java.util.stream.Stream;
7676
import java.util.stream.StreamSupport;
7777

78-
import static org.openapitools.codegen.CodegenConstants.USE_DEDUCTION_FOR_ONE_OF_INTERFACES;
79-
import static org.openapitools.codegen.CodegenConstants.X_IMPLEMENTS;
78+
import static org.openapitools.codegen.CodegenConstants.*;
8079
import static org.openapitools.codegen.utils.CamelizeOption.*;
8180
import static org.openapitools.codegen.utils.ModelUtils.getSchemaItems;
8281
import static org.openapitools.codegen.utils.OnceLogger.once;
@@ -1788,7 +1787,7 @@ public void setParameterExampleValue(CodegenParameter p) {
17881787
boolean hasAllowableValues = p.allowableValues != null && !p.allowableValues.isEmpty();
17891788
if (hasAllowableValues) {
17901789
//support examples for inline enums
1791-
final List<Object> values = (List<Object>) p.allowableValues.get("values");
1790+
final List<Object> values = (List<Object>) p.allowableValues.get(ENUM_VALUES);
17921791
example = String.valueOf(values.get(0));
17931792
} else if (p.defaultValue == null) {
17941793
example = p.example;

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@
3838
import java.util.regex.Matcher;
3939
import java.util.regex.Pattern;
4040

41-
import static org.openapitools.codegen.CodegenConstants.X_ENUM_DESCRIPTIONS;
42-
import static org.openapitools.codegen.CodegenConstants.X_ENUM_VARNAMES;
41+
import static org.openapitools.codegen.CodegenConstants.*;
4342
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
4443
import static org.openapitools.codegen.utils.CamelizeOption.UPPERCASE_FIRST_CHAR;
4544
import static org.openapitools.codegen.utils.StringUtils.camelize;
@@ -755,8 +754,8 @@ public void setParameterExampleValue(CodegenParameter p) {
755754
@Override
756755
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
757756
if (vendorExtensions != null) {
758-
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_VARNAMES, "name", dataType, this::toEnumVarName);
759-
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_DESCRIPTIONS, "enumDescription", dataType);
757+
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_VARNAMES, ENUM_NAME, dataType, this::toEnumVarName);
758+
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_DESCRIPTIONS, ENUM_DESCRIPTION, dataType);
760759
}
761760
}
762761

0 commit comments

Comments
 (0)