Skip to content

Commit

Permalink
fix create_memory_object_stream not subscriptable at runtime in old a…
Browse files Browse the repository at this point in the history
…nyio versions (#2833)
  • Loading branch information
graingert authored Jan 3, 2025
1 parent 7c0d1e6 commit 950f528
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 11 deletions.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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'",
]

Expand Down
3 changes: 2 additions & 1 deletion starlette/middleware/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
22 changes: 13 additions & 9 deletions starlette/testclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down

0 comments on commit 950f528

Please sign in to comment.