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, )