serverish 1.2.1__tar.gz → 1.3.0__tar.gz

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.
Files changed (48) hide show
  1. {serverish-1.2.1 → serverish-1.3.0}/PKG-INFO +2 -4
  2. {serverish-1.2.1 → serverish-1.3.0}/pyproject.toml +2 -2
  3. serverish-1.3.0/serverish/base/iterators.py +97 -0
  4. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_reader.py +6 -6
  5. {serverish-1.2.1 → serverish-1.3.0}/LICENSE +0 -0
  6. {serverish-1.2.1 → serverish-1.3.0}/README.md +0 -0
  7. {serverish-1.2.1 → serverish-1.3.0}/serverish/__init__.py +0 -0
  8. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/__init__.py +0 -0
  9. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/asyncio_util_functions.py +0 -0
  10. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/collector.py +0 -0
  11. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/datetime.py +0 -0
  12. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/exceptions.py +0 -0
  13. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/fifoset.py +0 -0
  14. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/hasstatuses.py +0 -0
  15. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/idmanger.py +0 -0
  16. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/manageable.py +0 -0
  17. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/singleton.py +0 -0
  18. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/status.py +0 -0
  19. {serverish-1.2.1 → serverish-1.3.0}/serverish/base/task_manager.py +0 -0
  20. {serverish-1.2.1 → serverish-1.3.0}/serverish/connection/__init__.py +0 -0
  21. {serverish-1.2.1 → serverish-1.3.0}/serverish/connection/connection.py +0 -0
  22. {serverish-1.2.1 → serverish-1.3.0}/serverish/connection/connection_jets.py +0 -0
  23. {serverish-1.2.1 → serverish-1.3.0}/serverish/connection/connection_nats.py +0 -0
  24. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/__init__.py +0 -0
  25. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/logging.py +0 -0
  26. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/messenger.py +0 -0
  27. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_callback_sub.py +0 -0
  28. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_journal_pub.py +0 -0
  29. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_journal_read.py +0 -0
  30. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_progress_pub.py +0 -0
  31. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_progress_read.py +0 -0
  32. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_publisher.py +0 -0
  33. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_rpc_req.py +0 -0
  34. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_rpc_resp.py +0 -0
  35. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_single_pub.py +0 -0
  36. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msg_single_read.py +0 -0
  37. {serverish-1.2.1 → serverish-1.3.0}/serverish/messenger/msgvalidator.py +0 -0
  38. {serverish-1.2.1 → serverish-1.3.0}/serverish/schema/config.schema.json +0 -0
  39. {serverish-1.2.1 → serverish-1.3.0}/serverish/schema/default.schema.json +0 -0
  40. {serverish-1.2.1 → serverish-1.3.0}/serverish/schema/include/timestamp.schema.json +0 -0
  41. {serverish-1.2.1 → serverish-1.3.0}/serverish/schema/journal.schema.json +0 -0
  42. {serverish-1.2.1 → serverish-1.3.0}/serverish/schema/meta.schema.json +0 -0
  43. {serverish-1.2.1 → serverish-1.3.0}/serverish/schema/program_current_state.schema.json +0 -0
  44. {serverish-1.2.1 → serverish-1.3.0}/serverish/schema/program_state.schema.json +0 -0
  45. {serverish-1.2.1 → serverish-1.3.0}/serverish/schema/progress.schema.json +0 -0
  46. {serverish-1.2.1 → serverish-1.3.0}/serverish/schema/telemetry.schema.json +0 -0
  47. {serverish-1.2.1 → serverish-1.3.0}/serverish/services/TODO.txt +0 -0
  48. {serverish-1.2.1 → serverish-1.3.0}/serverish/slog.py +0 -0
@@ -1,13 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: serverish
3
- Version: 1.2.1
3
+ Version: 1.3.0
4
4
  Summary: helpers for server alike projects
5
5
  Home-page: https://github.com/AkondLab/serverish
6
6
  Author: Mikołaj Kałuszyński
7
- Requires-Python: >=3.8,<4.0
7
+ Requires-Python: >=3.10,<4.0
8
8
  Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.8
10
- Classifier: Programming Language :: Python :: 3.9
11
9
  Classifier: Programming Language :: Python :: 3.10
12
10
  Classifier: Programming Language :: Python :: 3.11
13
11
  Classifier: Programming Language :: Python :: 3.12
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "serverish"
3
- version = "1.2.1"
3
+ version = "1.3.0"
4
4
  description = "helpers for server alike projects"
5
5
  authors = ["Mikołaj Kałuszyński", "MMME team"]
6
6
  readme = "README.md"
@@ -8,7 +8,7 @@ repository = "https://github.com/AkondLab/serverish"
8
8
  include = ["serverish/schema/*"]
9
9
 
10
10
  [tool.poetry.dependencies]
11
- python = "^3.8"
11
+ python = "^3.10"
12
12
  aiodns = {version="^3.2.0", optional=true}
13
13
  param = "^2.1.0"
14
14
  nats-py = { version = "^2.7.2", optional= true}
@@ -0,0 +1,97 @@
1
+ import asyncio
2
+ from typing import List, Dict, Any, Tuple, Set
3
+
4
+
5
+ class AsyncRangeIter:
6
+ """This class represent async range iterator (instead of sync).
7
+
8
+ WARNING: Noticed that end is included (not like in standard iterator).
9
+ Example 1: start=1, end=4, will return [1, 2, 3, 4]
10
+ Example 2: async for n in AsyncRangeIter(start=1, end=3): ...
11
+ """
12
+
13
+ def __init__(self, start: int, end: int) -> None:
14
+ self.start = start
15
+ self.end = end
16
+
17
+ def __aiter__(self) -> Any:
18
+ self.current = self.start
19
+ return self
20
+
21
+ async def __anext__(self) -> int:
22
+ if self.current <= self.end:
23
+ value = self.current
24
+ self.current += 1
25
+ await asyncio.sleep(0)
26
+ return value
27
+ else:
28
+ raise StopAsyncIteration
29
+
30
+
31
+ class AsyncListIter:
32
+ """This class represent async list iterator (instead of sync).
33
+
34
+ Example of use: async for n in AsyncListIter(some_list): ...
35
+ """
36
+ def __init__(self, iterable: List | Tuple | Set | Any):
37
+ self.iterable = iterable
38
+ self.index: int = 0
39
+
40
+ def __aiter__(self) -> Any:
41
+ self.index = 0
42
+ return self
43
+
44
+ async def __anext__(self):
45
+ if self.index < len(self.iterable):
46
+ value = self.iterable[self.index]
47
+ self.index += 1
48
+ await asyncio.sleep(0)
49
+ return value
50
+ else:
51
+ raise StopAsyncIteration
52
+
53
+
54
+ class AsyncEnumerateIter:
55
+ """This class represent async enumerate iterator (instead of sync).
56
+
57
+ Example of use: async for current_index, value in AsyncEnumerateIter(some_iterable): ...
58
+ """
59
+
60
+ def __init__(self, iterable: List | Tuple | Set | Any) -> None:
61
+ self.iterable = iterable
62
+
63
+ def __aiter__(self):
64
+ self.index = 0
65
+ return self
66
+
67
+ async def __anext__(self):
68
+ if self.index < len(self.iterable):
69
+ value = self.iterable[self.index]
70
+ current_index = self.index
71
+ self.index += 1
72
+ await asyncio.sleep(0)
73
+ return current_index, value
74
+ else:
75
+ raise StopAsyncIteration
76
+
77
+
78
+ class AsyncDictItemsIter:
79
+ """This class represent async dict items iterator (instead of sync).
80
+
81
+ Example of use: async for key, value in AsyncEnumerateIter(some_dict): ...
82
+ """
83
+
84
+ def __init__(self, data_dict: Dict) -> None:
85
+ self.data_dict = data_dict
86
+
87
+ def __aiter__(self) -> Any:
88
+ self.iterator = iter(self.data_dict.items())
89
+ return self
90
+
91
+ async def __anext__(self) -> Tuple:
92
+ try:
93
+ n, m = next(self.iterator)
94
+ await asyncio.sleep(0)
95
+ return n, m
96
+ except StopIteration:
97
+ raise StopAsyncIteration
@@ -205,21 +205,21 @@ class MsgReader(MsgDriver):
205
205
  if len(self.reader.messages) == 0:
206
206
  timeout = 100.0 # min(0.1 + self.n/10.0, 5.0)
207
207
  # batch = 1 if self.error is not None else 100 # recover slowly
208
- log.info(self.fmt(f"Pulling {self.reader.batch} messages with timeout {timeout}s"))
208
+ log.debug(self.fmt(f"Pulling {self.reader.batch} messages with timeout {timeout}s"))
209
209
  new_msgs = await self.reader.fetch_available(batch=self.reader.batch, timeout=timeout)
210
- log.info(self.fmt(f"Pulled {len(new_msgs)} messages"))
210
+ log.debug(self.fmt(f"Pulled {len(new_msgs)} messages"))
211
211
 
212
212
  # If no messages were available immediately, switch to blocking mode
213
213
  # to wait for at least one message more efficiently
214
214
  if len(new_msgs) == 0:
215
- log.info(self.fmt(f"No messages available immediately, waiting for at least one message with timeout {timeout:0.1f}s"))
215
+ log.debug(self.fmt(f"No messages available immediately, waiting for at least one message with timeout {timeout:0.1f}s"))
216
216
 
217
217
  # Use the regular fetch operation from nats (which blocks)
218
218
  try:
219
219
  new_msgs = await self.reader.pull_subscription.fetch(1, timeout=timeout)
220
- log.info(self.fmt(f"Received {len(new_msgs)} message while blocking waiting"))
220
+ log.debug(self.fmt(f"Received {len(new_msgs)} message while blocking waiting"))
221
221
  except asyncio.TimeoutError:
222
- log.info(self.fmt(f"No meesge before timeout"))
222
+ log.debug(self.fmt(f"No meesge before timeout"))
223
223
  except Exception as e:
224
224
  log.warning(self.fmt(f"Error waiting for messages: {e}"))
225
225
  # fi : no messages available immediately
@@ -347,7 +347,7 @@ class MsgReader(MsgDriver):
347
347
  except asyncio.TimeoutError:
348
348
  break
349
349
  except asyncio.QueueEmpty:
350
- log.info(f"{self} Queue is empty")
350
+ log.debug(f"{self} Queue is empty")
351
351
  break
352
352
 
353
353
  return msgs
File without changes
File without changes
File without changes