784 lines
28 KiB
Python
784 lines
28 KiB
Python
|
import warnings
|
||
|
from enum import Enum
|
||
|
from typing import Any, Callable, Dict, List, Optional, Sequence, Union
|
||
|
|
||
|
from fastapi.openapi.models import Example
|
||
|
from pydantic.fields import FieldInfo
|
||
|
from typing_extensions import Annotated, deprecated
|
||
|
|
||
|
from ._compat import PYDANTIC_V2, PYDANTIC_VERSION, Undefined
|
||
|
|
||
|
_Unset: Any = Undefined
|
||
|
|
||
|
|
||
|
class ParamTypes(Enum):
|
||
|
query = "query"
|
||
|
header = "header"
|
||
|
path = "path"
|
||
|
cookie = "cookie"
|
||
|
|
||
|
|
||
|
class Param(FieldInfo):
|
||
|
in_: ParamTypes
|
||
|
|
||
|
def __init__(
|
||
|
self,
|
||
|
default: Any = Undefined,
|
||
|
*,
|
||
|
default_factory: Union[Callable[[], Any], None] = _Unset,
|
||
|
annotation: Optional[Any] = None,
|
||
|
alias: Optional[str] = None,
|
||
|
alias_priority: Union[int, None] = _Unset,
|
||
|
# TODO: update when deprecating Pydantic v1, import these types
|
||
|
# validation_alias: str | AliasPath | AliasChoices | None
|
||
|
validation_alias: Union[str, None] = None,
|
||
|
serialization_alias: Union[str, None] = None,
|
||
|
title: Optional[str] = None,
|
||
|
description: Optional[str] = None,
|
||
|
gt: Optional[float] = None,
|
||
|
ge: Optional[float] = None,
|
||
|
lt: Optional[float] = None,
|
||
|
le: Optional[float] = None,
|
||
|
min_length: Optional[int] = None,
|
||
|
max_length: Optional[int] = None,
|
||
|
pattern: Optional[str] = None,
|
||
|
regex: Annotated[
|
||
|
Optional[str],
|
||
|
deprecated(
|
||
|
"Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
|
||
|
),
|
||
|
] = None,
|
||
|
discriminator: Union[str, None] = None,
|
||
|
strict: Union[bool, None] = _Unset,
|
||
|
multiple_of: Union[float, None] = _Unset,
|
||
|
allow_inf_nan: Union[bool, None] = _Unset,
|
||
|
max_digits: Union[int, None] = _Unset,
|
||
|
decimal_places: Union[int, None] = _Unset,
|
||
|
examples: Optional[List[Any]] = None,
|
||
|
example: Annotated[
|
||
|
Optional[Any],
|
||
|
deprecated(
|
||
|
"Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
|
||
|
"although still supported. Use examples instead."
|
||
|
),
|
||
|
] = _Unset,
|
||
|
openapi_examples: Optional[Dict[str, Example]] = None,
|
||
|
deprecated: Union[deprecated, str, bool, None] = None,
|
||
|
include_in_schema: bool = True,
|
||
|
json_schema_extra: Union[Dict[str, Any], None] = None,
|
||
|
**extra: Any,
|
||
|
):
|
||
|
if example is not _Unset:
|
||
|
warnings.warn(
|
||
|
"`example` has been deprecated, please use `examples` instead",
|
||
|
category=DeprecationWarning,
|
||
|
stacklevel=4,
|
||
|
)
|
||
|
self.example = example
|
||
|
self.include_in_schema = include_in_schema
|
||
|
self.openapi_examples = openapi_examples
|
||
|
kwargs = dict(
|
||
|
default=default,
|
||
|
default_factory=default_factory,
|
||
|
alias=alias,
|
||
|
title=title,
|
||
|
description=description,
|
||
|
gt=gt,
|
||
|
ge=ge,
|
||
|
lt=lt,
|
||
|
le=le,
|
||
|
min_length=min_length,
|
||
|
max_length=max_length,
|
||
|
discriminator=discriminator,
|
||
|
multiple_of=multiple_of,
|
||
|
allow_nan=allow_inf_nan,
|
||
|
max_digits=max_digits,
|
||
|
decimal_places=decimal_places,
|
||
|
**extra,
|
||
|
)
|
||
|
if examples is not None:
|
||
|
kwargs["examples"] = examples
|
||
|
if regex is not None:
|
||
|
warnings.warn(
|
||
|
"`regex` has been deprecated, please use `pattern` instead",
|
||
|
category=DeprecationWarning,
|
||
|
stacklevel=4,
|
||
|
)
|
||
|
current_json_schema_extra = json_schema_extra or extra
|
||
|
if PYDANTIC_VERSION < "2.7.0":
|
||
|
self.deprecated = deprecated
|
||
|
else:
|
||
|
kwargs["deprecated"] = deprecated
|
||
|
if PYDANTIC_V2:
|
||
|
kwargs.update(
|
||
|
{
|
||
|
"annotation": annotation,
|
||
|
"alias_priority": alias_priority,
|
||
|
"validation_alias": validation_alias,
|
||
|
"serialization_alias": serialization_alias,
|
||
|
"strict": strict,
|
||
|
"json_schema_extra": current_json_schema_extra,
|
||
|
}
|
||
|
)
|
||
|
kwargs["pattern"] = pattern or regex
|
||
|
else:
|
||
|
kwargs["regex"] = pattern or regex
|
||
|
kwargs.update(**current_json_schema_extra)
|
||
|
use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset}
|
||
|
|
||
|
super().__init__(**use_kwargs)
|
||
|
|
||
|
def __repr__(self) -> str:
|
||
|
return f"{self.__class__.__name__}({self.default})"
|
||
|
|
||
|
|
||
|
class Path(Param):
|
||
|
in_ = ParamTypes.path
|
||
|
|
||
|
def __init__(
|
||
|
self,
|
||
|
default: Any = ...,
|
||
|
*,
|
||
|
default_factory: Union[Callable[[], Any], None] = _Unset,
|
||
|
annotation: Optional[Any] = None,
|
||
|
alias: Optional[str] = None,
|
||
|
alias_priority: Union[int, None] = _Unset,
|
||
|
# TODO: update when deprecating Pydantic v1, import these types
|
||
|
# validation_alias: str | AliasPath | AliasChoices | None
|
||
|
validation_alias: Union[str, None] = None,
|
||
|
serialization_alias: Union[str, None] = None,
|
||
|
title: Optional[str] = None,
|
||
|
description: Optional[str] = None,
|
||
|
gt: Optional[float] = None,
|
||
|
ge: Optional[float] = None,
|
||
|
lt: Optional[float] = None,
|
||
|
le: Optional[float] = None,
|
||
|
min_length: Optional[int] = None,
|
||
|
max_length: Optional[int] = None,
|
||
|
pattern: Optional[str] = None,
|
||
|
regex: Annotated[
|
||
|
Optional[str],
|
||
|
deprecated(
|
||
|
"Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
|
||
|
),
|
||
|
] = None,
|
||
|
discriminator: Union[str, None] = None,
|
||
|
strict: Union[bool, None] = _Unset,
|
||
|
multiple_of: Union[float, None] = _Unset,
|
||
|
allow_inf_nan: Union[bool, None] = _Unset,
|
||
|
max_digits: Union[int, None] = _Unset,
|
||
|
decimal_places: Union[int, None] = _Unset,
|
||
|
examples: Optional[List[Any]] = None,
|
||
|
example: Annotated[
|
||
|
Optional[Any],
|
||
|
deprecated(
|
||
|
"Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
|
||
|
"although still supported. Use examples instead."
|
||
|
),
|
||
|
] = _Unset,
|
||
|
openapi_examples: Optional[Dict[str, Example]] = None,
|
||
|
deprecated: Union[deprecated, str, bool, None] = None,
|
||
|
include_in_schema: bool = True,
|
||
|
json_schema_extra: Union[Dict[str, Any], None] = None,
|
||
|
**extra: Any,
|
||
|
):
|
||
|
assert default is ..., "Path parameters cannot have a default value"
|
||
|
self.in_ = self.in_
|
||
|
super().__init__(
|
||
|
default=default,
|
||
|
default_factory=default_factory,
|
||
|
annotation=annotation,
|
||
|
alias=alias,
|
||
|
alias_priority=alias_priority,
|
||
|
validation_alias=validation_alias,
|
||
|
serialization_alias=serialization_alias,
|
||
|
title=title,
|
||
|
description=description,
|
||
|
gt=gt,
|
||
|
ge=ge,
|
||
|
lt=lt,
|
||
|
le=le,
|
||
|
min_length=min_length,
|
||
|
max_length=max_length,
|
||
|
pattern=pattern,
|
||
|
regex=regex,
|
||
|
discriminator=discriminator,
|
||
|
strict=strict,
|
||
|
multiple_of=multiple_of,
|
||
|
allow_inf_nan=allow_inf_nan,
|
||
|
max_digits=max_digits,
|
||
|
decimal_places=decimal_places,
|
||
|
deprecated=deprecated,
|
||
|
example=example,
|
||
|
examples=examples,
|
||
|
openapi_examples=openapi_examples,
|
||
|
include_in_schema=include_in_schema,
|
||
|
json_schema_extra=json_schema_extra,
|
||
|
**extra,
|
||
|
)
|
||
|
|
||
|
|
||
|
class Query(Param):
|
||
|
in_ = ParamTypes.query
|
||
|
|
||
|
def __init__(
|
||
|
self,
|
||
|
default: Any = Undefined,
|
||
|
*,
|
||
|
default_factory: Union[Callable[[], Any], None] = _Unset,
|
||
|
annotation: Optional[Any] = None,
|
||
|
alias: Optional[str] = None,
|
||
|
alias_priority: Union[int, None] = _Unset,
|
||
|
# TODO: update when deprecating Pydantic v1, import these types
|
||
|
# validation_alias: str | AliasPath | AliasChoices | None
|
||
|
validation_alias: Union[str, None] = None,
|
||
|
serialization_alias: Union[str, None] = None,
|
||
|
title: Optional[str] = None,
|
||
|
description: Optional[str] = None,
|
||
|
gt: Optional[float] = None,
|
||
|
ge: Optional[float] = None,
|
||
|
lt: Optional[float] = None,
|
||
|
le: Optional[float] = None,
|
||
|
min_length: Optional[int] = None,
|
||
|
max_length: Optional[int] = None,
|
||
|
pattern: Optional[str] = None,
|
||
|
regex: Annotated[
|
||
|
Optional[str],
|
||
|
deprecated(
|
||
|
"Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
|
||
|
),
|
||
|
] = None,
|
||
|
discriminator: Union[str, None] = None,
|
||
|
strict: Union[bool, None] = _Unset,
|
||
|
multiple_of: Union[float, None] = _Unset,
|
||
|
allow_inf_nan: Union[bool, None] = _Unset,
|
||
|
max_digits: Union[int, None] = _Unset,
|
||
|
decimal_places: Union[int, None] = _Unset,
|
||
|
examples: Optional[List[Any]] = None,
|
||
|
example: Annotated[
|
||
|
Optional[Any],
|
||
|
deprecated(
|
||
|
"Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
|
||
|
"although still supported. Use examples instead."
|
||
|
),
|
||
|
] = _Unset,
|
||
|
openapi_examples: Optional[Dict[str, Example]] = None,
|
||
|
deprecated: Union[deprecated, str, bool, None] = None,
|
||
|
include_in_schema: bool = True,
|
||
|
json_schema_extra: Union[Dict[str, Any], None] = None,
|
||
|
**extra: Any,
|
||
|
):
|
||
|
super().__init__(
|
||
|
default=default,
|
||
|
default_factory=default_factory,
|
||
|
annotation=annotation,
|
||
|
alias=alias,
|
||
|
alias_priority=alias_priority,
|
||
|
validation_alias=validation_alias,
|
||
|
serialization_alias=serialization_alias,
|
||
|
title=title,
|
||
|
description=description,
|
||
|
gt=gt,
|
||
|
ge=ge,
|
||
|
lt=lt,
|
||
|
le=le,
|
||
|
min_length=min_length,
|
||
|
max_length=max_length,
|
||
|
pattern=pattern,
|
||
|
regex=regex,
|
||
|
discriminator=discriminator,
|
||
|
strict=strict,
|
||
|
multiple_of=multiple_of,
|
||
|
allow_inf_nan=allow_inf_nan,
|
||
|
max_digits=max_digits,
|
||
|
decimal_places=decimal_places,
|
||
|
deprecated=deprecated,
|
||
|
example=example,
|
||
|
examples=examples,
|
||
|
openapi_examples=openapi_examples,
|
||
|
include_in_schema=include_in_schema,
|
||
|
json_schema_extra=json_schema_extra,
|
||
|
**extra,
|
||
|
)
|
||
|
|
||
|
|
||
|
class Header(Param):
|
||
|
in_ = ParamTypes.header
|
||
|
|
||
|
def __init__(
|
||
|
self,
|
||
|
default: Any = Undefined,
|
||
|
*,
|
||
|
default_factory: Union[Callable[[], Any], None] = _Unset,
|
||
|
annotation: Optional[Any] = None,
|
||
|
alias: Optional[str] = None,
|
||
|
alias_priority: Union[int, None] = _Unset,
|
||
|
# TODO: update when deprecating Pydantic v1, import these types
|
||
|
# validation_alias: str | AliasPath | AliasChoices | None
|
||
|
validation_alias: Union[str, None] = None,
|
||
|
serialization_alias: Union[str, None] = None,
|
||
|
convert_underscores: bool = True,
|
||
|
title: Optional[str] = None,
|
||
|
description: Optional[str] = None,
|
||
|
gt: Optional[float] = None,
|
||
|
ge: Optional[float] = None,
|
||
|
lt: Optional[float] = None,
|
||
|
le: Optional[float] = None,
|
||
|
min_length: Optional[int] = None,
|
||
|
max_length: Optional[int] = None,
|
||
|
pattern: Optional[str] = None,
|
||
|
regex: Annotated[
|
||
|
Optional[str],
|
||
|
deprecated(
|
||
|
"Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
|
||
|
),
|
||
|
] = None,
|
||
|
discriminator: Union[str, None] = None,
|
||
|
strict: Union[bool, None] = _Unset,
|
||
|
multiple_of: Union[float, None] = _Unset,
|
||
|
allow_inf_nan: Union[bool, None] = _Unset,
|
||
|
max_digits: Union[int, None] = _Unset,
|
||
|
decimal_places: Union[int, None] = _Unset,
|
||
|
examples: Optional[List[Any]] = None,
|
||
|
example: Annotated[
|
||
|
Optional[Any],
|
||
|
deprecated(
|
||
|
"Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
|
||
|
"although still supported. Use examples instead."
|
||
|
),
|
||
|
] = _Unset,
|
||
|
openapi_examples: Optional[Dict[str, Example]] = None,
|
||
|
deprecated: Union[deprecated, str, bool, None] = None,
|
||
|
include_in_schema: bool = True,
|
||
|
json_schema_extra: Union[Dict[str, Any], None] = None,
|
||
|
**extra: Any,
|
||
|
):
|
||
|
self.convert_underscores = convert_underscores
|
||
|
super().__init__(
|
||
|
default=default,
|
||
|
default_factory=default_factory,
|
||
|
annotation=annotation,
|
||
|
alias=alias,
|
||
|
alias_priority=alias_priority,
|
||
|
validation_alias=validation_alias,
|
||
|
serialization_alias=serialization_alias,
|
||
|
title=title,
|
||
|
description=description,
|
||
|
gt=gt,
|
||
|
ge=ge,
|
||
|
lt=lt,
|
||
|
le=le,
|
||
|
min_length=min_length,
|
||
|
max_length=max_length,
|
||
|
pattern=pattern,
|
||
|
regex=regex,
|
||
|
discriminator=discriminator,
|
||
|
strict=strict,
|
||
|
multiple_of=multiple_of,
|
||
|
allow_inf_nan=allow_inf_nan,
|
||
|
max_digits=max_digits,
|
||
|
decimal_places=decimal_places,
|
||
|
deprecated=deprecated,
|
||
|
example=example,
|
||
|
examples=examples,
|
||
|
openapi_examples=openapi_examples,
|
||
|
include_in_schema=include_in_schema,
|
||
|
json_schema_extra=json_schema_extra,
|
||
|
**extra,
|
||
|
)
|
||
|
|
||
|
|
||
|
class Cookie(Param):
|
||
|
in_ = ParamTypes.cookie
|
||
|
|
||
|
def __init__(
|
||
|
self,
|
||
|
default: Any = Undefined,
|
||
|
*,
|
||
|
default_factory: Union[Callable[[], Any], None] = _Unset,
|
||
|
annotation: Optional[Any] = None,
|
||
|
alias: Optional[str] = None,
|
||
|
alias_priority: Union[int, None] = _Unset,
|
||
|
# TODO: update when deprecating Pydantic v1, import these types
|
||
|
# validation_alias: str | AliasPath | AliasChoices | None
|
||
|
validation_alias: Union[str, None] = None,
|
||
|
serialization_alias: Union[str, None] = None,
|
||
|
title: Optional[str] = None,
|
||
|
description: Optional[str] = None,
|
||
|
gt: Optional[float] = None,
|
||
|
ge: Optional[float] = None,
|
||
|
lt: Optional[float] = None,
|
||
|
le: Optional[float] = None,
|
||
|
min_length: Optional[int] = None,
|
||
|
max_length: Optional[int] = None,
|
||
|
pattern: Optional[str] = None,
|
||
|
regex: Annotated[
|
||
|
Optional[str],
|
||
|
deprecated(
|
||
|
"Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
|
||
|
),
|
||
|
] = None,
|
||
|
discriminator: Union[str, None] = None,
|
||
|
strict: Union[bool, None] = _Unset,
|
||
|
multiple_of: Union[float, None] = _Unset,
|
||
|
allow_inf_nan: Union[bool, None] = _Unset,
|
||
|
max_digits: Union[int, None] = _Unset,
|
||
|
decimal_places: Union[int, None] = _Unset,
|
||
|
examples: Optional[List[Any]] = None,
|
||
|
example: Annotated[
|
||
|
Optional[Any],
|
||
|
deprecated(
|
||
|
"Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
|
||
|
"although still supported. Use examples instead."
|
||
|
),
|
||
|
] = _Unset,
|
||
|
openapi_examples: Optional[Dict[str, Example]] = None,
|
||
|
deprecated: Union[deprecated, str, bool, None] = None,
|
||
|
include_in_schema: bool = True,
|
||
|
json_schema_extra: Union[Dict[str, Any], None] = None,
|
||
|
**extra: Any,
|
||
|
):
|
||
|
super().__init__(
|
||
|
default=default,
|
||
|
default_factory=default_factory,
|
||
|
annotation=annotation,
|
||
|
alias=alias,
|
||
|
alias_priority=alias_priority,
|
||
|
validation_alias=validation_alias,
|
||
|
serialization_alias=serialization_alias,
|
||
|
title=title,
|
||
|
description=description,
|
||
|
gt=gt,
|
||
|
ge=ge,
|
||
|
lt=lt,
|
||
|
le=le,
|
||
|
min_length=min_length,
|
||
|
max_length=max_length,
|
||
|
pattern=pattern,
|
||
|
regex=regex,
|
||
|
discriminator=discriminator,
|
||
|
strict=strict,
|
||
|
multiple_of=multiple_of,
|
||
|
allow_inf_nan=allow_inf_nan,
|
||
|
max_digits=max_digits,
|
||
|
decimal_places=decimal_places,
|
||
|
deprecated=deprecated,
|
||
|
example=example,
|
||
|
examples=examples,
|
||
|
openapi_examples=openapi_examples,
|
||
|
include_in_schema=include_in_schema,
|
||
|
json_schema_extra=json_schema_extra,
|
||
|
**extra,
|
||
|
)
|
||
|
|
||
|
|
||
|
class Body(FieldInfo):
|
||
|
def __init__(
|
||
|
self,
|
||
|
default: Any = Undefined,
|
||
|
*,
|
||
|
default_factory: Union[Callable[[], Any], None] = _Unset,
|
||
|
annotation: Optional[Any] = None,
|
||
|
embed: bool = False,
|
||
|
media_type: str = "application/json",
|
||
|
alias: Optional[str] = None,
|
||
|
alias_priority: Union[int, None] = _Unset,
|
||
|
# TODO: update when deprecating Pydantic v1, import these types
|
||
|
# validation_alias: str | AliasPath | AliasChoices | None
|
||
|
validation_alias: Union[str, None] = None,
|
||
|
serialization_alias: Union[str, None] = None,
|
||
|
title: Optional[str] = None,
|
||
|
description: Optional[str] = None,
|
||
|
gt: Optional[float] = None,
|
||
|
ge: Optional[float] = None,
|
||
|
lt: Optional[float] = None,
|
||
|
le: Optional[float] = None,
|
||
|
min_length: Optional[int] = None,
|
||
|
max_length: Optional[int] = None,
|
||
|
pattern: Optional[str] = None,
|
||
|
regex: Annotated[
|
||
|
Optional[str],
|
||
|
deprecated(
|
||
|
"Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
|
||
|
),
|
||
|
] = None,
|
||
|
discriminator: Union[str, None] = None,
|
||
|
strict: Union[bool, None] = _Unset,
|
||
|
multiple_of: Union[float, None] = _Unset,
|
||
|
allow_inf_nan: Union[bool, None] = _Unset,
|
||
|
max_digits: Union[int, None] = _Unset,
|
||
|
decimal_places: Union[int, None] = _Unset,
|
||
|
examples: Optional[List[Any]] = None,
|
||
|
example: Annotated[
|
||
|
Optional[Any],
|
||
|
deprecated(
|
||
|
"Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
|
||
|
"although still supported. Use examples instead."
|
||
|
),
|
||
|
] = _Unset,
|
||
|
openapi_examples: Optional[Dict[str, Example]] = None,
|
||
|
deprecated: Union[deprecated, str, bool, None] = None,
|
||
|
include_in_schema: bool = True,
|
||
|
json_schema_extra: Union[Dict[str, Any], None] = None,
|
||
|
**extra: Any,
|
||
|
):
|
||
|
self.embed = embed
|
||
|
self.media_type = media_type
|
||
|
if example is not _Unset:
|
||
|
warnings.warn(
|
||
|
"`example` has been deprecated, please use `examples` instead",
|
||
|
category=DeprecationWarning,
|
||
|
stacklevel=4,
|
||
|
)
|
||
|
self.example = example
|
||
|
self.include_in_schema = include_in_schema
|
||
|
self.openapi_examples = openapi_examples
|
||
|
kwargs = dict(
|
||
|
default=default,
|
||
|
default_factory=default_factory,
|
||
|
alias=alias,
|
||
|
title=title,
|
||
|
description=description,
|
||
|
gt=gt,
|
||
|
ge=ge,
|
||
|
lt=lt,
|
||
|
le=le,
|
||
|
min_length=min_length,
|
||
|
max_length=max_length,
|
||
|
discriminator=discriminator,
|
||
|
multiple_of=multiple_of,
|
||
|
allow_nan=allow_inf_nan,
|
||
|
max_digits=max_digits,
|
||
|
decimal_places=decimal_places,
|
||
|
**extra,
|
||
|
)
|
||
|
if examples is not None:
|
||
|
kwargs["examples"] = examples
|
||
|
if regex is not None:
|
||
|
warnings.warn(
|
||
|
"`regex` has been depreacated, please use `pattern` instead",
|
||
|
category=DeprecationWarning,
|
||
|
stacklevel=4,
|
||
|
)
|
||
|
current_json_schema_extra = json_schema_extra or extra
|
||
|
if PYDANTIC_VERSION < "2.7.0":
|
||
|
self.deprecated = deprecated
|
||
|
else:
|
||
|
kwargs["deprecated"] = deprecated
|
||
|
if PYDANTIC_V2:
|
||
|
kwargs.update(
|
||
|
{
|
||
|
"annotation": annotation,
|
||
|
"alias_priority": alias_priority,
|
||
|
"validation_alias": validation_alias,
|
||
|
"serialization_alias": serialization_alias,
|
||
|
"strict": strict,
|
||
|
"json_schema_extra": current_json_schema_extra,
|
||
|
}
|
||
|
)
|
||
|
kwargs["pattern"] = pattern or regex
|
||
|
else:
|
||
|
kwargs["regex"] = pattern or regex
|
||
|
kwargs.update(**current_json_schema_extra)
|
||
|
|
||
|
use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset}
|
||
|
|
||
|
super().__init__(**use_kwargs)
|
||
|
|
||
|
def __repr__(self) -> str:
|
||
|
return f"{self.__class__.__name__}({self.default})"
|
||
|
|
||
|
|
||
|
class Form(Body):
|
||
|
def __init__(
|
||
|
self,
|
||
|
default: Any = Undefined,
|
||
|
*,
|
||
|
default_factory: Union[Callable[[], Any], None] = _Unset,
|
||
|
annotation: Optional[Any] = None,
|
||
|
media_type: str = "application/x-www-form-urlencoded",
|
||
|
alias: Optional[str] = None,
|
||
|
alias_priority: Union[int, None] = _Unset,
|
||
|
# TODO: update when deprecating Pydantic v1, import these types
|
||
|
# validation_alias: str | AliasPath | AliasChoices | None
|
||
|
validation_alias: Union[str, None] = None,
|
||
|
serialization_alias: Union[str, None] = None,
|
||
|
title: Optional[str] = None,
|
||
|
description: Optional[str] = None,
|
||
|
gt: Optional[float] = None,
|
||
|
ge: Optional[float] = None,
|
||
|
lt: Optional[float] = None,
|
||
|
le: Optional[float] = None,
|
||
|
min_length: Optional[int] = None,
|
||
|
max_length: Optional[int] = None,
|
||
|
pattern: Optional[str] = None,
|
||
|
regex: Annotated[
|
||
|
Optional[str],
|
||
|
deprecated(
|
||
|
"Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
|
||
|
),
|
||
|
] = None,
|
||
|
discriminator: Union[str, None] = None,
|
||
|
strict: Union[bool, None] = _Unset,
|
||
|
multiple_of: Union[float, None] = _Unset,
|
||
|
allow_inf_nan: Union[bool, None] = _Unset,
|
||
|
max_digits: Union[int, None] = _Unset,
|
||
|
decimal_places: Union[int, None] = _Unset,
|
||
|
examples: Optional[List[Any]] = None,
|
||
|
example: Annotated[
|
||
|
Optional[Any],
|
||
|
deprecated(
|
||
|
"Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
|
||
|
"although still supported. Use examples instead."
|
||
|
),
|
||
|
] = _Unset,
|
||
|
openapi_examples: Optional[Dict[str, Example]] = None,
|
||
|
deprecated: Union[deprecated, str, bool, None] = None,
|
||
|
include_in_schema: bool = True,
|
||
|
json_schema_extra: Union[Dict[str, Any], None] = None,
|
||
|
**extra: Any,
|
||
|
):
|
||
|
super().__init__(
|
||
|
default=default,
|
||
|
default_factory=default_factory,
|
||
|
annotation=annotation,
|
||
|
embed=True,
|
||
|
media_type=media_type,
|
||
|
alias=alias,
|
||
|
alias_priority=alias_priority,
|
||
|
validation_alias=validation_alias,
|
||
|
serialization_alias=serialization_alias,
|
||
|
title=title,
|
||
|
description=description,
|
||
|
gt=gt,
|
||
|
ge=ge,
|
||
|
lt=lt,
|
||
|
le=le,
|
||
|
min_length=min_length,
|
||
|
max_length=max_length,
|
||
|
pattern=pattern,
|
||
|
regex=regex,
|
||
|
discriminator=discriminator,
|
||
|
strict=strict,
|
||
|
multiple_of=multiple_of,
|
||
|
allow_inf_nan=allow_inf_nan,
|
||
|
max_digits=max_digits,
|
||
|
decimal_places=decimal_places,
|
||
|
deprecated=deprecated,
|
||
|
example=example,
|
||
|
examples=examples,
|
||
|
openapi_examples=openapi_examples,
|
||
|
include_in_schema=include_in_schema,
|
||
|
json_schema_extra=json_schema_extra,
|
||
|
**extra,
|
||
|
)
|
||
|
|
||
|
|
||
|
class File(Form):
|
||
|
def __init__(
|
||
|
self,
|
||
|
default: Any = Undefined,
|
||
|
*,
|
||
|
default_factory: Union[Callable[[], Any], None] = _Unset,
|
||
|
annotation: Optional[Any] = None,
|
||
|
media_type: str = "multipart/form-data",
|
||
|
alias: Optional[str] = None,
|
||
|
alias_priority: Union[int, None] = _Unset,
|
||
|
# TODO: update when deprecating Pydantic v1, import these types
|
||
|
# validation_alias: str | AliasPath | AliasChoices | None
|
||
|
validation_alias: Union[str, None] = None,
|
||
|
serialization_alias: Union[str, None] = None,
|
||
|
title: Optional[str] = None,
|
||
|
description: Optional[str] = None,
|
||
|
gt: Optional[float] = None,
|
||
|
ge: Optional[float] = None,
|
||
|
lt: Optional[float] = None,
|
||
|
le: Optional[float] = None,
|
||
|
min_length: Optional[int] = None,
|
||
|
max_length: Optional[int] = None,
|
||
|
pattern: Optional[str] = None,
|
||
|
regex: Annotated[
|
||
|
Optional[str],
|
||
|
deprecated(
|
||
|
"Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
|
||
|
),
|
||
|
] = None,
|
||
|
discriminator: Union[str, None] = None,
|
||
|
strict: Union[bool, None] = _Unset,
|
||
|
multiple_of: Union[float, None] = _Unset,
|
||
|
allow_inf_nan: Union[bool, None] = _Unset,
|
||
|
max_digits: Union[int, None] = _Unset,
|
||
|
decimal_places: Union[int, None] = _Unset,
|
||
|
examples: Optional[List[Any]] = None,
|
||
|
example: Annotated[
|
||
|
Optional[Any],
|
||
|
deprecated(
|
||
|
"Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
|
||
|
"although still supported. Use examples instead."
|
||
|
),
|
||
|
] = _Unset,
|
||
|
openapi_examples: Optional[Dict[str, Example]] = None,
|
||
|
deprecated: Union[deprecated, str, bool, None] = None,
|
||
|
include_in_schema: bool = True,
|
||
|
json_schema_extra: Union[Dict[str, Any], None] = None,
|
||
|
**extra: Any,
|
||
|
):
|
||
|
super().__init__(
|
||
|
default=default,
|
||
|
default_factory=default_factory,
|
||
|
annotation=annotation,
|
||
|
media_type=media_type,
|
||
|
alias=alias,
|
||
|
alias_priority=alias_priority,
|
||
|
validation_alias=validation_alias,
|
||
|
serialization_alias=serialization_alias,
|
||
|
title=title,
|
||
|
description=description,
|
||
|
gt=gt,
|
||
|
ge=ge,
|
||
|
lt=lt,
|
||
|
le=le,
|
||
|
min_length=min_length,
|
||
|
max_length=max_length,
|
||
|
pattern=pattern,
|
||
|
regex=regex,
|
||
|
discriminator=discriminator,
|
||
|
strict=strict,
|
||
|
multiple_of=multiple_of,
|
||
|
allow_inf_nan=allow_inf_nan,
|
||
|
max_digits=max_digits,
|
||
|
decimal_places=decimal_places,
|
||
|
deprecated=deprecated,
|
||
|
example=example,
|
||
|
examples=examples,
|
||
|
openapi_examples=openapi_examples,
|
||
|
include_in_schema=include_in_schema,
|
||
|
json_schema_extra=json_schema_extra,
|
||
|
**extra,
|
||
|
)
|
||
|
|
||
|
|
||
|
class Depends:
|
||
|
def __init__(
|
||
|
self, dependency: Optional[Callable[..., Any]] = None, *, use_cache: bool = True
|
||
|
):
|
||
|
self.dependency = dependency
|
||
|
self.use_cache = use_cache
|
||
|
|
||
|
def __repr__(self) -> str:
|
||
|
attr = getattr(self.dependency, "__name__", type(self.dependency).__name__)
|
||
|
cache = "" if self.use_cache else ", use_cache=False"
|
||
|
return f"{self.__class__.__name__}({attr}{cache})"
|
||
|
|
||
|
|
||
|
class Security(Depends):
|
||
|
def __init__(
|
||
|
self,
|
||
|
dependency: Optional[Callable[..., Any]] = None,
|
||
|
*,
|
||
|
scopes: Optional[Sequence[str]] = None,
|
||
|
use_cache: bool = True,
|
||
|
):
|
||
|
super().__init__(dependency=dependency, use_cache=use_cache)
|
||
|
self.scopes = scopes or []
|