From 0295250516e3b5e54fa2752fedbb95c4b089d939 Mon Sep 17 00:00:00 2001 From: svd0 Date: Fri, 24 Jun 2022 11:06:31 -0300 Subject: [PATCH 1/6] Fix formats in fastapi/utils --- fastapi/utils.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/fastapi/utils.py b/fastapi/utils.py index a7e135bca..dcd523b22 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -51,14 +51,11 @@ def create_response_field( """ Create a new response field. Raises if type_ is invalid. """ - class_validators = class_validators or {} - field_info = field_info or FieldInfo() - response_field = functools.partial( ModelField, name=name, type_=type_, - class_validators=class_validators, + class_validators=class_validators or {}, default=default, required=required, model_config=model_config, @@ -66,7 +63,8 @@ def create_response_field( ) try: - return response_field(field_info=field_info) + _info = field_info or FieldInfo() + return response_field(field_info=_info) except RuntimeError: raise fastapi.exceptions.FastAPIError( f"Invalid args for response field! Hint: check that {type_} is a valid pydantic field type" @@ -134,7 +132,7 @@ def generate_operation_id_for_path( ) operation_id = name + path operation_id = re.sub("[^0-9a-zA-Z_]", "_", operation_id) - operation_id = operation_id + "_" + method.lower() + operation_id = f"{operation_id}_{method.lower()}" return operation_id @@ -142,7 +140,7 @@ def generate_unique_id(route: "APIRoute") -> str: operation_id = route.name + route.path_format operation_id = re.sub("[^0-9a-zA-Z_]", "_", operation_id) assert route.methods - operation_id = operation_id + "_" + list(route.methods)[0].lower() + operation_id = f"{operation_id}_{list(route.methods)[0].lower()}" return operation_id @@ -169,8 +167,7 @@ def get_value_or_default( Otherwise, the first item (a `DefaultPlaceholder`) will be returned. """ - items = (first_item,) + extra_items - for item in items: + for item in (first_item,) + extra_items: if not isinstance(item, DefaultPlaceholder): return item return first_item From 7c54fd0ff80e1a855b5f234bf884e721182040a8 Mon Sep 17 00:00:00 2001 From: svd0 Date: Wed, 29 Jun 2022 11:25:52 -0300 Subject: [PATCH 2/6] Fix formats in fastapi/utils, fastapi/dependencies/utils --- fastapi/dependencies/utils.py | 2 +- fastapi/utils.py | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index f397e333c..96d28f6cf 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -721,7 +721,7 @@ def get_body_field(*, dependant: Dependant, name: str) -> Optional[ModelField]: # That is combined (embedded) with other body fields for param in flat_dependant.body_params: setattr(param.field_info, "embed", True) - model_name = "Body_" + name + model_name = f"Body_{name}" BodyModel: Type[BaseModel] = create_model(model_name) for f in flat_dependant.body_params: BodyModel.__fields__[f.name] = f diff --git a/fastapi/utils.py b/fastapi/utils.py index dcd523b22..f6476933d 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -74,11 +74,11 @@ def create_response_field( def create_cloned_field( field: ModelField, *, - cloned_types: Optional[Dict[Type[BaseModel], Type[BaseModel]]] = None, + cloned_types: Optional[Dict[Type[BaseModel], Type[BaseModel]]] = {}, ) -> ModelField: - # _cloned_types has already cloned types, to support recursive models - if cloned_types is None: - cloned_types = dict() + """ + _cloned_types has already cloned types, to support recursive models + """ original_type = field.type_ if is_dataclass(original_type) and hasattr(original_type, "__pydantic_model__"): original_type = original_type.__pydantic_model__ @@ -167,7 +167,8 @@ def get_value_or_default( Otherwise, the first item (a `DefaultPlaceholder`) will be returned. """ - for item in (first_item,) + extra_items: + items = (first_item,) + extra_items + for item in (first_item,) + items: if not isinstance(item, DefaultPlaceholder): return item return first_item From 2737b7613287a56e056122e3e0c4175521eb264c Mon Sep 17 00:00:00 2001 From: svd0 Date: Wed, 29 Jun 2022 11:33:09 -0300 Subject: [PATCH 3/6] Fix for loop on get_value_or_default function --- fastapi/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastapi/utils.py b/fastapi/utils.py index f6476933d..40bff3279 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -168,7 +168,7 @@ def get_value_or_default( Otherwise, the first item (a `DefaultPlaceholder`) will be returned. """ items = (first_item,) + extra_items - for item in (first_item,) + items: + for item in items: if not isinstance(item, DefaultPlaceholder): return item return first_item From 57c9d0bcd160965e724e399ab1b2dcb71c7b39bf Mon Sep 17 00:00:00 2001 From: svd0 Date: Wed, 29 Jun 2022 11:43:29 -0300 Subject: [PATCH 4/6] Fix variable names and remove a redundant assignment --- fastapi/utils.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fastapi/utils.py b/fastapi/utils.py index 40bff3279..774c5b982 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -137,11 +137,10 @@ def generate_operation_id_for_path( def generate_unique_id(route: "APIRoute") -> str: - operation_id = route.name + route.path_format - operation_id = re.sub("[^0-9a-zA-Z_]", "_", operation_id) + route_path_name = route.name + route.path_format + operation_id = re.sub("[^0-9a-zA-Z_]", "_", route_path_name) assert route.methods - operation_id = f"{operation_id}_{list(route.methods)[0].lower()}" - return operation_id + return f"{operation_id}_{list(route.methods)[0].lower()}" def deep_dict_update(main_dict: Dict[Any, Any], update_dict: Dict[Any, Any]) -> None: From e0c97a9599782df4a13cef49fa29f5afd25279a2 Mon Sep 17 00:00:00 2001 From: svd0 Date: Thu, 30 Jun 2022 10:14:28 -0300 Subject: [PATCH 5/6] Fix tests --- fastapi/utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fastapi/utils.py b/fastapi/utils.py index 774c5b982..10173222e 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -74,11 +74,11 @@ def create_response_field( def create_cloned_field( field: ModelField, *, - cloned_types: Optional[Dict[Type[BaseModel], Type[BaseModel]]] = {}, + cloned_types: Optional[Dict[Type[BaseModel], Type[BaseModel]]] = None, ) -> ModelField: - """ - _cloned_types has already cloned types, to support recursive models - """ + # _cloned_types has already cloned types, to support recursive model + if cloned_types is None: + cloned_types = dict() original_type = field.type_ if is_dataclass(original_type) and hasattr(original_type, "__pydantic_model__"): original_type = original_type.__pydantic_model__ From d84df5cb2da22d9914526143aaeeea147b989fd9 Mon Sep 17 00:00:00 2001 From: svd0 Date: Thu, 30 Jun 2022 10:19:09 -0300 Subject: [PATCH 6/6] Fix comment --- fastapi/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastapi/utils.py b/fastapi/utils.py index 10173222e..2a634c70c 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -76,7 +76,7 @@ def create_cloned_field( *, cloned_types: Optional[Dict[Type[BaseModel], Type[BaseModel]]] = None, ) -> ModelField: - # _cloned_types has already cloned types, to support recursive model + # _cloned_types has already cloned types, to support recursive models if cloned_types is None: cloned_types = dict() original_type = field.type_