Style: add type hints (#2217)

* style(routes): add_route argument, return typing

* style(listeners): typing

* style(views): typing as_view

* style(routes): change type hint

* style(listeners): change type hint

* style(routes): change type hint

* add some more types

* Change as_view typing

* Add some cleaner type annotations

Co-authored-by: Adam Hopkins <adam@amhopkins.com>
This commit is contained in:
YongChan Cho 2021-08-09 03:37:34 +09:00 committed by GitHub
parent 8dbda247d6
commit 08c5689441
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 26 deletions

View File

@ -1,8 +1,9 @@
from enum import Enum, auto from enum import Enum, auto
from functools import partial from functools import partial
from typing import Any, Callable, Coroutine, List, Optional, Union from typing import List, Optional, Union
from sanic.models.futures import FutureListener from sanic.models.futures import FutureListener
from sanic.models.handler_types import ListenerType
class ListenerEvent(str, Enum): class ListenerEvent(str, Enum):
@ -26,9 +27,7 @@ class ListenerMixin:
def listener( def listener(
self, self,
listener_or_event: Union[ listener_or_event: Union[ListenerType, str],
Callable[..., Coroutine[Any, Any, None]], str
],
event_or_none: Optional[str] = None, event_or_none: Optional[str] = None,
apply: bool = True, apply: bool = True,
): ):
@ -63,20 +62,20 @@ class ListenerMixin:
else: else:
return partial(register_listener, event=listener_or_event) return partial(register_listener, event=listener_or_event)
def main_process_start(self, listener): def main_process_start(self, listener: ListenerType) -> ListenerType:
return self.listener(listener, "main_process_start") return self.listener(listener, "main_process_start")
def main_process_stop(self, listener): def main_process_stop(self, listener: ListenerType) -> ListenerType:
return self.listener(listener, "main_process_stop") return self.listener(listener, "main_process_stop")
def before_server_start(self, listener): def before_server_start(self, listener: ListenerType) -> ListenerType:
return self.listener(listener, "before_server_start") return self.listener(listener, "before_server_start")
def after_server_start(self, listener): def after_server_start(self, listener: ListenerType) -> ListenerType:
return self.listener(listener, "after_server_start") return self.listener(listener, "after_server_start")
def before_server_stop(self, listener): def before_server_stop(self, listener: ListenerType) -> ListenerType:
return self.listener(listener, "before_server_stop") return self.listener(listener, "before_server_stop")
def after_server_stop(self, listener): def after_server_stop(self, listener: ListenerType) -> ListenerType:
return self.listener(listener, "after_server_stop") return self.listener(listener, "after_server_stop")

View File

@ -5,7 +5,7 @@ from os import path
from pathlib import PurePath from pathlib import PurePath
from re import sub from re import sub
from time import gmtime, strftime from time import gmtime, strftime
from typing import Iterable, List, Optional, Set, Union from typing import Callable, Iterable, List, Optional, Set, Tuple, Union
from urllib.parse import unquote from urllib.parse import unquote
from sanic_routing.route import Route # type: ignore from sanic_routing.route import Route # type: ignore
@ -21,10 +21,16 @@ from sanic.exceptions import (
from sanic.handlers import ContentRangeHandler from sanic.handlers import ContentRangeHandler
from sanic.log import error_logger from sanic.log import error_logger
from sanic.models.futures import FutureRoute, FutureStatic from sanic.models.futures import FutureRoute, FutureStatic
from sanic.models.handler_types import RouteHandler
from sanic.response import HTTPResponse, file, file_stream from sanic.response import HTTPResponse, file, file_stream
from sanic.views import CompositionView from sanic.views import CompositionView
RouteWrapper = Callable[
[RouteHandler], Union[RouteHandler, Tuple[Route, RouteHandler]]
]
class RouteMixin: class RouteMixin:
name: str name: str
@ -55,7 +61,7 @@ class RouteMixin:
unquote: bool = False, unquote: bool = False,
static: bool = False, static: bool = False,
version_prefix: str = "/v", version_prefix: str = "/v",
): ) -> RouteWrapper:
""" """
Decorate a function to be registered as a route Decorate a function to be registered as a route
@ -168,7 +174,7 @@ class RouteMixin:
def add_route( def add_route(
self, self,
handler, handler: RouteHandler,
uri: str, uri: str,
methods: Iterable[str] = frozenset({"GET"}), methods: Iterable[str] = frozenset({"GET"}),
host: Optional[str] = None, host: Optional[str] = None,
@ -177,7 +183,7 @@ class RouteMixin:
name: Optional[str] = None, name: Optional[str] = None,
stream: bool = False, stream: bool = False,
version_prefix: str = "/v", version_prefix: str = "/v",
): ) -> RouteHandler:
"""A helper method to register class instance or """A helper method to register class instance or
functions as a handler to the application url functions as a handler to the application url
routes. routes.
@ -200,7 +206,8 @@ class RouteMixin:
methods = set() methods = set()
for method in HTTP_METHODS: for method in HTTP_METHODS:
_handler = getattr(handler.view_class, method.lower(), None) view_class = getattr(handler, "view_class")
_handler = getattr(view_class, method.lower(), None)
if _handler: if _handler:
methods.add(method) methods.add(method)
if hasattr(_handler, "is_stream"): if hasattr(_handler, "is_stream"):
@ -239,7 +246,7 @@ class RouteMixin:
name: Optional[str] = None, name: Optional[str] = None,
ignore_body: bool = True, ignore_body: bool = True,
version_prefix: str = "/v", version_prefix: str = "/v",
): ) -> RouteWrapper:
""" """
Add an API URL under the **GET** *HTTP* method Add an API URL under the **GET** *HTTP* method
@ -273,7 +280,7 @@ class RouteMixin:
version: Optional[int] = None, version: Optional[int] = None,
name: Optional[str] = None, name: Optional[str] = None,
version_prefix: str = "/v", version_prefix: str = "/v",
): ) -> RouteWrapper:
""" """
Add an API URL under the **POST** *HTTP* method Add an API URL under the **POST** *HTTP* method
@ -307,7 +314,7 @@ class RouteMixin:
version: Optional[int] = None, version: Optional[int] = None,
name: Optional[str] = None, name: Optional[str] = None,
version_prefix: str = "/v", version_prefix: str = "/v",
): ) -> RouteWrapper:
""" """
Add an API URL under the **PUT** *HTTP* method Add an API URL under the **PUT** *HTTP* method
@ -341,7 +348,7 @@ class RouteMixin:
name: Optional[str] = None, name: Optional[str] = None,
ignore_body: bool = True, ignore_body: bool = True,
version_prefix: str = "/v", version_prefix: str = "/v",
): ) -> RouteWrapper:
""" """
Add an API URL under the **HEAD** *HTTP* method Add an API URL under the **HEAD** *HTTP* method
@ -383,7 +390,7 @@ class RouteMixin:
name: Optional[str] = None, name: Optional[str] = None,
ignore_body: bool = True, ignore_body: bool = True,
version_prefix: str = "/v", version_prefix: str = "/v",
): ) -> RouteWrapper:
""" """
Add an API URL under the **OPTIONS** *HTTP* method Add an API URL under the **OPTIONS** *HTTP* method
@ -425,7 +432,7 @@ class RouteMixin:
version: Optional[int] = None, version: Optional[int] = None,
name: Optional[str] = None, name: Optional[str] = None,
version_prefix: str = "/v", version_prefix: str = "/v",
): ) -> RouteWrapper:
""" """
Add an API URL under the **PATCH** *HTTP* method Add an API URL under the **PATCH** *HTTP* method
@ -469,7 +476,7 @@ class RouteMixin:
name: Optional[str] = None, name: Optional[str] = None,
ignore_body: bool = True, ignore_body: bool = True,
version_prefix: str = "/v", version_prefix: str = "/v",
): ) -> RouteWrapper:
""" """
Add an API URL under the **DELETE** *HTTP* method Add an API URL under the **DELETE** *HTTP* method
@ -847,7 +854,7 @@ class RouteMixin:
) )
) )
route, _ = self.route( route, _ = self.route( # type: ignore
uri=uri, uri=uri,
methods=["GET", "HEAD"], methods=["GET", "HEAD"],
name=name, name=name,

View File

@ -21,5 +21,5 @@ MiddlewareType = Union[RequestMiddlewareType, ResponseMiddlewareType]
ListenerType = Callable[ ListenerType = Callable[
[Sanic, AbstractEventLoop], Optional[Coroutine[Any, Any, None]] [Sanic, AbstractEventLoop], Optional[Coroutine[Any, Any, None]]
] ]
RouteHandler = Callable[..., Coroutine[Any, Any, HTTPResponse]] RouteHandler = Callable[..., Coroutine[Any, Any, Optional[HTTPResponse]]]
SignalHandler = Callable[..., Coroutine[Any, Any, None]] SignalHandler = Callable[..., Coroutine[Any, Any, None]]

View File

@ -13,6 +13,7 @@ from warnings import warn
from sanic.constants import HTTP_METHODS from sanic.constants import HTTP_METHODS
from sanic.exceptions import InvalidUsage from sanic.exceptions import InvalidUsage
from sanic.models.handler_types import RouteHandler
if TYPE_CHECKING: if TYPE_CHECKING:
@ -86,7 +87,7 @@ class HTTPMethodView:
return handler(request, *args, **kwargs) return handler(request, *args, **kwargs)
@classmethod @classmethod
def as_view(cls, *class_args, **class_kwargs): def as_view(cls, *class_args: Any, **class_kwargs: Any) -> RouteHandler:
"""Return view function for use with the routing system, that """Return view function for use with the routing system, that
dispatches request to appropriate handler method. dispatches request to appropriate handler method.
""" """
@ -100,7 +101,7 @@ class HTTPMethodView:
for decorator in cls.decorators: for decorator in cls.decorators:
view = decorator(view) view = decorator(view)
view.view_class = cls view.view_class = cls # type: ignore
view.__doc__ = cls.__doc__ view.__doc__ = cls.__doc__
view.__module__ = cls.__module__ view.__module__ = cls.__module__
view.__name__ = cls.__name__ view.__name__ = cls.__name__