From 950f528bf5f620f68c10fc5a35939b716d38ee98 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Fri, 3 Jan 2025 13:16:39 +0000 Subject: [PATCH] fix create_memory_object_stream not subscriptable at runtime in old anyio versions (#2833) --- pyproject.toml | 2 +- starlette/middleware/base.py | 3 ++- starlette/testclient.py | 22 +++++++++++++--------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 223b6319f..02a3820fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ classifiers = [ "Topic :: Internet :: WWW/HTTP", ] dependencies = [ - "anyio>=3.4.0,<5", + "anyio>=3.6.2,<5", "typing_extensions>=3.10.0; python_version < '3.10'", ] diff --git a/starlette/middleware/base.py b/starlette/middleware/base.py index 6e37c6f60..f146984b3 100644 --- a/starlette/middleware/base.py +++ b/starlette/middleware/base.py @@ -172,7 +172,8 @@ async def body_stream() -> typing.AsyncGenerator[bytes, None]: response.raw_headers = message["headers"] return response - send_stream, recv_stream = anyio.create_memory_object_stream[Message]() + streams: anyio.create_memory_object_stream[Message] = anyio.create_memory_object_stream() + send_stream, recv_stream = streams with recv_stream, send_stream, collapse_excgroups(): async with anyio.create_task_group() as task_group: response = await self.dispatch_func(request, call_next) diff --git a/starlette/testclient.py b/starlette/testclient.py index 4f9788feb..fb2ad6e35 100644 --- a/starlette/testclient.py +++ b/starlette/testclient.py @@ -117,8 +117,10 @@ async def _run(self, *, task_status: anyio.abc.TaskStatus[anyio.CancelScope]) -> """ The sub-thread in which the websocket session runs. """ - send_tx, send_rx = anyio.create_memory_object_stream[Message](math.inf) - receive_tx, receive_rx = anyio.create_memory_object_stream[Message](math.inf) + send: anyio.create_memory_object_stream[Message] = anyio.create_memory_object_stream(math.inf) + send_tx, send_rx = send + receive: anyio.create_memory_object_stream[Message] = anyio.create_memory_object_stream(math.inf) + receive_tx, receive_rx = receive with send_tx, send_rx, receive_tx, receive_rx, anyio.CancelScope() as cs: self._receive_tx = receive_tx self._send_rx = send_rx @@ -657,14 +659,16 @@ def __enter__(self) -> TestClient: def reset_portal() -> None: self.portal = None - send1, receive1 = anyio.create_memory_object_stream[ - typing.Union[typing.MutableMapping[str, typing.Any], None] - ](math.inf) - send2, receive2 = anyio.create_memory_object_stream[typing.MutableMapping[str, typing.Any]](math.inf) - for channel in (send1, send2, receive1, receive2): + send: anyio.create_memory_object_stream[typing.MutableMapping[str, typing.Any] | None] = ( + anyio.create_memory_object_stream(math.inf) + ) + receive: anyio.create_memory_object_stream[typing.MutableMapping[str, typing.Any]] = ( + anyio.create_memory_object_stream(math.inf) + ) + for channel in (*send, *receive): stack.callback(channel.close) - self.stream_send = StapledObjectStream(send1, receive1) - self.stream_receive = StapledObjectStream(send2, receive2) + self.stream_send = StapledObjectStream(*send) + self.stream_receive = StapledObjectStream(*receive) self.task = portal.start_task_soon(self.lifespan) portal.call(self.wait_startup)