queutils 0.8.5__py3-none-any.whl → 0.9.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
queutils/__init__.py CHANGED
@@ -2,10 +2,15 @@ from .countable import Countable as Countable
2
2
  from .asyncqueue import AsyncQueue as AsyncQueue
3
3
  from .iterablequeue import IterableQueue as IterableQueue, QueueDone as QueueDone
4
4
  from .filequeue import FileQueue as FileQueue
5
+ from .categorycounterqueue import (
6
+ QCounter as QCounter,
7
+ CategoryCounterQueue as CategoryCounterQueue,
8
+ )
5
9
 
6
10
  __all__ = [
7
11
  "asyncqueue",
8
12
  "countable",
13
+ "categorycounterqueue",
9
14
  "filequeue",
10
15
  "iterablequeue",
11
16
  ]
@@ -0,0 +1,116 @@
1
+ from asyncio import Queue
2
+ from typing import TypeVar
3
+ from deprecated import deprecated
4
+ from .countable import Countable
5
+ from .iterablequeue import IterableQueue, QueueDone
6
+ from collections import defaultdict
7
+ import logging
8
+
9
+ logger = logging.getLogger()
10
+ error = logger.error
11
+ message = logger.warning
12
+ verbose = logger.info
13
+ debug = logger.debug
14
+
15
+ ###########################################
16
+ #
17
+ # class CounterQueue
18
+ #
19
+ ###########################################
20
+ T = TypeVar("T")
21
+
22
+
23
+ @deprecated(version="0.9.1", reason="Use CategoryCounterQueue instead")
24
+ class CounterQueue(Queue[T], Countable):
25
+ """
26
+ CounterQueue is a asyncio.Queue for counting items
27
+ """
28
+
29
+ _counter: int
30
+ _count_items: bool
31
+ _batch: int
32
+
33
+ def __init__(
34
+ self, *args, count_items: bool = True, batch: int = 1, **kwargs
35
+ ) -> None:
36
+ super().__init__(*args, **kwargs)
37
+ self._counter = 0
38
+ self._count_items = count_items
39
+ self._batch = batch
40
+
41
+ def task_done(self) -> None:
42
+ super().task_done()
43
+ if self._count_items:
44
+ self._counter += 1
45
+ return None
46
+
47
+ @property
48
+ def count(self) -> int:
49
+ """Return number of completed tasks"""
50
+ return self._counter * self._batch
51
+
52
+ @property
53
+ def count_items(self) -> bool:
54
+ """Whether or not count items"""
55
+ return self._count_items
56
+
57
+
58
+ class CategoryCounterQueue(IterableQueue[tuple[str, int]]):
59
+ """
60
+ CategorySummerQueue is a asyncio.Queue for summing up values by category
61
+ """
62
+
63
+ _counter: defaultdict[str, int]
64
+ _batch: int
65
+
66
+ def __init__(self, *args, batch: int = 1, **kwargs) -> None:
67
+ super().__init__(*args, **kwargs)
68
+ self._batch = batch
69
+ self._counter = defaultdict(int)
70
+
71
+ async def receive(self) -> tuple[str, int]:
72
+ """Receive a category value from the queue and sum it"""
73
+ category: str
74
+ value: int
75
+ category, value = await super().get()
76
+ self._counter[category] += value
77
+ super().task_done()
78
+ return (category, value)
79
+
80
+ async def send(self, category: str = "count", value: int = 1) -> None:
81
+ """Send count of a category"""
82
+ await super().put((category, value))
83
+ return None
84
+
85
+ def get_count(self, category: str = "count") -> int:
86
+ """Return count of a category"""
87
+ return self._counter[category]
88
+
89
+ def get_counts(self) -> defaultdict[str, int]:
90
+ """Return counts of all categories"""
91
+ return self._counter
92
+
93
+ async def listen(self) -> defaultdict[str, int]:
94
+ """Listen for category values"""
95
+ try:
96
+ while True:
97
+ await self.receive()
98
+ except QueueDone:
99
+ pass
100
+ return self.get_counts()
101
+
102
+
103
+ class QCounter:
104
+ def __init__(self, Q: Queue[int]):
105
+ self._count = 0
106
+ self._Q: Queue[int] = Q
107
+
108
+ @property
109
+ def count(self) -> int:
110
+ return self._count
111
+
112
+ async def start(self) -> None:
113
+ """Read and count items from Q"""
114
+ while True:
115
+ self._count += await self._Q.get()
116
+ self._Q.task_done()
@@ -1,10 +1,11 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: queutils
3
- Version: 0.8.5
3
+ Version: 0.9.1
4
4
  Summary: Handy Python Queue utilies
5
5
  Project-URL: Homepage, https://github.com/Jylpah/queutils
6
6
  Project-URL: Bug Tracker, https://github.com/Jylpah/queutils/issues
7
7
  Author-email: Jylpah <jylpah@gmail.com>
8
+ License-File: LICENSE
8
9
  Classifier: Development Status :: 4 - Beta
9
10
  Classifier: Framework :: AsyncIO
10
11
  Classifier: License :: OSI Approved :: MIT License
@@ -13,6 +14,7 @@ Classifier: Programming Language :: Python :: 3
13
14
  Classifier: Topic :: Software Development :: Libraries
14
15
  Requires-Python: >=3.11
15
16
  Requires-Dist: aioconsole>=0.6
17
+ Requires-Dist: deprecated>=1.2.18
16
18
  Provides-Extra: dev
17
19
  Requires-Dist: build>=0.10; extra == 'dev'
18
20
  Requires-Dist: hatchling>=1.22.4; extra == 'dev'
@@ -24,6 +26,7 @@ Requires-Dist: pytest-datafiles>=3.0; extra == 'dev'
24
26
  Requires-Dist: pytest-timeout>=2.2; extra == 'dev'
25
27
  Requires-Dist: pytest>=8.0; extra == 'dev'
26
28
  Requires-Dist: ruff>=0.1.9; extra == 'dev'
29
+ Requires-Dist: types-deprecated>=1.2.15; extra == 'dev'
27
30
  Description-Content-Type: text/markdown
28
31
 
29
32
  [![Python package](https://github.com/Jylpah/queutils/actions/workflows/python-package.yml/badge.svg)](https://github.com/Jylpah/queutils/actions/workflows/python-package.yml) [![codecov](https://codecov.io/gh/Jylpah/queutils/graph/badge.svg?token=rMKdbfHOFs)](https://codecov.io/gh/Jylpah/queutils)
@@ -0,0 +1,11 @@
1
+ queutils/__init__.py,sha256=buANyRlxO1x4G_EBE3tYFpPtZGSepJDKRkWl-zKct1M,453
2
+ queutils/asyncqueue.py,sha256=GZRmlWTBQoKzTf7xr4MI-qhNqvIiaNWswAxFokP91Lg,2789
3
+ queutils/categorycounterqueue.py,sha256=Ku5pAJXSsoNyUsuWkQe9w7SaPeiPwPHFMdZFqA0LtBw,3097
4
+ queutils/countable.py,sha256=YSi7ILf9CuB5Tm3T4UUMEFlveqzqcmomfqJAlLGHEz8,172
5
+ queutils/filequeue.py,sha256=q2ly9H-lSCq6xuOqT1IlWgyCVyLoZiKbc0NuzmkF4aw,5360
6
+ queutils/iterablequeue.py,sha256=ZXwa9040yTawL1DMMNBXgQKiYr32nmzuSbgi-raAtZc,8664
7
+ queutils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ queutils-0.9.1.dist-info/METADATA,sha256=zT3br-kHUXjDGp2QhPxW_K-EvP212VUYWZNbjTb-MUA,4281
9
+ queutils-0.9.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
10
+ queutils-0.9.1.dist-info/licenses/LICENSE,sha256=J1zeIKU2JVQmhwO2hHQDK8WR6zjVZ-wX8r7ZlL45AbI,1063
11
+ queutils-0.9.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.26.3
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,10 +0,0 @@
1
- queutils/__init__.py,sha256=MboAom80iQTQURz0liGv_f2ae2Np8YA5ORX1LwsNa50,311
2
- queutils/asyncqueue.py,sha256=GZRmlWTBQoKzTf7xr4MI-qhNqvIiaNWswAxFokP91Lg,2789
3
- queutils/countable.py,sha256=YSi7ILf9CuB5Tm3T4UUMEFlveqzqcmomfqJAlLGHEz8,172
4
- queutils/filequeue.py,sha256=q2ly9H-lSCq6xuOqT1IlWgyCVyLoZiKbc0NuzmkF4aw,5360
5
- queutils/iterablequeue.py,sha256=ZXwa9040yTawL1DMMNBXgQKiYr32nmzuSbgi-raAtZc,8664
6
- queutils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- queutils-0.8.5.dist-info/METADATA,sha256=6sJ7O4naraaat7-8ZFeTD9c_r1RFM9uDtkotLuX6aq0,4169
8
- queutils-0.8.5.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
9
- queutils-0.8.5.dist-info/licenses/LICENSE,sha256=J1zeIKU2JVQmhwO2hHQDK8WR6zjVZ-wX8r7ZlL45AbI,1063
10
- queutils-0.8.5.dist-info/RECORD,,