Coverage for /pythoncovmergedfiles/medio/medio/src/aiohttp/aiohttp/web_routedef.py: 56%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import abc
2import dataclasses
3from typing import (
4 TYPE_CHECKING,
5 Any,
6 Callable,
7 Dict,
8 Iterator,
9 List,
10 Optional,
11 Sequence,
12 Type,
13 Union,
14 overload,
15)
17from . import hdrs
18from .abc import AbstractView
19from .typedefs import Handler, PathLike
21if TYPE_CHECKING:
22 from .web_request import Request
23 from .web_response import StreamResponse
24 from .web_urldispatcher import AbstractRoute, UrlDispatcher
25else:
26 Request = StreamResponse = UrlDispatcher = AbstractRoute = None
29__all__ = (
30 "AbstractRouteDef",
31 "RouteDef",
32 "StaticDef",
33 "RouteTableDef",
34 "head",
35 "options",
36 "get",
37 "post",
38 "patch",
39 "put",
40 "delete",
41 "route",
42 "view",
43 "static",
44)
47class AbstractRouteDef(abc.ABC):
48 @abc.abstractmethod
49 def register(self, router: UrlDispatcher) -> List[AbstractRoute]:
50 """Register itself into the given router."""
53_HandlerType = Union[Type[AbstractView], Handler]
56@dataclasses.dataclass(frozen=True, repr=False)
57class RouteDef(AbstractRouteDef): # type: ignore[misc]
58 method: str
59 path: str
60 handler: _HandlerType
61 kwargs: Dict[str, Any]
63 def __repr__(self) -> str:
64 info = []
65 for name, value in sorted(self.kwargs.items()):
66 info.append(f", {name}={value!r}")
67 return "<RouteDef {method} {path} -> {handler.__name__!r}{info}>".format(
68 method=self.method, path=self.path, handler=self.handler, info="".join(info)
69 )
71 def register(self, router: UrlDispatcher) -> List[AbstractRoute]:
72 if self.method in hdrs.METH_ALL:
73 reg = getattr(router, "add_" + self.method.lower())
74 return [reg(self.path, self.handler, **self.kwargs)]
75 else:
76 return [
77 router.add_route(self.method, self.path, self.handler, **self.kwargs)
78 ]
81@dataclasses.dataclass(frozen=True, repr=False)
82class StaticDef(AbstractRouteDef): # type: ignore[misc]
83 prefix: str
84 path: PathLike
85 kwargs: Dict[str, Any]
87 def __repr__(self) -> str:
88 info = []
89 for name, value in sorted(self.kwargs.items()):
90 info.append(f", {name}={value!r}")
91 return "<StaticDef {prefix} -> {path}{info}>".format(
92 prefix=self.prefix, path=self.path, info="".join(info)
93 )
95 def register(self, router: UrlDispatcher) -> List[AbstractRoute]:
96 resource = router.add_static(self.prefix, self.path, **self.kwargs)
97 routes = resource.get_info().get("routes", {})
98 return list(routes.values())
101def route(method: str, path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
102 return RouteDef(method, path, handler, kwargs)
105def head(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
106 return route(hdrs.METH_HEAD, path, handler, **kwargs)
109def options(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
110 return route(hdrs.METH_OPTIONS, path, handler, **kwargs)
113def get(
114 path: str,
115 handler: _HandlerType,
116 *,
117 name: Optional[str] = None,
118 allow_head: bool = True,
119 **kwargs: Any,
120) -> RouteDef:
121 return route(
122 hdrs.METH_GET, path, handler, name=name, allow_head=allow_head, **kwargs
123 )
126def post(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
127 return route(hdrs.METH_POST, path, handler, **kwargs)
130def put(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
131 return route(hdrs.METH_PUT, path, handler, **kwargs)
134def patch(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
135 return route(hdrs.METH_PATCH, path, handler, **kwargs)
138def delete(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
139 return route(hdrs.METH_DELETE, path, handler, **kwargs)
142def view(path: str, handler: Type[AbstractView], **kwargs: Any) -> RouteDef:
143 return route(hdrs.METH_ANY, path, handler, **kwargs)
146def static(prefix: str, path: PathLike, **kwargs: Any) -> StaticDef:
147 return StaticDef(prefix, path, kwargs)
150_Deco = Callable[[_HandlerType], _HandlerType]
153class RouteTableDef(Sequence[AbstractRouteDef]):
154 """Route definition table"""
156 def __init__(self) -> None:
157 self._items: List[AbstractRouteDef] = []
159 def __repr__(self) -> str:
160 return f"<RouteTableDef count={len(self._items)}>"
162 @overload
163 def __getitem__(self, index: int) -> AbstractRouteDef: ...
165 @overload
166 def __getitem__(self, index: "slice[int, int, int]") -> List[AbstractRouteDef]: ...
168 def __getitem__(
169 self, index: Union[int, "slice[int, int, int]"]
170 ) -> Union[AbstractRouteDef, List[AbstractRouteDef]]:
171 return self._items[index]
173 def __iter__(self) -> Iterator[AbstractRouteDef]:
174 return iter(self._items)
176 def __len__(self) -> int:
177 return len(self._items)
179 def __contains__(self, item: object) -> bool:
180 return item in self._items
182 def route(self, method: str, path: str, **kwargs: Any) -> _Deco:
183 def inner(handler: _HandlerType) -> _HandlerType:
184 self._items.append(RouteDef(method, path, handler, kwargs))
185 return handler
187 return inner
189 def head(self, path: str, **kwargs: Any) -> _Deco:
190 return self.route(hdrs.METH_HEAD, path, **kwargs)
192 def get(self, path: str, **kwargs: Any) -> _Deco:
193 return self.route(hdrs.METH_GET, path, **kwargs)
195 def post(self, path: str, **kwargs: Any) -> _Deco:
196 return self.route(hdrs.METH_POST, path, **kwargs)
198 def put(self, path: str, **kwargs: Any) -> _Deco:
199 return self.route(hdrs.METH_PUT, path, **kwargs)
201 def patch(self, path: str, **kwargs: Any) -> _Deco:
202 return self.route(hdrs.METH_PATCH, path, **kwargs)
204 def delete(self, path: str, **kwargs: Any) -> _Deco:
205 return self.route(hdrs.METH_DELETE, path, **kwargs)
207 def options(self, path: str, **kwargs: Any) -> _Deco:
208 return self.route(hdrs.METH_OPTIONS, path, **kwargs)
210 def view(self, path: str, **kwargs: Any) -> _Deco:
211 return self.route(hdrs.METH_ANY, path, **kwargs)
213 def static(self, prefix: str, path: PathLike, **kwargs: Any) -> None:
214 self._items.append(StaticDef(prefix, path, kwargs))