💥 Remove: 移除 Python 3.9 支持 (#3860)

This commit is contained in:
呵呵です
2026-02-18 00:11:36 +08:00
committed by GitHub
parent f719a6b41b
commit 63cde5da77
56 changed files with 603 additions and 1144 deletions

View File

@@ -19,7 +19,7 @@ FrontMatter:
from collections.abc import AsyncGenerator
from contextlib import asynccontextmanager
from typing import TYPE_CHECKING, Optional, Union
from typing import TYPE_CHECKING
from typing_extensions import override
from multidict import CIMultiDict
@@ -62,11 +62,11 @@ class Session(HTTPClientSession):
params: QueryTypes = None,
headers: HeaderTypes = None,
cookies: CookieTypes = None,
version: Union[str, HTTPVersion] = HTTPVersion.H11,
version: str | HTTPVersion = HTTPVersion.H11,
timeout: TimeoutTypes = None,
proxy: Optional[str] = None,
proxy: str | None = None,
):
self._client: Optional[aiohttp.ClientSession] = None
self._client: aiohttp.ClientSession | None = None
self._params = URL.build(query=params).query if params is not None else None
@@ -279,9 +279,9 @@ class Mixin(HTTPClientMixin, WebSocketClientMixin):
params: QueryTypes = None,
headers: HeaderTypes = None,
cookies: CookieTypes = None,
version: Union[str, HTTPVersion] = HTTPVersion.H11,
version: str | HTTPVersion = HTTPVersion.H11,
timeout: TimeoutTypes = None,
proxy: Optional[str] = None,
proxy: str | None = None,
) -> Session:
return Session(
params=params,

View File

@@ -20,7 +20,7 @@ FrontMatter:
import contextlib
from functools import wraps
import logging
from typing import Any, Optional, Union
from typing import Any
from typing_extensions import override
from pydantic import BaseModel
@@ -63,23 +63,23 @@ def catch_closed(func):
class Config(BaseModel):
"""FastAPI 驱动框架设置,详情参考 FastAPI 文档"""
fastapi_openapi_url: Optional[str] = None
fastapi_openapi_url: str | None = None
"""`openapi.json` 地址,默认为 `None` 即关闭"""
fastapi_docs_url: Optional[str] = None
fastapi_docs_url: str | None = None
"""`swagger` 地址,默认为 `None` 即关闭"""
fastapi_redoc_url: Optional[str] = None
fastapi_redoc_url: str | None = None
"""`redoc` 地址,默认为 `None` 即关闭"""
fastapi_include_adapter_schema: bool = True
"""是否包含适配器路由的 schema默认为 `True`"""
fastapi_reload: bool = False
"""开启/关闭冷重载"""
fastapi_reload_dirs: Optional[list[str]] = None
fastapi_reload_dirs: list[str] | None = None
"""重载监控文件夹列表,默认为 uvicorn 默认值"""
fastapi_reload_delay: float = 0.25
"""重载延迟,默认为 uvicorn 默认值"""
fastapi_reload_includes: Optional[list[str]] = None
fastapi_reload_includes: list[str] | None = None
"""要监听的文件列表,支持 glob pattern默认为 uvicorn 默认值"""
fastapi_reload_excludes: Optional[list[str]] = None
fastapi_reload_excludes: list[str] | None = None
"""不要监听的文件列表,支持 glob pattern默认为 uvicorn 默认值"""
fastapi_extra: dict[str, Any] = {}
"""传递给 `FastAPI` 的其他参数。"""
@@ -160,10 +160,10 @@ class Driver(BaseDriver, ASGIMixin):
@override
def run(
self,
host: Optional[str] = None,
port: Optional[int] = None,
host: str | None = None,
port: int | None = None,
*args,
app: Optional[str] = None,
app: str | None = None,
**kwargs,
):
"""使用 `uvicorn` 启动 FastAPI"""
@@ -206,8 +206,8 @@ class Driver(BaseDriver, ASGIMixin):
with contextlib.suppress(Exception):
json = await request.json()
data: Optional[dict] = None
files: Optional[list[tuple[str, FileTypes]]] = None
data: dict | None = None
files: list[tuple[str, FileTypes]] | None = None
with contextlib.suppress(Exception):
form = await request.form()
data = {}
@@ -280,7 +280,7 @@ class FastAPIWebSocket(BaseWebSocket):
await self.websocket.close(code, reason)
@override
async def receive(self) -> Union[str, bytes]:
async def receive(self) -> str | bytes:
# assert self.websocket.application_state == WebSocketState.CONNECTED
msg = await self.websocket.receive()
if msg["type"] == "websocket.disconnect":

View File

@@ -18,7 +18,7 @@ FrontMatter:
"""
from collections.abc import AsyncGenerator
from typing import TYPE_CHECKING, Optional, Union
from typing import TYPE_CHECKING
from typing_extensions import override
from multidict import CIMultiDict
@@ -58,11 +58,11 @@ class Session(HTTPClientSession):
params: QueryTypes = None,
headers: HeaderTypes = None,
cookies: CookieTypes = None,
version: Union[str, HTTPVersion] = HTTPVersion.H11,
version: str | HTTPVersion = HTTPVersion.H11,
timeout: TimeoutTypes = None,
proxy: Optional[str] = None,
proxy: str | None = None,
):
self._client: Optional[httpx.AsyncClient] = None
self._client: httpx.AsyncClient | None = None
self._params = (
tuple(URL.build(query=params).query.items()) if params is not None else None
@@ -216,9 +216,9 @@ class Mixin(HTTPClientMixin):
params: QueryTypes = None,
headers: HeaderTypes = None,
cookies: CookieTypes = None,
version: Union[str, HTTPVersion] = HTTPVersion.H11,
version: str | HTTPVersion = HTTPVersion.H11,
timeout: TimeoutTypes = None,
proxy: Optional[str] = None,
proxy: str | None = None,
) -> Session:
return Session(
params=params,

View File

@@ -12,7 +12,6 @@ FrontMatter:
"""
import signal
from typing import Optional
from typing_extensions import override
import anyio
@@ -112,7 +111,7 @@ class Driver(BaseDriver):
if not self.should_exit.is_set():
logger.info("Application startup completed.")
async def _listen_exit(self, tg: Optional[TaskGroup] = None):
async def _listen_exit(self, tg: TaskGroup | None = None):
await self.should_exit.wait()
if tg is not None:

View File

@@ -19,7 +19,7 @@ FrontMatter:
import asyncio
from functools import wraps
from typing import Any, Optional, Union, cast
from typing import Any, cast
from typing_extensions import override
from pydantic import BaseModel
@@ -65,13 +65,13 @@ class Config(BaseModel):
quart_reload: bool = False
"""开启/关闭冷重载"""
quart_reload_dirs: Optional[list[str]] = None
quart_reload_dirs: list[str] | None = None
"""重载监控文件夹列表,默认为 uvicorn 默认值"""
quart_reload_delay: float = 0.25
"""重载延迟,默认为 uvicorn 默认值"""
quart_reload_includes: Optional[list[str]] = None
quart_reload_includes: list[str] | None = None
"""要监听的文件列表,支持 glob pattern默认为 uvicorn 默认值"""
quart_reload_excludes: Optional[list[str]] = None
quart_reload_excludes: list[str] | None = None
"""不要监听的文件列表,支持 glob pattern默认为 uvicorn 默认值"""
quart_extra: dict[str, Any] = {}
"""传递给 `Quart` 的其他参数。"""
@@ -141,10 +141,10 @@ class Driver(BaseDriver, ASGIMixin):
@override
def run(
self,
host: Optional[str] = None,
port: Optional[int] = None,
host: str | None = None,
port: int | None = None,
*args,
app: Optional[str] = None,
app: str | None = None,
**kwargs,
):
"""使用 `uvicorn` 启动 Quart"""
@@ -257,7 +257,7 @@ class WebSocket(BaseWebSocket):
@override
@catch_closed
async def receive(self) -> Union[str, bytes]:
async def receive(self) -> str | bytes:
return await self.websocket.receive()
@override

View File

@@ -17,12 +17,12 @@ FrontMatter:
description: nonebot.drivers.websockets 模块
"""
from collections.abc import AsyncGenerator
from collections.abc import AsyncGenerator, Callable
from contextlib import asynccontextmanager
from functools import wraps
import logging
from types import CoroutineType
from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union
from typing import TYPE_CHECKING, Any, TypeVar
from typing_extensions import ParamSpec, override
from nonebot.drivers import Request, Timeout, WebSocketClientMixin, combine_driver
@@ -108,7 +108,7 @@ class WebSocket(BaseWebSocket):
@override
@catch_closed
async def receive(self) -> Union[str, bytes]:
async def receive(self) -> str | bytes:
return await self.websocket.recv()
@override