From 807851312272a1831b34b93b1b70c24bf1c8c16c Mon Sep 17 00:00:00 2001 From: jylpah Date: Sun, 7 Jan 2024 21:38:07 +0200 Subject: [PATCH 1/4] IterableQueue(): add is_done() --- src/pyutils/iterablequeue.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pyutils/iterablequeue.py b/src/pyutils/iterablequeue.py index 4b681ff..325b426 100644 --- a/src/pyutils/iterablequeue.py +++ b/src/pyutils/iterablequeue.py @@ -50,6 +50,10 @@ def __init__(self, count_items: bool = True, **kwargs): @property def is_filled(self) -> bool: return self._filled.is_set() + + @property + def is_done(self) -> bool: + return self.is_filled and self.empty() and not self.has_wip @property def maxsize(self) -> int: @@ -62,6 +66,8 @@ def _maxsize(self) -> int: def full(self) -> bool: return self._Q.full() + + def check_done(self) -> bool: if self.is_filled and self.empty() and not self.has_wip: self._done.set() From 65584439b6591eff80e069056d639c8a3da84c95 Mon Sep 17 00:00:00 2001 From: jylpah Date: Sun, 7 Jan 2024 21:41:33 +0200 Subject: [PATCH 2/4] tests for IterableQueue.is_done --- tests/test_iterablequeue.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_iterablequeue.py b/tests/test_iterablequeue.py index 66ac8af..3921337 100644 --- a/tests/test_iterablequeue.py +++ b/tests/test_iterablequeue.py @@ -215,9 +215,11 @@ async def test_6_finish_full_queue(test_interablequeue_int: IterableQueue[int]): assert ( Q.empty() ), f"Queue should be empty: qsize={Q._Q.qsize()}: {Q._Q.get_nowait()}, {Q._Q.get_nowait()}" + assert Q.is_done, "Queue is not done" except TimeoutError: assert False, "await IterableQueue.join() failed with an empty queue finished" await sleep(0.1) + assert Q.is_done, "Queue is not done" producer.cancel() @@ -232,9 +234,10 @@ async def test_7_aiter(test_interablequeue_int: IterableQueue[int]): await sleep(0.5) async for i in Q: assert i >= 0, "Did not receive an int" - assert ( - True - ), "Queue is done after 3 secs and the join() should finish before timeout(5)" + assert Q.is_done, "Queue is not done" + # assert ( + # True + # ), "Queue is done after 3 secs and the join() should finish before timeout(5)" except TimeoutError: assert False, "await IterableQueue.join() failed with an empty queue finished" From 5764e2fd74e60393df3c9c53842974bb4ae59922 Mon Sep 17 00:00:00 2001 From: jylpah Date: Sun, 7 Jan 2024 21:41:47 +0200 Subject: [PATCH 3/4] version 1.2.2 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9837812..5214df6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pyutils" -version = "1.2.1" +version = "1.2.2" authors = [{ name = "Jylpah", email = "jylpah@gmail.com" }] description = "Misc Python utils and classes" readme = "README.md" From 5d6e83d90baf087a06c99c2894c2f7ac9b7a6a40 Mon Sep 17 00:00:00 2001 From: jylpah Date: Sun, 7 Jan 2024 22:09:04 +0200 Subject: [PATCH 4/4] more tests for IterableQueue.is_done --- tests/test_iterablequeue.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_iterablequeue.py b/tests/test_iterablequeue.py index 3921337..07426bd 100644 --- a/tests/test_iterablequeue.py +++ b/tests/test_iterablequeue.py @@ -67,10 +67,10 @@ async def test_1_put_get_async(test_interablequeue_int: IterableQueue[int]): assert Q.qsize() == QSIZE - 1, f"qsize() returned {Q.qsize()}, should be {QSIZE-1}" try: await Q.put(1) - assert False, "Queue is done and put() should raise an exception" + assert False, "Queue is filled and put() should raise an exception" except QueueDone: pass # Queue is done and put() should raise an exception - + assert not Q.is_done, "is_done returned True even queue is not finished" consumer: Task = create_task(_consumer_int(Q)) try: async with timeout(5): @@ -132,6 +132,7 @@ async def test_3_multiple_producers(test_interablequeue_int: IterableQueue[int]) for _ in range(THREADS): workers.append(create_task(_producer_int(Q, N, finish=True, wait=0.05))) try: + assert not Q.is_done, "is_done returned True even queue is not finished" async with timeout(10): async for _ in Q: pass @@ -181,8 +182,10 @@ async def test_5_empty_join(test_interablequeue_int: IterableQueue[int]): """Test for await join when an empty queue is finished""" Q = test_interablequeue_int producer: Task = create_task(_producer_int(Q, n=0, finish=True, wait=2)) + assert not Q.is_done, "is_done returned True even queue is not finished" consumer: Task = create_task(_consumer_int(Q)) try: + async with timeout(3): await Q.join() assert (