From ad08581f16ca4309f91606a9d5ea37a0f36cb91b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= <34892635+fa0311@users.noreply.github.com> Date: Tue, 20 Feb 2024 13:17:32 +0900 Subject: [PATCH] [python] Fix Circular imports on inherited discriminators. (#17886) * [python] add inheritance discriminators test #16808 * [python] update samples * [python] fix assert in test * [python] fix inheritance discriminators circular import * [python] update samples * [python] undo type changes related to discriminator * [python] remove extraneous processing * [python-pydantic-v1] fix inheritance discriminators circular import * [python] remove type ignore comment * [python] update samples * [python] fix avoid the empty line break * [python] update samples --- .../languages/AbstractPythonCodegen.java | 5 +- .../AbstractPythonPydanticV1Codegen.java | 4 - .../python-pydantic-v1/model_generic.mustache | 26 ++-- .../resources/python/model_generic.mustache | 30 +++-- ...ith-fake-endpoints-models-for-testing.yaml | 14 +++ .../python-aiohttp/.openapi-generator/FILES | 4 + .../client/petstore/python-aiohttp/README.md | 2 + .../docs/DiscriminatorAllOfSub.md | 28 +++++ .../docs/DiscriminatorAllOfSuper.md | 29 +++++ .../python-aiohttp/petstore_api/__init__.py | 2 + .../petstore_api/models/__init__.py | 2 + .../petstore_api/models/animal.py | 29 +++-- .../models/discriminator_all_of_sub.py | 86 +++++++++++++ .../models/discriminator_all_of_super.py | 107 ++++++++++++++++ .../test/test_discriminator_all_of_sub.py | 50 ++++++++ .../test/test_discriminator_all_of_super.py | 52 ++++++++ .../.openapi-generator/FILES | 4 + .../python-pydantic-v1-aiohttp/README.md | 2 + .../docs/DiscriminatorAllOfSub.md | 27 ++++ .../docs/DiscriminatorAllOfSuper.md | 28 +++++ .../petstore_api/__init__.py | 2 + .../petstore_api/models/__init__.py | 2 + .../petstore_api/models/animal.py | 23 ++-- .../models/discriminator_all_of_sub.py | 71 +++++++++++ .../models/discriminator_all_of_super.py | 90 ++++++++++++++ .../test/test_discriminator_all_of_sub.py | 51 ++++++++ .../test/test_discriminator_all_of_super.py | 53 ++++++++ .../.openapi-generator/FILES | 4 + .../petstore/python-pydantic-v1/README.md | 2 + .../docs/DiscriminatorAllOfSub.md | 27 ++++ .../docs/DiscriminatorAllOfSuper.md | 28 +++++ .../petstore_api/__init__.py | 2 + .../petstore_api/models/__init__.py | 2 + .../petstore_api/models/animal.py | 23 ++-- .../models/discriminator_all_of_sub.py | 83 +++++++++++++ .../models/discriminator_all_of_super.py | 97 +++++++++++++++ .../test/test_discriminator_all_of_sub.py | 51 ++++++++ .../test/test_discriminator_all_of_super.py | 53 ++++++++ .../petstore/python/.openapi-generator/FILES | 4 + .../openapi3/client/petstore/python/README.md | 2 + .../python/docs/DiscriminatorAllOfSub.md | 28 +++++ .../python/docs/DiscriminatorAllOfSuper.md | 29 +++++ .../petstore/python/petstore_api/__init__.py | 2 + .../python/petstore_api/models/__init__.py | 2 + .../python/petstore_api/models/animal.py | 29 +++-- .../models/discriminator_all_of_sub.py | 99 +++++++++++++++ .../models/discriminator_all_of_super.py | 115 ++++++++++++++++++ .../test/test_discriminator_all_of_sub.py | 50 ++++++++ .../test/test_discriminator_all_of_super.py | 52 ++++++++ .../petstore/python/tests/test_model.py | 4 + 50 files changed, 1541 insertions(+), 70 deletions(-) create mode 100644 samples/openapi3/client/petstore/python-aiohttp/docs/DiscriminatorAllOfSub.md create mode 100644 samples/openapi3/client/petstore/python-aiohttp/docs/DiscriminatorAllOfSuper.md create mode 100644 samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/discriminator_all_of_sub.py create mode 100644 samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/discriminator_all_of_super.py create mode 100644 samples/openapi3/client/petstore/python-aiohttp/test/test_discriminator_all_of_sub.py create mode 100644 samples/openapi3/client/petstore/python-aiohttp/test/test_discriminator_all_of_super.py create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/docs/DiscriminatorAllOfSub.md create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/docs/DiscriminatorAllOfSuper.md create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/discriminator_all_of_sub.py create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/discriminator_all_of_super.py create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/test/test_discriminator_all_of_sub.py create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/test/test_discriminator_all_of_super.py create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1/docs/DiscriminatorAllOfSub.md create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1/docs/DiscriminatorAllOfSuper.md create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/discriminator_all_of_sub.py create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/discriminator_all_of_super.py create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1/test/test_discriminator_all_of_sub.py create mode 100644 samples/openapi3/client/petstore/python-pydantic-v1/test/test_discriminator_all_of_super.py create mode 100644 samples/openapi3/client/petstore/python/docs/DiscriminatorAllOfSub.md create mode 100644 samples/openapi3/client/petstore/python/docs/DiscriminatorAllOfSuper.md create mode 100644 samples/openapi3/client/petstore/python/petstore_api/models/discriminator_all_of_sub.py create mode 100644 samples/openapi3/client/petstore/python/petstore_api/models/discriminator_all_of_super.py create mode 100644 samples/openapi3/client/petstore/python/test/test_discriminator_all_of_sub.py create mode 100644 samples/openapi3/client/petstore/python/test/test_discriminator_all_of_super.py diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java index 643983be167..d8c680caaa2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java @@ -927,10 +927,7 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co // if super class if (model.getDiscriminator() != null && model.getDiscriminator().getMappedModels() != null) { moduleImports.add("typing", "Union"); - Set discriminator = model.getDiscriminator().getMappedModels(); - for (CodegenDiscriminator.MappedModel mappedModel : discriminator) { - postponedModelImports.add(mappedModel.getModelName()); - } + moduleImports.add("importlib", "import_module"); } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonPydanticV1Codegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonPydanticV1Codegen.java index 2ac56035256..921f28c3f70 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonPydanticV1Codegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonPydanticV1Codegen.java @@ -879,10 +879,6 @@ public abstract class AbstractPythonPydanticV1Codegen extends DefaultCodegen imp // if super class if (model.getDiscriminator() != null && model.getDiscriminator().getMappedModels() != null) { typingImports.add("Union"); - Set discriminator = model.getDiscriminator().getMappedModels(); - for (CodegenDiscriminator.MappedModel mappedModel : discriminator) { - postponedModelImports.add(mappedModel.getModelName()); - } } } diff --git a/modules/openapi-generator/src/main/resources/python-pydantic-v1/model_generic.mustache b/modules/openapi-generator/src/main/resources/python-pydantic-v1/model_generic.mustache index 6a09b9c9bd1..28acda94c88 100644 --- a/modules/openapi-generator/src/main/resources/python-pydantic-v1/model_generic.mustache +++ b/modules/openapi-generator/src/main/resources/python-pydantic-v1/model_generic.mustache @@ -10,6 +10,18 @@ import json {{{.}}} {{/vendorExtensions.x-py-model-imports}} +{{#hasChildren}} +{{#discriminator}} +{{! If this model is a super class, importlib is used. So import the necessary modules for the type here. }} +from typing import TYPE_CHECKING +from importlib import import_module +if TYPE_CHECKING: +{{#mappedModels}} + from {{packageName}}.models.{{model.classVarName}} import {{modelName}} +{{/mappedModels}} + +{{/discriminator}} +{{/hasChildren}} class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}): """ {{#description}}{{{description}}} # noqa: E501{{/description}}{{^description}}{{{classname}}}{{/description}} @@ -222,13 +234,13 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}} {{#discriminator}} # look up the object type based on discriminator mapping object_type = cls.get_discriminator_value(obj) - if object_type: - klass = globals()[object_type] - return klass.from_dict(obj) - else: - raise ValueError("{{{classname}}} failed to lookup discriminator value from " + - json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + - ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + {{#mappedModels}} + if object_type == '{{{mappingName}}}': + return import_module("{{packageName}}.models.{{model.classVarName}}").{{modelName}}.from_dict(obj) + {{/mappedModels}} + raise ValueError("{{{classname}}} failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) {{/discriminator}} {{/hasChildren}} {{^hasChildren}} diff --git a/modules/openapi-generator/src/main/resources/python/model_generic.mustache b/modules/openapi-generator/src/main/resources/python/model_generic.mustache index fe470f8295f..8dcdd1a48ae 100644 --- a/modules/openapi-generator/src/main/resources/python/model_generic.mustache +++ b/modules/openapi-generator/src/main/resources/python/model_generic.mustache @@ -12,6 +12,17 @@ import json from typing import Optional, Set from typing_extensions import Self +{{#hasChildren}} +{{#discriminator}} +{{! If this model is a super class, importlib is used. So import the necessary modules for the type here. }} +from typing import TYPE_CHECKING +if TYPE_CHECKING: +{{#mappedModels}} + from {{packageName}}.models.{{model.classVarName}} import {{modelName}} +{{/mappedModels}} + +{{/discriminator}} +{{/hasChildren}} class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}): """ {{#description}}{{{description}}}{{/description}}{{^description}}{{{classname}}}{{/description}} @@ -113,7 +124,7 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}} return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Optional[{{^hasChildren}}Self{{/hasChildren}}{{#hasChildren}}{{#discriminator}}Union[{{#children}}Self{{^-last}}, {{/-last}}{{/children}}]{{/discriminator}}{{^discriminator}}Self{{/discriminator}}{{/hasChildren}}]: + def from_json(cls, json_str: str) -> Optional[{{^hasChildren}}Self{{/hasChildren}}{{#hasChildren}}{{#discriminator}}Union[{{#mappedModels}}{{{modelName}}}{{^-last}}, {{/-last}}{{/mappedModels}}]{{/discriminator}}{{^discriminator}}Self{{/discriminator}}{{/hasChildren}}]: """Create an instance of {{{classname}}} from a JSON string""" return cls.from_dict(json.loads(json_str)) @@ -236,18 +247,19 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}} {{#hasChildren}} @classmethod - def from_dict(cls, obj: Dict[str, Any]) -> Optional[{{#discriminator}}Union[{{#children}}Self{{^-last}}, {{/-last}}{{/children}}]{{/discriminator}}{{^discriminator}}Self{{/discriminator}}]: + def from_dict(cls, obj: Dict[str, Any]) -> Optional[{{#discriminator}}Union[{{#mappedModels}}{{{modelName}}}{{^-last}}, {{/-last}}{{/mappedModels}}]{{/discriminator}}{{^discriminator}}Self{{/discriminator}}]: """Create an instance of {{{classname}}} from a dict""" {{#discriminator}} # look up the object type based on discriminator mapping object_type = cls.get_discriminator_value(obj) - if object_type: - klass = globals()[object_type] - return klass.from_dict(obj) - else: - raise ValueError("{{{classname}}} failed to lookup discriminator value from " + - json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + - ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + {{#mappedModels}} + if object_type == '{{{mappingName}}}': + return import_module("{{packageName}}.models.{{model.classVarName}}").{{modelName}}.from_dict(obj) + {{/mappedModels}} + + raise ValueError("{{{classname}}} failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) {{/discriminator}} {{/hasChildren}} {{^hasChildren}} diff --git a/modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing.yaml b/modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing.yaml index b77ff51d4ba..e0f1475ea83 100644 --- a/modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing.yaml @@ -1640,6 +1640,20 @@ components: required: - id - activity + DiscriminatorAllOfSuper: + type: object + required: + - elementType + discriminator: + propertyName: elementType + properties: + elementType: + type: string + DiscriminatorAllOfSub: + allOf: + - $ref: '#/components/schemas/DiscriminatorAllOfSuper' + - type: object + properties: {} Pet: type: object required: diff --git a/samples/openapi3/client/petstore/python-aiohttp/.openapi-generator/FILES b/samples/openapi3/client/petstore/python-aiohttp/.openapi-generator/FILES index d56ebf6ba52..8ca56876d60 100644 --- a/samples/openapi3/client/petstore/python-aiohttp/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/python-aiohttp/.openapi-generator/FILES @@ -30,6 +30,8 @@ docs/CreatureInfo.md docs/DanishPig.md docs/DefaultApi.md docs/DeprecatedObject.md +docs/DiscriminatorAllOfSub.md +docs/DiscriminatorAllOfSuper.md docs/Dog.md docs/DummyModel.md docs/EnumArrays.md @@ -140,6 +142,8 @@ petstore_api/models/creature.py petstore_api/models/creature_info.py petstore_api/models/danish_pig.py petstore_api/models/deprecated_object.py +petstore_api/models/discriminator_all_of_sub.py +petstore_api/models/discriminator_all_of_super.py petstore_api/models/dog.py petstore_api/models/dummy_model.py petstore_api/models/enum_arrays.py diff --git a/samples/openapi3/client/petstore/python-aiohttp/README.md b/samples/openapi3/client/petstore/python-aiohttp/README.md index 60205006ddf..3e37a008f4e 100644 --- a/samples/openapi3/client/petstore/python-aiohttp/README.md +++ b/samples/openapi3/client/petstore/python-aiohttp/README.md @@ -164,6 +164,8 @@ Class | Method | HTTP request | Description - [CreatureInfo](docs/CreatureInfo.md) - [DanishPig](docs/DanishPig.md) - [DeprecatedObject](docs/DeprecatedObject.md) + - [DiscriminatorAllOfSub](docs/DiscriminatorAllOfSub.md) + - [DiscriminatorAllOfSuper](docs/DiscriminatorAllOfSuper.md) - [Dog](docs/Dog.md) - [DummyModel](docs/DummyModel.md) - [EnumArrays](docs/EnumArrays.md) diff --git a/samples/openapi3/client/petstore/python-aiohttp/docs/DiscriminatorAllOfSub.md b/samples/openapi3/client/petstore/python-aiohttp/docs/DiscriminatorAllOfSub.md new file mode 100644 index 00000000000..445cde66282 --- /dev/null +++ b/samples/openapi3/client/petstore/python-aiohttp/docs/DiscriminatorAllOfSub.md @@ -0,0 +1,28 @@ +# DiscriminatorAllOfSub + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +## Example + +```python +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub + +# TODO update the JSON string below +json = "{}" +# create an instance of DiscriminatorAllOfSub from a JSON string +discriminator_all_of_sub_instance = DiscriminatorAllOfSub.from_json(json) +# print the JSON string representation of the object +print DiscriminatorAllOfSub.to_json() + +# convert the object into a dict +discriminator_all_of_sub_dict = discriminator_all_of_sub_instance.to_dict() +# create an instance of DiscriminatorAllOfSub from a dict +discriminator_all_of_sub_form_dict = discriminator_all_of_sub.from_dict(discriminator_all_of_sub_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/python-aiohttp/docs/DiscriminatorAllOfSuper.md b/samples/openapi3/client/petstore/python-aiohttp/docs/DiscriminatorAllOfSuper.md new file mode 100644 index 00000000000..4f4c8868608 --- /dev/null +++ b/samples/openapi3/client/petstore/python-aiohttp/docs/DiscriminatorAllOfSuper.md @@ -0,0 +1,29 @@ +# DiscriminatorAllOfSuper + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**element_type** | **str** | | + +## Example + +```python +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper + +# TODO update the JSON string below +json = "{}" +# create an instance of DiscriminatorAllOfSuper from a JSON string +discriminator_all_of_super_instance = DiscriminatorAllOfSuper.from_json(json) +# print the JSON string representation of the object +print DiscriminatorAllOfSuper.to_json() + +# convert the object into a dict +discriminator_all_of_super_dict = discriminator_all_of_super_instance.to_dict() +# create an instance of DiscriminatorAllOfSuper from a dict +discriminator_all_of_super_form_dict = discriminator_all_of_super.from_dict(discriminator_all_of_super_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/__init__.py b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/__init__.py index 8a19de3a94c..b038a7fc260 100644 --- a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/__init__.py +++ b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/__init__.py @@ -63,6 +63,8 @@ from petstore_api.models.creature import Creature from petstore_api.models.creature_info import CreatureInfo from petstore_api.models.danish_pig import DanishPig from petstore_api.models.deprecated_object import DeprecatedObject +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper from petstore_api.models.dog import Dog from petstore_api.models.dummy_model import DummyModel from petstore_api.models.enum_arrays import EnumArrays diff --git a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/__init__.py b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/__init__.py index 07e92b10ce0..4724dd902c6 100644 --- a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/__init__.py +++ b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/__init__.py @@ -39,6 +39,8 @@ from petstore_api.models.creature import Creature from petstore_api.models.creature_info import CreatureInfo from petstore_api.models.danish_pig import DanishPig from petstore_api.models.deprecated_object import DeprecatedObject +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper from petstore_api.models.dog import Dog from petstore_api.models.dummy_model import DummyModel from petstore_api.models.enum_arrays import EnumArrays diff --git a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/animal.py b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/animal.py index 772b2bc9320..2d99a95425f 100644 --- a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/animal.py +++ b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/animal.py @@ -17,11 +17,17 @@ import pprint import re # noqa: F401 import json +from importlib import import_module from pydantic import BaseModel, Field, StrictStr from typing import Any, ClassVar, Dict, List, Optional, Union from typing import Optional, Set from typing_extensions import Self +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from petstore_api.models.cat import Cat + from petstore_api.models.dog import Dog + class Animal(BaseModel): """ Animal @@ -64,7 +70,7 @@ class Animal(BaseModel): return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Optional[Union[Self, Self]]: + def from_json(cls, json_str: str) -> Optional[Union[Cat, Dog]]: """Create an instance of Animal from a JSON string""" return cls.from_dict(json.loads(json_str)) @@ -89,20 +95,17 @@ class Animal(BaseModel): return _dict @classmethod - def from_dict(cls, obj: Dict[str, Any]) -> Optional[Union[Self, Self]]: + def from_dict(cls, obj: Dict[str, Any]) -> Optional[Union[Cat, Dog]]: """Create an instance of Animal from a dict""" # look up the object type based on discriminator mapping object_type = cls.get_discriminator_value(obj) - if object_type: - klass = globals()[object_type] - return klass.from_dict(obj) - else: - raise ValueError("Animal failed to lookup discriminator value from " + - json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + - ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + if object_type == 'Cat': + return import_module("petstore_api.models.cat").Cat.from_dict(obj) + if object_type == 'Dog': + return import_module("petstore_api.models.dog").Dog.from_dict(obj) + + raise ValueError("Animal failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) -from petstore_api.models.cat import Cat -from petstore_api.models.dog import Dog -# TODO: Rewrite to not use raise_errors -Animal.model_rebuild(raise_errors=False) diff --git a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/discriminator_all_of_sub.py b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/discriminator_all_of_sub.py new file mode 100644 index 00000000000..222e38686bb --- /dev/null +++ b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/discriminator_all_of_sub.py @@ -0,0 +1,86 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from typing import Any, ClassVar, Dict, List +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper +from typing import Optional, Set +from typing_extensions import Self + +class DiscriminatorAllOfSub(DiscriminatorAllOfSuper): + """ + DiscriminatorAllOfSub + """ # noqa: E501 + __properties: ClassVar[List[str]] = ["elementType"] + + model_config = { + "populate_by_name": True, + "validate_assignment": True, + "protected_namespaces": (), + } + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DiscriminatorAllOfSub from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DiscriminatorAllOfSub from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "elementType": obj.get("elementType") + }) + return _obj + + diff --git a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/discriminator_all_of_super.py b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/discriminator_all_of_super.py new file mode 100644 index 00000000000..813a6064337 --- /dev/null +++ b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/discriminator_all_of_super.py @@ -0,0 +1,107 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from importlib import import_module +from pydantic import BaseModel, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Union +from typing import Optional, Set +from typing_extensions import Self + +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub + +class DiscriminatorAllOfSuper(BaseModel): + """ + DiscriminatorAllOfSuper + """ # noqa: E501 + element_type: StrictStr = Field(alias="elementType") + __properties: ClassVar[List[str]] = ["elementType"] + + model_config = { + "populate_by_name": True, + "validate_assignment": True, + "protected_namespaces": (), + } + + + # JSON field name that stores the object type + __discriminator_property_name: ClassVar[str] = 'elementType' + + # discriminator mappings + __discriminator_value_class_map: ClassVar[Dict[str, str]] = { + 'DiscriminatorAllOfSub': 'DiscriminatorAllOfSub' + } + + @classmethod + def get_discriminator_value(cls, obj: Dict[str, Any]) -> Optional[str]: + """Returns the discriminator value (object type) of the data""" + discriminator_value = obj[cls.__discriminator_property_name] + if discriminator_value: + return cls.__discriminator_value_class_map.get(discriminator_value) + else: + return None + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Union[DiscriminatorAllOfSub]]: + """Create an instance of DiscriminatorAllOfSuper from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Dict[str, Any]) -> Optional[Union[DiscriminatorAllOfSub]]: + """Create an instance of DiscriminatorAllOfSuper from a dict""" + # look up the object type based on discriminator mapping + object_type = cls.get_discriminator_value(obj) + if object_type == 'DiscriminatorAllOfSub': + return import_module("petstore_api.models.discriminator_all_of_sub").DiscriminatorAllOfSub.from_dict(obj) + + raise ValueError("DiscriminatorAllOfSuper failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + + diff --git a/samples/openapi3/client/petstore/python-aiohttp/test/test_discriminator_all_of_sub.py b/samples/openapi3/client/petstore/python-aiohttp/test/test_discriminator_all_of_sub.py new file mode 100644 index 00000000000..15941f4f854 --- /dev/null +++ b/samples/openapi3/client/petstore/python-aiohttp/test/test_discriminator_all_of_sub.py @@ -0,0 +1,50 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub + +class TestDiscriminatorAllOfSub(unittest.TestCase): + """DiscriminatorAllOfSub unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> DiscriminatorAllOfSub: + """Test DiscriminatorAllOfSub + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `DiscriminatorAllOfSub` + """ + model = DiscriminatorAllOfSub() + if include_optional: + return DiscriminatorAllOfSub( + ) + else: + return DiscriminatorAllOfSub( + ) + """ + + def testDiscriminatorAllOfSub(self): + """Test DiscriminatorAllOfSub""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/samples/openapi3/client/petstore/python-aiohttp/test/test_discriminator_all_of_super.py b/samples/openapi3/client/petstore/python-aiohttp/test/test_discriminator_all_of_super.py new file mode 100644 index 00000000000..503d6b3c558 --- /dev/null +++ b/samples/openapi3/client/petstore/python-aiohttp/test/test_discriminator_all_of_super.py @@ -0,0 +1,52 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper + +class TestDiscriminatorAllOfSuper(unittest.TestCase): + """DiscriminatorAllOfSuper unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> DiscriminatorAllOfSuper: + """Test DiscriminatorAllOfSuper + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `DiscriminatorAllOfSuper` + """ + model = DiscriminatorAllOfSuper() + if include_optional: + return DiscriminatorAllOfSuper( + element_type = '' + ) + else: + return DiscriminatorAllOfSuper( + element_type = '', + ) + """ + + def testDiscriminatorAllOfSuper(self): + """Test DiscriminatorAllOfSuper""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/.openapi-generator/FILES b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/.openapi-generator/FILES index bc131e51c8e..fa3538ce756 100644 --- a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/.openapi-generator/FILES @@ -31,6 +31,8 @@ docs/CreatureInfo.md docs/DanishPig.md docs/DefaultApi.md docs/DeprecatedObject.md +docs/DiscriminatorAllOfSub.md +docs/DiscriminatorAllOfSuper.md docs/Dog.md docs/DummyModel.md docs/EnumArrays.md @@ -141,6 +143,8 @@ petstore_api/models/creature.py petstore_api/models/creature_info.py petstore_api/models/danish_pig.py petstore_api/models/deprecated_object.py +petstore_api/models/discriminator_all_of_sub.py +petstore_api/models/discriminator_all_of_super.py petstore_api/models/dog.py petstore_api/models/dummy_model.py petstore_api/models/enum_arrays.py diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/README.md b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/README.md index 80a9446dad3..ccb95c2319b 100644 --- a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/README.md +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/README.md @@ -166,6 +166,8 @@ Class | Method | HTTP request | Description - [CreatureInfo](docs/CreatureInfo.md) - [DanishPig](docs/DanishPig.md) - [DeprecatedObject](docs/DeprecatedObject.md) + - [DiscriminatorAllOfSub](docs/DiscriminatorAllOfSub.md) + - [DiscriminatorAllOfSuper](docs/DiscriminatorAllOfSuper.md) - [Dog](docs/Dog.md) - [DummyModel](docs/DummyModel.md) - [EnumArrays](docs/EnumArrays.md) diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/docs/DiscriminatorAllOfSub.md b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/docs/DiscriminatorAllOfSub.md new file mode 100644 index 00000000000..b5dcd991926 --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/docs/DiscriminatorAllOfSub.md @@ -0,0 +1,27 @@ +# DiscriminatorAllOfSub + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +## Example + +```python +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub + +# TODO update the JSON string below +json = "{}" +# create an instance of DiscriminatorAllOfSub from a JSON string +discriminator_all_of_sub_instance = DiscriminatorAllOfSub.from_json(json) +# print the JSON string representation of the object +print DiscriminatorAllOfSub.to_json() + +# convert the object into a dict +discriminator_all_of_sub_dict = discriminator_all_of_sub_instance.to_dict() +# create an instance of DiscriminatorAllOfSub from a dict +discriminator_all_of_sub_form_dict = discriminator_all_of_sub.from_dict(discriminator_all_of_sub_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/docs/DiscriminatorAllOfSuper.md b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/docs/DiscriminatorAllOfSuper.md new file mode 100644 index 00000000000..9564ca75c80 --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/docs/DiscriminatorAllOfSuper.md @@ -0,0 +1,28 @@ +# DiscriminatorAllOfSuper + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**element_type** | **str** | | + +## Example + +```python +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper + +# TODO update the JSON string below +json = "{}" +# create an instance of DiscriminatorAllOfSuper from a JSON string +discriminator_all_of_super_instance = DiscriminatorAllOfSuper.from_json(json) +# print the JSON string representation of the object +print DiscriminatorAllOfSuper.to_json() + +# convert the object into a dict +discriminator_all_of_super_dict = discriminator_all_of_super_instance.to_dict() +# create an instance of DiscriminatorAllOfSuper from a dict +discriminator_all_of_super_form_dict = discriminator_all_of_super.from_dict(discriminator_all_of_super_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/__init__.py b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/__init__.py index adcad6b7cf5..5b780780fd8 100644 --- a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/__init__.py +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/__init__.py @@ -64,6 +64,8 @@ from petstore_api.models.creature import Creature from petstore_api.models.creature_info import CreatureInfo from petstore_api.models.danish_pig import DanishPig from petstore_api.models.deprecated_object import DeprecatedObject +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper from petstore_api.models.dog import Dog from petstore_api.models.dummy_model import DummyModel from petstore_api.models.enum_arrays import EnumArrays diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/__init__.py b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/__init__.py index bedca10121a..5be0f85af54 100644 --- a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/__init__.py +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/__init__.py @@ -40,6 +40,8 @@ from petstore_api.models.creature import Creature from petstore_api.models.creature_info import CreatureInfo from petstore_api.models.danish_pig import DanishPig from petstore_api.models.deprecated_object import DeprecatedObject +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper from petstore_api.models.dog import Dog from petstore_api.models.dummy_model import DummyModel from petstore_api.models.enum_arrays import EnumArrays diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/animal.py b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/animal.py index 18738e6051b..5909850c019 100644 --- a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/animal.py +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/animal.py @@ -21,6 +21,12 @@ import json from typing import Optional, Union from pydantic import BaseModel, Field, StrictStr +from typing import TYPE_CHECKING +from importlib import import_module +if TYPE_CHECKING: + from petstore_api.models.cat import Cat + from petstore_api.models.dog import Dog + class Animal(BaseModel): """ Animal @@ -78,15 +84,12 @@ class Animal(BaseModel): """Create an instance of Animal from a dict""" # look up the object type based on discriminator mapping object_type = cls.get_discriminator_value(obj) - if object_type: - klass = globals()[object_type] - return klass.from_dict(obj) - else: - raise ValueError("Animal failed to lookup discriminator value from " + - json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + - ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + if object_type == 'Cat': + return import_module("petstore_api.models.cat").Cat.from_dict(obj) + if object_type == 'Dog': + return import_module("petstore_api.models.dog").Dog.from_dict(obj) + raise ValueError("Animal failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) -from petstore_api.models.cat import Cat -from petstore_api.models.dog import Dog -Animal.update_forward_refs() diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/discriminator_all_of_sub.py b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/discriminator_all_of_sub.py new file mode 100644 index 00000000000..65d54ea8d1a --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/discriminator_all_of_sub.py @@ -0,0 +1,71 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + + + +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper + +class DiscriminatorAllOfSub(DiscriminatorAllOfSuper): + """ + DiscriminatorAllOfSub + """ + __properties = ["elementType"] + + class Config: + """Pydantic configuration""" + allow_population_by_field_name = True + validate_assignment = True + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.dict(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> DiscriminatorAllOfSub: + """Create an instance of DiscriminatorAllOfSub from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self): + """Returns the dictionary representation of the model using alias""" + _dict = self.dict(by_alias=True, + exclude={ + }, + exclude_none=True) + return _dict + + @classmethod + def from_dict(cls, obj: dict) -> DiscriminatorAllOfSub: + """Create an instance of DiscriminatorAllOfSub from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return DiscriminatorAllOfSub.parse_obj(obj) + + _obj = DiscriminatorAllOfSub.parse_obj({ + "element_type": obj.get("elementType") + }) + return _obj + + diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/discriminator_all_of_super.py b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/discriminator_all_of_super.py new file mode 100644 index 00000000000..4c808fbd408 --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/petstore_api/models/discriminator_all_of_super.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Union +from pydantic import BaseModel, Field, StrictStr + +from typing import TYPE_CHECKING +from importlib import import_module +if TYPE_CHECKING: + from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub + +class DiscriminatorAllOfSuper(BaseModel): + """ + DiscriminatorAllOfSuper + """ + element_type: StrictStr = Field(..., alias="elementType") + __properties = ["elementType"] + + class Config: + """Pydantic configuration""" + allow_population_by_field_name = True + validate_assignment = True + + # JSON field name that stores the object type + __discriminator_property_name = 'elementType' + + # discriminator mappings + __discriminator_value_class_map = { + 'DiscriminatorAllOfSub': 'DiscriminatorAllOfSub' + } + + @classmethod + def get_discriminator_value(cls, obj: dict) -> str: + """Returns the discriminator value (object type) of the data""" + discriminator_value = obj[cls.__discriminator_property_name] + if discriminator_value: + return cls.__discriminator_value_class_map.get(discriminator_value) + else: + return None + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.dict(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Union(DiscriminatorAllOfSub): + """Create an instance of DiscriminatorAllOfSuper from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self): + """Returns the dictionary representation of the model using alias""" + _dict = self.dict(by_alias=True, + exclude={ + }, + exclude_none=True) + return _dict + + @classmethod + def from_dict(cls, obj: dict) -> Union(DiscriminatorAllOfSub): + """Create an instance of DiscriminatorAllOfSuper from a dict""" + # look up the object type based on discriminator mapping + object_type = cls.get_discriminator_value(obj) + if object_type == 'DiscriminatorAllOfSub': + return import_module("petstore_api.models.discriminator_all_of_sub").DiscriminatorAllOfSub.from_dict(obj) + raise ValueError("DiscriminatorAllOfSuper failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + + diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/test/test_discriminator_all_of_sub.py b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/test/test_discriminator_all_of_sub.py new file mode 100644 index 00000000000..50defed512a --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/test/test_discriminator_all_of_sub.py @@ -0,0 +1,51 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest +import datetime + +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub # noqa: E501 + +class TestDiscriminatorAllOfSub(unittest.TestCase): + """DiscriminatorAllOfSub unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> DiscriminatorAllOfSub: + """Test DiscriminatorAllOfSub + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `DiscriminatorAllOfSub` + """ + model = DiscriminatorAllOfSub() # noqa: E501 + if include_optional: + return DiscriminatorAllOfSub( + ) + else: + return DiscriminatorAllOfSub( + ) + """ + + def testDiscriminatorAllOfSub(self): + """Test DiscriminatorAllOfSub""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/test/test_discriminator_all_of_super.py b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/test/test_discriminator_all_of_super.py new file mode 100644 index 00000000000..02567a14d3d --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1-aiohttp/test/test_discriminator_all_of_super.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest +import datetime + +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper # noqa: E501 + +class TestDiscriminatorAllOfSuper(unittest.TestCase): + """DiscriminatorAllOfSuper unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> DiscriminatorAllOfSuper: + """Test DiscriminatorAllOfSuper + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `DiscriminatorAllOfSuper` + """ + model = DiscriminatorAllOfSuper() # noqa: E501 + if include_optional: + return DiscriminatorAllOfSuper( + element_type = '' + ) + else: + return DiscriminatorAllOfSuper( + element_type = '', + ) + """ + + def testDiscriminatorAllOfSuper(self): + """Test DiscriminatorAllOfSuper""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/.openapi-generator/FILES b/samples/openapi3/client/petstore/python-pydantic-v1/.openapi-generator/FILES index bc131e51c8e..fa3538ce756 100644 --- a/samples/openapi3/client/petstore/python-pydantic-v1/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/python-pydantic-v1/.openapi-generator/FILES @@ -31,6 +31,8 @@ docs/CreatureInfo.md docs/DanishPig.md docs/DefaultApi.md docs/DeprecatedObject.md +docs/DiscriminatorAllOfSub.md +docs/DiscriminatorAllOfSuper.md docs/Dog.md docs/DummyModel.md docs/EnumArrays.md @@ -141,6 +143,8 @@ petstore_api/models/creature.py petstore_api/models/creature_info.py petstore_api/models/danish_pig.py petstore_api/models/deprecated_object.py +petstore_api/models/discriminator_all_of_sub.py +petstore_api/models/discriminator_all_of_super.py petstore_api/models/dog.py petstore_api/models/dummy_model.py petstore_api/models/enum_arrays.py diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/README.md b/samples/openapi3/client/petstore/python-pydantic-v1/README.md index cb9e33592a5..b286288a0e9 100644 --- a/samples/openapi3/client/petstore/python-pydantic-v1/README.md +++ b/samples/openapi3/client/petstore/python-pydantic-v1/README.md @@ -166,6 +166,8 @@ Class | Method | HTTP request | Description - [CreatureInfo](docs/CreatureInfo.md) - [DanishPig](docs/DanishPig.md) - [DeprecatedObject](docs/DeprecatedObject.md) + - [DiscriminatorAllOfSub](docs/DiscriminatorAllOfSub.md) + - [DiscriminatorAllOfSuper](docs/DiscriminatorAllOfSuper.md) - [Dog](docs/Dog.md) - [DummyModel](docs/DummyModel.md) - [EnumArrays](docs/EnumArrays.md) diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/docs/DiscriminatorAllOfSub.md b/samples/openapi3/client/petstore/python-pydantic-v1/docs/DiscriminatorAllOfSub.md new file mode 100644 index 00000000000..b5dcd991926 --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1/docs/DiscriminatorAllOfSub.md @@ -0,0 +1,27 @@ +# DiscriminatorAllOfSub + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +## Example + +```python +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub + +# TODO update the JSON string below +json = "{}" +# create an instance of DiscriminatorAllOfSub from a JSON string +discriminator_all_of_sub_instance = DiscriminatorAllOfSub.from_json(json) +# print the JSON string representation of the object +print DiscriminatorAllOfSub.to_json() + +# convert the object into a dict +discriminator_all_of_sub_dict = discriminator_all_of_sub_instance.to_dict() +# create an instance of DiscriminatorAllOfSub from a dict +discriminator_all_of_sub_form_dict = discriminator_all_of_sub.from_dict(discriminator_all_of_sub_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/docs/DiscriminatorAllOfSuper.md b/samples/openapi3/client/petstore/python-pydantic-v1/docs/DiscriminatorAllOfSuper.md new file mode 100644 index 00000000000..9564ca75c80 --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1/docs/DiscriminatorAllOfSuper.md @@ -0,0 +1,28 @@ +# DiscriminatorAllOfSuper + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**element_type** | **str** | | + +## Example + +```python +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper + +# TODO update the JSON string below +json = "{}" +# create an instance of DiscriminatorAllOfSuper from a JSON string +discriminator_all_of_super_instance = DiscriminatorAllOfSuper.from_json(json) +# print the JSON string representation of the object +print DiscriminatorAllOfSuper.to_json() + +# convert the object into a dict +discriminator_all_of_super_dict = discriminator_all_of_super_instance.to_dict() +# create an instance of DiscriminatorAllOfSuper from a dict +discriminator_all_of_super_form_dict = discriminator_all_of_super.from_dict(discriminator_all_of_super_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/__init__.py b/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/__init__.py index adcad6b7cf5..5b780780fd8 100644 --- a/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/__init__.py +++ b/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/__init__.py @@ -64,6 +64,8 @@ from petstore_api.models.creature import Creature from petstore_api.models.creature_info import CreatureInfo from petstore_api.models.danish_pig import DanishPig from petstore_api.models.deprecated_object import DeprecatedObject +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper from petstore_api.models.dog import Dog from petstore_api.models.dummy_model import DummyModel from petstore_api.models.enum_arrays import EnumArrays diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/__init__.py b/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/__init__.py index bedca10121a..5be0f85af54 100644 --- a/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/__init__.py +++ b/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/__init__.py @@ -40,6 +40,8 @@ from petstore_api.models.creature import Creature from petstore_api.models.creature_info import CreatureInfo from petstore_api.models.danish_pig import DanishPig from petstore_api.models.deprecated_object import DeprecatedObject +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper from petstore_api.models.dog import Dog from petstore_api.models.dummy_model import DummyModel from petstore_api.models.enum_arrays import EnumArrays diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/animal.py b/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/animal.py index 08c51a32b43..1c40beec4e5 100644 --- a/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/animal.py +++ b/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/animal.py @@ -21,6 +21,12 @@ import json from typing import Any, Dict, Optional, Union from pydantic import BaseModel, Field, StrictStr +from typing import TYPE_CHECKING +from importlib import import_module +if TYPE_CHECKING: + from petstore_api.models.cat import Cat + from petstore_api.models.dog import Dog + class Animal(BaseModel): """ Animal @@ -85,15 +91,12 @@ class Animal(BaseModel): """Create an instance of Animal from a dict""" # look up the object type based on discriminator mapping object_type = cls.get_discriminator_value(obj) - if object_type: - klass = globals()[object_type] - return klass.from_dict(obj) - else: - raise ValueError("Animal failed to lookup discriminator value from " + - json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + - ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + if object_type == 'Cat': + return import_module("petstore_api.models.cat").Cat.from_dict(obj) + if object_type == 'Dog': + return import_module("petstore_api.models.dog").Dog.from_dict(obj) + raise ValueError("Animal failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) -from petstore_api.models.cat import Cat -from petstore_api.models.dog import Dog -Animal.update_forward_refs() diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/discriminator_all_of_sub.py b/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/discriminator_all_of_sub.py new file mode 100644 index 00000000000..27133992634 --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/discriminator_all_of_sub.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, Dict + +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper + +class DiscriminatorAllOfSub(DiscriminatorAllOfSuper): + """ + DiscriminatorAllOfSub + """ + additional_properties: Dict[str, Any] = {} + __properties = ["elementType"] + + class Config: + """Pydantic configuration""" + allow_population_by_field_name = True + validate_assignment = True + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.dict(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> DiscriminatorAllOfSub: + """Create an instance of DiscriminatorAllOfSub from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self): + """Returns the dictionary representation of the model using alias""" + _dict = self.dict(by_alias=True, + exclude={ + "additional_properties" + }, + exclude_none=True) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: dict) -> DiscriminatorAllOfSub: + """Create an instance of DiscriminatorAllOfSub from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return DiscriminatorAllOfSub.parse_obj(obj) + + _obj = DiscriminatorAllOfSub.parse_obj({ + "element_type": obj.get("elementType") + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/discriminator_all_of_super.py b/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/discriminator_all_of_super.py new file mode 100644 index 00000000000..67bca0597ed --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/models/discriminator_all_of_super.py @@ -0,0 +1,97 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, Dict, Union +from pydantic import BaseModel, Field, StrictStr + +from typing import TYPE_CHECKING +from importlib import import_module +if TYPE_CHECKING: + from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub + +class DiscriminatorAllOfSuper(BaseModel): + """ + DiscriminatorAllOfSuper + """ + element_type: StrictStr = Field(..., alias="elementType") + additional_properties: Dict[str, Any] = {} + __properties = ["elementType"] + + class Config: + """Pydantic configuration""" + allow_population_by_field_name = True + validate_assignment = True + + # JSON field name that stores the object type + __discriminator_property_name = 'elementType' + + # discriminator mappings + __discriminator_value_class_map = { + 'DiscriminatorAllOfSub': 'DiscriminatorAllOfSub' + } + + @classmethod + def get_discriminator_value(cls, obj: dict) -> str: + """Returns the discriminator value (object type) of the data""" + discriminator_value = obj[cls.__discriminator_property_name] + if discriminator_value: + return cls.__discriminator_value_class_map.get(discriminator_value) + else: + return None + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.dict(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Union(DiscriminatorAllOfSub): + """Create an instance of DiscriminatorAllOfSuper from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self): + """Returns the dictionary representation of the model using alias""" + _dict = self.dict(by_alias=True, + exclude={ + "additional_properties" + }, + exclude_none=True) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: dict) -> Union(DiscriminatorAllOfSub): + """Create an instance of DiscriminatorAllOfSuper from a dict""" + # look up the object type based on discriminator mapping + object_type = cls.get_discriminator_value(obj) + if object_type == 'DiscriminatorAllOfSub': + return import_module("petstore_api.models.discriminator_all_of_sub").DiscriminatorAllOfSub.from_dict(obj) + raise ValueError("DiscriminatorAllOfSuper failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + + diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/test/test_discriminator_all_of_sub.py b/samples/openapi3/client/petstore/python-pydantic-v1/test/test_discriminator_all_of_sub.py new file mode 100644 index 00000000000..50defed512a --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1/test/test_discriminator_all_of_sub.py @@ -0,0 +1,51 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest +import datetime + +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub # noqa: E501 + +class TestDiscriminatorAllOfSub(unittest.TestCase): + """DiscriminatorAllOfSub unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> DiscriminatorAllOfSub: + """Test DiscriminatorAllOfSub + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `DiscriminatorAllOfSub` + """ + model = DiscriminatorAllOfSub() # noqa: E501 + if include_optional: + return DiscriminatorAllOfSub( + ) + else: + return DiscriminatorAllOfSub( + ) + """ + + def testDiscriminatorAllOfSub(self): + """Test DiscriminatorAllOfSub""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/samples/openapi3/client/petstore/python-pydantic-v1/test/test_discriminator_all_of_super.py b/samples/openapi3/client/petstore/python-pydantic-v1/test/test_discriminator_all_of_super.py new file mode 100644 index 00000000000..02567a14d3d --- /dev/null +++ b/samples/openapi3/client/petstore/python-pydantic-v1/test/test_discriminator_all_of_super.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest +import datetime + +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper # noqa: E501 + +class TestDiscriminatorAllOfSuper(unittest.TestCase): + """DiscriminatorAllOfSuper unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> DiscriminatorAllOfSuper: + """Test DiscriminatorAllOfSuper + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `DiscriminatorAllOfSuper` + """ + model = DiscriminatorAllOfSuper() # noqa: E501 + if include_optional: + return DiscriminatorAllOfSuper( + element_type = '' + ) + else: + return DiscriminatorAllOfSuper( + element_type = '', + ) + """ + + def testDiscriminatorAllOfSuper(self): + """Test DiscriminatorAllOfSuper""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/samples/openapi3/client/petstore/python/.openapi-generator/FILES b/samples/openapi3/client/petstore/python/.openapi-generator/FILES index d56ebf6ba52..8ca56876d60 100755 --- a/samples/openapi3/client/petstore/python/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/python/.openapi-generator/FILES @@ -30,6 +30,8 @@ docs/CreatureInfo.md docs/DanishPig.md docs/DefaultApi.md docs/DeprecatedObject.md +docs/DiscriminatorAllOfSub.md +docs/DiscriminatorAllOfSuper.md docs/Dog.md docs/DummyModel.md docs/EnumArrays.md @@ -140,6 +142,8 @@ petstore_api/models/creature.py petstore_api/models/creature_info.py petstore_api/models/danish_pig.py petstore_api/models/deprecated_object.py +petstore_api/models/discriminator_all_of_sub.py +petstore_api/models/discriminator_all_of_super.py petstore_api/models/dog.py petstore_api/models/dummy_model.py petstore_api/models/enum_arrays.py diff --git a/samples/openapi3/client/petstore/python/README.md b/samples/openapi3/client/petstore/python/README.md index 329b8030e50..cdee1ebeb62 100755 --- a/samples/openapi3/client/petstore/python/README.md +++ b/samples/openapi3/client/petstore/python/README.md @@ -164,6 +164,8 @@ Class | Method | HTTP request | Description - [CreatureInfo](docs/CreatureInfo.md) - [DanishPig](docs/DanishPig.md) - [DeprecatedObject](docs/DeprecatedObject.md) + - [DiscriminatorAllOfSub](docs/DiscriminatorAllOfSub.md) + - [DiscriminatorAllOfSuper](docs/DiscriminatorAllOfSuper.md) - [Dog](docs/Dog.md) - [DummyModel](docs/DummyModel.md) - [EnumArrays](docs/EnumArrays.md) diff --git a/samples/openapi3/client/petstore/python/docs/DiscriminatorAllOfSub.md b/samples/openapi3/client/petstore/python/docs/DiscriminatorAllOfSub.md new file mode 100644 index 00000000000..445cde66282 --- /dev/null +++ b/samples/openapi3/client/petstore/python/docs/DiscriminatorAllOfSub.md @@ -0,0 +1,28 @@ +# DiscriminatorAllOfSub + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +## Example + +```python +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub + +# TODO update the JSON string below +json = "{}" +# create an instance of DiscriminatorAllOfSub from a JSON string +discriminator_all_of_sub_instance = DiscriminatorAllOfSub.from_json(json) +# print the JSON string representation of the object +print DiscriminatorAllOfSub.to_json() + +# convert the object into a dict +discriminator_all_of_sub_dict = discriminator_all_of_sub_instance.to_dict() +# create an instance of DiscriminatorAllOfSub from a dict +discriminator_all_of_sub_form_dict = discriminator_all_of_sub.from_dict(discriminator_all_of_sub_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/python/docs/DiscriminatorAllOfSuper.md b/samples/openapi3/client/petstore/python/docs/DiscriminatorAllOfSuper.md new file mode 100644 index 00000000000..4f4c8868608 --- /dev/null +++ b/samples/openapi3/client/petstore/python/docs/DiscriminatorAllOfSuper.md @@ -0,0 +1,29 @@ +# DiscriminatorAllOfSuper + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**element_type** | **str** | | + +## Example + +```python +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper + +# TODO update the JSON string below +json = "{}" +# create an instance of DiscriminatorAllOfSuper from a JSON string +discriminator_all_of_super_instance = DiscriminatorAllOfSuper.from_json(json) +# print the JSON string representation of the object +print DiscriminatorAllOfSuper.to_json() + +# convert the object into a dict +discriminator_all_of_super_dict = discriminator_all_of_super_instance.to_dict() +# create an instance of DiscriminatorAllOfSuper from a dict +discriminator_all_of_super_form_dict = discriminator_all_of_super.from_dict(discriminator_all_of_super_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/python/petstore_api/__init__.py b/samples/openapi3/client/petstore/python/petstore_api/__init__.py index 8a19de3a94c..b038a7fc260 100755 --- a/samples/openapi3/client/petstore/python/petstore_api/__init__.py +++ b/samples/openapi3/client/petstore/python/petstore_api/__init__.py @@ -63,6 +63,8 @@ from petstore_api.models.creature import Creature from petstore_api.models.creature_info import CreatureInfo from petstore_api.models.danish_pig import DanishPig from petstore_api.models.deprecated_object import DeprecatedObject +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper from petstore_api.models.dog import Dog from petstore_api.models.dummy_model import DummyModel from petstore_api.models.enum_arrays import EnumArrays diff --git a/samples/openapi3/client/petstore/python/petstore_api/models/__init__.py b/samples/openapi3/client/petstore/python/petstore_api/models/__init__.py index 07e92b10ce0..4724dd902c6 100644 --- a/samples/openapi3/client/petstore/python/petstore_api/models/__init__.py +++ b/samples/openapi3/client/petstore/python/petstore_api/models/__init__.py @@ -39,6 +39,8 @@ from petstore_api.models.creature import Creature from petstore_api.models.creature_info import CreatureInfo from petstore_api.models.danish_pig import DanishPig from petstore_api.models.deprecated_object import DeprecatedObject +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper from petstore_api.models.dog import Dog from petstore_api.models.dummy_model import DummyModel from petstore_api.models.enum_arrays import EnumArrays diff --git a/samples/openapi3/client/petstore/python/petstore_api/models/animal.py b/samples/openapi3/client/petstore/python/petstore_api/models/animal.py index 4e14ccbfc78..204cabbf1e9 100644 --- a/samples/openapi3/client/petstore/python/petstore_api/models/animal.py +++ b/samples/openapi3/client/petstore/python/petstore_api/models/animal.py @@ -17,11 +17,17 @@ import pprint import re # noqa: F401 import json +from importlib import import_module from pydantic import BaseModel, Field, StrictStr from typing import Any, ClassVar, Dict, List, Optional, Union from typing import Optional, Set from typing_extensions import Self +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from petstore_api.models.cat import Cat + from petstore_api.models.dog import Dog + class Animal(BaseModel): """ Animal @@ -65,7 +71,7 @@ class Animal(BaseModel): return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Optional[Union[Self, Self]]: + def from_json(cls, json_str: str) -> Optional[Union[Cat, Dog]]: """Create an instance of Animal from a JSON string""" return cls.from_dict(json.loads(json_str)) @@ -97,20 +103,17 @@ class Animal(BaseModel): return _dict @classmethod - def from_dict(cls, obj: Dict[str, Any]) -> Optional[Union[Self, Self]]: + def from_dict(cls, obj: Dict[str, Any]) -> Optional[Union[Cat, Dog]]: """Create an instance of Animal from a dict""" # look up the object type based on discriminator mapping object_type = cls.get_discriminator_value(obj) - if object_type: - klass = globals()[object_type] - return klass.from_dict(obj) - else: - raise ValueError("Animal failed to lookup discriminator value from " + - json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + - ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + if object_type == 'Cat': + return import_module("petstore_api.models.cat").Cat.from_dict(obj) + if object_type == 'Dog': + return import_module("petstore_api.models.dog").Dog.from_dict(obj) + + raise ValueError("Animal failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) -from petstore_api.models.cat import Cat -from petstore_api.models.dog import Dog -# TODO: Rewrite to not use raise_errors -Animal.model_rebuild(raise_errors=False) diff --git a/samples/openapi3/client/petstore/python/petstore_api/models/discriminator_all_of_sub.py b/samples/openapi3/client/petstore/python/petstore_api/models/discriminator_all_of_sub.py new file mode 100644 index 00000000000..ec3991985da --- /dev/null +++ b/samples/openapi3/client/petstore/python/petstore_api/models/discriminator_all_of_sub.py @@ -0,0 +1,99 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from typing import Any, ClassVar, Dict, List +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper +from typing import Optional, Set +from typing_extensions import Self + +class DiscriminatorAllOfSub(DiscriminatorAllOfSuper): + """ + DiscriminatorAllOfSub + """ # noqa: E501 + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["elementType"] + + model_config = { + "populate_by_name": True, + "validate_assignment": True, + "protected_namespaces": (), + } + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DiscriminatorAllOfSub from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DiscriminatorAllOfSub from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "elementType": obj.get("elementType") + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/samples/openapi3/client/petstore/python/petstore_api/models/discriminator_all_of_super.py b/samples/openapi3/client/petstore/python/petstore_api/models/discriminator_all_of_super.py new file mode 100644 index 00000000000..e7a27350de9 --- /dev/null +++ b/samples/openapi3/client/petstore/python/petstore_api/models/discriminator_all_of_super.py @@ -0,0 +1,115 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from importlib import import_module +from pydantic import BaseModel, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Union +from typing import Optional, Set +from typing_extensions import Self + +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub + +class DiscriminatorAllOfSuper(BaseModel): + """ + DiscriminatorAllOfSuper + """ # noqa: E501 + element_type: StrictStr = Field(alias="elementType") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["elementType"] + + model_config = { + "populate_by_name": True, + "validate_assignment": True, + "protected_namespaces": (), + } + + + # JSON field name that stores the object type + __discriminator_property_name: ClassVar[str] = 'elementType' + + # discriminator mappings + __discriminator_value_class_map: ClassVar[Dict[str, str]] = { + 'DiscriminatorAllOfSub': 'DiscriminatorAllOfSub' + } + + @classmethod + def get_discriminator_value(cls, obj: Dict[str, Any]) -> Optional[str]: + """Returns the discriminator value (object type) of the data""" + discriminator_value = obj[cls.__discriminator_property_name] + if discriminator_value: + return cls.__discriminator_value_class_map.get(discriminator_value) + else: + return None + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Union[DiscriminatorAllOfSub]]: + """Create an instance of DiscriminatorAllOfSuper from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict[str, Any]) -> Optional[Union[DiscriminatorAllOfSub]]: + """Create an instance of DiscriminatorAllOfSuper from a dict""" + # look up the object type based on discriminator mapping + object_type = cls.get_discriminator_value(obj) + if object_type == 'DiscriminatorAllOfSub': + return import_module("petstore_api.models.discriminator_all_of_sub").DiscriminatorAllOfSub.from_dict(obj) + + raise ValueError("DiscriminatorAllOfSuper failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + + diff --git a/samples/openapi3/client/petstore/python/test/test_discriminator_all_of_sub.py b/samples/openapi3/client/petstore/python/test/test_discriminator_all_of_sub.py new file mode 100644 index 00000000000..15941f4f854 --- /dev/null +++ b/samples/openapi3/client/petstore/python/test/test_discriminator_all_of_sub.py @@ -0,0 +1,50 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from petstore_api.models.discriminator_all_of_sub import DiscriminatorAllOfSub + +class TestDiscriminatorAllOfSub(unittest.TestCase): + """DiscriminatorAllOfSub unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> DiscriminatorAllOfSub: + """Test DiscriminatorAllOfSub + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `DiscriminatorAllOfSub` + """ + model = DiscriminatorAllOfSub() + if include_optional: + return DiscriminatorAllOfSub( + ) + else: + return DiscriminatorAllOfSub( + ) + """ + + def testDiscriminatorAllOfSub(self): + """Test DiscriminatorAllOfSub""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/samples/openapi3/client/petstore/python/test/test_discriminator_all_of_super.py b/samples/openapi3/client/petstore/python/test/test_discriminator_all_of_super.py new file mode 100644 index 00000000000..503d6b3c558 --- /dev/null +++ b/samples/openapi3/client/petstore/python/test/test_discriminator_all_of_super.py @@ -0,0 +1,52 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from petstore_api.models.discriminator_all_of_super import DiscriminatorAllOfSuper + +class TestDiscriminatorAllOfSuper(unittest.TestCase): + """DiscriminatorAllOfSuper unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> DiscriminatorAllOfSuper: + """Test DiscriminatorAllOfSuper + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `DiscriminatorAllOfSuper` + """ + model = DiscriminatorAllOfSuper() + if include_optional: + return DiscriminatorAllOfSuper( + element_type = '' + ) + else: + return DiscriminatorAllOfSuper( + element_type = '', + ) + """ + + def testDiscriminatorAllOfSuper(self): + """Test DiscriminatorAllOfSuper""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/samples/openapi3/client/petstore/python/tests/test_model.py b/samples/openapi3/client/petstore/python/tests/test_model.py index e67ae8fb653..9ca69d0a53c 100644 --- a/samples/openapi3/client/petstore/python/tests/test_model.py +++ b/samples/openapi3/client/petstore/python/tests/test_model.py @@ -342,6 +342,10 @@ class ModelTests(unittest.TestCase): self.assertEqual(dog2.breed, 'bulldog') self.assertEqual(dog2.class_name, "dog") self.assertEqual(dog2.color, 'white') + + def test_inheritance_discriminators(self): + model = petstore_api.DiscriminatorAllOfSuper.from_dict({"elementType": "DiscriminatorAllOfSub"}) + self.assertIsInstance(model, petstore_api.DiscriminatorAllOfSub) def test_list(self): # should throw exception as var_123_list should be string