|
10 | 10 | Iterable,
|
11 | 11 | Mapping,
|
12 | 12 | Optional,
|
| 13 | + TypeVar, |
13 | 14 | Union,
|
14 | 15 | cast,
|
15 | 16 | overload,
|
|
33 | 34 |
|
34 | 35 | _TemplateReturnType = Awaitable[Union[web.StreamResponse, Mapping[str, Any]]]
|
35 | 36 | _SimpleTemplateHandler = Callable[[web.Request], _TemplateReturnType]
|
36 |
| -_MethodTemplateHandler = Callable[[Any, web.Request], _TemplateReturnType] |
37 |
| -_ViewTemplateHandler = Callable[[AbstractView], _TemplateReturnType] |
38 |
| -_TemplateHandler = Union[ |
39 |
| - _SimpleTemplateHandler, _MethodTemplateHandler, _ViewTemplateHandler |
40 |
| -] |
41 |
| - |
42 | 37 | _ContextProcessor = Callable[[web.Request], Awaitable[Dict[str, Any]]]
|
43 | 38 |
|
| 39 | +_T = TypeVar("_T") |
| 40 | +_AbstractView = TypeVar("_AbstractView", bound=AbstractView) |
| 41 | + |
44 | 42 | if sys.version_info >= (3, 8):
|
45 | 43 | from typing import Protocol
|
46 | 44 |
|
47 |
| - class _TemplateWrapped(Protocol): |
| 45 | + class _TemplateWrapper(Protocol): |
48 | 46 | @overload
|
49 |
| - async def __call__(self, request: web.Request) -> web.StreamResponse: |
| 47 | + def __call__( |
| 48 | + self, func: _SimpleTemplateHandler |
| 49 | + ) -> Callable[[web.Request], Awaitable[web.StreamResponse]]: |
50 | 50 | ...
|
51 | 51 |
|
52 | 52 | @overload
|
53 |
| - async def __call__(self, view: AbstractView) -> web.StreamResponse: |
| 53 | + def __call__( |
| 54 | + self, func: Callable[[_AbstractView], _TemplateReturnType] |
| 55 | + ) -> Callable[[_AbstractView], Awaitable[web.StreamResponse]]: |
54 | 56 | ...
|
55 | 57 |
|
56 | 58 | @overload
|
57 |
| - async def __call__( |
58 |
| - self, _self: Any, request: web.Request |
59 |
| - ) -> web.StreamResponse: |
| 59 | + def __call__( |
| 60 | + self, func: Callable[[_T, web.Request], _TemplateReturnType] |
| 61 | + ) -> Callable[[_T, web.Request], Awaitable[web.StreamResponse]]: |
60 | 62 | ...
|
61 | 63 |
|
62 | 64 |
|
63 | 65 | else:
|
64 |
| - _TemplateWrapped = Callable[..., web.StreamResponse] |
| 66 | + _TemplateHandler = Callable[..., _TemplateReturnType] |
| 67 | + _WebHandler = Callable[..., Awaitable[web.StreamResponse]] |
| 68 | + _TemplateWrapper = Callable[[_TemplateHandler], _WebHandler] |
65 | 69 |
|
66 | 70 |
|
67 | 71 | def setup(
|
@@ -151,20 +155,28 @@ def template(
|
151 | 155 | app_key: str = APP_KEY,
|
152 | 156 | encoding: str = "utf-8",
|
153 | 157 | status: int = 200,
|
154 |
| -) -> Callable[[_TemplateHandler], _TemplateWrapped]: |
155 |
| - def wrapper(func: _TemplateHandler) -> _TemplateWrapped: |
156 |
| - @overload |
157 |
| - async def wrapped(request: web.Request) -> web.StreamResponse: |
158 |
| - ... |
159 |
| - |
160 |
| - @overload |
161 |
| - async def wrapped(view: AbstractView) -> web.StreamResponse: |
162 |
| - ... |
163 |
| - |
164 |
| - @overload |
165 |
| - async def wrapped(_self: Any, request: web.Request) -> web.StreamResponse: |
166 |
| - ... |
167 |
| - |
| 158 | +) -> _TemplateWrapper: |
| 159 | + @overload |
| 160 | + def wrapper( |
| 161 | + func: _SimpleTemplateHandler, |
| 162 | + ) -> Callable[[web.Request], Awaitable[web.StreamResponse]]: |
| 163 | + ... |
| 164 | + |
| 165 | + @overload |
| 166 | + def wrapper( |
| 167 | + func: Callable[[_AbstractView], _TemplateReturnType] |
| 168 | + ) -> Callable[[_AbstractView], Awaitable[web.StreamResponse]]: |
| 169 | + ... |
| 170 | + |
| 171 | + @overload |
| 172 | + def wrapper( |
| 173 | + func: Callable[[_T, web.Request], _TemplateReturnType] |
| 174 | + ) -> Callable[[_T, web.Request], Awaitable[web.StreamResponse]]: |
| 175 | + ... |
| 176 | + |
| 177 | + def wrapper( |
| 178 | + func: Callable[..., _TemplateReturnType] |
| 179 | + ) -> Callable[..., Awaitable[web.StreamResponse]]: |
168 | 180 | @functools.wraps(func)
|
169 | 181 | async def wrapped(*args: Any) -> web.StreamResponse:
|
170 | 182 | if asyncio.iscoroutinefunction(func):
|
|
0 commit comments