[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 * Return the default value of the property
* *
@ -716,5 +715,7 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co
} }
@Override @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); modelImports.add(model.parent);
} }
// set enum type in extensions // set enum type in extensions and update `name` in enumVars
if (model.isEnum) { if (model.isEnum) {
for (Map<String, Object> enumVars : (List<Map<String, Object>>) model.getAllowableValues().get("enumVars")) { for (Map<String, Object> enumVars : (List<Map<String, Object>>) model.getAllowableValues().get("enumVars")) {
if ((Boolean) enumVars.get("isString")) { 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 { } 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 @Override
public String toEnumVarName(String name, String datatype) { 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) { if (name.length() == 0) {
return "EMPTY"; return "EMPTY";
} }
@ -1366,7 +1376,7 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
@Override @Override
public String toEnumDefaultValue(String value, String datatype) { 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) { public void setDateFormat(String dateFormat) {
this.dateFormat = 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 - UPPER
- lower - lower
- '' - ''
enum_integer_default:
type: integer
format: int32
enum:
- 1
- 5
- 14
default: 5
enum_integer: enum_integer:
type: integer type: integer
format: int32 format: int32

View File

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

View File

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

View File

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

View File

@ -32,6 +32,7 @@ class EnumTest(BaseModel):
""" """
enum_string: Optional[StrictStr] = None enum_string: Optional[StrictStr] = None
enum_string_required: StrictStr = ... enum_string_required: StrictStr = ...
enum_integer_default: Optional[StrictInt] = 5
enum_integer: Optional[StrictInt] = None enum_integer: Optional[StrictInt] = None
enum_number: Optional[StrictFloat] = None enum_number: Optional[StrictFloat] = None
outer_enum: Optional[OuterEnum] = Field(None, alias="outerEnum") 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_default_value: Optional[OuterEnumDefaultValue] = Field(None, alias="outerEnumDefaultValue")
outer_enum_integer_default_value: Optional[OuterEnumIntegerDefaultValue] = Field(None, alias="outerEnumIntegerDefaultValue") outer_enum_integer_default_value: Optional[OuterEnumIntegerDefaultValue] = Field(None, alias="outerEnumIntegerDefaultValue")
additional_properties: Dict[str, Any] = {} 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') @validator('enum_string')
def enum_string_validate_enum(cls, v): def enum_string_validate_enum(cls, v):
@ -56,6 +57,15 @@ class EnumTest(BaseModel):
raise ValueError("must validate the enum values ('UPPER', 'lower', '')") raise ValueError("must validate the enum values ('UPPER', 'lower', '')")
return v 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') @validator('enum_integer')
def enum_integer_validate_enum(cls, v): def enum_integer_validate_enum(cls, v):
if v is None: if v is None:
@ -121,6 +131,7 @@ class EnumTest(BaseModel):
_obj = EnumTest.parse_obj({ _obj = EnumTest.parse_obj({
"enum_string": obj.get("enum_string"), "enum_string": obj.get("enum_string"),
"enum_string_required": obj.get("enum_string_required"), "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_integer": obj.get("enum_integer"),
"enum_number": obj.get("enum_number"), "enum_number": obj.get("enum_number"),
"outer_enum": obj.get("outerEnum"), "outer_enum": obj.get("outerEnum"),

View File

@ -382,3 +382,8 @@ class ModelTests(unittest.TestCase):
## Serializing json ## Serializing json
#json_object = json.dumps(dictionary) #json_object = json.dumps(dictionary)
#self.assertEqual(json_object, "") #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)