113 lines
3.3 KiB
Python
113 lines
3.3 KiB
Python
from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Pattern, TypeVar, Union
|
|
|
|
from typing_extensions import Annotated
|
|
|
|
from ninja.params import functions as param_functions
|
|
|
|
__all__ = [
|
|
"Body",
|
|
"Cookie",
|
|
"File",
|
|
"Form",
|
|
"Header",
|
|
"Path",
|
|
"Query",
|
|
"BodyEx",
|
|
"CookieEx",
|
|
"FileEx",
|
|
"FormEx",
|
|
"HeaderEx",
|
|
"PathEx",
|
|
"QueryEx",
|
|
"P",
|
|
]
|
|
|
|
|
|
class ParamShortcut:
|
|
def __init__(self, base_func: Callable[..., Any]) -> None:
|
|
self._base_func = base_func
|
|
|
|
def __call__(self, *args: Any, **kwargs: Any) -> Any:
|
|
return self._base_func(*args, **kwargs)
|
|
|
|
def __getitem__(self, args: Any) -> Any:
|
|
if isinstance(args, tuple):
|
|
return Annotated[args[0], self._base_func(**args[1])]
|
|
return Annotated[args, self._base_func()]
|
|
|
|
|
|
if TYPE_CHECKING: # pragma: nocover
|
|
# mypy cheats
|
|
T = TypeVar("T")
|
|
Body = Annotated[T, param_functions.Body()]
|
|
Cookie = Annotated[T, param_functions.Cookie()]
|
|
File = Annotated[T, param_functions.File()]
|
|
Form = Annotated[T, param_functions.Form()]
|
|
Header = Annotated[T, param_functions.Header()]
|
|
Path = Annotated[T, param_functions.Path()]
|
|
Query = Annotated[T, param_functions.Query()]
|
|
# mypy does not like to extend already annotated params
|
|
# with extra annotation (so need to cheat with these XXX-Ex types):
|
|
from typing_extensions import Annotated as BodyEx
|
|
from typing_extensions import Annotated as CookieEx
|
|
from typing_extensions import Annotated as FileEx
|
|
from typing_extensions import Annotated as FormEx
|
|
from typing_extensions import Annotated as HeaderEx
|
|
from typing_extensions import Annotated as PathEx
|
|
from typing_extensions import Annotated as QueryEx
|
|
else:
|
|
Body = ParamShortcut(param_functions.Body)
|
|
Cookie = ParamShortcut(param_functions.Cookie)
|
|
File = ParamShortcut(param_functions.File)
|
|
Form = ParamShortcut(param_functions.Form)
|
|
Header = ParamShortcut(param_functions.Header)
|
|
Path = ParamShortcut(param_functions.Path)
|
|
Query = ParamShortcut(param_functions.Query)
|
|
# mypy does not like to extend already annotated params
|
|
# with extra annotation (so need to cheat with these XXX-Ex types):
|
|
BodyEx = Body
|
|
CookieEx = Cookie
|
|
FileEx = File
|
|
FormEx = Form
|
|
HeaderEx = Header
|
|
PathEx = Path
|
|
QueryEx = Query
|
|
|
|
|
|
def P(
|
|
*,
|
|
alias: Optional[str] = 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: Union[str, Pattern[str], None] = None,
|
|
example: Any = None,
|
|
examples: Optional[Dict[str, Any]] = None,
|
|
deprecated: Optional[bool] = None,
|
|
include_in_schema: bool = True,
|
|
**extra: Any,
|
|
) -> Dict[str, Any]:
|
|
"Arguments for BodyEx, QueryEx, etc."
|
|
return dict(
|
|
alias=alias,
|
|
title=title,
|
|
description=description,
|
|
gt=gt,
|
|
ge=ge,
|
|
lt=lt,
|
|
le=le,
|
|
min_length=min_length,
|
|
max_length=max_length,
|
|
pattern=pattern,
|
|
example=example,
|
|
examples=examples,
|
|
deprecated=deprecated,
|
|
include_in_schema=include_in_schema,
|
|
**extra,
|
|
)
|