Voice et bot modif

This commit is contained in:
pi 2026-06-16 17:09:34 +00:00
parent 189d56026b
commit 7333a22bcd
10774 changed files with 634644 additions and 933308 deletions

View file

@ -10,20 +10,9 @@ import socket
import sys
import warnings
from abc import ABC, abstractmethod
from collections.abc import Callable, Iterator
from types import TracebackType
from typing import (
TYPE_CHECKING,
Any,
Callable,
Generic,
Iterator,
List,
Optional,
Type,
TypeVar,
cast,
overload,
)
from typing import TYPE_CHECKING, Any, Generic, Literal, TypeVar, cast, overload
from unittest import IsolatedAsyncioTestCase, mock
from aiosignal import Signal
@ -32,6 +21,7 @@ from yarl import URL
import aiohttp
from aiohttp.client import (
_BaseRequestContextManager,
_RequestContextManager,
_RequestOptions,
_WSRequestContextManager,
@ -61,7 +51,7 @@ from .web_protocol import _RequestHandler
if TYPE_CHECKING:
from ssl import SSLContext
else:
SSLContext = None
SSLContext = Any
if sys.version_info >= (3, 11) and TYPE_CHECKING:
from typing import Unpack
@ -110,9 +100,9 @@ class BaseTestServer(ABC):
self,
*,
scheme: str = "",
loop: Optional[asyncio.AbstractEventLoop] = None,
loop: asyncio.AbstractEventLoop | None = None,
host: str = "127.0.0.1",
port: Optional[int] = None,
port: int | None = None,
skip_url_asserts: bool = False,
socket_factory: Callable[
[str, int, socket.AddressFamily], socket.socket
@ -120,8 +110,8 @@ class BaseTestServer(ABC):
**kwargs: Any,
) -> None:
self._loop = loop
self.runner: Optional[BaseRunner] = None
self._root: Optional[URL] = None
self.runner: BaseRunner | None = None
self._root: URL | None = None
self.host = host
self.port = port
self._closed = False
@ -130,7 +120,7 @@ class BaseTestServer(ABC):
self.socket_factory = socket_factory
async def start_server(
self, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any
self, loop: asyncio.AbstractEventLoop | None = None, **kwargs: Any
) -> None:
if self.runner:
return
@ -215,9 +205,9 @@ class BaseTestServer(ABC):
def __exit__(
self,
exc_type: Optional[Type[BaseException]],
exc_value: Optional[BaseException],
traceback: Optional[TracebackType],
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
traceback: TracebackType | None,
) -> None:
# __exit__ should exist in pair with __enter__ but never executed
pass # pragma: no cover
@ -228,9 +218,9 @@ class BaseTestServer(ABC):
async def __aexit__(
self,
exc_type: Optional[Type[BaseException]],
exc_value: Optional[BaseException],
traceback: Optional[TracebackType],
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
traceback: TracebackType | None,
) -> None:
await self.close()
@ -242,7 +232,7 @@ class TestServer(BaseTestServer):
*,
scheme: str = "",
host: str = "127.0.0.1",
port: Optional[int] = None,
port: int | None = None,
**kwargs: Any,
):
self.app = app
@ -259,7 +249,7 @@ class RawTestServer(BaseTestServer):
*,
scheme: str = "",
host: str = "127.0.0.1",
port: Optional[int] = None,
port: int | None = None,
**kwargs: Any,
) -> None:
self._handler = handler
@ -285,7 +275,7 @@ class TestClient(Generic[_Request, _ApplicationNone]):
self: "TestClient[Request, Application]",
server: TestServer,
*,
cookie_jar: Optional[AbstractCookieJar] = None,
cookie_jar: AbstractCookieJar | None = None,
**kwargs: Any,
) -> None: ...
@overload
@ -293,15 +283,15 @@ class TestClient(Generic[_Request, _ApplicationNone]):
self: "TestClient[_Request, None]",
server: BaseTestServer,
*,
cookie_jar: Optional[AbstractCookieJar] = None,
cookie_jar: AbstractCookieJar | None = None,
**kwargs: Any,
) -> None: ...
def __init__(
self,
server: BaseTestServer,
*,
cookie_jar: Optional[AbstractCookieJar] = None,
loop: Optional[asyncio.AbstractEventLoop] = None,
cookie_jar: AbstractCookieJar | None = None,
loop: asyncio.AbstractEventLoop | None = None,
**kwargs: Any,
) -> None:
if not isinstance(server, BaseTestServer):
@ -315,8 +305,8 @@ class TestClient(Generic[_Request, _ApplicationNone]):
self._session = ClientSession(loop=loop, cookie_jar=cookie_jar, **kwargs)
self._session._retry_connection = False
self._closed = False
self._responses: List[ClientResponse] = []
self._websockets: List[ClientWebSocketResponse] = []
self._responses: list[ClientResponse] = []
self._websockets: list[ClientWebSocketResponse[bool]] = []
async def start_server(self) -> None:
await self._server.start_server(loop=self._loop)
@ -326,7 +316,7 @@ class TestClient(Generic[_Request, _ApplicationNone]):
return self._server.host
@property
def port(self) -> Optional[int]:
def port(self) -> int | None:
return self._server.port
@property
@ -455,18 +445,54 @@ class TestClient(Generic[_Request, _ApplicationNone]):
self._request(hdrs.METH_DELETE, path, **kwargs)
)
def ws_connect(self, path: StrOrURL, **kwargs: Any) -> _WSRequestContextManager:
@overload
def ws_connect(
self, path: StrOrURL, *, decode_text: Literal[True] = ..., **kwargs: Any
) -> "_BaseRequestContextManager[ClientWebSocketResponse[Literal[True]]]": ...
@overload
def ws_connect(
self, path: StrOrURL, *, decode_text: Literal[False], **kwargs: Any
) -> "_BaseRequestContextManager[ClientWebSocketResponse[Literal[False]]]": ...
@overload
def ws_connect(
self, path: StrOrURL, *, decode_text: bool = ..., **kwargs: Any
) -> "_BaseRequestContextManager[ClientWebSocketResponse[bool]]": ...
def ws_connect(
self, path: StrOrURL, *, decode_text: bool = True, **kwargs: Any
) -> "_BaseRequestContextManager[ClientWebSocketResponse[bool]]":
"""Initiate websocket connection.
The api corresponds to aiohttp.ClientSession.ws_connect.
"""
return _WSRequestContextManager(self._ws_connect(path, **kwargs))
return _WSRequestContextManager(
self._ws_connect(path, decode_text=decode_text, **kwargs)
)
@overload
async def _ws_connect(
self, path: StrOrURL, *, decode_text: Literal[True] = ..., **kwargs: Any
) -> "ClientWebSocketResponse[Literal[True]]": ...
@overload
async def _ws_connect(
self, path: StrOrURL, *, decode_text: Literal[False], **kwargs: Any
) -> "ClientWebSocketResponse[Literal[False]]": ...
@overload
async def _ws_connect(
self, path: StrOrURL, *, decode_text: bool = ..., **kwargs: Any
) -> "ClientWebSocketResponse[bool]": ...
async def _ws_connect(
self, path: StrOrURL, **kwargs: Any
) -> ClientWebSocketResponse:
ws = await self._session.ws_connect(self.make_url(path), **kwargs)
self, path: StrOrURL, *, decode_text: bool = True, **kwargs: Any
) -> "ClientWebSocketResponse[bool]":
ws = await self._session.ws_connect(
self.make_url(path), decode_text=decode_text, **kwargs
)
self._websockets.append(ws)
return ws
@ -496,9 +522,9 @@ class TestClient(Generic[_Request, _ApplicationNone]):
def __exit__(
self,
exc_type: Optional[Type[BaseException]],
exc: Optional[BaseException],
tb: Optional[TracebackType],
exc_type: type[BaseException] | None,
exc: BaseException | None,
tb: TracebackType | None,
) -> None:
# __exit__ should exist in pair with __enter__ but never executed
pass # pragma: no cover
@ -509,9 +535,9 @@ class TestClient(Generic[_Request, _ApplicationNone]):
async def __aexit__(
self,
exc_type: Optional[Type[BaseException]],
exc: Optional[BaseException],
tb: Optional[TracebackType],
exc_type: type[BaseException] | None,
exc: BaseException | None,
tb: TracebackType | None,
) -> None:
await self.close()
@ -648,14 +674,13 @@ def _create_app_mock() -> mock.MagicMock:
return app
def _create_transport(sslcontext: Optional[SSLContext] = None) -> mock.Mock:
def _create_transport(sslcontext: SSLContext | None = None) -> mock.Mock:
transport = mock.Mock()
def get_extra_info(key: str) -> Optional[SSLContext]:
def get_extra_info(key: str) -> SSLContext | tuple[str, int] | None:
if key == "sslcontext":
return sslcontext
else:
return None
return ("127.0.0.1", 80) if key == "sockname" else None
transport.get_extra_info.side_effect = get_extra_info
return transport
@ -674,7 +699,7 @@ def make_mocked_request(
protocol: Any = sentinel,
transport: Any = sentinel,
payload: StreamReader = EMPTY_PAYLOAD,
sslcontext: Optional[SSLContext] = None,
sslcontext: SSLContext | None = None,
client_max_size: int = 1024**2,
loop: Any = ...,
) -> Request:
@ -708,6 +733,9 @@ def make_mocked_request(
raw_hdrs = ()
chunked = "chunked" in headers.get(hdrs.TRANSFER_ENCODING, "").lower()
upgrade = headers.get(hdrs.CONNECTION, "").lower() == "upgrade" and bool(
headers.get(hdrs.UPGRADE)
)
message = RawRequestMessage(
method,
@ -717,7 +745,7 @@ def make_mocked_request(
raw_hdrs,
closing,
None,
False,
upgrade,
chunked,
URL(path),
)
@ -729,10 +757,16 @@ def make_mocked_request(
if protocol is sentinel:
protocol = mock.Mock()
protocol.max_field_size = 8190
protocol.max_line_length = 8190
protocol.max_headers = 128
protocol.transport = transport
type(protocol).peername = mock.PropertyMock(
return_value=transport.get_extra_info("peername")
)
type(protocol).sockname = mock.PropertyMock(
return_value=transport.get_extra_info("sockname")
)
type(protocol).ssl_context = mock.PropertyMock(return_value=sslcontext)
if writer is sentinel: