Compare commits

...

5 Commits

Author SHA1 Message Date
William Cheng
3a502aab8d test the new option 2025-09-30 16:41:06 +08:00
William Cheng
fa242fcb46 Merge branch 'master' of https://github.com/ranjanp75/openapi-generator into ranjanp75-master 2025-09-30 16:37:24 +08:00
Ranjan Prasad
17a184c2b0 Test cases fixes 2025-09-29 05:51:09 +05:30
Ranjan Prasad
0cee6d9419 Update docs 2025-09-28 05:10:35 +05:30
Ranjan Prasad
b40e4d81b4 Added enumUnknownDefaultCase property to python generator 2025-09-28 04:20:33 +05:30
48 changed files with 359 additions and 40 deletions

View File

@@ -7,6 +7,7 @@ additionalProperties:
packageName: petstore_api
mapNumberTo: float
poetry1: true
enumUnknownDefaultCase: true
nameMappings:
_type: underscore_type
type_: type_with_underscore

View File

@@ -22,6 +22,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|dateFormat|date format for query parameters| |%Y-%m-%d|
|datetimeFormat|datetime format for query parameters| |%Y-%m-%dT%H:%M:%S%z|
|disallowAdditionalPropertiesIfNotPresent|If false, the 'additionalProperties' implementation (set to true by default) is compliant with the OAS and JSON schema specifications. If true (default), keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.|<dl><dt>**false**</dt><dd>The 'additionalProperties' implementation is compliant with the OAS and JSON schema specifications.</dd><dt>**true**</dt><dd>Keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.</dd></dl>|true|
|enumUnknownDefaultCase|If the server adds new enum cases, that are unknown by an old spec/client, the client will fail to parse the network response.With this option enabled, each enum will have a new case, 'unknown_default_open_api', so that when the server sends an enum case that is not known by the client/spec, they can safely fallback to this case.| |false|
|generateSourceCodeOnly|Specifies that only a library source code is to be generated.| |false|
|hideGenerationTimestamp|Hides the generation timestamp when files are generated.| |true|
|lazyImports|Enable lazy imports.| |false|

View File

@@ -153,6 +153,7 @@ public class PythonClientCodegen extends AbstractPythonCodegen implements Codege
cliOptions.add(new CliOption(CodegenConstants.USE_ONEOF_DISCRIMINATOR_LOOKUP, CodegenConstants.USE_ONEOF_DISCRIMINATOR_LOOKUP_DESC).defaultValue("false"));
cliOptions.add(new CliOption(POETRY1_FALLBACK, "Fallback to formatting pyproject.toml to Poetry 1.x format."));
cliOptions.add(new CliOption(LAZY_IMPORTS, "Enable lazy imports.").defaultValue(Boolean.FALSE.toString()));
cliOptions.add(new CliOption(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE_DESC).defaultValue("false"));
supportedLibraries.put("urllib3", "urllib3-based client");
supportedLibraries.put("asyncio", "asyncio-based client");
@@ -271,6 +272,10 @@ public class PythonClientCodegen extends AbstractPythonCodegen implements Codege
additionalProperties.put(LAZY_IMPORTS, Boolean.valueOf(additionalProperties.get(LAZY_IMPORTS).toString()));
}
if (additionalProperties.containsKey(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE)) {
setEnumUnknownDefaultCase(Boolean.parseBoolean(additionalProperties.get(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE).toString()));
}
String modelPath = packagePath() + File.separatorChar + modelPackage.replace('.', File.separatorChar);
String apiPath = packagePath() + File.separatorChar + apiPackage.replace('.', File.separatorChar);

View File

@@ -24,6 +24,13 @@ class {{classname}}({{vendorExtensions.x-py-enum-type}}, Enum):
def from_json(cls, json_str: str) -> Self:
"""Create an instance of {{classname}} from a JSON string"""
return cls(json.loads(json_str))
{{#enumUnknownDefaultCase}}
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API
{{/enumUnknownDefaultCase}}
{{#defaultValue}}

View File

@@ -26,6 +26,8 @@ import io.swagger.v3.parser.core.models.ParseOptions;
import io.swagger.v3.parser.util.SchemaTypeUtil;
import org.openapitools.codegen.*;
import org.openapitools.codegen.config.CodegenConfigurator;
import org.openapitools.codegen.model.ModelMap;
import org.openapitools.codegen.model.ModelsMap;
import org.openapitools.codegen.languages.PythonClientCodegen;
import org.openapitools.codegen.languages.features.CXFServerFeatures;
import org.testng.Assert;
@@ -38,6 +40,8 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@@ -47,6 +51,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.openapitools.codegen.TestUtils.assertFileContains;
import static org.openapitools.codegen.TestUtils.assertFileExists;
import static org.openapitools.codegen.TestUtils.assertFileNotContains;
public class PythonClientCodegenTest {
@@ -685,4 +690,120 @@ public class PythonClientCodegenTest {
// Verify it does NOT use the legacy string format
TestUtils.assertFileNotContains(pyprojectPath, "license = \"BSD-3-Clause\"");
}
@Test(description = "test enumUnknownDefaultCase option")
public void testEnumUnknownDefaultCaseOption() {
final PythonClientCodegen codegen = new PythonClientCodegen();
// Test default value is false
codegen.processOpts();
Assert.assertEquals(codegen.getEnumUnknownDefaultCase(), Boolean.FALSE);
// Test setting via additionalProperties
codegen.additionalProperties().put(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, "true");
codegen.processOpts();
Assert.assertEquals(codegen.getEnumUnknownDefaultCase(), Boolean.TRUE);
}
@Test(description = "test enum model generation with enumUnknownDefaultCase")
public void testEnumModelWithUnknownDefaultCase() {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/enum_unknown_default_case.yaml");
final PythonClientCodegen codegen = new PythonClientCodegen();
// Enable enumUnknownDefaultCase
codegen.additionalProperties().put(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, "true");
codegen.setOpenAPI(openAPI);
codegen.processOpts();
// Verify that enumUnknownDefaultCase is set
Assert.assertEquals(codegen.getEnumUnknownDefaultCase(), Boolean.TRUE);
// Process all models to trigger enum processing
Map<String, Schema> schemas = openAPI.getComponents().getSchemas();
Map<String, ModelsMap> allModels = new HashMap<>();
for (String modelName : schemas.keySet()) {
Schema schema = schemas.get(modelName);
CodegenModel cm = codegen.fromModel(modelName, schema);
ModelsMap modelsMap = new ModelsMap();
modelsMap.setModels(Collections.singletonList(new ModelMap(Collections.singletonMap("model", cm))));
allModels.put(modelName, modelsMap);
}
// Post-process to add enumVars
allModels = codegen.postProcessAllModels(allModels);
// Get the ColorEnum model
CodegenModel colorEnum = null;
for (Map.Entry<String, ModelsMap> entry : allModels.entrySet()) {
if ("ColorEnum".equals(entry.getKey())) {
colorEnum = entry.getValue().getModels().get(0).getModel();
break;
}
}
Assert.assertNotNull(colorEnum);
Assert.assertNotNull(colorEnum.allowableValues);
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) colorEnum.allowableValues.get("enumVars");
Assert.assertNotNull(enumVars);
// Check that we have the expected enum values including UNKNOWN_DEFAULT_OPEN_API
Assert.assertTrue(enumVars.stream().anyMatch(var -> "'RED'".equals(var.get("value"))));
Assert.assertTrue(enumVars.stream().anyMatch(var -> "'GREEN'".equals(var.get("value"))));
Assert.assertTrue(enumVars.stream().anyMatch(var -> "'BLUE'".equals(var.get("value"))));
Assert.assertTrue(enumVars.stream().anyMatch(var -> "'YELLOW'".equals(var.get("value"))));
Assert.assertTrue(enumVars.stream().anyMatch(var -> "'unknown_default_open_api'".equals(var.get("value"))));
}
@Test(description = "test enum generation with enumUnknownDefaultCase enabled")
public void testEnumGenerationWithUnknownDefaultCase() throws IOException {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
output.deleteOnExit();
String outputPath = output.getAbsolutePath().replace('\\', '/');
final CodegenConfigurator configurator = new CodegenConfigurator()
.setGeneratorName("python")
.setInputSpec("src/test/resources/3_0/enum_unknown_default_case.yaml")
.setOutputDir(outputPath)
.addAdditionalProperty(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, "true");
DefaultGenerator generator = new DefaultGenerator();
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
files.forEach(File::deleteOnExit);
Path enumFile = Paths.get(outputPath, "openapi_client", "models", "color_enum.py");
// Check that UNKNOWN_DEFAULT_OPEN_API is added (with single quotes as Python generates)
TestUtils.assertFileContains(enumFile, "UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'");
// Check that _missing_ method is added
TestUtils.assertFileContains(enumFile, "@classmethod");
TestUtils.assertFileContains(enumFile, "def _missing_(cls, value):");
TestUtils.assertFileContains(enumFile, "return cls.UNKNOWN_DEFAULT_OPEN_API");
}
@Test(description = "test enum generation with enumUnknownDefaultCase disabled")
public void testEnumGenerationWithoutUnknownDefaultCase() throws IOException {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
output.deleteOnExit();
String outputPath = output.getAbsolutePath().replace('\\', '/');
final CodegenConfigurator configurator = new CodegenConfigurator()
.setGeneratorName("python")
.setInputSpec("src/test/resources/3_0/enum_unknown_default_case.yaml")
.setOutputDir(outputPath)
.addAdditionalProperty(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, "false");
DefaultGenerator generator = new DefaultGenerator();
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
files.forEach(File::deleteOnExit);
Path enumFile = Paths.get(outputPath, "openapi_client", "models", "color_enum.py");
// Check that UNKNOWN_DEFAULT_OPEN_API is NOT added
TestUtils.assertFileNotContains(enumFile, "UNKNOWN_DEFAULT_OPEN_API");
// Check that _missing_ method is NOT added
TestUtils.assertFileNotContains(enumFile, "def _missing_(cls, value):");
}
}

View File

@@ -0,0 +1,56 @@
openapi: 3.0.0
info:
title: Enum Test API
description: API for testing enum generation with enumUnknownDefaultCase
version: 1.0.0
paths:
/colors:
get:
summary: Get color
operationId: getColor
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/ColorResponse'
components:
schemas:
ColorResponse:
type: object
required:
- color
- status
properties:
color:
$ref: '#/components/schemas/ColorEnum'
status:
$ref: '#/components/schemas/StatusEnum'
priority:
$ref: '#/components/schemas/PriorityEnum'
ColorEnum:
type: string
description: Available colors
enum:
- RED
- GREEN
- BLUE
- YELLOW
StatusEnum:
type: string
description: Status values
enum:
- PENDING
- APPROVED
- REJECTED
- IN_PROGRESS
PriorityEnum:
type: integer
description: Priority levels
enum:
- 1
- 2
- 3
- 4
- 5

View File

@@ -9,6 +9,8 @@
* `XML` (value: `'XML'`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -9,6 +9,8 @@
* `LEFT_PARENTHESIS_XYZ_RIGHT_PARENTHESIS` (value: `'(xyz)'`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -9,6 +9,8 @@
* `FiftySix` (value: `56`)
* `unknown_default_open_api` (value: `11184809`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -7,6 +7,8 @@
* `B` (value: `'b'`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -7,6 +7,8 @@
* `D` (value: `'d'`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -9,6 +9,8 @@
* `bazVar_XEnumVarname` (value: `'baz'`)
* `&#39;unknown_default_open_api&#39;` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -12,6 +12,8 @@ oneOf enum strings
* `D` (value: `'d'`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -9,6 +9,8 @@
* `DELIVERED` (value: `'delivered'`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -9,6 +9,8 @@
* `DELIVERED` (value: `'delivered'`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -9,6 +9,8 @@
* `NUMBER_2` (value: `2`)
* `NUMBER_11184809` (value: `11184809`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -11,6 +11,8 @@
* `NUMBER_2` (value: `2`)
* `NUMBER_11184809` (value: `11184809`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -7,6 +7,8 @@
* `USER` (value: `'user'`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -23,6 +23,8 @@
* `HELLO_WORLD` (value: `' hello world '`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -11,6 +11,8 @@
* `FOUR` (value: `'foUr'`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -9,6 +9,8 @@
* `DREI` (value: `'DREI'`)
* `UNKNOWN_DEFAULT_OPEN_API` (value: `'unknown_default_open_api'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -11,6 +11,8 @@
* `NUMBER_0_DOT_25` (value: `0.25`)
* `NUMBER_11184809` (value: `11184809`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -34,15 +34,15 @@ class Bathing(BaseModel):
@field_validator('task_name')
def task_name_validate_enum(cls, value):
"""Validates the enum"""
if value not in set(['cleaning_deep']):
raise ValueError("must be one of enum values ('cleaning_deep')")
if value not in set(['cleaning_deep', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('cleaning_deep', 'unknown_default_open_api')")
return value
@field_validator('function_name')
def function_name_validate_enum(cls, value):
"""Validates the enum"""
if value not in set(['care_nourish']):
raise ValueError("must be one of enum values ('care_nourish')")
if value not in set(['care_nourish', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('care_nourish', 'unknown_default_open_api')")
return value
model_config = ConfigDict(

View File

@@ -29,10 +29,16 @@ class DataOutputFormat(str, Enum):
JSON = 'JSON'
CSV = 'CSV'
XML = 'XML'
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of DataOutputFormat from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -36,8 +36,8 @@ class EnumArrays(BaseModel):
if value is None:
return value
if value not in set(['>=', '$']):
raise ValueError("must be one of enum values ('>=', '$')")
if value not in set(['>=', '$', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('>=', '$', 'unknown_default_open_api')")
return value
@field_validator('array_enum')
@@ -47,8 +47,8 @@ class EnumArrays(BaseModel):
return value
for i in value:
if i not in set(['fish', 'crab']):
raise ValueError("each list item must be one of ('fish', 'crab')")
if i not in set(['fish', 'crab', 'unknown_default_open_api']):
raise ValueError("each list item must be one of ('fish', 'crab', 'unknown_default_open_api')")
return value
model_config = ConfigDict(

View File

@@ -29,10 +29,16 @@ class EnumClass(str, Enum):
ABC = '_abc'
MINUS_EFG = '-efg'
LEFT_PARENTHESIS_XYZ_RIGHT_PARENTHESIS = '(xyz)'
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of EnumClass from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -29,10 +29,16 @@ class EnumNumberVendorExt(int, Enum):
FortyTwo = 42
Eigtheen = 18
FiftySix = 56
unknown_default_open_api = 11184809
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of EnumNumberVendorExt from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -28,10 +28,16 @@ class EnumString1(str, Enum):
"""
A = 'a'
B = 'b'
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of EnumString1 from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -28,10 +28,16 @@ class EnumString2(str, Enum):
"""
C = 'c'
D = 'd'
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of EnumString2 from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -29,10 +29,16 @@ class EnumStringVendorExt(str, Enum):
FOO_XEnumVarname = 'FOO'
BarVar_XEnumVarname = 'Bar'
bazVar_XEnumVarname = 'baz'
'unknown_default_open_api' = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of EnumStringVendorExt from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -53,15 +53,15 @@ class EnumTest(BaseModel):
if value is None:
return value
if value not in set(['UPPER', 'lower', '']):
raise ValueError("must be one of enum values ('UPPER', 'lower', '')")
if value not in set(['UPPER', 'lower', '', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('UPPER', 'lower', '', 'unknown_default_open_api')")
return value
@field_validator('enum_string_required')
def enum_string_required_validate_enum(cls, value):
"""Validates the enum"""
if value not in set(['UPPER', 'lower', '']):
raise ValueError("must be one of enum values ('UPPER', 'lower', '')")
if value not in set(['UPPER', 'lower', '', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('UPPER', 'lower', '', 'unknown_default_open_api')")
return value
@field_validator('enum_integer_default')
@@ -70,8 +70,8 @@ class EnumTest(BaseModel):
if value is None:
return value
if value not in set([1, 5, 14]):
raise ValueError("must be one of enum values (1, 5, 14)")
if value not in set([1, 5, 14, 11184809]):
raise ValueError("must be one of enum values (1, 5, 14, 11184809)")
return value
@field_validator('enum_integer')
@@ -80,8 +80,8 @@ class EnumTest(BaseModel):
if value is None:
return value
if value not in set([1, -1]):
raise ValueError("must be one of enum values (1, -1)")
if value not in set([1, -1, 11184809]):
raise ValueError("must be one of enum values (1, -1, 11184809)")
return value
@field_validator('enum_number')
@@ -90,8 +90,8 @@ class EnumTest(BaseModel):
if value is None:
return value
if value not in set([1.1, -1.2]):
raise ValueError("must be one of enum values (1.1, -1.2)")
if value not in set([1.1, -1.2, 11184809]):
raise ValueError("must be one of enum values (1.1, -1.2, 11184809)")
return value
@field_validator('enum_string_single_member')
@@ -100,8 +100,8 @@ class EnumTest(BaseModel):
if value is None:
return value
if value not in set(['abc']):
raise ValueError("must be one of enum values ('abc')")
if value not in set(['abc', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('abc', 'unknown_default_open_api')")
return value
@field_validator('enum_integer_single_member')
@@ -110,8 +110,8 @@ class EnumTest(BaseModel):
if value is None:
return value
if value not in set([100]):
raise ValueError("must be one of enum values (100)")
if value not in set([100, 11184809]):
raise ValueError("must be one of enum values (100, 11184809)")
return value
model_config = ConfigDict(

View File

@@ -34,15 +34,15 @@ class Feeding(BaseModel):
@field_validator('task_name')
def task_name_validate_enum(cls, value):
"""Validates the enum"""
if value not in set(['cleaning']):
raise ValueError("must be one of enum values ('cleaning')")
if value not in set(['cleaning', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('cleaning', 'unknown_default_open_api')")
return value
@field_validator('function_name')
def function_name_validate_enum(cls, value):
"""Validates the enum"""
if value not in set(['care_nourish']):
raise ValueError("must be one of enum values ('care_nourish')")
if value not in set(['care_nourish', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('care_nourish', 'unknown_default_open_api')")
return value
model_config = ConfigDict(

View File

@@ -39,8 +39,8 @@ class MapTest(BaseModel):
return value
for i in value.values():
if i not in set(['UPPER', 'lower']):
raise ValueError("dict values must be one of enum values ('UPPER', 'lower')")
if i not in set(['UPPER', 'lower', 'unknown_default_open_api']):
raise ValueError("dict values must be one of enum values ('UPPER', 'lower', 'unknown_default_open_api')")
return value
model_config = ConfigDict(

View File

@@ -30,10 +30,16 @@ class OneOfEnumString(str, Enum):
B = 'b'
C = 'c'
D = 'd'
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of OneOfEnumString from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -41,8 +41,8 @@ class Order(BaseModel):
if value is None:
return value
if value not in set(['placed', 'approved', 'delivered']):
raise ValueError("must be one of enum values ('placed', 'approved', 'delivered')")
if value not in set(['placed', 'approved', 'delivered', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('placed', 'approved', 'delivered', 'unknown_default_open_api')")
return value
model_config = ConfigDict(

View File

@@ -29,10 +29,16 @@ class OuterEnum(str, Enum):
PLACED = 'placed'
APPROVED = 'approved'
DELIVERED = 'delivered'
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of OuterEnum from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -29,10 +29,16 @@ class OuterEnumDefaultValue(str, Enum):
PLACED = 'placed'
APPROVED = 'approved'
DELIVERED = 'delivered'
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of OuterEnumDefaultValue from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -29,10 +29,16 @@ class OuterEnumInteger(int, Enum):
NUMBER_0 = 0
NUMBER_1 = 1
NUMBER_2 = 2
NUMBER_11184809 = 11184809
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of OuterEnumInteger from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -30,10 +30,16 @@ class OuterEnumIntegerDefaultValue(int, Enum):
NUMBER_0 = 0
NUMBER_1 = 1
NUMBER_2 = 2
NUMBER_11184809 = 11184809
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of OuterEnumIntegerDefaultValue from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -43,8 +43,8 @@ class Pet(BaseModel):
if value is None:
return value
if value not in set(['available', 'pending', 'sold']):
raise ValueError("must be one of enum values ('available', 'pending', 'sold')")
if value not in set(['available', 'pending', 'sold', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('available', 'pending', 'sold', 'unknown_default_open_api')")
return value
model_config = ConfigDict(

View File

@@ -34,15 +34,15 @@ class PoopCleaning(BaseModel):
@field_validator('task_name')
def task_name_validate_enum(cls, value):
"""Validates the enum"""
if value not in set(['cleaning']):
raise ValueError("must be one of enum values ('cleaning')")
if value not in set(['cleaning', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('cleaning', 'unknown_default_open_api')")
return value
@field_validator('function_name')
def function_name_validate_enum(cls, value):
"""Validates the enum"""
if value not in set(['care']):
raise ValueError("must be one of enum values ('care')")
if value not in set(['care', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('care', 'unknown_default_open_api')")
return value
model_config = ConfigDict(

View File

@@ -28,10 +28,16 @@ class SingleRefType(str, Enum):
"""
ADMIN = 'admin'
USER = 'user'
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of SingleRefType from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -36,10 +36,16 @@ class SpecialCharacterEnum(str, Enum):
THIS_IS_EXCLAMATION = 'this_is_!'
IMPORT = 'import'
HELLO_WORLD = ' hello world '
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of SpecialCharacterEnum from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -38,8 +38,8 @@ class SpecialName(BaseModel):
if value is None:
return value
if value not in set(['available', 'pending', 'sold']):
raise ValueError("must be one of enum values ('available', 'pending', 'sold')")
if value not in set(['available', 'pending', 'sold', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('available', 'pending', 'sold', 'unknown_default_open_api')")
return value
model_config = ConfigDict(

View File

@@ -30,10 +30,16 @@ class TestEnum(str, Enum):
TWO = 'TWO'
THREE = 'THREE'
FOUR = 'foUr'
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of TestEnum from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -29,10 +29,16 @@ class TestEnumWithDefault(str, Enum):
EIN = 'EIN'
ZWEI = 'ZWEI'
DREI = 'DREI'
UNKNOWN_DEFAULT_OPEN_API = 'unknown_default_open_api'
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of TestEnumWithDefault from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API

View File

@@ -41,8 +41,8 @@ class TestModelWithEnumDefault(BaseModel):
if value is None:
return value
if value not in set(['A', 'B', 'C']):
raise ValueError("must be one of enum values ('A', 'B', 'C')")
if value not in set(['A', 'B', 'C', 'unknown_default_open_api']):
raise ValueError("must be one of enum values ('A', 'B', 'C', 'unknown_default_open_api')")
return value
model_config = ConfigDict(

View File

@@ -30,10 +30,16 @@ class Type(int, Enum):
NUMBER_1_DOT_0 = 1.0
NUMBER_0_DOT_5 = 0.5
NUMBER_0_DOT_25 = 0.25
NUMBER_11184809 = 11184809
@classmethod
def from_json(cls, json_str: str) -> Self:
"""Create an instance of Type from a JSON string"""
return cls(json.loads(json_str))
@classmethod
def _missing_(cls, value):
"""Handle unknown enum values"""
return cls.UNKNOWN_DEFAULT_OPEN_API