From 57bd05a9499955cf919a2563e6f6262f5ac347cf Mon Sep 17 00:00:00 2001 From: Ailitonia <41713304+ailitonia@users.noreply.github.com> Date: Thu, 10 Jul 2025 14:00:08 +0800 Subject: [PATCH 01/10] =?UTF-8?q?feat:=20=E7=BB=86=E5=8C=96=E5=86=85?= =?UTF-8?q?=E7=BD=AE=E9=A9=B1=E5=8A=A8=E5=99=A8=E8=AF=B7=E6=B1=82=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=B8=AD=E7=9A=84=E8=B6=85=E6=97=B6=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E9=A2=97=E7=B2=92=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nonebot/drivers/__init__.py | 2 ++ nonebot/drivers/aiohttp.py | 24 +++++++++++++++++++----- nonebot/drivers/httpx.py | 28 +++++++++++++++++++++++----- nonebot/internal/driver/__init__.py | 2 ++ nonebot/internal/driver/abstract.py | 5 +++-- nonebot/internal/driver/model.py | 17 +++++++++++++++-- 6 files changed, 64 insertions(+), 14 deletions(-) diff --git a/nonebot/drivers/__init__.py b/nonebot/drivers/__init__.py index da235ff2dd78..c7e6e82dd016 100644 --- a/nonebot/drivers/__init__.py +++ b/nonebot/drivers/__init__.py @@ -24,6 +24,7 @@ from nonebot.internal.driver import Response as Response from nonebot.internal.driver import ReverseDriver as ReverseDriver from nonebot.internal.driver import ReverseMixin as ReverseMixin +from nonebot.internal.driver import Timeout as Timeout from nonebot.internal.driver import WebSocket as WebSocket from nonebot.internal.driver import WebSocketClientMixin as WebSocketClientMixin from nonebot.internal.driver import WebSocketServerSetup as WebSocketServerSetup @@ -34,6 +35,7 @@ "Cookies": True, "Request": True, "Response": True, + "Timeout": True, "WebSocket": True, "HTTPVersion": True, "Driver": True, diff --git a/nonebot/drivers/aiohttp.py b/nonebot/drivers/aiohttp.py index 7a2e06a7eca9..a086954c9f9a 100644 --- a/nonebot/drivers/aiohttp.py +++ b/nonebot/drivers/aiohttp.py @@ -37,7 +37,7 @@ from nonebot.drivers import WebSocket as BaseWebSocket from nonebot.drivers.none import Driver as NoneDriver from nonebot.exception import WebSocketClosed -from nonebot.internal.driver import Cookies, CookieTypes, HeaderTypes, QueryTypes +from nonebot.internal.driver import Cookies, CookieTypes, HeaderTypes, QueryTypes, Timeout, TimeoutTypes try: import aiohttp @@ -56,7 +56,7 @@ def __init__( headers: HeaderTypes = None, cookies: CookieTypes = None, version: Union[str, HTTPVersion] = HTTPVersion.H11, - timeout: Optional[float] = None, + timeout: TimeoutTypes = None, proxy: Optional[str] = None, ): self._client: Optional[aiohttp.ClientSession] = None @@ -106,7 +106,14 @@ async def request(self, setup: Request) -> Response: if cookie.value is not None ) - timeout = aiohttp.ClientTimeout(setup.timeout) + if isinstance(setup.timeout, Timeout): + timeout = aiohttp.ClientTimeout( + total=setup.timeout.total, + connect=setup.timeout.connect, + sock_read=setup.timeout.read + ) + else: + timeout = aiohttp.ClientTimeout(setup.timeout) async with await self.client.request( setup.method, @@ -149,7 +156,14 @@ async def stream_request( if cookie.value is not None ) - timeout = aiohttp.ClientTimeout(setup.timeout) + if isinstance(setup.timeout, Timeout): + timeout = aiohttp.ClientTimeout( + total=setup.timeout.total, + connect=setup.timeout.connect, + sock_read=setup.timeout.read + ) + else: + timeout = aiohttp.ClientTimeout(setup.timeout) async with self.client.request( setup.method, @@ -245,7 +259,7 @@ def get_session( headers: HeaderTypes = None, cookies: CookieTypes = None, version: Union[str, HTTPVersion] = HTTPVersion.H11, - timeout: Optional[float] = None, + timeout: TimeoutTypes = None, proxy: Optional[str] = None, ) -> Session: return Session( diff --git a/nonebot/drivers/httpx.py b/nonebot/drivers/httpx.py index bca949a13cf6..c04e72ee8709 100644 --- a/nonebot/drivers/httpx.py +++ b/nonebot/drivers/httpx.py @@ -33,7 +33,7 @@ combine_driver, ) from nonebot.drivers.none import Driver as NoneDriver -from nonebot.internal.driver import Cookies, CookieTypes, HeaderTypes, QueryTypes +from nonebot.internal.driver import Cookies, CookieTypes, HeaderTypes, QueryTypes, Timeout, TimeoutTypes try: import httpx @@ -52,7 +52,7 @@ def __init__( headers: HeaderTypes = None, cookies: CookieTypes = None, version: Union[str, HTTPVersion] = HTTPVersion.H11, - timeout: Optional[float] = None, + timeout: TimeoutTypes = None, proxy: Optional[str] = None, ): self._client: Optional[httpx.AsyncClient] = None @@ -76,6 +76,15 @@ def client(self) -> httpx.AsyncClient: @override async def request(self, setup: Request) -> Response: + if isinstance(setup.timeout, Timeout): + timeout = httpx.Timeout( + timeout=setup.timeout.total, + connect=setup.timeout.connect, + read=setup.timeout.read + ) + else: + timeout = httpx.Timeout(setup.timeout) + response = await self.client.request( setup.method, str(setup.url), @@ -87,7 +96,7 @@ async def request(self, setup: Request) -> Response: params=setup.url.raw_query_string, headers=tuple(setup.headers.items()), cookies=setup.cookies.jar, - timeout=setup.timeout, + timeout=timeout, ) return Response( response.status_code, @@ -103,6 +112,15 @@ async def stream_request( *, chunk_size: int = 1024, ) -> AsyncGenerator[Response, None]: + if isinstance(setup.timeout, Timeout): + timeout = httpx.Timeout( + timeout=setup.timeout.total, + connect=setup.timeout.connect, + read=setup.timeout.read + ) + else: + timeout = httpx.Timeout(setup.timeout) + async with self.client.stream( setup.method, str(setup.url), @@ -114,7 +132,7 @@ async def stream_request( params=setup.url.raw_query_string, headers=tuple(setup.headers.items()), cookies=setup.cookies.jar, - timeout=setup.timeout, + timeout=timeout, ) as response: response_headers = response.headers.multi_items() async for chunk in response.aiter_bytes(chunk_size=chunk_size): @@ -183,7 +201,7 @@ def get_session( headers: HeaderTypes = None, cookies: CookieTypes = None, version: Union[str, HTTPVersion] = HTTPVersion.H11, - timeout: Optional[float] = None, + timeout: TimeoutTypes = None, proxy: Optional[str] = None, ) -> Session: return Session( diff --git a/nonebot/internal/driver/__init__.py b/nonebot/internal/driver/__init__.py index 0fd5c8553e51..e4b3f042c3f6 100644 --- a/nonebot/internal/driver/__init__.py +++ b/nonebot/internal/driver/__init__.py @@ -27,5 +27,7 @@ from .model import Request as Request from .model import Response as Response from .model import SimpleQuery as SimpleQuery +from .model import Timeout as Timeout +from .model import TimeoutTypes as TimeoutTypes from .model import WebSocket as WebSocket from .model import WebSocketServerSetup as WebSocketServerSetup diff --git a/nonebot/internal/driver/abstract.py b/nonebot/internal/driver/abstract.py index d35e0011f58a..253354f18db2 100644 --- a/nonebot/internal/driver/abstract.py +++ b/nonebot/internal/driver/abstract.py @@ -30,6 +30,7 @@ QueryTypes, Request, Response, + TimeoutTypes, WebSocket, WebSocketServerSetup, ) @@ -245,7 +246,7 @@ def __init__( headers: HeaderTypes = None, cookies: CookieTypes = None, version: Union[str, HTTPVersion] = HTTPVersion.H11, - timeout: Optional[float] = None, + timeout: TimeoutTypes = None, proxy: Optional[str] = None, ): raise NotImplementedError @@ -315,7 +316,7 @@ def get_session( headers: HeaderTypes = None, cookies: CookieTypes = None, version: Union[str, HTTPVersion] = HTTPVersion.H11, - timeout: Optional[float] = None, + timeout: TimeoutTypes = None, proxy: Optional[str] = None, ) -> HTTPClientSession: """获取一个 HTTP 会话""" diff --git a/nonebot/internal/driver/model.py b/nonebot/internal/driver/model.py index 0f0b2c27827c..c44ea8432bbd 100644 --- a/nonebot/internal/driver/model.py +++ b/nonebot/internal/driver/model.py @@ -42,6 +42,7 @@ FileType, ] FilesTypes: TypeAlias = Union[dict[str, FileTypes], list[tuple[str, FileTypes]], None] +TimeoutTypes: TypeAlias = Union[Optional[float], "Timeout"] class HTTPVersion(Enum): @@ -50,6 +51,18 @@ class HTTPVersion(Enum): H2 = "2" +class Timeout: + def __init__( + self, + total: Optional[float] = None, + connect: Optional[float] = None, + read: Optional[float] = None, + ): + self.total = total + self.connect = connect + self.read = read + + class Request: def __init__( self, @@ -64,7 +77,7 @@ def __init__( json: Any = None, files: FilesTypes = None, version: Union[str, HTTPVersion] = HTTPVersion.H11, - timeout: Optional[float] = None, + timeout: TimeoutTypes = None, proxy: Optional[str] = None, ): # method @@ -76,7 +89,7 @@ def __init__( # http version self.version: HTTPVersion = HTTPVersion(version) # timeout - self.timeout: Optional[float] = timeout + self.timeout: TimeoutTypes = timeout # proxy self.proxy: Optional[str] = proxy From 16db914bf575388ef93e2d64d46502e2ef87ce8d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 10 Jul 2025 06:02:41 +0000 Subject: [PATCH 02/10] :rotating_light: auto fix by pre-commit hooks --- nonebot/drivers/aiohttp.py | 13 ++++++++++--- nonebot/drivers/httpx.py | 13 ++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/nonebot/drivers/aiohttp.py b/nonebot/drivers/aiohttp.py index a086954c9f9a..d6e6628cbe7c 100644 --- a/nonebot/drivers/aiohttp.py +++ b/nonebot/drivers/aiohttp.py @@ -37,7 +37,14 @@ from nonebot.drivers import WebSocket as BaseWebSocket from nonebot.drivers.none import Driver as NoneDriver from nonebot.exception import WebSocketClosed -from nonebot.internal.driver import Cookies, CookieTypes, HeaderTypes, QueryTypes, Timeout, TimeoutTypes +from nonebot.internal.driver import ( + Cookies, + CookieTypes, + HeaderTypes, + QueryTypes, + Timeout, + TimeoutTypes, +) try: import aiohttp @@ -110,7 +117,7 @@ async def request(self, setup: Request) -> Response: timeout = aiohttp.ClientTimeout( total=setup.timeout.total, connect=setup.timeout.connect, - sock_read=setup.timeout.read + sock_read=setup.timeout.read, ) else: timeout = aiohttp.ClientTimeout(setup.timeout) @@ -160,7 +167,7 @@ async def stream_request( timeout = aiohttp.ClientTimeout( total=setup.timeout.total, connect=setup.timeout.connect, - sock_read=setup.timeout.read + sock_read=setup.timeout.read, ) else: timeout = aiohttp.ClientTimeout(setup.timeout) diff --git a/nonebot/drivers/httpx.py b/nonebot/drivers/httpx.py index c04e72ee8709..1652c6592507 100644 --- a/nonebot/drivers/httpx.py +++ b/nonebot/drivers/httpx.py @@ -33,7 +33,14 @@ combine_driver, ) from nonebot.drivers.none import Driver as NoneDriver -from nonebot.internal.driver import Cookies, CookieTypes, HeaderTypes, QueryTypes, Timeout, TimeoutTypes +from nonebot.internal.driver import ( + Cookies, + CookieTypes, + HeaderTypes, + QueryTypes, + Timeout, + TimeoutTypes, +) try: import httpx @@ -80,7 +87,7 @@ async def request(self, setup: Request) -> Response: timeout = httpx.Timeout( timeout=setup.timeout.total, connect=setup.timeout.connect, - read=setup.timeout.read + read=setup.timeout.read, ) else: timeout = httpx.Timeout(setup.timeout) @@ -116,7 +123,7 @@ async def stream_request( timeout = httpx.Timeout( timeout=setup.timeout.total, connect=setup.timeout.connect, - read=setup.timeout.read + read=setup.timeout.read, ) else: timeout = httpx.Timeout(setup.timeout) From 649aff8ec9a160db727db107fca9e936484879a4 Mon Sep 17 00:00:00 2001 From: Ailitonia <41713304+ailitonia@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:22:59 +0800 Subject: [PATCH 03/10] =?UTF-8?q?fix:=20=E8=B6=85=E6=97=B6=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=9C=A8=20`Driver`=20=E4=B8=AD=E7=9A=84=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nonebot/drivers/aiohttp.py | 15 +++++++++++++-- nonebot/drivers/httpx.py | 11 ++++++++++- nonebot/drivers/websockets.py | 10 ++++++++-- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/nonebot/drivers/aiohttp.py b/nonebot/drivers/aiohttp.py index d6e6628cbe7c..7dbb342b2f3e 100644 --- a/nonebot/drivers/aiohttp.py +++ b/nonebot/drivers/aiohttp.py @@ -85,7 +85,15 @@ def __init__( else: raise RuntimeError(f"Unsupported HTTP version: {version}") - self._timeout = timeout + if isinstance(timeout, Timeout): + self._timeout = aiohttp.ClientTimeout( + total=timeout.total, + connect=timeout.connect, + sock_read=timeout.read, + ) + else: + self._timeout = aiohttp.ClientTimeout(timeout) + self._proxy = proxy @property @@ -247,7 +255,10 @@ async def websocket(self, setup: Request) -> AsyncGenerator["WebSocket", None]: else: raise RuntimeError(f"Unsupported HTTP version: {setup.version}") - timeout = aiohttp.ClientWSTimeout(ws_close=setup.timeout or 10.0) # type: ignore + if isinstance(setup.timeout, Timeout): + timeout = aiohttp.ClientWSTimeout(ws_receive=setup.timeout.read, ws_close=setup.timeout.total) # type: ignore + else: + timeout = aiohttp.ClientWSTimeout(ws_close=setup.timeout or 10.0) # type: ignore async with aiohttp.ClientSession(version=version, trust_env=True) as session: async with session.ws_connect( diff --git a/nonebot/drivers/httpx.py b/nonebot/drivers/httpx.py index 1652c6592507..49161566a7f7 100644 --- a/nonebot/drivers/httpx.py +++ b/nonebot/drivers/httpx.py @@ -72,7 +72,16 @@ def __init__( ) self._cookies = Cookies(cookies) self._version = HTTPVersion(version) - self._timeout = timeout + + if isinstance(timeout, Timeout): + self._timeout = httpx.Timeout( + timeout=timeout.total, + connect=timeout.connect, + read=timeout.read, + ) + else: + self._timeout = httpx.Timeout(timeout) + self._proxy = proxy @property diff --git a/nonebot/drivers/websockets.py b/nonebot/drivers/websockets.py index ff9601b05b9d..b348c417502a 100644 --- a/nonebot/drivers/websockets.py +++ b/nonebot/drivers/websockets.py @@ -25,7 +25,7 @@ from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union from typing_extensions import ParamSpec, override -from nonebot.drivers import Request, WebSocketClientMixin, combine_driver +from nonebot.drivers import Request, Timeout, WebSocketClientMixin, combine_driver from nonebot.drivers import WebSocket as BaseWebSocket from nonebot.drivers.none import Driver as NoneDriver from nonebot.exception import WebSocketClosed @@ -73,10 +73,16 @@ def type(self) -> str: async def websocket(self, setup: Request) -> AsyncGenerator["WebSocket", None]: if setup.proxy is not None: logger.warning("proxy is not supported by websockets driver") + + if isinstance(setup.timeout, Timeout): + timeout = setup.timeout.total or setup.timeout.connect or setup.timeout.read + else: + timeout = setup.timeout + connection = Connect( str(setup.url), extra_headers={**setup.headers, **setup.cookies.as_header(setup)}, - open_timeout=setup.timeout, + open_timeout=timeout, ) async with connection as ws: yield WebSocket(request=setup, websocket=ws) From ccc69b010133175f5ba29811c7ef3b576f4dc699 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 10 Jul 2025 07:23:20 +0000 Subject: [PATCH 04/10] :rotating_light: auto fix by pre-commit hooks --- nonebot/drivers/aiohttp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nonebot/drivers/aiohttp.py b/nonebot/drivers/aiohttp.py index 7dbb342b2f3e..9bb278dc3494 100644 --- a/nonebot/drivers/aiohttp.py +++ b/nonebot/drivers/aiohttp.py @@ -256,7 +256,9 @@ async def websocket(self, setup: Request) -> AsyncGenerator["WebSocket", None]: raise RuntimeError(f"Unsupported HTTP version: {setup.version}") if isinstance(setup.timeout, Timeout): - timeout = aiohttp.ClientWSTimeout(ws_receive=setup.timeout.read, ws_close=setup.timeout.total) # type: ignore + timeout = aiohttp.ClientWSTimeout( + ws_receive=setup.timeout.read, ws_close=setup.timeout.total + ) # type: ignore else: timeout = aiohttp.ClientWSTimeout(ws_close=setup.timeout or 10.0) # type: ignore From c7ddcd9539cecd776b196c2dd2355c0f7efb1ec2 Mon Sep 17 00:00:00 2001 From: Ailitonia <41713304+ailitonia@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:30:56 +0800 Subject: [PATCH 05/10] style: ignore `attr.s` attributes --- nonebot/drivers/aiohttp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nonebot/drivers/aiohttp.py b/nonebot/drivers/aiohttp.py index 9bb278dc3494..3ae5bed15497 100644 --- a/nonebot/drivers/aiohttp.py +++ b/nonebot/drivers/aiohttp.py @@ -257,8 +257,8 @@ async def websocket(self, setup: Request) -> AsyncGenerator["WebSocket", None]: if isinstance(setup.timeout, Timeout): timeout = aiohttp.ClientWSTimeout( - ws_receive=setup.timeout.read, ws_close=setup.timeout.total - ) # type: ignore + ws_receive=setup.timeout.read, ws_close=setup.timeout.total # type: ignore + ) else: timeout = aiohttp.ClientWSTimeout(ws_close=setup.timeout or 10.0) # type: ignore From ecf96681630b0330f05875f04cf8a1c5cc74d4e1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 10 Jul 2025 07:31:17 +0000 Subject: [PATCH 06/10] :rotating_light: auto fix by pre-commit hooks --- nonebot/drivers/aiohttp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nonebot/drivers/aiohttp.py b/nonebot/drivers/aiohttp.py index 3ae5bed15497..72f72ccae681 100644 --- a/nonebot/drivers/aiohttp.py +++ b/nonebot/drivers/aiohttp.py @@ -257,7 +257,8 @@ async def websocket(self, setup: Request) -> AsyncGenerator["WebSocket", None]: if isinstance(setup.timeout, Timeout): timeout = aiohttp.ClientWSTimeout( - ws_receive=setup.timeout.read, ws_close=setup.timeout.total # type: ignore + ws_receive=setup.timeout.read, + ws_close=setup.timeout.total, # type: ignore ) else: timeout = aiohttp.ClientWSTimeout(ws_close=setup.timeout or 10.0) # type: ignore From 8c972c4c87f3ea32baa87b1b6576e6b10a14ca65 Mon Sep 17 00:00:00 2001 From: Ailitonia <41713304+ailitonia@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:33:02 +0800 Subject: [PATCH 07/10] style: ignore `attr.s` attributes --- nonebot/drivers/aiohttp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nonebot/drivers/aiohttp.py b/nonebot/drivers/aiohttp.py index 72f72ccae681..b77e374e6aa5 100644 --- a/nonebot/drivers/aiohttp.py +++ b/nonebot/drivers/aiohttp.py @@ -257,7 +257,7 @@ async def websocket(self, setup: Request) -> AsyncGenerator["WebSocket", None]: if isinstance(setup.timeout, Timeout): timeout = aiohttp.ClientWSTimeout( - ws_receive=setup.timeout.read, + ws_receive=setup.timeout.read, # type: ignore ws_close=setup.timeout.total, # type: ignore ) else: From 2c4c2f171ce462497af4cf8222407e146967e4a2 Mon Sep 17 00:00:00 2001 From: Ailitonia <41713304+ailitonia@users.noreply.github.com> Date: Thu, 10 Jul 2025 16:43:31 +0800 Subject: [PATCH 08/10] test: Add driver test case timeout params --- tests/test_driver.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_driver.py b/tests/test_driver.py index 3094ea62a0f1..cf364daa083e 100644 --- a/tests/test_driver.py +++ b/tests/test_driver.py @@ -16,6 +16,7 @@ HTTPServerSetup, Request, Response, + Timeout, WebSocket, WebSocketClientMixin, WebSocketServerSetup, @@ -235,6 +236,7 @@ async def test_http_client(driver: Driver, server_url: URL): headers={"X-Test": "test"}, cookies={"session": "test"}, content="test", + timeout=Timeout(total=4, connect=2, read=2), ) response = await driver.request(request) assert server_url.host is not None @@ -250,6 +252,7 @@ async def test_http_client(driver: Driver, server_url: URL): headers={"X-Test": "test"}, cookies={"session": "test"}, content="test", + timeout=Timeout(total=4, connect=2, read=2), ) assert request.url == request_raw_url.url, ( "request.url should be equal to request_raw_url.url" @@ -312,6 +315,7 @@ async def test_http_client(driver: Driver, server_url: URL): headers={"X-Test": "stream"}, cookies={"session": "stream"}, content="stream_test" * 1024, + timeout=Timeout(total=4, connect=2, read=2), ) chunks = [] async for resp in driver.stream_request(request, chunk_size=4): @@ -414,6 +418,7 @@ async def test_http_client_session(driver: Driver, server_url: URL): headers={"X-Test": "test"}, cookies={"cookie": "test"}, content="test", + timeout=Timeout(total=4, connect=2, read=2), ) response = await session.request(request) assert response.status_code == 200 @@ -499,6 +504,7 @@ async def test_http_client_session(driver: Driver, server_url: URL): headers={"X-Test": "stream"}, cookies={"cookie": "stream"}, content="stream_test" * 1024, + timeout=Timeout(total=4, connect=2, read=2), ) chunks = [] async for resp in session.stream_request(request, chunk_size=4): From 6278a325c33b78e048799f48c4d005367dda6053 Mon Sep 17 00:00:00 2001 From: Ailitonia <41713304+Ailitonia@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:57:30 +0800 Subject: [PATCH 09/10] style: update `TimeoutTypes` typing Co-authored-by: Ju4tCode <42488585+yanyongyu@users.noreply.github.com> --- nonebot/internal/driver/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nonebot/internal/driver/model.py b/nonebot/internal/driver/model.py index c44ea8432bbd..4cdf99e9881c 100644 --- a/nonebot/internal/driver/model.py +++ b/nonebot/internal/driver/model.py @@ -42,7 +42,7 @@ FileType, ] FilesTypes: TypeAlias = Union[dict[str, FileTypes], list[tuple[str, FileTypes]], None] -TimeoutTypes: TypeAlias = Union[Optional[float], "Timeout"] +TimeoutTypes: TypeAlias = Union[float, "Timeout", None] class HTTPVersion(Enum): From dd01af0f9c35f39f1d752f1f6a416c324eb94832 Mon Sep 17 00:00:00 2001 From: Ailitonia <41713304+ailitonia@users.noreply.github.com> Date: Thu, 10 Jul 2025 18:05:55 +0800 Subject: [PATCH 10/10] refactor: Change `Timeout` to `dataclass` --- nonebot/internal/driver/model.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/nonebot/internal/driver/model.py b/nonebot/internal/driver/model.py index 4cdf99e9881c..ca6558c92777 100644 --- a/nonebot/internal/driver/model.py +++ b/nonebot/internal/driver/model.py @@ -51,16 +51,13 @@ class HTTPVersion(Enum): H2 = "2" +@dataclass class Timeout: - def __init__( - self, - total: Optional[float] = None, - connect: Optional[float] = None, - read: Optional[float] = None, - ): - self.total = total - self.connect = connect - self.read = read + """Request 超时配置。""" + + total: Optional[float] = None + connect: Optional[float] = None + read: Optional[float] = None class Request: