Skip to content

Commit aeb2d20

Browse files
committed
♻️ Refactor and simplify function indirection through utils
1 parent 04703fd commit aeb2d20

3 files changed

Lines changed: 20 additions & 29 deletions

File tree

fastapi/_compat/__init__.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
from .shared import PYDANTIC_VERSION_MINOR_TUPLE as PYDANTIC_VERSION_MINOR_TUPLE
22
from .shared import annotation_is_pydantic_v1 as annotation_is_pydantic_v1
33
from .shared import field_annotation_is_scalar as field_annotation_is_scalar
4+
from .shared import (
5+
field_annotation_is_scalar_sequence as field_annotation_is_scalar_sequence,
6+
)
7+
from .shared import field_annotation_is_sequence as field_annotation_is_sequence
8+
from .shared import (
9+
is_bytes_or_nonable_bytes_annotation as is_bytes_or_nonable_bytes_annotation,
10+
)
11+
from .shared import is_bytes_sequence_annotation as is_bytes_sequence_annotation
412
from .shared import is_pydantic_v1_model_instance as is_pydantic_v1_model_instance
513
from .shared import (
614
is_uploadfile_or_nonable_uploadfile_annotation as is_uploadfile_or_nonable_uploadfile_annotation,
@@ -25,11 +33,7 @@
2533
from .v2 import get_missing_field_error as get_missing_field_error
2634
from .v2 import get_model_name_map as get_model_name_map
2735
from .v2 import get_schema_from_model_field as get_schema_from_model_field
28-
from .v2 import is_bytes_field as is_bytes_field
29-
from .v2 import is_bytes_sequence_field as is_bytes_sequence_field
3036
from .v2 import is_scalar_field as is_scalar_field
31-
from .v2 import is_scalar_sequence_field as is_scalar_sequence_field
32-
from .v2 import is_sequence_field as is_sequence_field
3337
from .v2 import serialize_sequence_value as serialize_sequence_value
3438
from .v2 import (
3539
with_info_plain_validator_function as with_info_plain_validator_function,

fastapi/_compat/v2.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -296,22 +296,6 @@ def is_scalar_field(field: ModelField) -> bool:
296296
) and not isinstance(field.field_info, params.Body)
297297

298298

299-
def is_sequence_field(field: ModelField) -> bool:
300-
return shared.field_annotation_is_sequence(field.field_info.annotation)
301-
302-
303-
def is_scalar_sequence_field(field: ModelField) -> bool:
304-
return shared.field_annotation_is_scalar_sequence(field.field_info.annotation)
305-
306-
307-
def is_bytes_field(field: ModelField) -> bool:
308-
return shared.is_bytes_or_nonable_bytes_annotation(field.field_info.annotation)
309-
310-
311-
def is_bytes_sequence_field(field: ModelField) -> bool:
312-
return shared.is_bytes_sequence_annotation(field.field_info.annotation)
313-
314-
315299
def copy_field_info(*, field_info: FieldInfo, annotation: Any) -> FieldInfo:
316300
cls = type(field_info)
317301
merged_field_info = cls.from_annotation(annotation)

fastapi/dependencies/utils.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@
2525
create_body_model,
2626
evaluate_forwardref,
2727
field_annotation_is_scalar,
28+
field_annotation_is_scalar_sequence,
29+
field_annotation_is_sequence,
2830
get_cached_model_fields,
2931
get_missing_field_error,
30-
is_bytes_field,
31-
is_bytes_sequence_field,
32+
is_bytes_or_nonable_bytes_annotation,
33+
is_bytes_sequence_annotation,
3234
is_scalar_field,
33-
is_scalar_sequence_field,
34-
is_sequence_field,
3535
is_uploadfile_or_nonable_uploadfile_annotation,
3636
is_uploadfile_sequence_annotation,
3737
lenient_issubclass,
@@ -523,7 +523,7 @@ def analyze_param(
523523
elif isinstance(field_info, params.Query):
524524
assert (
525525
is_scalar_field(field)
526-
or is_scalar_sequence_field(field)
526+
or field_annotation_is_scalar_sequence(field.field_info.annotation)
527527
or lenient_issubclass(field.field_info.annotation, BaseModel)
528528
), f"Query parameter {param_name!r} must be one of the supported types"
529529

@@ -727,7 +727,7 @@ def _get_multidict_value(
727727
alias = alias or get_validation_alias(field)
728728
if (
729729
(not _is_json_field(field))
730-
and is_sequence_field(field)
730+
and field_annotation_is_sequence(field.field_info.annotation)
731731
and isinstance(values, (ImmutableMultiDict, Headers))
732732
):
733733
value = values.getlist(alias)
@@ -740,7 +740,10 @@ def _get_multidict_value(
740740
and isinstance(value, str) # For type checks
741741
and value == ""
742742
)
743-
or (is_sequence_field(field) and len(value) == 0)
743+
or (
744+
field_annotation_is_sequence(field.field_info.annotation)
745+
and len(value) == 0
746+
)
744747
):
745748
if field.field_info.is_required():
746749
return
@@ -888,12 +891,12 @@ async def _extract_form_body(
888891
field_info = field.field_info
889892
if (
890893
isinstance(field_info, params.File)
891-
and is_bytes_field(field)
894+
and is_bytes_or_nonable_bytes_annotation(field.field_info.annotation)
892895
and isinstance(value, UploadFile)
893896
):
894897
value = await value.read()
895898
elif (
896-
is_bytes_sequence_field(field)
899+
is_bytes_sequence_annotation(field.field_info.annotation)
897900
and isinstance(field_info, params.File)
898901
and value_is_sequence(value)
899902
):

0 commit comments

Comments
 (0)