From 3bf1053a206a2521983a5bc2673e9c4aac169090 Mon Sep 17 00:00:00 2001
From: Danipulok <45077699+Danipulok@users.noreply.github.com>
Date: Wed, 14 Aug 2024 23:34:32 +0300
Subject: [PATCH 1/5] Fix `AttributeError` on default repr
---
src/anyio/streams/memory.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/anyio/streams/memory.py b/src/anyio/streams/memory.py
index 23d74d2b..b547aa6a 100644
--- a/src/anyio/streams/memory.py
+++ b/src/anyio/streams/memory.py
@@ -38,6 +38,12 @@ class MemoryObjectItemReceiver(Generic[T_Item]):
task_info: TaskInfo = field(init=False, default_factory=get_current_task)
item: T_Item = field(init=False)
+ def __repr__(self) -> str:
+ # When item is not defined, we get following error with default __repr__:
+ # AttributeError: 'MemoryObjectItemReceiver' object has no attribute 'item'
+ item = getattr(self, "item", None)
+ return f"{self.__class__.__name__}(task_info={self.task_info}, item={item!r})"
+
@dataclass(eq=False)
class MemoryObjectStreamState(Generic[T_Item]):
From 3251e928b8b41ccb0ff2d8bfac8eefde2525797c Mon Sep 17 00:00:00 2001
From: Danipulok <45077699+Danipulok@users.noreply.github.com>
Date: Wed, 14 Aug 2024 23:51:07 +0300
Subject: [PATCH 2/5] Update versionhistory.rst
---
docs/versionhistory.rst | 2 ++
1 file changed, 2 insertions(+)
diff --git a/docs/versionhistory.rst b/docs/versionhistory.rst
index ed278586..79cc970f 100644
--- a/docs/versionhistory.rst
+++ b/docs/versionhistory.rst
@@ -5,6 +5,8 @@ This library adheres to `Semantic Versioning 2.0 `_.
**UNRELEASED**
+- Fixed ``str`` and ``repr`` of ``MemoryObjectItemReceiver``, when ``item`` is not defined.
+ (`#767 `_)
- Added support for the ``from_uri()``, ``full_match()``, ``parser`` methods/properties
in ``anyio.Path``, newly added in Python 3.13
(`#737 `_)
From 8277579627edd066ae69c1838b6a4f0041eeff3b Mon Sep 17 00:00:00 2001
From: Danipulok <45077699+Danipulok@users.noreply.github.com>
Date: Thu, 15 Aug 2024 00:52:59 +0300
Subject: [PATCH 3/5] Update docs/versionhistory.rst
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Alex Grönholm
---
docs/versionhistory.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/versionhistory.rst b/docs/versionhistory.rst
index 79cc970f..5a42d0b0 100644
--- a/docs/versionhistory.rst
+++ b/docs/versionhistory.rst
@@ -5,8 +5,8 @@ This library adheres to `Semantic Versioning 2.0 `_.
**UNRELEASED**
-- Fixed ``str`` and ``repr`` of ``MemoryObjectItemReceiver``, when ``item`` is not defined.
- (`#767 `_)
+- Fixed ``__repr__()`` of ``MemoryObjectItemReceiver``, when ``item`` is not defined
+ (`#767 `_; PR by @Danipulok)
- Added support for the ``from_uri()``, ``full_match()``, ``parser`` methods/properties
in ``anyio.Path``, newly added in Python 3.13
(`#737 `_)
From 9f292692dccd1ecc97c2cb2a5cfad17306ad90f9 Mon Sep 17 00:00:00 2001
From: Danipulok
Date: Thu, 15 Aug 2024 18:51:48 +0300
Subject: [PATCH 4/5] Add tests for `MemoryObjectItemReceiver` repr
---
tests/streams/test_memory.py | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/tests/streams/test_memory.py b/tests/streams/test_memory.py
index 246d4014..dc9865a2 100644
--- a/tests/streams/test_memory.py
+++ b/tests/streams/test_memory.py
@@ -18,7 +18,11 @@
wait_all_tasks_blocked,
)
from anyio.abc import ObjectReceiveStream, ObjectSendStream, TaskStatus
-from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
+from anyio.streams.memory import (
+ MemoryObjectItemReceiver,
+ MemoryObjectReceiveStream,
+ MemoryObjectSendStream,
+)
if sys.version_info < (3, 11):
from exceptiongroup import ExceptionGroup
@@ -502,3 +506,20 @@ async def test_send_to_natively_cancelled_receiver() -> None:
await receive_task
assert receive.receive_nowait() == "hello"
+
+
+async def test_memory_object_item_receiver_repr() -> None:
+ """
+ Test the repr of `MemoryObjectItemReceiver`.
+ Since when `item` is not set, the default dataclass repr raises an AttributeError.
+ """
+ receiver = MemoryObjectItemReceiver[str]()
+
+ assert str(receiver) is not None
+ receiver_repr = repr(receiver)
+ assert "item=None" in receiver_repr
+
+ assert str(receiver) is not None
+ receiver.item = "test_item"
+ receiver_repr = repr(receiver)
+ assert "item='test_item'" in receiver_repr
From 2350044050c123935da1d9c6b79b08f54d8f7b81 Mon Sep 17 00:00:00 2001
From: "pre-commit-ci[bot]"
<66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date: Thu, 15 Aug 2024 15:53:51 +0000
Subject: [PATCH 5/5] [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
---
tests/streams/test_memory.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tests/streams/test_memory.py b/tests/streams/test_memory.py
index dc9865a2..0e6d022a 100644
--- a/tests/streams/test_memory.py
+++ b/tests/streams/test_memory.py
@@ -19,8 +19,8 @@
)
from anyio.abc import ObjectReceiveStream, ObjectSendStream, TaskStatus
from anyio.streams.memory import (
- MemoryObjectItemReceiver,
- MemoryObjectReceiveStream,
+ MemoryObjectItemReceiver,
+ MemoryObjectReceiveStream,
MemoryObjectSendStream,
)