mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-05-12 20:50:55 +00:00
Merge 9298c56bbdeb9aaaeba9978d399787d39bc5aaeb into 2fb26c362ea6557c90353606ccdc3c446d6a8f35
This commit is contained in:
commit
bfee50dd9a
@ -28,7 +28,7 @@ from {{modelPackage}}.extra_models import TokenModel # noqa: F401
|
||||
{{/imports}}
|
||||
{{#securityImports.0}}from {{packageName}}.security_api import {{#securityImports}}get_token_{{.}}{{^-last}}, {{/-last}}{{/securityImports}}{{/securityImports.0}}
|
||||
|
||||
router = APIRouter()
|
||||
router = APIRouter(prefix="{{basePathWithoutHost}}")
|
||||
|
||||
ns_pkg = {{fastapiImplementationPackage}}
|
||||
for _, name, _ in pkgutil.iter_modules(ns_pkg.__path__, ns_pkg.__name__ + "."):
|
||||
|
@ -1 +1 @@
|
||||
{{#isPathParam}}{{baseName}}{{/isPathParam}}{{^isPathParam}}{{paramName}}{{/isPathParam}}: {{>param_type}} = {{#isPathParam}}Path{{/isPathParam}}{{#isHeaderParam}}Header{{/isHeaderParam}}{{#isFormParam}}Form{{/isFormParam}}{{#isQueryParam}}Query{{/isQueryParam}}{{#isCookieParam}}Cookie{{/isCookieParam}}{{#isBodyParam}}Body{{/isBodyParam}}({{&defaultValue}}{{^defaultValue}}{{#isPathParam}}...{{/isPathParam}}{{^isPathParam}}None{{/isPathParam}}{{/defaultValue}}, description="{{description}}"{{#isQueryParam}}, alias="{{baseName}}"{{/isQueryParam}}{{#isLong}}{{#minimum}}, ge={{.}}{{/minimum}}{{#maximum}}, le={{.}}{{/maximum}}{{/isLong}}{{#isInteger}}{{#minimum}}, ge={{.}}{{/minimum}}{{#maximum}}, le={{.}}{{/maximum}}{{/isInteger}}{{#pattern}}, regex=r"{{.}}"{{/pattern}}{{#minLength}}, min_length={{.}}{{/minLength}}{{#maxLength}}, max_length={{.}}{{/maxLength}})
|
||||
{{#isPathParam}}{{baseName}}{{/isPathParam}}{{^isPathParam}}{{paramName}}{{/isPathParam}}: {{>param_type}} = {{#isPathParam}}Path{{/isPathParam}}{{#isHeaderParam}}Header{{/isHeaderParam}}{{#isFormParam}}Form{{/isFormParam}}{{#isQueryParam}}Query{{/isQueryParam}}{{#isCookieParam}}Cookie{{/isCookieParam}}{{#isBodyParam}}Body{{/isBodyParam}}({{#isEnum}}{{&enumDefaultValue}}{{/isEnum}}{{^isEnum}}{{&defaultValue}}{{/isEnum}}{{^defaultValue}}{{#isPathParam}}...{{/isPathParam}}{{^isPathParam}}None{{/isPathParam}}{{/defaultValue}}, description="{{description}}"{{#isQueryParam}}, alias="{{baseName}}"{{/isQueryParam}}{{#isLong}}{{#minimum}}, ge={{.}}{{/minimum}}{{#maximum}}, le={{.}}{{/maximum}}{{/isLong}}{{#isInteger}}{{#minimum}}, ge={{.}}{{/minimum}}{{#maximum}}, le={{.}}{{/maximum}}{{/isInteger}}{{#pattern}}, regex=r"{{.}}"{{/pattern}}{{#minLength}}, min_length={{.}}{{/minLength}}{{#maxLength}}, max_length={{.}}{{/maxLength}})
|
@ -14,198 +14,50 @@ import re # noqa: F401
|
||||
{{/vendorExtensions.x-py-model-imports}}
|
||||
from typing import Union, Any, List, TYPE_CHECKING, Optional, Dict
|
||||
from typing_extensions import Literal
|
||||
from pydantic import StrictStr, Field
|
||||
from pydantic import StrictStr, Field, RootModel
|
||||
try:
|
||||
from typing import Self
|
||||
except ImportError:
|
||||
from typing_extensions import Self
|
||||
|
||||
{{#lambda.uppercase}}{{{classname}}}{{/lambda.uppercase}}_ONE_OF_SCHEMAS = [{{#oneOf}}"{{.}}"{{^-last}}, {{/-last}}{{/oneOf}}]
|
||||
{{#discriminator.mappedModels}}{{#explicitMapping}}
|
||||
class {{modelName}}Oneof({{modelName}}):
|
||||
{{discriminatorName}}: Literal['{{mappingName}}']
|
||||
pass
|
||||
{{/explicitMapping}}{{/discriminator.mappedModels}}
|
||||
|
||||
class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}):
|
||||
class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}RootModel{{/parent}}):
|
||||
"""
|
||||
{{{description}}}{{^description}}{{{classname}}}{{/description}}
|
||||
"""
|
||||
{{#composedSchemas.oneOf}}
|
||||
# data type: {{{dataType}}}
|
||||
{{vendorExtensions.x-py-name}}: {{{vendorExtensions.x-py-typing}}}
|
||||
{{/composedSchemas.oneOf}}
|
||||
actual_instance: Optional[Union[{{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}]] = None
|
||||
one_of_schemas: List[str] = Literal[{{#oneOf}}"{{.}}"{{^-last}}, {{/-last}}{{/oneOf}}]
|
||||
root: Union[{{#oneOf}}{{{.}}}Oneof{{^-last}}, {{/-last}}{{/oneOf}}] = Field(discriminator="{{discriminatorName}}")
|
||||
|
||||
model_config = {
|
||||
"validate_assignment": True,
|
||||
"protected_namespaces": (),
|
||||
}
|
||||
|
||||
{{#discriminator}}
|
||||
|
||||
discriminator_value_class_map: Dict[str, str] = {
|
||||
{{#children}}
|
||||
'{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}': '{{{classname}}}'{{^-last}},{{/-last}}
|
||||
{{/children}}
|
||||
}
|
||||
{{/discriminator}}
|
||||
|
||||
def __init__(self, *args, **kwargs) -> None:
|
||||
if args:
|
||||
if len(args) > 1:
|
||||
raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`")
|
||||
if kwargs:
|
||||
raise ValueError("If a position argument is used, keyword arguments cannot be used.")
|
||||
super().__init__(actual_instance=args[0])
|
||||
else:
|
||||
super().__init__(**kwargs)
|
||||
|
||||
@field_validator('actual_instance')
|
||||
def actual_instance_must_validate_oneof(cls, v):
|
||||
{{#isNullable}}
|
||||
if v is None:
|
||||
return v
|
||||
|
||||
{{/isNullable}}
|
||||
instance = {{{classname}}}.model_construct()
|
||||
error_messages = []
|
||||
match = 0
|
||||
{{#composedSchemas.oneOf}}
|
||||
# validate data type: {{{dataType}}}
|
||||
{{#isContainer}}
|
||||
try:
|
||||
instance.{{vendorExtensions.x-py-name}} = v
|
||||
match += 1
|
||||
except (ValidationError, ValueError) as e:
|
||||
error_messages.append(str(e))
|
||||
{{/isContainer}}
|
||||
{{^isContainer}}
|
||||
{{#isPrimitiveType}}
|
||||
try:
|
||||
instance.{{vendorExtensions.x-py-name}} = v
|
||||
match += 1
|
||||
except (ValidationError, ValueError) as e:
|
||||
error_messages.append(str(e))
|
||||
{{/isPrimitiveType}}
|
||||
{{^isPrimitiveType}}
|
||||
if not isinstance(v, {{{dataType}}}):
|
||||
error_messages.append(f"Error! Input type `{type(v)}` is not `{{{dataType}}}`")
|
||||
else:
|
||||
match += 1
|
||||
{{/isPrimitiveType}}
|
||||
{{/isContainer}}
|
||||
{{/composedSchemas.oneOf}}
|
||||
if match > 1:
|
||||
# more than 1 match
|
||||
raise ValueError("Multiple matches found when setting `actual_instance` in {{{classname}}} with oneOf schemas: {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}. Details: " + ", ".join(error_messages))
|
||||
elif match == 0:
|
||||
# no match
|
||||
raise ValueError("No match found when setting `actual_instance` in {{{classname}}} with oneOf schemas: {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}. Details: " + ", ".join(error_messages))
|
||||
else:
|
||||
return v
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: dict) -> Self:
|
||||
return cls.from_json(json.dumps(obj))
|
||||
|
||||
@classmethod
|
||||
def from_json(cls, json_str: str) -> Self:
|
||||
"""Returns the object represented by the json string"""
|
||||
instance = cls.model_construct()
|
||||
{{#isNullable}}
|
||||
if json_str is None:
|
||||
return instance
|
||||
|
||||
{{/isNullable}}
|
||||
error_messages = []
|
||||
match = 0
|
||||
|
||||
{{#useOneOfDiscriminatorLookup}}
|
||||
{{#discriminator}}
|
||||
{{#mappedModels}}
|
||||
{{#-first}}
|
||||
# use oneOf discriminator to lookup the data type
|
||||
_data_type = json.loads(json_str).get("{{{propertyBaseName}}}")
|
||||
if not _data_type:
|
||||
raise ValueError("Failed to lookup data type from the field `{{{propertyBaseName}}}` in the input.")
|
||||
|
||||
{{/-first}}
|
||||
# check if data type is `{{{modelName}}}`
|
||||
if _data_type == "{{{mappingName}}}":
|
||||
instance.actual_instance = {{{modelName}}}.from_json(json_str)
|
||||
return instance
|
||||
|
||||
{{/mappedModels}}
|
||||
{{/discriminator}}
|
||||
{{/useOneOfDiscriminatorLookup}}
|
||||
{{#composedSchemas.oneOf}}
|
||||
{{#isContainer}}
|
||||
# deserialize data into {{{dataType}}}
|
||||
try:
|
||||
# validation
|
||||
instance.{{vendorExtensions.x-py-name}} = json.loads(json_str)
|
||||
# assign value to actual_instance
|
||||
instance.actual_instance = instance.{{vendorExtensions.x-py-name}}
|
||||
match += 1
|
||||
except (ValidationError, ValueError) as e:
|
||||
error_messages.append(str(e))
|
||||
{{/isContainer}}
|
||||
{{^isContainer}}
|
||||
{{#isPrimitiveType}}
|
||||
# deserialize data into {{{dataType}}}
|
||||
try:
|
||||
# validation
|
||||
instance.{{vendorExtensions.x-py-name}} = json.loads(json_str)
|
||||
# assign value to actual_instance
|
||||
instance.actual_instance = instance.{{vendorExtensions.x-py-name}}
|
||||
match += 1
|
||||
except (ValidationError, ValueError) as e:
|
||||
error_messages.append(str(e))
|
||||
{{/isPrimitiveType}}
|
||||
{{^isPrimitiveType}}
|
||||
# deserialize data into {{{dataType}}}
|
||||
try:
|
||||
instance.actual_instance = {{{dataType}}}.from_json(json_str)
|
||||
match += 1
|
||||
except (ValidationError, ValueError) as e:
|
||||
error_messages.append(str(e))
|
||||
{{/isPrimitiveType}}
|
||||
{{/isContainer}}
|
||||
{{/composedSchemas.oneOf}}
|
||||
|
||||
if match > 1:
|
||||
# more than 1 match
|
||||
raise ValueError("Multiple matches found when deserializing the JSON string into {{{classname}}} with oneOf schemas: {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}. Details: " + ", ".join(error_messages))
|
||||
elif match == 0:
|
||||
# no match
|
||||
raise ValueError("No match found when deserializing the JSON string into {{{classname}}} with oneOf schemas: {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}. Details: " + ", ".join(error_messages))
|
||||
else:
|
||||
return instance
|
||||
|
||||
def to_json(self) -> str:
|
||||
"""Returns the JSON representation of the actual instance"""
|
||||
if self.actual_instance is None:
|
||||
return "null"
|
||||
|
||||
to_json = getattr(self.actual_instance, "to_json", None)
|
||||
if callable(to_json):
|
||||
return self.actual_instance.to_json()
|
||||
else:
|
||||
return json.dumps(self.actual_instance)
|
||||
|
||||
def to_dict(self) -> Dict:
|
||||
"""Returns the dict representation of the actual instance"""
|
||||
if self.actual_instance is None:
|
||||
return None
|
||||
|
||||
to_dict = getattr(self.actual_instance, "to_dict", None)
|
||||
if callable(to_dict):
|
||||
return self.actual_instance.to_dict()
|
||||
else:
|
||||
# primitive type
|
||||
return self.actual_instance
|
||||
|
||||
def to_str(self) -> str:
|
||||
"""Returns the string representation of the actual instance"""
|
||||
return pprint.pformat(self.model_dump())
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Dict) -> Self:
|
||||
"""Create an instance of {{classname}} from a dictionary"""
|
||||
return cls(obj)
|
||||
|
||||
def to_dict(self) -> Dict:
|
||||
"""Returns the dict representation of the actual instance"""
|
||||
if self.root is None:
|
||||
return None
|
||||
|
||||
to_dict = getattr(self.root, "to_dict", None)
|
||||
if callable(to_dict):
|
||||
return self.root.to_dict()
|
||||
else:
|
||||
# primitive type
|
||||
return self.root
|
||||
|
||||
{{#vendorExtensions.x-py-postponed-model-imports.size}}
|
||||
{{#vendorExtensions.x-py-postponed-model-imports}}
|
||||
{{{.}}}
|
||||
|
@ -28,7 +28,7 @@ from typing import Any, Optional
|
||||
from typing_extensions import Annotated
|
||||
|
||||
|
||||
router = APIRouter()
|
||||
router = APIRouter(prefix="/v2")
|
||||
|
||||
ns_pkg = openapi_server.impl
|
||||
for _, name, _ in pkgutil.iter_modules(ns_pkg.__path__, ns_pkg.__name__ + "."):
|
||||
|
@ -30,7 +30,7 @@ from openapi_server.models.api_response import ApiResponse
|
||||
from openapi_server.models.pet import Pet
|
||||
from openapi_server.security_api import get_token_petstore_auth, get_token_api_key
|
||||
|
||||
router = APIRouter()
|
||||
router = APIRouter(prefix="/v2")
|
||||
|
||||
ns_pkg = openapi_server.impl
|
||||
for _, name, _ in pkgutil.iter_modules(ns_pkg.__path__, ns_pkg.__name__ + "."):
|
||||
|
@ -29,7 +29,7 @@ from typing_extensions import Annotated
|
||||
from openapi_server.models.order import Order
|
||||
from openapi_server.security_api import get_token_api_key
|
||||
|
||||
router = APIRouter()
|
||||
router = APIRouter(prefix="/v2")
|
||||
|
||||
ns_pkg = openapi_server.impl
|
||||
for _, name, _ in pkgutil.iter_modules(ns_pkg.__path__, ns_pkg.__name__ + "."):
|
||||
|
@ -29,7 +29,7 @@ from typing_extensions import Annotated
|
||||
from openapi_server.models.user import User
|
||||
from openapi_server.security_api import get_token_api_key
|
||||
|
||||
router = APIRouter()
|
||||
router = APIRouter(prefix="/v2")
|
||||
|
||||
ns_pkg = openapi_server.impl
|
||||
for _, name, _ in pkgutil.iter_modules(ns_pkg.__path__, ns_pkg.__name__ + "."):
|
||||
|
Loading…
x
Reference in New Issue
Block a user