Coverage for /pythoncovmergedfiles/medio/medio/src/aiohttp/aiohttp/web_routedef.py: 57%
106 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:52 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:52 +0000
1import abc
2import dataclasses
3import os # noqa
4from typing import (
5 TYPE_CHECKING,
6 Any,
7 Callable,
8 Dict,
9 Iterator,
10 List,
11 Optional,
12 Sequence,
13 Type,
14 Union,
15 overload,
16)
18from . import hdrs
19from .abc import AbstractView
20from .typedefs import Handler, PathLike
22if TYPE_CHECKING: # pragma: no cover
23 from .web_request import Request
24 from .web_response import StreamResponse
25 from .web_urldispatcher import AbstractRoute, UrlDispatcher
26else:
27 Request = StreamResponse = UrlDispatcher = AbstractRoute = None
30__all__ = (
31 "AbstractRouteDef",
32 "RouteDef",
33 "StaticDef",
34 "RouteTableDef",
35 "head",
36 "options",
37 "get",
38 "post",
39 "patch",
40 "put",
41 "delete",
42 "route",
43 "view",
44 "static",
45)
48class AbstractRouteDef(abc.ABC):
49 @abc.abstractmethod
50 def register(self, router: UrlDispatcher) -> List[AbstractRoute]:
51 pass # pragma: no cover
54_HandlerType = Union[Type[AbstractView], Handler]
57@dataclasses.dataclass(frozen=True, repr=False)
58class RouteDef(AbstractRouteDef):
59 method: str
60 path: str
61 handler: _HandlerType
62 kwargs: Dict[str, Any]
64 def __repr__(self) -> str:
65 info = []
66 for name, value in sorted(self.kwargs.items()):
67 info.append(f", {name}={value!r}")
68 return "<RouteDef {method} {path} -> {handler.__name__!r}" "{info}>".format(
69 method=self.method, path=self.path, handler=self.handler, info="".join(info)
70 )
72 def register(self, router: UrlDispatcher) -> List[AbstractRoute]:
73 if self.method in hdrs.METH_ALL:
74 reg = getattr(router, "add_" + self.method.lower())
75 return [reg(self.path, self.handler, **self.kwargs)]
76 else:
77 return [
78 router.add_route(self.method, self.path, self.handler, **self.kwargs)
79 ]
82@dataclasses.dataclass(frozen=True, repr=False)
83class StaticDef(AbstractRouteDef):
84 prefix: str
85 path: PathLike
86 kwargs: Dict[str, Any]
88 def __repr__(self) -> str:
89 info = []
90 for name, value in sorted(self.kwargs.items()):
91 info.append(f", {name}={value!r}")
92 return "<StaticDef {prefix} -> {path}" "{info}>".format(
93 prefix=self.prefix, path=self.path, info="".join(info)
94 )
96 def register(self, router: UrlDispatcher) -> List[AbstractRoute]:
97 resource = router.add_static(self.prefix, self.path, **self.kwargs)
98 routes = resource.get_info().get("routes", {})
99 return list(routes.values())
102def route(method: str, path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
103 return RouteDef(method, path, handler, kwargs)
106def head(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
107 return route(hdrs.METH_HEAD, path, handler, **kwargs)
110def options(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
111 return route(hdrs.METH_OPTIONS, path, handler, **kwargs)
114def get(
115 path: str,
116 handler: _HandlerType,
117 *,
118 name: Optional[str] = None,
119 allow_head: bool = True,
120 **kwargs: Any,
121) -> RouteDef:
122 return route(
123 hdrs.METH_GET, path, handler, name=name, allow_head=allow_head, **kwargs
124 )
127def post(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
128 return route(hdrs.METH_POST, path, handler, **kwargs)
131def put(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
132 return route(hdrs.METH_PUT, path, handler, **kwargs)
135def patch(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
136 return route(hdrs.METH_PATCH, path, handler, **kwargs)
139def delete(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
140 return route(hdrs.METH_DELETE, path, handler, **kwargs)
143def view(path: str, handler: Type[AbstractView], **kwargs: Any) -> RouteDef:
144 return route(hdrs.METH_ANY, path, handler, **kwargs)
147def static(prefix: str, path: PathLike, **kwargs: Any) -> StaticDef:
148 return StaticDef(prefix, path, kwargs)
151_Deco = Callable[[_HandlerType], _HandlerType]
154class RouteTableDef(Sequence[AbstractRouteDef]):
155 """Route definition table"""
157 def __init__(self) -> None:
158 self._items: List[AbstractRouteDef] = []
160 def __repr__(self) -> str:
161 return f"<RouteTableDef count={len(self._items)}>"
163 @overload
164 def __getitem__(self, index: int) -> AbstractRouteDef:
165 ...
167 @overload
168 def __getitem__(self, index: slice) -> List[AbstractRouteDef]:
169 ...
171 def __getitem__(self, index): # type: ignore[no-untyped-def]
172 return self._items[index]
174 def __iter__(self) -> Iterator[AbstractRouteDef]:
175 return iter(self._items)
177 def __len__(self) -> int:
178 return len(self._items)
180 def __contains__(self, item: object) -> bool:
181 return item in self._items
183 def route(self, method: str, path: str, **kwargs: Any) -> _Deco:
184 def inner(handler: _HandlerType) -> _HandlerType:
185 self._items.append(RouteDef(method, path, handler, kwargs))
186 return handler
188 return inner
190 def head(self, path: str, **kwargs: Any) -> _Deco:
191 return self.route(hdrs.METH_HEAD, path, **kwargs)
193 def get(self, path: str, **kwargs: Any) -> _Deco:
194 return self.route(hdrs.METH_GET, path, **kwargs)
196 def post(self, path: str, **kwargs: Any) -> _Deco:
197 return self.route(hdrs.METH_POST, path, **kwargs)
199 def put(self, path: str, **kwargs: Any) -> _Deco:
200 return self.route(hdrs.METH_PUT, path, **kwargs)
202 def patch(self, path: str, **kwargs: Any) -> _Deco:
203 return self.route(hdrs.METH_PATCH, path, **kwargs)
205 def delete(self, path: str, **kwargs: Any) -> _Deco:
206 return self.route(hdrs.METH_DELETE, path, **kwargs)
208 def options(self, path: str, **kwargs: Any) -> _Deco:
209 return self.route(hdrs.METH_OPTIONS, path, **kwargs)
211 def view(self, path: str, **kwargs: Any) -> _Deco:
212 return self.route(hdrs.METH_ANY, path, **kwargs)
214 def static(self, prefix: str, path: PathLike, **kwargs: Any) -> None:
215 self._items.append(StaticDef(prefix, path, kwargs))