Skip to content

Commit 94a61ab

Browse files
committed
Remove 3.8 and add 3.13
1 parent 4327b8b commit 94a61ab

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+446
-540
lines changed

sanic/app.py

+56-72
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
)
1717
from asyncio.futures import Future
1818
from collections import defaultdict, deque
19+
from collections.abc import Awaitable, Coroutine, Iterable, Iterator
1920
from contextlib import contextmanager, suppress
2021
from enum import Enum
2122
from functools import partial, wraps
@@ -29,21 +30,12 @@
2930
TYPE_CHECKING,
3031
Any,
3132
AnyStr,
32-
Awaitable,
3333
Callable,
3434
ClassVar,
35-
Coroutine,
3635
Deque,
37-
Dict,
3836
Generic,
39-
Iterable,
40-
Iterator,
41-
List,
4237
Literal,
4338
Optional,
44-
Set,
45-
Tuple,
46-
Type,
4739
TypeVar,
4840
Union,
4941
cast,
@@ -105,7 +97,7 @@
10597
from sanic_ext import Extend # type: ignore
10698
from sanic_ext.extensions.base import Extension # type: ignore
10799
except ImportError:
108-
Extend = TypeVar("Extend", Type) # type: ignore
100+
Extend = TypeVar("Extend", type) # type: ignore
109101

110102

111103
if OS_IS_WINDOWS: # no cov
@@ -229,7 +221,7 @@ class to use for the application. Defaults to `None`.
229221
"websocket_tasks",
230222
)
231223

232-
_app_registry: ClassVar[Dict[str, "Sanic"]] = {}
224+
_app_registry: ClassVar[dict[str, Sanic]] = {}
233225
test_mode: ClassVar[bool] = False
234226

235227
@overload
@@ -242,15 +234,15 @@ def __init__(
242234
signal_router: Optional[SignalRouter] = None,
243235
error_handler: Optional[ErrorHandler] = None,
244236
env_prefix: Optional[str] = SANIC_PREFIX,
245-
request_class: Optional[Type[Request]] = None,
237+
request_class: Optional[type[Request]] = None,
246238
strict_slashes: bool = False,
247-
log_config: Optional[Dict[str, Any]] = None,
239+
log_config: Optional[dict[str, Any]] = None,
248240
configure_logging: bool = True,
249241
dumps: Optional[Callable[..., AnyStr]] = None,
250242
loads: Optional[Callable[..., Any]] = None,
251243
inspector: bool = False,
252-
inspector_class: Optional[Type[Inspector]] = None,
253-
certloader_class: Optional[Type[CertLoader]] = None,
244+
inspector_class: Optional[type[Inspector]] = None,
245+
certloader_class: Optional[type[CertLoader]] = None,
254246
) -> None: ...
255247

256248
@overload
@@ -263,15 +255,15 @@ def __init__(
263255
signal_router: Optional[SignalRouter] = None,
264256
error_handler: Optional[ErrorHandler] = None,
265257
env_prefix: Optional[str] = SANIC_PREFIX,
266-
request_class: Optional[Type[Request]] = None,
258+
request_class: Optional[type[Request]] = None,
267259
strict_slashes: bool = False,
268-
log_config: Optional[Dict[str, Any]] = None,
260+
log_config: Optional[dict[str, Any]] = None,
269261
configure_logging: bool = True,
270262
dumps: Optional[Callable[..., AnyStr]] = None,
271263
loads: Optional[Callable[..., Any]] = None,
272264
inspector: bool = False,
273-
inspector_class: Optional[Type[Inspector]] = None,
274-
certloader_class: Optional[Type[CertLoader]] = None,
265+
inspector_class: Optional[type[Inspector]] = None,
266+
certloader_class: Optional[type[CertLoader]] = None,
275267
) -> None: ...
276268

277269
@overload
@@ -284,15 +276,15 @@ def __init__(
284276
signal_router: Optional[SignalRouter] = None,
285277
error_handler: Optional[ErrorHandler] = None,
286278
env_prefix: Optional[str] = SANIC_PREFIX,
287-
request_class: Optional[Type[Request]] = None,
279+
request_class: Optional[type[Request]] = None,
288280
strict_slashes: bool = False,
289-
log_config: Optional[Dict[str, Any]] = None,
281+
log_config: Optional[dict[str, Any]] = None,
290282
configure_logging: bool = True,
291283
dumps: Optional[Callable[..., AnyStr]] = None,
292284
loads: Optional[Callable[..., Any]] = None,
293285
inspector: bool = False,
294-
inspector_class: Optional[Type[Inspector]] = None,
295-
certloader_class: Optional[Type[CertLoader]] = None,
286+
inspector_class: Optional[type[Inspector]] = None,
287+
certloader_class: Optional[type[CertLoader]] = None,
296288
) -> None: ...
297289

298290
@overload
@@ -305,15 +297,15 @@ def __init__(
305297
signal_router: Optional[SignalRouter] = None,
306298
error_handler: Optional[ErrorHandler] = None,
307299
env_prefix: Optional[str] = SANIC_PREFIX,
308-
request_class: Optional[Type[Request]] = None,
300+
request_class: Optional[type[Request]] = None,
309301
strict_slashes: bool = False,
310-
log_config: Optional[Dict[str, Any]] = None,
302+
log_config: Optional[dict[str, Any]] = None,
311303
configure_logging: bool = True,
312304
dumps: Optional[Callable[..., AnyStr]] = None,
313305
loads: Optional[Callable[..., Any]] = None,
314306
inspector: bool = False,
315-
inspector_class: Optional[Type[Inspector]] = None,
316-
certloader_class: Optional[Type[CertLoader]] = None,
307+
inspector_class: Optional[type[Inspector]] = None,
308+
certloader_class: Optional[type[CertLoader]] = None,
317309
) -> None: ...
318310

319311
def __init__(
@@ -325,15 +317,15 @@ def __init__(
325317
signal_router: Optional[SignalRouter] = None,
326318
error_handler: Optional[ErrorHandler] = None,
327319
env_prefix: Optional[str] = SANIC_PREFIX,
328-
request_class: Optional[Type[Request]] = None,
320+
request_class: Optional[type[Request]] = None,
329321
strict_slashes: bool = False,
330-
log_config: Optional[Dict[str, Any]] = None,
322+
log_config: Optional[dict[str, Any]] = None,
331323
configure_logging: bool = True,
332324
dumps: Optional[Callable[..., AnyStr]] = None,
333325
loads: Optional[Callable[..., Any]] = None,
334326
inspector: bool = False,
335-
inspector_class: Optional[Type[Inspector]] = None,
336-
certloader_class: Optional[Type[CertLoader]] = None,
327+
inspector_class: Optional[type[Inspector]] = None,
328+
certloader_class: Optional[type[CertLoader]] = None,
337329
) -> None:
338330
super().__init__(name=name)
339331
# logging
@@ -358,28 +350,28 @@ def __init__(
358350
self._asgi_app: Optional[ASGIApp] = None
359351
self._asgi_lifespan: Optional[Lifespan] = None
360352
self._asgi_client: Any = None
361-
self._blueprint_order: List[Blueprint] = []
362-
self._delayed_tasks: List[str] = []
353+
self._blueprint_order: list[Blueprint] = []
354+
self._delayed_tasks: list[str] = []
363355
self._future_registry: FutureRegistry = FutureRegistry()
364356
self._inspector: Optional[Inspector] = None
365357
self._manager: Optional[WorkerManager] = None
366358
self._state: ApplicationState = ApplicationState(app=self)
367-
self._task_registry: Dict[str, Union[Task, None]] = {}
359+
self._task_registry: dict[str, Union[Task, None]] = {}
368360
self._test_client: Any = None
369361
self._test_manager: Any = None
370362
self.asgi = False
371363
self.auto_reload = False
372-
self.blueprints: Dict[str, Blueprint] = {}
373-
self.certloader_class: Type[CertLoader] = (
364+
self.blueprints: dict[str, Blueprint] = {}
365+
self.certloader_class: type[CertLoader] = (
374366
certloader_class or CertLoader
375367
)
376368
self.configure_logging: bool = configure_logging
377369
self.ctx: ctx_type = cast(ctx_type, ctx or SimpleNamespace())
378370
self.error_handler: ErrorHandler = error_handler or ErrorHandler()
379-
self.inspector_class: Type[Inspector] = inspector_class or Inspector
380-
self.listeners: Dict[str, List[ListenerType[Any]]] = defaultdict(list)
381-
self.named_request_middleware: Dict[str, Deque[Middleware]] = {}
382-
self.named_response_middleware: Dict[str, Deque[Middleware]] = {}
371+
self.inspector_class: type[Inspector] = inspector_class or Inspector
372+
self.listeners: dict[str, list[ListenerType[Any]]] = defaultdict(list)
373+
self.named_request_middleware: dict[str, Deque[Middleware]] = {}
374+
self.named_response_middleware: dict[str, Deque[Middleware]] = {}
383375
self.request_class = request_class or Request
384376
self.request_middleware: Deque[Middleware] = deque()
385377
self.response_middleware: Deque[Middleware] = deque()
@@ -389,7 +381,7 @@ def __init__(
389381
self.sock: Optional[socket] = None
390382
self.strict_slashes: bool = strict_slashes
391383
self.websocket_enabled: bool = False
392-
self.websocket_tasks: Set[Future[Any]] = set()
384+
self.websocket_tasks: set[Future[Any]] = set()
393385

394386
# Register alternative method names
395387
self.go_fast = self.run
@@ -572,7 +564,7 @@ def register_named_middleware(
572564
def _apply_exception_handler(
573565
self,
574566
handler: FutureException,
575-
route_names: Optional[List[str]] = None,
567+
route_names: Optional[list[str]] = None,
576568
):
577569
"""Decorate a function to be registered as a handler for exceptions
578570
@@ -595,7 +587,7 @@ def _apply_listener(self, listener: FutureListener):
595587

596588
def _apply_route(
597589
self, route: FutureRoute, overwrite: bool = False
598-
) -> List[Route]:
590+
) -> list[Route]:
599591
params = route._asdict()
600592
params["overwrite"] = overwrite
601593
websocket = params.pop("websocket", False)
@@ -629,7 +621,7 @@ def _apply_route(
629621
def _apply_middleware(
630622
self,
631623
middleware: FutureMiddleware,
632-
route_names: Optional[List[str]] = None,
624+
route_names: Optional[list[str]] = None,
633625
):
634626
with self.amend():
635627
if route_names:
@@ -656,8 +648,8 @@ def dispatch(
656648
self,
657649
event: str,
658650
*,
659-
condition: Optional[Dict[str, str]] = None,
660-
context: Optional[Dict[str, Any]] = None,
651+
condition: Optional[dict[str, str]] = None,
652+
context: Optional[dict[str, Any]] = None,
661653
fail_not_found: bool = True,
662654
inline: Literal[True],
663655
reverse: bool = False,
@@ -668,8 +660,8 @@ def dispatch(
668660
self,
669661
event: str,
670662
*,
671-
condition: Optional[Dict[str, str]] = None,
672-
context: Optional[Dict[str, Any]] = None,
663+
condition: Optional[dict[str, str]] = None,
664+
context: Optional[dict[str, Any]] = None,
673665
fail_not_found: bool = True,
674666
inline: Literal[False] = False,
675667
reverse: bool = False,
@@ -679,8 +671,8 @@ def dispatch(
679671
self,
680672
event: str,
681673
*,
682-
condition: Optional[Dict[str, str]] = None,
683-
context: Optional[Dict[str, Any]] = None,
674+
condition: Optional[dict[str, str]] = None,
675+
context: Optional[dict[str, Any]] = None,
684676
fail_not_found: bool = True,
685677
inline: bool = False,
686678
reverse: bool = False,
@@ -733,7 +725,7 @@ async def event(
733725
event: Union[str, Enum],
734726
timeout: Optional[Union[int, float]] = None,
735727
*,
736-
condition: Optional[Dict[str, Any]] = None,
728+
condition: Optional[dict[str, Any]] = None,
737729
exclusive: bool = True,
738730
) -> None:
739731
"""Wait for a specific event to be triggered.
@@ -890,7 +882,7 @@ def handler(request):
890882
app.blueprint(bp, url_prefix='/blueprint')
891883
```
892884
""" # noqa: E501
893-
options: Dict[str, Any] = {}
885+
options: dict[str, Any] = {}
894886
if url_prefix is not None:
895887
options["url_prefix"] = url_prefix
896888
if version is not None:
@@ -903,7 +895,7 @@ def handler(request):
903895
options["name_prefix"] = name_prefix
904896
if isinstance(blueprint, (Iterable, BlueprintGroup)):
905897
for item in blueprint:
906-
params: Dict[str, Any] = {**options}
898+
params: dict[str, Any] = {**options}
907899
if isinstance(blueprint, BlueprintGroup):
908900
merge_from = [
909901
options.get("url_prefix", ""),
@@ -1001,7 +993,7 @@ def url_for(self, view_name: str, **kwargs):
1001993
# http://subdomain.example.com/view-name
1002994
""" # noqa: E501
1003995
# find the route by the supplied view name
1004-
kw: Dict[str, str] = {}
996+
kw: dict[str, str] = {}
1005997
# special static files url_for
1006998

1007999
if "." not in view_name:
@@ -1371,10 +1363,8 @@ async def handle_request(self, request: Request) -> None: # no cov
13711363

13721364
if handler is None:
13731365
raise ServerError(
1374-
(
1375-
"'None' was returned while requesting a "
1376-
"handler from the router"
1377-
)
1366+
"'None' was returned while requesting a "
1367+
"handler from the router"
13781368
)
13791369

13801370
# Run response handler
@@ -1499,7 +1489,7 @@ async def _websocket_handler(
14991489
# -------------------------------------------------------------------- #
15001490

15011491
@property
1502-
def test_client(self) -> "SanicTestClient": # type: ignore # noqa
1492+
def test_client(self) -> SanicTestClient: # type: ignore # noqa
15031493
"""A testing client that uses httpx and a live running server to reach into the application to execute handlers.
15041494
15051495
This property is available if the `sanic-testing` package is installed.
@@ -1519,7 +1509,7 @@ def test_client(self) -> "SanicTestClient": # type: ignore # noqa
15191509
return self._test_client
15201510

15211511
@property
1522-
def asgi_client(self) -> "SanicASGITestClient": # type: ignore # noqa
1512+
def asgi_client(self) -> SanicASGITestClient: # type: ignore # noqa
15231513
"""A testing client that uses ASGI to reach into the application to execute handlers.
15241514
15251515
This property is available if the `sanic-testing` package is installed.
@@ -1859,15 +1849,9 @@ async def before_start(app):
18591849
""" # noqa: E501
18601850
task = self.get_task(name, raise_exception=raise_exception)
18611851
if task and not task.cancelled():
1862-
args: Tuple[str, ...] = ()
1852+
args: tuple[str, ...] = ()
18631853
if msg:
1864-
if sys.version_info >= (3, 9):
1865-
args = (msg,)
1866-
else: # no cov
1867-
raise RuntimeError(
1868-
"Cancelling a task with a message is only supported "
1869-
"on Python 3.9+."
1870-
)
1854+
args = (msg,)
18711855
task.cancel(*args)
18721856
try:
18731857
await task
@@ -2012,7 +1996,7 @@ def state(self) -> ApplicationState: # type: ignore
20121996
return self._state
20131997

20141998
@property
2015-
def reload_dirs(self) -> Set[Path]:
1999+
def reload_dirs(self) -> set[Path]:
20162000
"""The directories that are monitored for auto-reload.
20172001
20182002
Returns:
@@ -2057,9 +2041,9 @@ def ext(self) -> Extend:
20572041
def extend(
20582042
self,
20592043
*,
2060-
extensions: Optional[List[Type[Extension]]] = None,
2044+
extensions: Optional[list[type[Extension]]] = None,
20612045
built_in_extensions: bool = True,
2062-
config: Optional[Union[Config, Dict[str, Any]]] = None,
2046+
config: Optional[Union[Config, dict[str, Any]]] = None,
20632047
**kwargs,
20642048
) -> Extend:
20652049
"""Extend Sanic with additional functionality using Sanic Extensions.
@@ -2470,7 +2454,7 @@ async def _server_event(
24702454

24712455
def refresh(
24722456
self,
2473-
passthru: Optional[Dict[str, Any]] = None,
2457+
passthru: Optional[dict[str, Any]] = None,
24742458
) -> Sanic:
24752459
"""Refresh the application instance. **This is used internally by Sanic**.
24762460

0 commit comments

Comments
 (0)