Fix issue with fastapi generator converting all fields to snake_case (#12261)

* Fix issue with python-fastapi generator converting all fields to snake_case

* Update Python-FastAPI sample

Co-authored-by: Rory Dungan <contact@rorydungan.com>
This commit is contained in:
Rory Dungan 2022-05-10 03:08:59 +10:00 committed by GitHub
parent d242a98343
commit fd5ad7f895
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 56 additions and 35 deletions

View File

@ -41,6 +41,7 @@ router = APIRouter()
{{#description}} {{#description}}
description = "{{.}}", description = "{{.}}",
{{/description}} {{/description}}
response_model_by_alias=True,
) )
async def {{operationId}}( async def {{operationId}}(
{{#allParams}} {{#allParams}}

View File

@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401
import re # noqa: F401 import re # noqa: F401
from typing import Any, Dict, List, Optional # noqa: F401 from typing import Any, Dict, List, Optional # noqa: F401
from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 from pydantic import AnyUrl, BaseModel, EmailStr, Field, validator # noqa: F401
{{#models}} {{#models}}
{{#model}} {{#model}}
{{#pyImports}} {{#pyImports}}
@ -31,7 +31,7 @@ class {{classname}}(BaseModel):
""" """
{{#vars}} {{#vars}}
{{name}}: {{#required}}{{>model_field_type}}{{/required}}{{^required}}Optional[{{>model_field_type}}] = None{{/required}} {{name}}: {{#required}}{{>model_field_type}}{{/required}}{{^required}}Optional[{{>model_field_type}}]{{/required}} = Field(alias="{{baseName}}"{{^required}}, default=None{{/required}})
{{/vars}} {{/vars}}
{{#vars}} {{#vars}}
{{#maximum}} {{#maximum}}

View File

@ -32,6 +32,7 @@ router = APIRouter()
}, },
tags=["pet"], tags=["pet"],
summary="Add a new pet to the store", summary="Add a new pet to the store",
response_model_by_alias=True,
) )
async def add_pet( async def add_pet(
pet: Pet = Body(None, description="Pet object that needs to be added to the store"), pet: Pet = Body(None, description="Pet object that needs to be added to the store"),
@ -50,6 +51,7 @@ async def add_pet(
}, },
tags=["pet"], tags=["pet"],
summary="Deletes a pet", summary="Deletes a pet",
response_model_by_alias=True,
) )
async def delete_pet( async def delete_pet(
petId: int = Path(None, description="Pet id to delete"), petId: int = Path(None, description="Pet id to delete"),
@ -70,6 +72,7 @@ async def delete_pet(
}, },
tags=["pet"], tags=["pet"],
summary="Finds Pets by status", summary="Finds Pets by status",
response_model_by_alias=True,
) )
async def find_pets_by_status( async def find_pets_by_status(
status: List[str] = Query(None, description="Status values that need to be considered for filter"), status: List[str] = Query(None, description="Status values that need to be considered for filter"),
@ -89,6 +92,7 @@ async def find_pets_by_status(
}, },
tags=["pet"], tags=["pet"],
summary="Finds Pets by tags", summary="Finds Pets by tags",
response_model_by_alias=True,
) )
async def find_pets_by_tags( async def find_pets_by_tags(
tags: List[str] = Query(None, description="Tags to filter by"), tags: List[str] = Query(None, description="Tags to filter by"),
@ -109,6 +113,7 @@ async def find_pets_by_tags(
}, },
tags=["pet"], tags=["pet"],
summary="Find pet by ID", summary="Find pet by ID",
response_model_by_alias=True,
) )
async def get_pet_by_id( async def get_pet_by_id(
petId: int = Path(None, description="ID of pet to return"), petId: int = Path(None, description="ID of pet to return"),
@ -130,6 +135,7 @@ async def get_pet_by_id(
}, },
tags=["pet"], tags=["pet"],
summary="Update an existing pet", summary="Update an existing pet",
response_model_by_alias=True,
) )
async def update_pet( async def update_pet(
pet: Pet = Body(None, description="Pet object that needs to be added to the store"), pet: Pet = Body(None, description="Pet object that needs to be added to the store"),
@ -148,6 +154,7 @@ async def update_pet(
}, },
tags=["pet"], tags=["pet"],
summary="Updates a pet in the store with form data", summary="Updates a pet in the store with form data",
response_model_by_alias=True,
) )
async def update_pet_with_form( async def update_pet_with_form(
petId: int = Path(None, description="ID of pet that needs to be updated"), petId: int = Path(None, description="ID of pet that needs to be updated"),
@ -168,6 +175,7 @@ async def update_pet_with_form(
}, },
tags=["pet"], tags=["pet"],
summary="uploads an image", summary="uploads an image",
response_model_by_alias=True,
) )
async def upload_file( async def upload_file(
petId: int = Path(None, description="ID of pet to update"), petId: int = Path(None, description="ID of pet to update"),

View File

@ -31,6 +31,7 @@ router = APIRouter()
}, },
tags=["store"], tags=["store"],
summary="Delete purchase order by ID", summary="Delete purchase order by ID",
response_model_by_alias=True,
) )
async def delete_order( async def delete_order(
orderId: str = Path(None, description="ID of the order that needs to be deleted"), orderId: str = Path(None, description="ID of the order that needs to be deleted"),
@ -46,6 +47,7 @@ async def delete_order(
}, },
tags=["store"], tags=["store"],
summary="Returns pet inventories by status", summary="Returns pet inventories by status",
response_model_by_alias=True,
) )
async def get_inventory( async def get_inventory(
token_api_key: TokenModel = Security( token_api_key: TokenModel = Security(
@ -65,6 +67,7 @@ async def get_inventory(
}, },
tags=["store"], tags=["store"],
summary="Find purchase order by ID", summary="Find purchase order by ID",
response_model_by_alias=True,
) )
async def get_order_by_id( async def get_order_by_id(
orderId: int = Path(None, description="ID of pet that needs to be fetched", ge=1, le=5), orderId: int = Path(None, description="ID of pet that needs to be fetched", ge=1, le=5),
@ -81,6 +84,7 @@ async def get_order_by_id(
}, },
tags=["store"], tags=["store"],
summary="Place an order for a pet", summary="Place an order for a pet",
response_model_by_alias=True,
) )
async def place_order( async def place_order(
order: Order = Body(None, description="order placed for purchasing the pet"), order: Order = Body(None, description="order placed for purchasing the pet"),

View File

@ -30,6 +30,7 @@ router = APIRouter()
}, },
tags=["user"], tags=["user"],
summary="Create user", summary="Create user",
response_model_by_alias=True,
) )
async def create_user( async def create_user(
user: User = Body(None, description="Created user object"), user: User = Body(None, description="Created user object"),
@ -48,6 +49,7 @@ async def create_user(
}, },
tags=["user"], tags=["user"],
summary="Creates list of users with given input array", summary="Creates list of users with given input array",
response_model_by_alias=True,
) )
async def create_users_with_array_input( async def create_users_with_array_input(
user: List[User] = Body(None, description="List of user object"), user: List[User] = Body(None, description="List of user object"),
@ -66,6 +68,7 @@ async def create_users_with_array_input(
}, },
tags=["user"], tags=["user"],
summary="Creates list of users with given input array", summary="Creates list of users with given input array",
response_model_by_alias=True,
) )
async def create_users_with_list_input( async def create_users_with_list_input(
user: List[User] = Body(None, description="List of user object"), user: List[User] = Body(None, description="List of user object"),
@ -85,6 +88,7 @@ async def create_users_with_list_input(
}, },
tags=["user"], tags=["user"],
summary="Delete user", summary="Delete user",
response_model_by_alias=True,
) )
async def delete_user( async def delete_user(
username: str = Path(None, description="The name that needs to be deleted"), username: str = Path(None, description="The name that needs to be deleted"),
@ -105,6 +109,7 @@ async def delete_user(
}, },
tags=["user"], tags=["user"],
summary="Get user by user name", summary="Get user by user name",
response_model_by_alias=True,
) )
async def get_user_by_name( async def get_user_by_name(
username: str = Path(None, description="The name that needs to be fetched. Use user1 for testing."), username: str = Path(None, description="The name that needs to be fetched. Use user1 for testing."),
@ -121,6 +126,7 @@ async def get_user_by_name(
}, },
tags=["user"], tags=["user"],
summary="Logs user into the system", summary="Logs user into the system",
response_model_by_alias=True,
) )
async def login_user( async def login_user(
username: str = Query(None, description="The user name for login", regex=r"^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$"), username: str = Query(None, description="The user name for login", regex=r"^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$"),
@ -137,6 +143,7 @@ async def login_user(
}, },
tags=["user"], tags=["user"],
summary="Logs out current logged in user session", summary="Logs out current logged in user session",
response_model_by_alias=True,
) )
async def logout_user( async def logout_user(
token_api_key: TokenModel = Security( token_api_key: TokenModel = Security(
@ -155,6 +162,7 @@ async def logout_user(
}, },
tags=["user"], tags=["user"],
summary="Updated user", summary="Updated user",
response_model_by_alias=True,
) )
async def update_user( async def update_user(
username: str = Path(None, description="name that need to be deleted"), username: str = Path(None, description="name that need to be deleted"),

View File

@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401
import re # noqa: F401 import re # noqa: F401
from typing import Any, Dict, List, Optional # noqa: F401 from typing import Any, Dict, List, Optional # noqa: F401
from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 from pydantic import AnyUrl, BaseModel, EmailStr, Field, validator # noqa: F401
class ApiResponse(BaseModel): class ApiResponse(BaseModel):
@ -21,8 +21,8 @@ class ApiResponse(BaseModel):
message: The message of this ApiResponse [Optional]. message: The message of this ApiResponse [Optional].
""" """
code: Optional[int] = None code: Optional[int] = Field(alias="code", default=None)
type: Optional[str] = None type: Optional[str] = Field(alias="type", default=None)
message: Optional[str] = None message: Optional[str] = Field(alias="message", default=None)
ApiResponse.update_forward_refs() ApiResponse.update_forward_refs()

View File

@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401
import re # noqa: F401 import re # noqa: F401
from typing import Any, Dict, List, Optional # noqa: F401 from typing import Any, Dict, List, Optional # noqa: F401
from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 from pydantic import AnyUrl, BaseModel, EmailStr, Field, validator # noqa: F401
class Category(BaseModel): class Category(BaseModel):
@ -20,8 +20,8 @@ class Category(BaseModel):
name: The name of this Category [Optional]. name: The name of this Category [Optional].
""" """
id: Optional[int] = None id: Optional[int] = Field(alias="id", default=None)
name: Optional[str] = None name: Optional[str] = Field(alias="name", default=None)
@validator("name") @validator("name")
def name_pattern(cls, value): def name_pattern(cls, value):

View File

@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401
import re # noqa: F401 import re # noqa: F401
from typing import Any, Dict, List, Optional # noqa: F401 from typing import Any, Dict, List, Optional # noqa: F401
from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 from pydantic import AnyUrl, BaseModel, EmailStr, Field, validator # noqa: F401
class Order(BaseModel): class Order(BaseModel):
@ -24,11 +24,11 @@ class Order(BaseModel):
complete: The complete of this Order [Optional]. complete: The complete of this Order [Optional].
""" """
id: Optional[int] = None id: Optional[int] = Field(alias="id", default=None)
pet_id: Optional[int] = None pet_id: Optional[int] = Field(alias="petId", default=None)
quantity: Optional[int] = None quantity: Optional[int] = Field(alias="quantity", default=None)
ship_date: Optional[datetime] = None ship_date: Optional[datetime] = Field(alias="shipDate", default=None)
status: Optional[str] = None status: Optional[str] = Field(alias="status", default=None)
complete: Optional[bool] = None complete: Optional[bool] = Field(alias="complete", default=None)
Order.update_forward_refs() Order.update_forward_refs()

View File

@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401
import re # noqa: F401 import re # noqa: F401
from typing import Any, Dict, List, Optional # noqa: F401 from typing import Any, Dict, List, Optional # noqa: F401
from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 from pydantic import AnyUrl, BaseModel, EmailStr, Field, validator # noqa: F401
from openapi_server.models.category import Category from openapi_server.models.category import Category
from openapi_server.models.tag import Tag from openapi_server.models.tag import Tag
@ -26,11 +26,11 @@ class Pet(BaseModel):
status: The status of this Pet [Optional]. status: The status of this Pet [Optional].
""" """
id: Optional[int] = None id: Optional[int] = Field(alias="id", default=None)
category: Optional[Category] = None category: Optional[Category] = Field(alias="category", default=None)
name: str name: str = Field(alias="name")
photo_urls: List[str] photo_urls: List[str] = Field(alias="photoUrls")
tags: Optional[List[Tag]] = None tags: Optional[List[Tag]] = Field(alias="tags", default=None)
status: Optional[str] = None status: Optional[str] = Field(alias="status", default=None)
Pet.update_forward_refs() Pet.update_forward_refs()

View File

@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401
import re # noqa: F401 import re # noqa: F401
from typing import Any, Dict, List, Optional # noqa: F401 from typing import Any, Dict, List, Optional # noqa: F401
from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 from pydantic import AnyUrl, BaseModel, EmailStr, Field, validator # noqa: F401
class Tag(BaseModel): class Tag(BaseModel):
@ -20,7 +20,7 @@ class Tag(BaseModel):
name: The name of this Tag [Optional]. name: The name of this Tag [Optional].
""" """
id: Optional[int] = None id: Optional[int] = Field(alias="id", default=None)
name: Optional[str] = None name: Optional[str] = Field(alias="name", default=None)
Tag.update_forward_refs() Tag.update_forward_refs()

View File

@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401
import re # noqa: F401 import re # noqa: F401
from typing import Any, Dict, List, Optional # noqa: F401 from typing import Any, Dict, List, Optional # noqa: F401
from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 from pydantic import AnyUrl, BaseModel, EmailStr, Field, validator # noqa: F401
class User(BaseModel): class User(BaseModel):
@ -26,13 +26,13 @@ class User(BaseModel):
user_status: The user_status of this User [Optional]. user_status: The user_status of this User [Optional].
""" """
id: Optional[int] = None id: Optional[int] = Field(alias="id", default=None)
username: Optional[str] = None username: Optional[str] = Field(alias="username", default=None)
first_name: Optional[str] = None first_name: Optional[str] = Field(alias="firstName", default=None)
last_name: Optional[str] = None last_name: Optional[str] = Field(alias="lastName", default=None)
email: Optional[str] = None email: Optional[str] = Field(alias="email", default=None)
password: Optional[str] = None password: Optional[str] = Field(alias="password", default=None)
phone: Optional[str] = None phone: Optional[str] = Field(alias="phone", default=None)
user_status: Optional[int] = None user_status: Optional[int] = Field(alias="userStatus", default=None)
User.update_forward_refs() User.update_forward_refs()