From fd5ad7f89547a54c068a0fd679cb56aeb806d3b6 Mon Sep 17 00:00:00 2001 From: Rory Dungan Date: Tue, 10 May 2022 03:08:59 +1000 Subject: [PATCH] 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 --- .../main/resources/python-fastapi/api.mustache | 1 + .../resources/python-fastapi/model.mustache | 4 ++-- .../src/openapi_server/apis/pet_api.py | 8 ++++++++ .../src/openapi_server/apis/store_api.py | 4 ++++ .../src/openapi_server/apis/user_api.py | 8 ++++++++ .../src/openapi_server/models/api_response.py | 8 ++++---- .../src/openapi_server/models/category.py | 6 +++--- .../src/openapi_server/models/order.py | 14 +++++++------- .../src/openapi_server/models/pet.py | 14 +++++++------- .../src/openapi_server/models/tag.py | 6 +++--- .../src/openapi_server/models/user.py | 18 +++++++++--------- 11 files changed, 56 insertions(+), 35 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/python-fastapi/api.mustache b/modules/openapi-generator/src/main/resources/python-fastapi/api.mustache index d71e7f0d4ad..3adf3a2de34 100644 --- a/modules/openapi-generator/src/main/resources/python-fastapi/api.mustache +++ b/modules/openapi-generator/src/main/resources/python-fastapi/api.mustache @@ -41,6 +41,7 @@ router = APIRouter() {{#description}} description = "{{.}}", {{/description}} + response_model_by_alias=True, ) async def {{operationId}}( {{#allParams}} diff --git a/modules/openapi-generator/src/main/resources/python-fastapi/model.mustache b/modules/openapi-generator/src/main/resources/python-fastapi/model.mustache index 65d40b93482..3be022b17e3 100644 --- a/modules/openapi-generator/src/main/resources/python-fastapi/model.mustache +++ b/modules/openapi-generator/src/main/resources/python-fastapi/model.mustache @@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401 import re # 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}} {{#model}} {{#pyImports}} @@ -31,7 +31,7 @@ class {{classname}}(BaseModel): """ {{#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}} {{#maximum}} diff --git a/samples/server/petstore/python-fastapi/src/openapi_server/apis/pet_api.py b/samples/server/petstore/python-fastapi/src/openapi_server/apis/pet_api.py index e5525b0d2ba..b5fdb300c7f 100644 --- a/samples/server/petstore/python-fastapi/src/openapi_server/apis/pet_api.py +++ b/samples/server/petstore/python-fastapi/src/openapi_server/apis/pet_api.py @@ -32,6 +32,7 @@ router = APIRouter() }, tags=["pet"], summary="Add a new pet to the store", + response_model_by_alias=True, ) async def add_pet( 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"], summary="Deletes a pet", + response_model_by_alias=True, ) async def delete_pet( petId: int = Path(None, description="Pet id to delete"), @@ -70,6 +72,7 @@ async def delete_pet( }, tags=["pet"], summary="Finds Pets by status", + response_model_by_alias=True, ) async def find_pets_by_status( 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"], summary="Finds Pets by tags", + response_model_by_alias=True, ) async def find_pets_by_tags( tags: List[str] = Query(None, description="Tags to filter by"), @@ -109,6 +113,7 @@ async def find_pets_by_tags( }, tags=["pet"], summary="Find pet by ID", + response_model_by_alias=True, ) async def get_pet_by_id( petId: int = Path(None, description="ID of pet to return"), @@ -130,6 +135,7 @@ async def get_pet_by_id( }, tags=["pet"], summary="Update an existing pet", + response_model_by_alias=True, ) async def update_pet( 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"], summary="Updates a pet in the store with form data", + response_model_by_alias=True, ) async def update_pet_with_form( 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"], summary="uploads an image", + response_model_by_alias=True, ) async def upload_file( petId: int = Path(None, description="ID of pet to update"), diff --git a/samples/server/petstore/python-fastapi/src/openapi_server/apis/store_api.py b/samples/server/petstore/python-fastapi/src/openapi_server/apis/store_api.py index f280beb7603..b21e32f26f9 100644 --- a/samples/server/petstore/python-fastapi/src/openapi_server/apis/store_api.py +++ b/samples/server/petstore/python-fastapi/src/openapi_server/apis/store_api.py @@ -31,6 +31,7 @@ router = APIRouter() }, tags=["store"], summary="Delete purchase order by ID", + response_model_by_alias=True, ) async def delete_order( orderId: str = Path(None, description="ID of the order that needs to be deleted"), @@ -46,6 +47,7 @@ async def delete_order( }, tags=["store"], summary="Returns pet inventories by status", + response_model_by_alias=True, ) async def get_inventory( token_api_key: TokenModel = Security( @@ -65,6 +67,7 @@ async def get_inventory( }, tags=["store"], summary="Find purchase order by ID", + response_model_by_alias=True, ) async def get_order_by_id( 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"], summary="Place an order for a pet", + response_model_by_alias=True, ) async def place_order( order: Order = Body(None, description="order placed for purchasing the pet"), diff --git a/samples/server/petstore/python-fastapi/src/openapi_server/apis/user_api.py b/samples/server/petstore/python-fastapi/src/openapi_server/apis/user_api.py index ff1990bb7bf..b1073aa1f74 100644 --- a/samples/server/petstore/python-fastapi/src/openapi_server/apis/user_api.py +++ b/samples/server/petstore/python-fastapi/src/openapi_server/apis/user_api.py @@ -30,6 +30,7 @@ router = APIRouter() }, tags=["user"], summary="Create user", + response_model_by_alias=True, ) async def create_user( user: User = Body(None, description="Created user object"), @@ -48,6 +49,7 @@ async def create_user( }, tags=["user"], summary="Creates list of users with given input array", + response_model_by_alias=True, ) async def create_users_with_array_input( user: List[User] = Body(None, description="List of user object"), @@ -66,6 +68,7 @@ async def create_users_with_array_input( }, tags=["user"], summary="Creates list of users with given input array", + response_model_by_alias=True, ) async def create_users_with_list_input( user: List[User] = Body(None, description="List of user object"), @@ -85,6 +88,7 @@ async def create_users_with_list_input( }, tags=["user"], summary="Delete user", + response_model_by_alias=True, ) async def delete_user( username: str = Path(None, description="The name that needs to be deleted"), @@ -105,6 +109,7 @@ async def delete_user( }, tags=["user"], summary="Get user by user name", + response_model_by_alias=True, ) async def get_user_by_name( 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"], summary="Logs user into the system", + response_model_by_alias=True, ) 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]+$"), @@ -137,6 +143,7 @@ async def login_user( }, tags=["user"], summary="Logs out current logged in user session", + response_model_by_alias=True, ) async def logout_user( token_api_key: TokenModel = Security( @@ -155,6 +162,7 @@ async def logout_user( }, tags=["user"], summary="Updated user", + response_model_by_alias=True, ) async def update_user( username: str = Path(None, description="name that need to be deleted"), diff --git a/samples/server/petstore/python-fastapi/src/openapi_server/models/api_response.py b/samples/server/petstore/python-fastapi/src/openapi_server/models/api_response.py index fce5f94edc0..7840e693d73 100644 --- a/samples/server/petstore/python-fastapi/src/openapi_server/models/api_response.py +++ b/samples/server/petstore/python-fastapi/src/openapi_server/models/api_response.py @@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401 import re # 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): @@ -21,8 +21,8 @@ class ApiResponse(BaseModel): message: The message of this ApiResponse [Optional]. """ - code: Optional[int] = None - type: Optional[str] = None - message: Optional[str] = None + code: Optional[int] = Field(alias="code", default=None) + type: Optional[str] = Field(alias="type", default=None) + message: Optional[str] = Field(alias="message", default=None) ApiResponse.update_forward_refs() diff --git a/samples/server/petstore/python-fastapi/src/openapi_server/models/category.py b/samples/server/petstore/python-fastapi/src/openapi_server/models/category.py index de57bf2d2ee..c63704e2234 100644 --- a/samples/server/petstore/python-fastapi/src/openapi_server/models/category.py +++ b/samples/server/petstore/python-fastapi/src/openapi_server/models/category.py @@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401 import re # 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): @@ -20,8 +20,8 @@ class Category(BaseModel): name: The name of this Category [Optional]. """ - id: Optional[int] = None - name: Optional[str] = None + id: Optional[int] = Field(alias="id", default=None) + name: Optional[str] = Field(alias="name", default=None) @validator("name") def name_pattern(cls, value): diff --git a/samples/server/petstore/python-fastapi/src/openapi_server/models/order.py b/samples/server/petstore/python-fastapi/src/openapi_server/models/order.py index 384fec2a3a1..95d532c5156 100644 --- a/samples/server/petstore/python-fastapi/src/openapi_server/models/order.py +++ b/samples/server/petstore/python-fastapi/src/openapi_server/models/order.py @@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401 import re # 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): @@ -24,11 +24,11 @@ class Order(BaseModel): complete: The complete of this Order [Optional]. """ - id: Optional[int] = None - pet_id: Optional[int] = None - quantity: Optional[int] = None - ship_date: Optional[datetime] = None - status: Optional[str] = None - complete: Optional[bool] = None + id: Optional[int] = Field(alias="id", default=None) + pet_id: Optional[int] = Field(alias="petId", default=None) + quantity: Optional[int] = Field(alias="quantity", default=None) + ship_date: Optional[datetime] = Field(alias="shipDate", default=None) + status: Optional[str] = Field(alias="status", default=None) + complete: Optional[bool] = Field(alias="complete", default=None) Order.update_forward_refs() diff --git a/samples/server/petstore/python-fastapi/src/openapi_server/models/pet.py b/samples/server/petstore/python-fastapi/src/openapi_server/models/pet.py index c44c38079ac..d814c3ce2a0 100644 --- a/samples/server/petstore/python-fastapi/src/openapi_server/models/pet.py +++ b/samples/server/petstore/python-fastapi/src/openapi_server/models/pet.py @@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401 import re # 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.tag import Tag @@ -26,11 +26,11 @@ class Pet(BaseModel): status: The status of this Pet [Optional]. """ - id: Optional[int] = None - category: Optional[Category] = None - name: str - photo_urls: List[str] - tags: Optional[List[Tag]] = None - status: Optional[str] = None + id: Optional[int] = Field(alias="id", default=None) + category: Optional[Category] = Field(alias="category", default=None) + name: str = Field(alias="name") + photo_urls: List[str] = Field(alias="photoUrls") + tags: Optional[List[Tag]] = Field(alias="tags", default=None) + status: Optional[str] = Field(alias="status", default=None) Pet.update_forward_refs() diff --git a/samples/server/petstore/python-fastapi/src/openapi_server/models/tag.py b/samples/server/petstore/python-fastapi/src/openapi_server/models/tag.py index 3e0b45cd787..b12929adea7 100644 --- a/samples/server/petstore/python-fastapi/src/openapi_server/models/tag.py +++ b/samples/server/petstore/python-fastapi/src/openapi_server/models/tag.py @@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401 import re # 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): @@ -20,7 +20,7 @@ class Tag(BaseModel): name: The name of this Tag [Optional]. """ - id: Optional[int] = None - name: Optional[str] = None + id: Optional[int] = Field(alias="id", default=None) + name: Optional[str] = Field(alias="name", default=None) Tag.update_forward_refs() diff --git a/samples/server/petstore/python-fastapi/src/openapi_server/models/user.py b/samples/server/petstore/python-fastapi/src/openapi_server/models/user.py index 1c75b77dbfc..3cb036759f2 100644 --- a/samples/server/petstore/python-fastapi/src/openapi_server/models/user.py +++ b/samples/server/petstore/python-fastapi/src/openapi_server/models/user.py @@ -6,7 +6,7 @@ from datetime import date, datetime # noqa: F401 import re # 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): @@ -26,13 +26,13 @@ class User(BaseModel): user_status: The user_status of this User [Optional]. """ - id: Optional[int] = None - username: Optional[str] = None - first_name: Optional[str] = None - last_name: Optional[str] = None - email: Optional[str] = None - password: Optional[str] = None - phone: Optional[str] = None - user_status: Optional[int] = None + id: Optional[int] = Field(alias="id", default=None) + username: Optional[str] = Field(alias="username", default=None) + first_name: Optional[str] = Field(alias="firstName", default=None) + last_name: Optional[str] = Field(alias="lastName", default=None) + email: Optional[str] = Field(alias="email", default=None) + password: Optional[str] = Field(alias="password", default=None) + phone: Optional[str] = Field(alias="phone", default=None) + user_status: Optional[int] = Field(alias="userStatus", default=None) User.update_forward_refs()