[python-nextgen] fix enum default value (#14846)

* fix enum value

* add test for default value

* update samples, better code format
This commit is contained in:
William Cheng 2023-03-02 17:36:38 +08:00 committed by GitHub
parent 27a4355c6c
commit 60e2d605c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 64 additions and 10 deletions

View File

@ -125,7 +125,6 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co
}
/**
* Return the default value of the property
*
@ -716,5 +715,7 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co
}
@Override
public GeneratorLanguage generatorLanguage() { return GeneratorLanguage.PYTHON; }
public GeneratorLanguage generatorLanguage() {
return GeneratorLanguage.PYTHON;
}
}

View File

@ -1129,15 +1129,17 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
modelImports.add(model.parent);
}
// set enum type in extensions
// set enum type in extensions and update `name` in enumVars
if (model.isEnum) {
for (Map<String, Object> enumVars : (List<Map<String, Object>>) model.getAllowableValues().get("enumVars")) {
if ((Boolean) enumVars.get("isString")) {
model.vendorExtensions.put("x-py-enum-type", "str");
model.vendorExtensions.putIfAbsent("x-py-enum-type", "str");
// update `name`, e.g.
enumVars.put("name", toEnumVariableName((String) enumVars.get("value"), "str"));
} else {
model.vendorExtensions.put("x-py-enum-type", "int");
model.vendorExtensions.putIfAbsent("x-py-enum-type", "int");
enumVars.put("name", toEnumVariableName((String) enumVars.get("value"), "int"));
}
break;
}
}
@ -1321,6 +1323,14 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
@Override
public String toEnumVarName(String name, String datatype) {
if ("int".equals(datatype) || "float".equals(datatype)) {
return name;
} else {
return "\'" + name + "\'";
}
}
public String toEnumVariableName(String name, String datatype) {
if (name.length() == 0) {
return "EMPTY";
}
@ -1366,7 +1376,7 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
@Override
public String toEnumDefaultValue(String value, String datatype) {
return "self::" + datatype + "_" + value;
return value;
}
/**
@ -1405,4 +1415,10 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}
@Override
public ModelsMap postProcessModels(ModelsMap objs) {
// process enum in models
return postProcessModelsEnum(objs);
}
}

View File

@ -1630,6 +1630,14 @@ components:
- UPPER
- lower
- ''
enum_integer_default:
type: integer
format: int32
enum:
- 1
- 5
- 14
default: 5
enum_integer:
type: integer
format: int32

View File

@ -6,6 +6,7 @@ Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**enum_string** | **str** | | [optional]
**enum_string_required** | **str** | |
**enum_integer_default** | **int** | | [optional] [default to 5]
**enum_integer** | **int** | | [optional]
**enum_number** | **float** | | [optional]
**outer_enum** | [**OuterEnum**](OuterEnum.md) | | [optional]

View File

@ -32,13 +32,14 @@ class EnumTest(BaseModel):
"""
enum_string: Optional[StrictStr] = None
enum_string_required: StrictStr = ...
enum_integer_default: Optional[StrictInt] = 5
enum_integer: Optional[StrictInt] = None
enum_number: Optional[float] = None
outer_enum: Optional[OuterEnum] = Field(None, alias="outerEnum")
outer_enum_integer: Optional[OuterEnumInteger] = Field(None, alias="outerEnumInteger")
outer_enum_default_value: Optional[OuterEnumDefaultValue] = Field(None, alias="outerEnumDefaultValue")
outer_enum_integer_default_value: Optional[OuterEnumIntegerDefaultValue] = Field(None, alias="outerEnumIntegerDefaultValue")
__properties = ["enum_string", "enum_string_required", "enum_integer", "enum_number", "outerEnum", "outerEnumInteger", "outerEnumDefaultValue", "outerEnumIntegerDefaultValue"]
__properties = ["enum_string", "enum_string_required", "enum_integer_default", "enum_integer", "enum_number", "outerEnum", "outerEnumInteger", "outerEnumDefaultValue", "outerEnumIntegerDefaultValue"]
@validator('enum_string')
def enum_string_validate_enum(cls, v):
@ -55,6 +56,15 @@ class EnumTest(BaseModel):
raise ValueError("must validate the enum values ('UPPER', 'lower', '')")
return v
@validator('enum_integer_default')
def enum_integer_default_validate_enum(cls, v):
if v is None:
return v
if v not in (1, 5, 14):
raise ValueError("must validate the enum values (1, 5, 14)")
return v
@validator('enum_integer')
def enum_integer_validate_enum(cls, v):
if v is None:
@ -114,6 +124,7 @@ class EnumTest(BaseModel):
_obj = EnumTest.parse_obj({
"enum_string": obj.get("enum_string"),
"enum_string_required": obj.get("enum_string_required"),
"enum_integer_default": obj.get("enum_integer_default") if obj.get("enum_integer_default") is not None else 5,
"enum_integer": obj.get("enum_integer"),
"enum_number": obj.get("enum_number"),
"outer_enum": obj.get("outerEnum"),

View File

@ -6,6 +6,7 @@ Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**enum_string** | **str** | | [optional]
**enum_string_required** | **str** | |
**enum_integer_default** | **int** | | [optional] [default to 5]
**enum_integer** | **int** | | [optional]
**enum_number** | **float** | | [optional]
**outer_enum** | [**OuterEnum**](OuterEnum.md) | | [optional]

View File

@ -32,6 +32,7 @@ class EnumTest(BaseModel):
"""
enum_string: Optional[StrictStr] = None
enum_string_required: StrictStr = ...
enum_integer_default: Optional[StrictInt] = 5
enum_integer: Optional[StrictInt] = None
enum_number: Optional[StrictFloat] = None
outer_enum: Optional[OuterEnum] = Field(None, alias="outerEnum")
@ -39,7 +40,7 @@ class EnumTest(BaseModel):
outer_enum_default_value: Optional[OuterEnumDefaultValue] = Field(None, alias="outerEnumDefaultValue")
outer_enum_integer_default_value: Optional[OuterEnumIntegerDefaultValue] = Field(None, alias="outerEnumIntegerDefaultValue")
additional_properties: Dict[str, Any] = {}
__properties = ["enum_string", "enum_string_required", "enum_integer", "enum_number", "outerEnum", "outerEnumInteger", "outerEnumDefaultValue", "outerEnumIntegerDefaultValue"]
__properties = ["enum_string", "enum_string_required", "enum_integer_default", "enum_integer", "enum_number", "outerEnum", "outerEnumInteger", "outerEnumDefaultValue", "outerEnumIntegerDefaultValue"]
@validator('enum_string')
def enum_string_validate_enum(cls, v):
@ -56,6 +57,15 @@ class EnumTest(BaseModel):
raise ValueError("must validate the enum values ('UPPER', 'lower', '')")
return v
@validator('enum_integer_default')
def enum_integer_default_validate_enum(cls, v):
if v is None:
return v
if v not in (1, 5, 14):
raise ValueError("must validate the enum values (1, 5, 14)")
return v
@validator('enum_integer')
def enum_integer_validate_enum(cls, v):
if v is None:
@ -121,6 +131,7 @@ class EnumTest(BaseModel):
_obj = EnumTest.parse_obj({
"enum_string": obj.get("enum_string"),
"enum_string_required": obj.get("enum_string_required"),
"enum_integer_default": obj.get("enum_integer_default") if obj.get("enum_integer_default") is not None else 5,
"enum_integer": obj.get("enum_integer"),
"enum_number": obj.get("enum_number"),
"outer_enum": obj.get("outerEnum"),

View File

@ -382,3 +382,8 @@ class ModelTests(unittest.TestCase):
## Serializing json
#json_object = json.dumps(dictionary)
#self.assertEqual(json_object, "")
def test_inline_enum_default(self):
enum_test = petstore_api.EnumTest(enum_string_required="lower")
self.assertEqual(enum_test.enum_integer_default, 5)