funboost 18.9__py3-none-any.whl → 19.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.

Potentially problematic release.


This version of funboost might be problematic. Click here for more details.

@@ -0,0 +1,329 @@
1
+ import random
2
+ import weakref
3
+ from typing import AsyncIterator, Iterable, Mapping, Sequence, Tuple, Type
4
+
5
+ from funboost.utils.dependency_packages.aioredis_adapt_py311.client import Redis
6
+ from funboost.utils.dependency_packages.aioredis_adapt_py311.connection import Connection, ConnectionPool, EncodableT, SSLConnection
7
+ from funboost.utils.dependency_packages.aioredis_adapt_py311.exceptions import (
8
+ ConnectionError,
9
+ ReadOnlyError,
10
+ ResponseError,
11
+ TimeoutError,
12
+ )
13
+ from funboost.utils.dependency_packages.aioredis_adapt_py311.utils import str_if_bytes
14
+
15
+
16
+ class MasterNotFoundError(ConnectionError):
17
+ pass
18
+
19
+
20
+ class SlaveNotFoundError(ConnectionError):
21
+ pass
22
+
23
+
24
+ class SentinelManagedConnection(SSLConnection):
25
+ def __init__(self, **kwargs):
26
+ self.connection_pool = kwargs.pop("connection_pool")
27
+ if not kwargs.pop("ssl", False):
28
+ # use constructor from Connection class
29
+ super(SSLConnection, self).__init__(**kwargs)
30
+ else:
31
+ # use constructor from SSLConnection class
32
+ super().__init__(**kwargs)
33
+
34
+ def __repr__(self):
35
+ pool = self.connection_pool
36
+ s = f"{self.__class__.__name__}<service={pool.service_name}"
37
+ if self.host:
38
+ host_info = f",host={self.host},port={self.port}"
39
+ s += host_info
40
+ return s + ">"
41
+
42
+ async def connect_to(self, address):
43
+ self.host, self.port = address
44
+ await super().connect()
45
+ if self.connection_pool.check_connection:
46
+ await self.send_command("PING")
47
+ if str_if_bytes(await self.read_response()) != "PONG":
48
+ raise ConnectionError("PING failed")
49
+
50
+ async def connect(self):
51
+ if self._reader:
52
+ return # already connected
53
+ if self.connection_pool.is_master:
54
+ await self.connect_to(await self.connection_pool.get_master_address())
55
+ else:
56
+ async for slave in self.connection_pool.rotate_slaves():
57
+ try:
58
+ return await self.connect_to(slave)
59
+ except ConnectionError:
60
+ continue
61
+ raise SlaveNotFoundError # Never be here
62
+
63
+ async def read_response(self):
64
+ try:
65
+ return await super().read_response()
66
+ except ReadOnlyError:
67
+ if self.connection_pool.is_master:
68
+ # When talking to a master, a ReadOnlyError when likely
69
+ # indicates that the previous master that we're still connected
70
+ # to has been demoted to a slave and there's a new master.
71
+ # calling disconnect will force the connection to re-query
72
+ # sentinel during the next connect() attempt.
73
+ await self.disconnect()
74
+ raise ConnectionError("The previous master is now a slave")
75
+ raise
76
+
77
+
78
+ class SentinelConnectionPool(ConnectionPool):
79
+ """
80
+ Sentinel backed connection pool.
81
+
82
+ If ``check_connection`` flag is set to True, SentinelManagedConnection
83
+ sends a PING command right after establishing the connection.
84
+ """
85
+
86
+ def __init__(self, service_name, sentinel_manager, **kwargs):
87
+ kwargs["connection_class"] = kwargs.get(
88
+ "connection_class", SentinelManagedConnection
89
+ )
90
+ self.is_master = kwargs.pop("is_master", True)
91
+ self.check_connection = kwargs.pop("check_connection", False)
92
+ super().__init__(**kwargs)
93
+ self.connection_kwargs["connection_pool"] = weakref.proxy(self)
94
+ self.service_name = service_name
95
+ self.sentinel_manager = sentinel_manager
96
+ self.master_address = None
97
+ self.slave_rr_counter = None
98
+
99
+ def __repr__(self):
100
+ return (
101
+ f"{self.__class__.__name__}"
102
+ f"<service={self.service_name}({self.is_master and 'master' or 'slave'})>"
103
+ )
104
+
105
+ def reset(self):
106
+ super().reset()
107
+ self.master_address = None
108
+ self.slave_rr_counter = None
109
+
110
+ def owns_connection(self, connection: Connection):
111
+ check = not self.is_master or (
112
+ self.is_master and self.master_address == (connection.host, connection.port)
113
+ )
114
+ return check and super().owns_connection(connection)
115
+
116
+ async def get_master_address(self):
117
+ master_address = await self.sentinel_manager.discover_master(self.service_name)
118
+ if self.is_master:
119
+ if self.master_address != master_address:
120
+ self.master_address = master_address
121
+ # disconnect any idle connections so that they reconnect
122
+ # to the new master the next time that they are used.
123
+ await self.disconnect(inuse_connections=False)
124
+ return master_address
125
+
126
+ async def rotate_slaves(self) -> AsyncIterator:
127
+ """Round-robin slave balancer"""
128
+ slaves = await self.sentinel_manager.discover_slaves(self.service_name)
129
+ if slaves:
130
+ if self.slave_rr_counter is None:
131
+ self.slave_rr_counter = random.randint(0, len(slaves) - 1)
132
+ for _ in range(len(slaves)):
133
+ self.slave_rr_counter = (self.slave_rr_counter + 1) % len(slaves)
134
+ slave = slaves[self.slave_rr_counter]
135
+ yield slave
136
+ # Fallback to the master connection
137
+ try:
138
+ yield await self.get_master_address()
139
+ except MasterNotFoundError:
140
+ pass
141
+ raise SlaveNotFoundError(f"No slave found for {self.service_name!r}")
142
+
143
+
144
+ class Sentinel:
145
+ """
146
+ Redis Sentinel cluster client
147
+
148
+ >>> from funboost.utils.dependency_packages.aioredis_adapt_py311.sentinel import Sentinel
149
+ >>> sentinel = Sentinel([('localhost', 26379)], socket_timeout=0.1)
150
+ >>> master = sentinel.master_for('mymaster', socket_timeout=0.1)
151
+ >>> await master.set('foo', 'bar')
152
+ >>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1)
153
+ >>> await slave.get('foo')
154
+ b'bar'
155
+
156
+ ``sentinels`` is a list of sentinel nodes. Each node is represented by
157
+ a pair (hostname, port).
158
+
159
+ ``min_other_sentinels`` defined a minimum number of peers for a sentinel.
160
+ When querying a sentinel, if it doesn't meet this threshold, responses
161
+ from that sentinel won't be considered valid.
162
+
163
+ ``sentinel_kwargs`` is a dictionary of connection arguments used when
164
+ connecting to sentinel instances. Any argument that can be passed to
165
+ a normal Redis connection can be specified here. If ``sentinel_kwargs`` is
166
+ not specified, any socket_timeout and socket_keepalive options specified
167
+ in ``connection_kwargs`` will be used.
168
+
169
+ ``connection_kwargs`` are keyword arguments that will be used when
170
+ establishing a connection to a Redis server.
171
+ """
172
+
173
+ def __init__(
174
+ self,
175
+ sentinels,
176
+ min_other_sentinels=0,
177
+ sentinel_kwargs=None,
178
+ **connection_kwargs,
179
+ ):
180
+ # if sentinel_kwargs isn't defined, use the socket_* options from
181
+ # connection_kwargs
182
+ if sentinel_kwargs is None:
183
+ sentinel_kwargs = {
184
+ k: v for k, v in connection_kwargs.items() if k.startswith("socket_")
185
+ }
186
+ self.sentinel_kwargs = sentinel_kwargs
187
+
188
+ self.sentinels = [
189
+ Redis(host=hostname, port=port, **self.sentinel_kwargs)
190
+ for hostname, port in sentinels
191
+ ]
192
+ self.min_other_sentinels = min_other_sentinels
193
+ self.connection_kwargs = connection_kwargs
194
+
195
+ def __repr__(self):
196
+ sentinel_addresses = []
197
+ for sentinel in self.sentinels:
198
+ sentinel_addresses.append(
199
+ f"{sentinel.connection_pool.connection_kwargs['host']}:"
200
+ f"{sentinel.connection_pool.connection_kwargs['port']}"
201
+ )
202
+ return f"{self.__class__.__name__}<sentinels=[{','.join(sentinel_addresses)}]>"
203
+
204
+ def check_master_state(self, state: dict, service_name: str) -> bool:
205
+ if not state["is_master"] or state["is_sdown"] or state["is_odown"]:
206
+ return False
207
+ # Check if our sentinel doesn't see other nodes
208
+ if state["num-other-sentinels"] < self.min_other_sentinels:
209
+ return False
210
+ return True
211
+
212
+ async def discover_master(self, service_name: str):
213
+ """
214
+ Asks sentinel servers for the Redis master's address corresponding
215
+ to the service labeled ``service_name``.
216
+
217
+ Returns a pair (address, port) or raises MasterNotFoundError if no
218
+ master is found.
219
+ """
220
+ for sentinel_no, sentinel in enumerate(self.sentinels):
221
+ try:
222
+ masters = await sentinel.sentinel_masters()
223
+ except (ConnectionError, TimeoutError):
224
+ continue
225
+ state = masters.get(service_name)
226
+ if state and self.check_master_state(state, service_name):
227
+ # Put this sentinel at the top of the list
228
+ self.sentinels[0], self.sentinels[sentinel_no] = (
229
+ sentinel,
230
+ self.sentinels[0],
231
+ )
232
+ return state["ip"], state["port"]
233
+ raise MasterNotFoundError(f"No master found for {service_name!r}")
234
+
235
+ def filter_slaves(
236
+ self, slaves: Iterable[Mapping]
237
+ ) -> Sequence[Tuple[EncodableT, EncodableT]]:
238
+ """Remove slaves that are in an ODOWN or SDOWN state"""
239
+ slaves_alive = []
240
+ for slave in slaves:
241
+ if slave["is_odown"] or slave["is_sdown"]:
242
+ continue
243
+ slaves_alive.append((slave["ip"], slave["port"]))
244
+ return slaves_alive
245
+
246
+ async def discover_slaves(
247
+ self, service_name: str
248
+ ) -> Sequence[Tuple[EncodableT, EncodableT]]:
249
+ """Returns a list of alive slaves for service ``service_name``"""
250
+ for sentinel in self.sentinels:
251
+ try:
252
+ slaves = await sentinel.sentinel_slaves(service_name)
253
+ except (ConnectionError, ResponseError, TimeoutError):
254
+ continue
255
+ slaves = self.filter_slaves(slaves)
256
+ if slaves:
257
+ return slaves
258
+ return []
259
+
260
+ def master_for(
261
+ self,
262
+ service_name: str,
263
+ redis_class: Type[Redis] = Redis,
264
+ connection_pool_class: Type[SentinelConnectionPool] = SentinelConnectionPool,
265
+ **kwargs,
266
+ ):
267
+ """
268
+ Returns a redis client instance for the ``service_name`` master.
269
+
270
+ A :py:class:`~redis.sentinel.SentinelConnectionPool` class is
271
+ used to retrive the master's address before establishing a new
272
+ connection.
273
+
274
+ NOTE: If the master's address has changed, any cached connections to
275
+ the old master are closed.
276
+
277
+ By default clients will be a :py:class:`~redis.Redis` instance.
278
+ Specify a different class to the ``redis_class`` argument if you
279
+ desire something different.
280
+
281
+ The ``connection_pool_class`` specifies the connection pool to
282
+ use. The :py:class:`~redis.sentinel.SentinelConnectionPool`
283
+ will be used by default.
284
+
285
+ All other keyword arguments are merged with any connection_kwargs
286
+ passed to this class and passed to the connection pool as keyword
287
+ arguments to be used to initialize Redis connections.
288
+ """
289
+ kwargs["is_master"] = True
290
+ connection_kwargs = dict(self.connection_kwargs)
291
+ connection_kwargs.update(kwargs)
292
+ return redis_class(
293
+ connection_pool=connection_pool_class(
294
+ service_name, self, **connection_kwargs
295
+ )
296
+ )
297
+
298
+ def slave_for(
299
+ self,
300
+ service_name: str,
301
+ redis_class: Type[Redis] = Redis,
302
+ connection_pool_class: Type[SentinelConnectionPool] = SentinelConnectionPool,
303
+ **kwargs,
304
+ ):
305
+ """
306
+ Returns redis client instance for the ``service_name`` slave(s).
307
+
308
+ A SentinelConnectionPool class is used to retrive the slave's
309
+ address before establishing a new connection.
310
+
311
+ By default clients will be a :py:class:`~redis.Redis` instance.
312
+ Specify a different class to the ``redis_class`` argument if you
313
+ desire something different.
314
+
315
+ The ``connection_pool_class`` specifies the connection pool to use.
316
+ The SentinelConnectionPool will be used by default.
317
+
318
+ All other keyword arguments are merged with any connection_kwargs
319
+ passed to this class and passed to the connection pool as keyword
320
+ arguments to be used to initialize Redis connections.
321
+ """
322
+ kwargs["is_master"] = False
323
+ connection_kwargs = dict(self.connection_kwargs)
324
+ connection_kwargs.update(kwargs)
325
+ return redis_class(
326
+ connection_pool=connection_pool_class(
327
+ service_name, self, **connection_kwargs
328
+ )
329
+ )
@@ -0,0 +1,61 @@
1
+ from typing import TYPE_CHECKING, TypeVar, overload
2
+
3
+ if TYPE_CHECKING:
4
+ from funboost.utils.dependency_packages.aioredis_adapt_py311 import Redis
5
+ from funboost.utils.dependency_packages.aioredis_adapt_py311.client import Pipeline
6
+
7
+
8
+ try:
9
+ import hiredis # noqa
10
+
11
+ HIREDIS_AVAILABLE = True
12
+ except ImportError:
13
+ HIREDIS_AVAILABLE = False
14
+
15
+
16
+ _T = TypeVar("_T")
17
+
18
+
19
+ def from_url(url, **kwargs):
20
+ """
21
+ Returns an active Redis client generated from the given database URL.
22
+
23
+ Will attempt to extract the database id from the path url fragment, if
24
+ none is provided.
25
+ """
26
+ from funboost.utils.dependency_packages.aioredis_adapt_py311.client import Redis
27
+
28
+ return Redis.from_url(url, **kwargs)
29
+
30
+
31
+ class pipeline:
32
+ def __init__(self, redis_obj: "Redis"):
33
+ self.p: "Pipeline" = redis_obj.pipeline()
34
+
35
+ async def __aenter__(self) -> "Pipeline":
36
+ return self.p
37
+
38
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
39
+ await self.p.execute()
40
+ del self.p
41
+
42
+
43
+ # Mypy bug: https://github.com/python/mypy/issues/11005
44
+ @overload
45
+ def str_if_bytes(value: bytes) -> str: # type: ignore[misc]
46
+ ...
47
+
48
+
49
+ @overload
50
+ def str_if_bytes(value: _T) -> _T:
51
+ ...
52
+
53
+
54
+ def str_if_bytes(value: object) -> object:
55
+ return (
56
+ value.decode("utf-8", errors="replace") if isinstance(value, bytes) else value
57
+ )
58
+
59
+
60
+ def safe_str(value: object) -> str:
61
+ return str(str_if_bytes(value))
@@ -36,9 +36,10 @@ class MongoMixin:
36
36
  """
37
37
  processid__client_map = {}
38
38
  processid__db_map = {}
39
+ processid__col_map = {}
39
40
 
40
41
  @property
41
- def mongo_client(self):
42
+ def mongo_client(self) -> pymongo.MongoClient:
42
43
  pid = os.getpid()
43
44
  if pid not in MongoMixin.processid__client_map:
44
45
  MongoMixin.processid__client_map[pid] = pymongo.MongoClient(funboost_config_deafult.MONGO_CONNECT_URL, connect=False)
@@ -51,3 +52,12 @@ class MongoMixin:
51
52
  MongoMixin.processid__db_map[pid] = self.mongo_client.get_database('task_status')
52
53
  return MongoMixin.processid__db_map[pid]
53
54
 
55
+ def get_mongo_collection(self,database_name,colleciton_name):
56
+ pid = os.getpid()
57
+ if pid not in MongoMixin.processid__col_map:
58
+ MongoMixin.processid__col_map[pid] = self.mongo_client.get_database(database_name).get_collection(colleciton_name)
59
+ return MongoMixin.processid__col_map[pid]
60
+
61
+
62
+
63
+
@@ -3,8 +3,9 @@ import redis2 as redis
3
3
  import redis3
4
4
  from funboost import funboost_config_deafult
5
5
  from funboost.utils import decorators
6
- import aioredis
7
- from aioredis.client import Redis as AioRedis
6
+
7
+ from funboost.utils.dependency_packages.aioredis_adapt_py311.client import Redis as AioRedis
8
+
8
9
 
9
10
  class RedisManager(object):
10
11
  _pool_dict = {}
@@ -97,8 +98,4 @@ class AioRedisMixin(object):
97
98
  @decorators.cached_method_result
98
99
  def aioredis_db_filter_and_rpc_result(self):
99
100
  return AioRedis(host=funboost_config_deafult.REDIS_HOST, port=funboost_config_deafult.REDIS_PORT,
100
- password=funboost_config_deafult.REDIS_PASSWORD, db=funboost_config_deafult.REDIS_DB_FILTER_AND_RPC_RESULT, decode_responses=True)
101
-
102
-
103
-
104
-
101
+ password=funboost_config_deafult.REDIS_PASSWORD, db=funboost_config_deafult.REDIS_DB_FILTER_AND_RPC_RESULT, decode_responses=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 18.9
3
+ Version: 19.1
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,。支持python所有类型的并发模式和一切知名消息队列中间件,python函数加速器,框架包罗万象,一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数。旧名字是function_scheduling_distributed_framework
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs
@@ -65,7 +65,6 @@ Requires-Dist: pysnooper
65
65
  Requires-Dist: deprecated
66
66
  Requires-Dist: cryptography
67
67
  Requires-Dist: auto-run-on-remote
68
- Requires-Dist: aioredis
69
68
 
70
69
 
71
70
  # 1.分布式函数调度框架简介
@@ -23,7 +23,7 @@ funboost/concurrent_pool/backup/async_pool_executor0223.py,sha256=K13RheWQiX3Fc2
23
23
  funboost/concurrent_pool/backup/async_pool_executor_back.py,sha256=-asM6fu3GLJKkkBZ1cbTSX9Iico74e6QEW6IWCpjk3M,9560
24
24
  funboost/concurrent_pool/backup/async_pool_executor_janus.py,sha256=cZ0Vm0qeT3sKcWQ6B6M6EIP1Wyk9WDHjk1TWAB1YQpc,5724
25
25
  funboost/consumers/__init__.py,sha256=ZXY_6Kut1VYNQiF5aWEgIWobsW1ht9YUP0TdRZRWFqI,126
26
- funboost/consumers/base_consumer.py,sha256=f8vUdbmIC17wLhSht1lAgPAHEvC-dK8d7GSnMg734vQ,83741
26
+ funboost/consumers/base_consumer.py,sha256=CzjbZZt6HkydI5OnB2wfJJcBTM6EnrTENRBQk4HwxxA,84457
27
27
  funboost/consumers/confirm_mixin.py,sha256=C2TYSRJ2vnXAVetd7YNcQ-LQq-HZgQZSAXXzsJ6rmUY,5497
28
28
  funboost/consumers/http_consumer.py,sha256=m9-o0nNeiG7UFr6iLhpfNuMd0bQNYI38i4cw0vC8MjM,2041
29
29
  funboost/consumers/http_consumer000.py,sha256=NXOSiN1qpLAJfJkuF6SjFpWQ28YxMDULzWCBTNMwYe8,4463
@@ -62,7 +62,7 @@ funboost/factories/__init__.py,sha256=s7kKKjR1HU5eMjPD6r5b-SXTVMo1zBp2JjOAtkyt5Y
62
62
  funboost/factories/consumer_factory.py,sha256=UY063zP7GQB4kYxG1WDbn8jINy3vNSiU9SJ0ZZFaagQ,3218
63
63
  funboost/factories/publisher_factotry.py,sha256=FvpPIAH174huwb5gfrXpt_g44ZwViJi2RIfkmrHKNMY,4504
64
64
  funboost/function_result_web/app.py,sha256=xUSDBwwDA5wQVWFdFBXj9Y1s7BOh2itUw5pCZl0URMw,4841
65
- funboost/function_result_web/functions.py,sha256=PXwMymY9_99RY_pXC38Cd3HK63PmQTGlTnrIOs6NTI8,7203
65
+ funboost/function_result_web/functions.py,sha256=OIPMxc4jv51qnhBxFGfTZnpMx5p4lQflPoTviDTbJUc,7345
66
66
  funboost/function_result_web/__pycache__/app.cpython-37.pyc,sha256=p-jwU7xf31KOJhmhNXqj6J79PTxjMbiTU16gAotpSEw,4045
67
67
  funboost/function_result_web/__pycache__/functions.cpython-37.pyc,sha256=KuU8DnYhFpYN0p9rdDXE9mqFuE7eKkcXHCNze3aAdOw,3921
68
68
  funboost/function_result_web/static/assets/css/custom.css,sha256=3brvjy2aBOTIXcTUK4NV6dX5wFRqx6K2aLu_jQn63jM,7674
@@ -86,7 +86,7 @@ funboost/publishers/httpsqs_publisher.py,sha256=7cf5ijwrbp4smq6ofndrKisruAqG0Wzf
86
86
  funboost/publishers/kafka_publisher.py,sha256=49JKL9PopDSIiQ3ZKBSSNPhByR-owxc2pbM4nT4Tc6g,2156
87
87
  funboost/publishers/kombu_publisher.py,sha256=ChX3qVE7Kvdu9XVFCKezV2KAwUqY7EhpvMS8nFelsY8,4567
88
88
  funboost/publishers/local_python_queue_publisher.py,sha256=veskMS5tjeneYU9HmrJLXZSK9_UT48NzHzcljjOoy3g,1365
89
- funboost/publishers/mongomq_publisher.py,sha256=hK2yIwfHctexmUKIjPjvbIjclc2JjzpMC15aIX1WtfI,1327
89
+ funboost/publishers/mongomq_publisher.py,sha256=t-vayvMsGhWEREJ1PzOFNuEMK9TOSKhD-DggzkS__nc,1453
90
90
  funboost/publishers/mqtt_publisher.py,sha256=NKVDE5R12QL99IXgRjJtF4phyW8QaXKxHkqW5p_kXr4,3050
91
91
  funboost/publishers/msg_result_getter.py,sha256=R_tYQUgnZtTUWge--i1j_aYZLY3wysNTTFKCQ2JKQbE,6161
92
92
  funboost/publishers/nats_publisher.py,sha256=hFfaQovij9dm8w-iRN0SgiHHoS_TlrTAjw42dPwCLSA,776
@@ -123,13 +123,13 @@ funboost/utils/custom_pysnooper.py,sha256=7yXLKEMY_JjPRRt0Y0N-wV2CFhILlYNh40Y6uR
123
123
  funboost/utils/decorators.py,sha256=1JdiRucuQf_kApRO7gqxiD6K5eUuK_HjetURNRlodxQ,24272
124
124
  funboost/utils/develop_log.py,sha256=f82JHBPBjdF_By5P_Ft4wMREeIHtF8MmqGFYa_pZbyA,251
125
125
  funboost/utils/log_manager000.py,sha256=GT9rR9O-UDeaFwTCwt68xdVAmrw0vmAi1FofjRSXrJ4,73634
126
- funboost/utils/mongo_util.py,sha256=nh9RI-d8Nmtb2rcm3BLBkVsnf7bLTDMBG00AkEFUVis,1910
126
+ funboost/utils/mongo_util.py,sha256=BWZnkbyHU7-zFCQ5r0Ajib5kK1S-INUR3IbE5ejIxzo,2297
127
127
  funboost/utils/monkey_color_log.py,sha256=jxxxVKebX0MmVjg75YRXUOBhPbksPBrHp2KLxCj6pT8,7357
128
128
  funboost/utils/monkey_patches.py,sha256=Q0_jKxOfFrSgrIDSuSZFrgNh6w_LRGaKAITghrIpEwI,2882
129
129
  funboost/utils/mqtt_util.py,sha256=BfCmyYwI-B8VL9499_IuYlJDCbv6ZhwyWThMf8dANOU,3199
130
130
  funboost/utils/paramiko_util.py,sha256=pu67zkgptqNSV9m2Lznezb3zF1AFYvkWJp_6DVKFSPU,4901
131
131
  funboost/utils/rabbitmq_factory.py,sha256=NPzTwG-INZG9aJgkzp-QVk3TgV0rjiuTVT5lmRT77zg,2963
132
- funboost/utils/redis_manager.py,sha256=HHjhhkx2pQ8EGnzIBuvPiD4pV3hhuuPmx9JBYdU0zG0,4625
132
+ funboost/utils/redis_manager.py,sha256=1WkUxy7ZU9oGNipPpJpbHvfFGRh0o2-tdfFCWpY6Gcg,4647
133
133
  funboost/utils/resource_monitoring.py,sha256=vf1htYa3a4wlMfQqksvIINMw8laiXwG5N8NXU2Zm3qQ,5532
134
134
  funboost/utils/show_funboost_flag.py,sha256=A4WB5P7SO9tFux1Y4yIurLmjLj09B973hq3LxEo4HOY,2985
135
135
  funboost/utils/simple_data_class.py,sha256=HgFyyrw2mDuMX6l-re8W6q-6HXwhg2MalpIbP9JKW70,1204
@@ -137,6 +137,15 @@ funboost/utils/sqla_queue.py,sha256=_QByOMlYsOyEak7pE-rLKBTLrz2U3UxXearEk-EEVmc,
137
137
  funboost/utils/time_util.py,sha256=Y-P6KowTNgGwXHzfQd4KnHdfLl8vAOqhg626MCKDvtA,5407
138
138
  funboost/utils/un_strict_json_dumps.py,sha256=uh2mXNRCq5dJcqMhb9CkfvehfEGYZAgI6RY1oLcYX_M,408
139
139
  funboost/utils/dependency_packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
+ funboost/utils/dependency_packages/aioredis_adapt_py311/__init__.py,sha256=rIr5v8Il9NnK1VD0iyr0igDGZBqMydS_FHssLcK50ps,1411
141
+ funboost/utils/dependency_packages/aioredis_adapt_py311/client.py,sha256=_IcqklkDS5MKLZ_zqOcZc2-IRbReif3DdWVpNZBr6oc,182882
142
+ funboost/utils/dependency_packages/aioredis_adapt_py311/compat.py,sha256=yplKtDh6CsO-sWqowLgyF5D3kwzcw7npEjlOGA3465k,183
143
+ funboost/utils/dependency_packages/aioredis_adapt_py311/connection.py,sha256=x-9UTbpp93q7V531bng2dwj0-uPTECVso5f7hw6s2hw,62267
144
+ funboost/utils/dependency_packages/aioredis_adapt_py311/exceptions.py,sha256=4cKa_B58ZSVjComO4_Qdqe1LUt5O7peKP7cuGMjeaJo,1585
145
+ funboost/utils/dependency_packages/aioredis_adapt_py311/lock.py,sha256=6vETUtlfzqaO1KPcek_VHdrBCUoRvzVmNWPDOT2ZvnQ,11745
146
+ funboost/utils/dependency_packages/aioredis_adapt_py311/log.py,sha256=qTxLRo5EqoHZIGqMguzLm90mtThBRYje_FaZz-fDbhg,427
147
+ funboost/utils/dependency_packages/aioredis_adapt_py311/sentinel.py,sha256=GTxz4dqxKpPV1GlOlHvlqloTR46rEx4HyCWyjYPvLkI,12771
148
+ funboost/utils/dependency_packages/aioredis_adapt_py311/utils.py,sha256=qUIfIJaWACq5V0fC8MlvI37IRYTVDV9OjdCY1rEmL2M,1425
140
149
  funboost/utils/dependency_packages/mongomq/__init__.py,sha256=yP7LHPsZ5ResiexksmtyJc9HGbMJWwZ0gOvHk2vNcz0,131
141
150
  funboost/utils/dependency_packages/mongomq/lock.py,sha256=anmWK7yoFnjW0ovPFuUiEKgIzw_1gymi2-mnyd3ViYY,2486
142
151
  funboost/utils/dependency_packages/mongomq/mongomq.py,sha256=A-_Y0OXmCqGHiCdOFWW4V0ciMyp6gIaPPVK95uaqd_k,7902
@@ -148,8 +157,8 @@ funboost/utils/pysnooper_ydf/pycompat.py,sha256=ehsCfjsLdwoK0_o5fwYWDo3WeqCVfHW5
148
157
  funboost/utils/pysnooper_ydf/tracer.py,sha256=2leNcEhT0qt2B_7Vn094dep9AG0qnRX94imQHm4Qp8k,19122
149
158
  funboost/utils/pysnooper_ydf/utils.py,sha256=Y0nGXPqdiHBwO93TQAyYNbrzXtcK3_BQXrDVyjcTqVw,2748
150
159
  funboost/utils/pysnooper_ydf/variables.py,sha256=N12-WKrg4GFt3X1aw9c-jwuVbn2wQTNZXscrYP9RM2k,3678
151
- funboost-18.9.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
152
- funboost-18.9.dist-info/METADATA,sha256=mWjy2FEntPCdsrWHnCD_fqfupK_4y-vH2dbmcSKxUxQ,25655
153
- funboost-18.9.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
154
- funboost-18.9.dist-info/top_level.txt,sha256=K8WuKnS6MRcEWxP1NvbmCeujJq6TEfbsB150YROlRw0,9
155
- funboost-18.9.dist-info/RECORD,,
160
+ funboost-19.1.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
161
+ funboost-19.1.dist-info/METADATA,sha256=8ZXXWh1xRShpwof3PlLa0WKttv4lJocbx0G_BL3MkUU,25630
162
+ funboost-19.1.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
163
+ funboost-19.1.dist-info/top_level.txt,sha256=K8WuKnS6MRcEWxP1NvbmCeujJq6TEfbsB150YROlRw0,9
164
+ funboost-19.1.dist-info/RECORD,,