import abc import os # noqa from typing import ( TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Sequence, Type, Union, overload, ) import attr from . import hdrs from .abc import AbstractView from .typedefs import Handler, PathLike if TYPE_CHECKING: from .web_request import Request from .web_response import StreamResponse from .web_urldispatcher import AbstractRoute, UrlDispatcher else: Request = StreamResponse = UrlDispatcher = AbstractRoute = None __all__ = ( "AbstractRouteDef", "RouteDef", "StaticDef", "RouteTableDef", "head", "options", "get", "post", "patch", "put", "delete", "route", "view", "static", ) class AbstractRouteDef(abc.ABC): @abc.abstractmethod def register(self, router: UrlDispatcher) -> List[AbstractRoute]: pass # pragma: no cover _HandlerType = Union[Type[AbstractView], Handler] @attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) class RouteDef(AbstractRouteDef): method: str path: str handler: _HandlerType kwargs: Dict[str, Any] def __repr__(self) -> str: info = [] for name, value in sorted(self.kwargs.items()): info.append(f", {name}={value!r}") return "<RouteDef {method} {path} -> {handler.__name__!r}" "{info}>".format( method=self.method, path=self.path, handler=self.handler, info="".join(info) ) def register(self, router: UrlDispatcher) -> List[AbstractRoute]: if self.method in hdrs.METH_ALL: reg = getattr(router, "add_" + self.method.lower()) return [reg(self.path, self.handler, **self.kwargs)] else: return [ router.add_route(self.method, self.path, self.handler, **self.kwargs) ] @attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) class StaticDef(AbstractRouteDef): prefix: str path: PathLike kwargs: Dict[str, Any] def __repr__(self) -> str: info = [] for name, value in sorted(self.kwargs.items()): info.append(f", {name}={value!r}") return "<StaticDef {prefix} -> {path}" "{info}>".format( prefix=self.prefix, path=self.path, info="".join(info) ) def register(self, router: UrlDispatcher) -> List[AbstractRoute]: resource = router.add_static(self.prefix, self.path, **self.kwargs) routes = resource.get_info().get("routes", {}) return list(routes.values()) def route(method: str, path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return RouteDef(method, path, handler, kwargs) def head(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_HEAD, path, handler, **kwargs) def options(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_OPTIONS, path, handler, **kwargs) def get( path: str, handler: _HandlerType, *, name: Optional[str] = None, allow_head: bool = True, **kwargs: Any, ) -> RouteDef: return route( hdrs.METH_GET, path, handler, name=name, allow_head=allow_head, **kwargs ) def post(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_POST, path, handler, **kwargs) def put(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_PUT, path, handler, **kwargs) def patch(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_PATCH, path, handler, **kwargs) def delete(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_DELETE, path, handler, **kwargs) def view(path: str, handler: Type[AbstractView], **kwargs: Any) -> RouteDef: return route(hdrs.METH_ANY, path, handler, **kwargs) def static(prefix: str, path: PathLike, **kwargs: Any) -> StaticDef: return StaticDef(prefix, path, kwargs) _Deco = Callable[[_HandlerType], _HandlerType] class RouteTableDef(Sequence[AbstractRouteDef]): """Route definition table""" def __init__(self) -> None: self._items: List[AbstractRouteDef] = [] def __repr__(self) -> str: return f"<RouteTableDef count={len(self._items)}>" @overload def __getitem__(self, index: int) -> AbstractRouteDef: ... @overload def __getitem__(self, index: slice) -> List[AbstractRouteDef]: ... def __getitem__(self, index): # type: ignore[no-untyped-def] return self._items[index] def __iter__(self) -> Iterator[AbstractRouteDef]: return iter(self._items) def __len__(self) -> int: return len(self._items) def __contains__(self, item: object) -> bool: return item in self._items def route(self, method: str, path: str, **kwargs: Any) -> _Deco: def inner(handler: _HandlerType) -> _HandlerType: self._items.append(RouteDef(method, path, handler, kwargs)) return handler return inner def head(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_HEAD, path, **kwargs) def get(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_GET, path, **kwargs) def post(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_POST, path, **kwargs) def put(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_PUT, path, **kwargs) def patch(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_PATCH, path, **kwargs) def delete(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_DELETE, path, **kwargs) def options(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_OPTIONS, path, **kwargs) def view(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_ANY, path, **kwargs) def static(self, prefix: str, path: PathLike, **kwargs: Any) -> None: self._items.append(StaticDef(prefix, path, kwargs))
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
.hash | Folder | 0755 |
|
|
__pycache__ | Folder | 0755 |
|
|
__init__.py | File | 7.58 KB | 0644 |
|
_cparser.pxd | File | 4.22 KB | 0644 |
|
_find_header.pxd | File | 68 B | 0644 |
|
_headers.pxi | File | 1.96 KB | 0644 |
|
_helpers.cpython-311-x86_64-linux-gnu.so | File | 86.01 KB | 0755 |
|
_helpers.pyi | File | 202 B | 0644 |
|
_helpers.pyx | File | 1.02 KB | 0644 |
|
_http_parser.cpython-311-x86_64-linux-gnu.so | File | 569.59 KB | 0755 |
|
_http_parser.pyx | File | 27.4 KB | 0644 |
|
_http_writer.cpython-311-x86_64-linux-gnu.so | File | 75.01 KB | 0755 |
|
_http_writer.pyx | File | 4.47 KB | 0644 |
|
_websocket.cpython-311-x86_64-linux-gnu.so | File | 53.37 KB | 0755 |
|
_websocket.pyx | File | 1.52 KB | 0644 |
|
abc.py | File | 5.37 KB | 0644 |
|
base_protocol.py | File | 2.68 KB | 0644 |
|
client.py | File | 46.17 KB | 0644 |
|
client_exceptions.py | File | 9.19 KB | 0644 |
|
client_proto.py | File | 8.45 KB | 0644 |
|
client_reqrep.py | File | 38.75 KB | 0644 |
|
client_ws.py | File | 10.75 KB | 0644 |
|
compression_utils.py | File | 4.9 KB | 0644 |
|
connector.py | File | 51.56 KB | 0644 |
|
cookiejar.py | File | 13.69 KB | 0644 |
|
formdata.py | File | 5.96 KB | 0644 |
|
hdrs.py | File | 4.5 KB | 0644 |
|
helpers.py | File | 29.55 KB | 0644 |
|
http.py | File | 1.8 KB | 0644 |
|
http_exceptions.py | File | 2.65 KB | 0644 |
|
http_parser.py | File | 34.66 KB | 0644 |
|
http_websocket.py | File | 26.09 KB | 0644 |
|
http_writer.py | File | 5.79 KB | 0644 |
|
locks.py | File | 1.11 KB | 0644 |
|
log.py | File | 325 B | 0644 |
|
multipart.py | File | 31.71 KB | 0644 |
|
payload.py | File | 13.22 KB | 0644 |
|
payload_streamer.py | File | 2.04 KB | 0644 |
|
py.typed | File | 7 B | 0644 |
|
pytest_plugin.py | File | 11.33 KB | 0644 |
|
resolver.py | File | 4.95 KB | 0644 |
|
streams.py | File | 20.35 KB | 0644 |
|
tcp_helpers.py | File | 961 B | 0644 |
|
test_utils.py | File | 19.71 KB | 0644 |
|
tracing.py | File | 14.78 KB | 0644 |
|
typedefs.py | File | 1.44 KB | 0644 |
|
web.py | File | 18.81 KB | 0644 |
|
web_app.py | File | 17.88 KB | 0644 |
|
web_exceptions.py | File | 10.12 KB | 0644 |
|
web_fileresponse.py | File | 11.15 KB | 0644 |
|
web_log.py | File | 7.62 KB | 0644 |
|
web_middlewares.py | File | 3.94 KB | 0644 |
|
web_protocol.py | File | 22.5 KB | 0644 |
|
web_request.py | File | 28.08 KB | 0644 |
|
web_response.py | File | 27.08 KB | 0644 |
|
web_routedef.py | File | 5.99 KB | 0644 |
|
web_runner.py | File | 11.46 KB | 0644 |
|
web_server.py | File | 2.53 KB | 0644 |
|
web_urldispatcher.py | File | 39.12 KB | 0644 |
|
web_ws.py | File | 18.21 KB | 0644 |
|
worker.py | File | 7.78 KB | 0644 |
|