Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import re # noqa: F401
{{#vendorExtensions.x-py-model-imports}}
{{{.}}}
{{/vendorExtensions.x-py-model-imports}}
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

{{#lambda.uppercase}}{{{classname}}}{{/lambda.uppercase}}_ANY_OF_SCHEMAS = [{{#anyOf}}"{{.}}"{{^-last}}, {{/-last}}{{/anyOf}}]
Expand All @@ -23,7 +23,10 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
# data type: {{{dataType}}}
{{vendorExtensions.x-py-name}}: {{{vendorExtensions.x-py-typing}}}
{{/composedSchemas.anyOf}}
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[{{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}]
else:
actual_instance: Any
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fa0311 thank again for the PR. Just a second thought, shall we simply use the following without TYPE_CHECKING:

    actual_instance: Union[{{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}]

Copy link
Contributor Author

@fa0311 fa0311 Jul 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If TYPE_CHECKING is not used, an incorrect type conversion will be performed by pydantic.

openapi: 3.0.3
info:
  title: Swagger Petstore
  version: 1.0.0

paths:
  /foo:
    get:
      responses:
        default:
          description: response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Animal"

components:
  schemas:
    Animal:
      oneOf:
        - $ref: "#/components/schemas/Cat"
        - $ref: "#/components/schemas/Dog"
      discriminator:
        propertyName: type
        mapping":
          Cat: "#/components/schemas/Cat"
          Dog: "#/components/schemas/Dog"

    Cat:
      properties:
        type:
          type: string
        color:
          type: string

    Dog:
      properties:
        type:
          type: string
        bark:
          type: string
inputSpec: test.yaml
outputDir: .
packageName: petstore
projectName: petstore
useOneOfDiscriminatorLookup: true
from petstore import Animal
res = Animal.from_dict({"type": "Dog", "bark": "loud"})
print(type(res.actual_instance)) # <class 'petstore.models.cat.Cat'>

In this example, the type is Dog, but the actual_instance is <class 'petstore.models.cat.Cat'>.
Assumed type of actual_instance is <class 'petstore.models.dog.Dog'>
If there is another, even better way to work around this, we will fix it.

any_of_schemas: List[str] = Field({{#lambda.uppercase}}{{{classname}}}{{/lambda.uppercase}}_ANY_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import re # noqa: F401
{{#vendorExtensions.x-py-model-imports}}
{{{.}}}
{{/vendorExtensions.x-py-model-imports}}
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

{{#lambda.uppercase}}{{{classname}}}{{/lambda.uppercase}}_ONE_OF_SCHEMAS = [{{#oneOf}}"{{.}}"{{^-last}}, {{/-last}}{{/oneOf}}]
Expand All @@ -22,7 +22,10 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
# data type: {{{dataType}}}
{{vendorExtensions.x-py-name}}: {{{vendorExtensions.x-py-typing}}}
{{/composedSchemas.oneOf}}
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[{{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}]
else:
actual_instance: Any
one_of_schemas: List[str] = Field({{#lambda.uppercase}}{{{classname}}}{{/lambda.uppercase}}_ONE_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

from typing import List, Optional
from pydantic import BaseModel, Field, StrictStr, ValidationError, conint, conlist, constr, validator
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

ANYOFCOLOR_ANY_OF_SCHEMAS = ["List[int]", "str"]
Expand All @@ -36,7 +36,10 @@ class AnyOfColor(BaseModel):
anyof_schema_2_validator: Optional[conlist(conint(strict=True, le=255, ge=0), max_items=4, min_items=4)] = Field(None, description="RGBA four element array with values 0-255.")
# data type: str
anyof_schema_3_validator: Optional[constr(strict=True, max_length=7, min_length=7)] = Field(None, description="Hex color string, such as #00FF00.")
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[List[int], str]
else:
actual_instance: Any
any_of_schemas: List[str] = Field(ANYOFCOLOR_ANY_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from pydantic import BaseModel, Field, StrictStr, ValidationError, validator
from petstore_api.models.basque_pig import BasquePig
from petstore_api.models.danish_pig import DanishPig
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

ANYOFPIG_ANY_OF_SCHEMAS = ["BasquePig", "DanishPig"]
Expand All @@ -36,7 +36,10 @@ class AnyOfPig(BaseModel):
anyof_schema_1_validator: Optional[BasquePig] = None
# data type: DanishPig
anyof_schema_2_validator: Optional[DanishPig] = None
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[BasquePig, DanishPig]
else:
actual_instance: Any
any_of_schemas: List[str] = Field(ANYOFPIG_ANY_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

from typing import Any, List, Optional
from pydantic import BaseModel, Field, StrictStr, ValidationError, conint, conlist, constr, validator
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

COLOR_ONE_OF_SCHEMAS = ["List[int]", "str"]
Expand All @@ -35,7 +35,10 @@ class Color(BaseModel):
oneof_schema_2_validator: Optional[conlist(conint(strict=True, le=255, ge=0), max_items=4, min_items=4)] = Field(None, description="RGBA four element array with values 0-255.")
# data type: str
oneof_schema_3_validator: Optional[constr(strict=True, max_length=7, min_length=7)] = Field(None, description="Hex color string, such as #00FF00.")
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[List[int], str]
else:
actual_instance: Any
one_of_schemas: List[str] = Field(COLOR_ONE_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

from typing import Any, List, Optional
from pydantic import BaseModel, Field, StrictStr, ValidationError, conint, validator
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

INTORSTRING_ONE_OF_SCHEMAS = ["int", "str"]
Expand All @@ -33,7 +33,10 @@ class IntOrString(BaseModel):
oneof_schema_1_validator: Optional[conint(strict=True, ge=10)] = None
# data type: str
oneof_schema_2_validator: Optional[StrictStr] = None
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[int, str]
else:
actual_instance: Any
one_of_schemas: List[str] = Field(INTORSTRING_ONE_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from pydantic import BaseModel, Field, StrictStr, ValidationError, validator
from petstore_api.models.enum_string1 import EnumString1
from petstore_api.models.enum_string2 import EnumString2
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

ONEOFENUMSTRING_ONE_OF_SCHEMAS = ["EnumString1", "EnumString2"]
Expand All @@ -35,7 +35,10 @@ class OneOfEnumString(BaseModel):
oneof_schema_1_validator: Optional[EnumString1] = None
# data type: EnumString2
oneof_schema_2_validator: Optional[EnumString2] = None
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[EnumString1, EnumString2]
else:
actual_instance: Any
one_of_schemas: List[str] = Field(ONEOFENUMSTRING_ONE_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from pydantic import BaseModel, Field, StrictStr, ValidationError, validator
from petstore_api.models.basque_pig import BasquePig
from petstore_api.models.danish_pig import DanishPig
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

PIG_ONE_OF_SCHEMAS = ["BasquePig", "DanishPig"]
Expand All @@ -35,7 +35,10 @@ class Pig(BaseModel):
oneof_schema_1_validator: Optional[BasquePig] = None
# data type: DanishPig
oneof_schema_2_validator: Optional[DanishPig] = None
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[BasquePig, DanishPig]
else:
actual_instance: Any
one_of_schemas: List[str] = Field(PIG_ONE_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

from typing import List, Optional
from pydantic import BaseModel, Field, StrictStr, ValidationError, conint, conlist, constr, validator
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

ANYOFCOLOR_ANY_OF_SCHEMAS = ["List[int]", "str"]
Expand All @@ -36,7 +36,10 @@ class AnyOfColor(BaseModel):
anyof_schema_2_validator: Optional[conlist(conint(strict=True, le=255, ge=0), max_items=4, min_items=4)] = Field(None, description="RGBA four element array with values 0-255.")
# data type: str
anyof_schema_3_validator: Optional[constr(strict=True, max_length=7, min_length=7)] = Field(None, description="Hex color string, such as #00FF00.")
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[List[int], str]
else:
actual_instance: Any
any_of_schemas: List[str] = Field(ANYOFCOLOR_ANY_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from pydantic import BaseModel, Field, StrictStr, ValidationError, validator
from petstore_api.models.basque_pig import BasquePig
from petstore_api.models.danish_pig import DanishPig
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

ANYOFPIG_ANY_OF_SCHEMAS = ["BasquePig", "DanishPig"]
Expand All @@ -36,7 +36,10 @@ class AnyOfPig(BaseModel):
anyof_schema_1_validator: Optional[BasquePig] = None
# data type: DanishPig
anyof_schema_2_validator: Optional[DanishPig] = None
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[BasquePig, DanishPig]
else:
actual_instance: Any
any_of_schemas: List[str] = Field(ANYOFPIG_ANY_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

from typing import Any, List, Optional
from pydantic import BaseModel, Field, StrictStr, ValidationError, conint, conlist, constr, validator
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

COLOR_ONE_OF_SCHEMAS = ["List[int]", "str"]
Expand All @@ -35,7 +35,10 @@ class Color(BaseModel):
oneof_schema_2_validator: Optional[conlist(conint(strict=True, le=255, ge=0), max_items=4, min_items=4)] = Field(None, description="RGBA four element array with values 0-255.")
# data type: str
oneof_schema_3_validator: Optional[constr(strict=True, max_length=7, min_length=7)] = Field(None, description="Hex color string, such as #00FF00.")
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[List[int], str]
else:
actual_instance: Any
one_of_schemas: List[str] = Field(COLOR_ONE_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

from typing import Any, List, Optional
from pydantic import BaseModel, Field, StrictStr, ValidationError, conint, validator
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

INTORSTRING_ONE_OF_SCHEMAS = ["int", "str"]
Expand All @@ -33,7 +33,10 @@ class IntOrString(BaseModel):
oneof_schema_1_validator: Optional[conint(strict=True, ge=10)] = None
# data type: str
oneof_schema_2_validator: Optional[StrictStr] = None
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[int, str]
else:
actual_instance: Any
one_of_schemas: List[str] = Field(INTORSTRING_ONE_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from pydantic import BaseModel, Field, StrictStr, ValidationError, validator
from petstore_api.models.enum_string1 import EnumString1
from petstore_api.models.enum_string2 import EnumString2
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

ONEOFENUMSTRING_ONE_OF_SCHEMAS = ["EnumString1", "EnumString2"]
Expand All @@ -35,7 +35,10 @@ class OneOfEnumString(BaseModel):
oneof_schema_1_validator: Optional[EnumString1] = None
# data type: EnumString2
oneof_schema_2_validator: Optional[EnumString2] = None
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[EnumString1, EnumString2]
else:
actual_instance: Any
one_of_schemas: List[str] = Field(ONEOFENUMSTRING_ONE_OF_SCHEMAS, const=True)

class Config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from pydantic import BaseModel, Field, StrictStr, ValidationError, validator
from petstore_api.models.basque_pig import BasquePig
from petstore_api.models.danish_pig import DanishPig
from typing import Any, List
from typing import Union, Any, List, TYPE_CHECKING
from pydantic import StrictStr, Field

PIG_ONE_OF_SCHEMAS = ["BasquePig", "DanishPig"]
Expand All @@ -35,7 +35,10 @@ class Pig(BaseModel):
oneof_schema_1_validator: Optional[BasquePig] = None
# data type: DanishPig
oneof_schema_2_validator: Optional[DanishPig] = None
actual_instance: Any
if TYPE_CHECKING:
actual_instance: Union[BasquePig, DanishPig]
else:
actual_instance: Any
one_of_schemas: List[str] = Field(PIG_ONE_OF_SCHEMAS, const=True)

class Config:
Expand Down