funboost 45.0__py3-none-any.whl → 45.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.

Files changed (75) hide show
  1. funboost/__init__.py +1 -1
  2. funboost/__init__old.py +1 -1
  3. funboost/constant.py +3 -0
  4. funboost/consumers/base_consumer.py +5 -2
  5. funboost/core/booster.py +6 -5
  6. funboost/core/func_params_model.py +5 -6
  7. funboost/core/helper_funs.py +1 -1
  8. funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
  9. funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
  10. funboost/publishers/base_publisher.py +17 -7
  11. funboost/set_frame_config.py +1 -1
  12. funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
  13. funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
  14. funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
  15. funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
  16. funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
  17. funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
  18. funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +59 -59
  19. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
  20. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
  21. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
  22. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
  23. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
  24. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
  25. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
  26. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
  27. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
  28. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
  29. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
  30. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
  31. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
  32. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
  33. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
  34. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
  35. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
  36. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
  37. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
  38. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
  39. funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
  40. funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +4804 -4804
  41. funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +8 -8
  42. funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +1668 -1668
  43. funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +96 -96
  44. funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +306 -306
  45. funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +15 -15
  46. funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +329 -329
  47. funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +61 -61
  48. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +16 -16
  49. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
  50. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
  51. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
  52. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
  53. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
  54. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
  55. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
  56. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
  57. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
  58. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
  59. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
  60. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
  61. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
  62. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
  63. funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
  64. funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +98 -98
  65. funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +7 -7
  66. funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +7 -7
  67. funboost/utils/times/__init__.py +85 -85
  68. funboost/utils/times/version.py +1 -1
  69. {funboost-45.0.dist-info → funboost-45.1.dist-info}/METADATA +7 -6
  70. {funboost-45.0.dist-info → funboost-45.1.dist-info}/RECORD +74 -45
  71. {funboost-45.0.dist-info → funboost-45.1.dist-info}/entry_points.txt +1 -0
  72. funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
  73. {funboost-45.0.dist-info → funboost-45.1.dist-info}/LICENSE +0 -0
  74. {funboost-45.0.dist-info → funboost-45.1.dist-info}/WHEEL +0 -0
  75. {funboost-45.0.dist-info → funboost-45.1.dist-info}/top_level.txt +0 -0
funboost/__init__.py CHANGED
@@ -13,7 +13,7 @@ set_frame_config这个模块的 use_config_form_funboost_config_module() 是核
13
13
  这段注释说明和使用的用户无关,只和框架开发人员有关.
14
14
  '''
15
15
 
16
- __version__ = "45.0"
16
+ __version__ = "45.1"
17
17
 
18
18
  from funboost.set_frame_config import show_frame_config
19
19
 
funboost/__init__old.py CHANGED
@@ -179,7 +179,7 @@ def boost(queue_name,
179
179
  funboost.funboost_config_deafult.BoostDecoratorDefaultParams 的值会自动被你项目根目录下的funboost_config.BoostDecoratorDefaultParams的值覆盖,
180
180
  如果boost装饰器不传参,默认使用funboost_config.BoostDecoratorDefaultParams的配置
181
181
 
182
- 入参也可以看文档 https://funboost.readthedocs.io/zh/latest/articles/c3.html 3.3章节。
182
+ 入参也可以看文档 https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html 3.3章节。
183
183
 
184
184
  # 为了代码提示好,这里重复一次入参意义。被此装饰器装饰的函数f,函数f对象本身自动加了一些方法,例如f.push 、 f.consume等。
185
185
  :param queue_name: 队列名字。
funboost/constant.py CHANGED
@@ -103,3 +103,6 @@ class ConstStrForClassMethod:
103
103
  FIRST_PARAM_NAME = 'first_param_name'
104
104
  CLS_NAME = 'cls_name'
105
105
  OBJ_INIT_PARAMS = 'obj_init_params'
106
+ CLS_MODULE = 'cls_module'
107
+ CLS_FILE = 'cls_file'
108
+
@@ -38,6 +38,7 @@ from funboost.core.func_params_model import BoosterParams, PublisherParams, Base
38
38
  from funboost.core.task_id_logger import TaskIdLogger
39
39
  from funboost.constant import FunctionKind
40
40
  from funboost.utils.json_helper import JsonUtils
41
+ from nb_libs.path_helper import PathHelper
41
42
  from nb_log import (get_logger, LoggerLevelSetterMixin, LogManager, is_main_process,
42
43
  nb_log_config_default)
43
44
  from funboost.core.loggers import FunboostFileLoggerMixin, logger_prompt
@@ -581,11 +582,13 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
581
582
  method_first_param_name = k
582
583
  method_first_param_value = v
583
584
  break
584
- method_cls = getattr(sys.modules[self.consumer_params.consuming_function_class_module],
585
- self.consumer_params.consuming_function_class_name)
585
+ # method_cls = getattr(sys.modules[self.consumer_params.consuming_function_class_module],
586
+ # self.consumer_params.consuming_function_class_name)
586
587
  if self.publisher_params.consuming_function_kind == FunctionKind.CLASS_METHOD:
588
+ method_cls = getattr(PathHelper(method_first_param_value[ConstStrForClassMethod.CLS_FILE]).import_as_module(),method_first_param_value[ConstStrForClassMethod.CLS_NAME])
587
589
  real_function_only_params[method_first_param_name] = method_cls
588
590
  elif self.publisher_params.consuming_function_kind == FunctionKind.INSTANCE_METHOD:
591
+ method_cls = getattr(PathHelper(method_first_param_value[ConstStrForClassMethod.CLS_FILE]).import_as_module(), method_first_param_value[ConstStrForClassMethod.CLS_NAME])
589
592
  obj = method_cls(**method_first_param_value[ConstStrForClassMethod.OBJ_INIT_PARAMS])
590
593
  real_function_only_params[method_first_param_name] = obj
591
594
  # print(real_function_only_params)
funboost/core/booster.py CHANGED
@@ -90,16 +90,17 @@ class Booster:
90
90
  if len(kwargs) == 0 and len(args) == 1 and isinstance(args[0], typing.Callable):
91
91
  consuming_function = args[0]
92
92
  self.boost_params.consuming_function = consuming_function
93
+ self.boost_params.consuming_function_raw = consuming_function
93
94
  # print(consuming_function)
94
95
  # print(ClsHelper.get_method_kind(consuming_function))
95
96
  # print(inspect.getsourcelines(consuming_function))
96
97
  if self.boost_params.consuming_function_kind is None:
97
98
  self.boost_params.consuming_function_kind = ClsHelper.get_method_kind(consuming_function)
98
- if self.boost_params.consuming_function_kind in [FunctionKind.CLASS_METHOD,FunctionKind.INSTANCE_METHOD]:
99
- if self.boost_params.consuming_function_class_module is None:
100
- self.boost_params.consuming_function_class_module = consuming_function.__module__
101
- if self.boost_params.consuming_function_class_name is None:
102
- self.boost_params.consuming_function_class_name = consuming_function.__qualname__.split('.')[0]
99
+ # if self.boost_params.consuming_function_kind in [FunctionKind.CLASS_METHOD,FunctionKind.INSTANCE_METHOD]:
100
+ # if self.boost_params.consuming_function_class_module is None:
101
+ # self.boost_params.consuming_function_class_module = consuming_function.__module__
102
+ # if self.boost_params.consuming_function_class_name is None:
103
+ # self.boost_params.consuming_function_class_name = consuming_function.__qualname__.split('.')[0]
103
104
  logger_prompt.debug(f''' {self.boost_params.queue_name} booster 配置是 {self.boost_params.json_str_value()}''')
104
105
  self.consuming_function = consuming_function
105
106
  self.is_decorated_as_consume_function = True
@@ -179,8 +179,9 @@ class BoosterParams(BaseJsonAbleModel):
179
179
  schedule_tasks_on_main_thread: bool = False # 直接在主线程调度任务,意味着不能直接在当前主线程同时开启两个消费者。
180
180
 
181
181
  consuming_function: typing.Callable = None # 消费函数,在@boost时候不用指定,因为装饰器知道下面的函数.
182
+ consuming_function_raw: typing.Callable = None
182
183
 
183
- broker_kind: str = BrokerEnum.SQLITE_QUEUE # 中间件选型见3.1章节 https://funboost.readthedocs.io/zh/latest/articles/c3.html
184
+ broker_kind: str = BrokerEnum.SQLITE_QUEUE # 中间件选型见3.1章节 https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html
184
185
 
185
186
  broker_exclusive_config: dict = {} # 加上一个不同种类中间件非通用的配置,不同中间件自身独有的配置,不是所有中间件都兼容的配置,因为框架支持30种消息队列,消息队列不仅仅是一般的先进先出queue这么简单的概念,
186
187
  # 例如kafka支持消费者组,rabbitmq也支持各种独特概念例如各种ack机制 复杂路由机制,有的中间件原生能支持消息优先级有的中间件不支持,每一种消息队列都有独特的配置参数意义,可以通过这里传递。每种中间件能传递的键值对可以看consumer类的 BROKER_EXCLUSIVE_CONFIG_DEFAULT
@@ -193,10 +194,9 @@ class BoosterParams(BaseJsonAbleModel):
193
194
  # func_params_is_pydantic_model: bool = False # funboost 兼容支持 函数娼还是 pydantic model类型,funboost在发布之前和取出来时候自己转化。
194
195
 
195
196
  auto_generate_info: dict = {} # 自动生成的信息,不需要用户主动传参.
196
- consuming_function_class:typing.Optional[typing.Type] = None
197
+
197
198
  consuming_function_kind :typing.Optional[str]= None #自动生成的信息,不需要用户主动传参.
198
- consuming_function_class_module:typing.Optional[str] = None #自动生成的信息,不需要用户主动传参.
199
- consuming_function_class_name: typing.Optional[str] = None #自动生成的信息,不需要用户主动传参.
199
+
200
200
 
201
201
  @root_validator(skip_on_failure=True)
202
202
  def check_values(cls, values: dict):
@@ -295,8 +295,7 @@ class PublisherParams(BaseJsonAbleModel):
295
295
  # func_params_is_pydantic_model: bool = False # funboost 兼容支持 函数娼还是 pydantic model类型,funboost在发布之前和取出来时候自己转化。
296
296
 
297
297
  consuming_function_kind: typing.Optional[str] = None # 自动生成的信息,不需要用户主动传参.
298
- consuming_function_class_module: typing.Optional[str] = None # 自动生成的信息,不需要用户主动传参.
299
- consuming_function_class_name: typing.Optional[str] = None # 自动生成的信息,不需要用户主动传参.
298
+
300
299
 
301
300
 
302
301
  if __name__ == '__main__':
@@ -28,7 +28,7 @@ def delete_keys_and_return_new_dict(dictx: dict, keys: list = None):
28
28
  def block_python_main_thread_exit():
29
29
  """
30
30
 
31
- https://funboost.readthedocs.io/zh/latest/articles/c10.html#runtimeerror-cannot-schedule-new-futures-after-interpreter-shutdown
31
+ https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html#runtimeerror-cannot-schedule-new-futures-after-interpreter-shutdown
32
32
 
33
33
  主要是用于 python3.9以上 定时任务报错, 定时任务报错 RuntimeError: cannot schedule new futures after interpreter shutdown
34
34
  如果主线程结束了,apscheduler就会报这个错,加上这个while 1 : time.sleep(100) 目的就是阻止主线程退出。
@@ -1,6 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # @Author : ydf
3
3
  # @Time : 2022/8/8 0008 11:57
4
+ from pathlib import Path
5
+
4
6
  import abc
5
7
  import copy
6
8
  import inspect
@@ -8,6 +10,7 @@ import atexit
8
10
  import json
9
11
  import logging
10
12
  import multiprocessing
13
+ import sys
11
14
  import threading
12
15
  import time
13
16
  import typing
@@ -30,8 +33,6 @@ from funboost.core.task_id_logger import TaskIdLogger
30
33
  from funboost.utils import decorators
31
34
  from funboost.funboost_config_deafult import BrokerConnConfig, FunboostCommonConfig
32
35
 
33
-
34
-
35
36
  RedisAsyncResult = AsyncResult # 别名
36
37
  RedisAioAsyncResult = AioAsyncResult # 别名
37
38
 
@@ -257,14 +258,23 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
257
258
  # func_args_list.insert(0, {'first_param_name': self.publish_params_checker.all_arg_name[0],
258
259
  # 'cls_type': ClsHelper.get_classs_method_cls(self.publisher_params.consuming_function).__name__},
259
260
  # )
260
- func_args_list.insert(0, {ConstStrForClassMethod.FIRST_PARAM_NAME: self.publish_params_checker.all_arg_name[0],
261
- ConstStrForClassMethod.CLS_NAME: self.publisher_params.consuming_function_class_name,})
261
+ cls = func_args_list[0]
262
+ # print(cls,cls.__name__, sys.modules[cls.__module__].__file__)
263
+ func_args_list[0] = {ConstStrForClassMethod.FIRST_PARAM_NAME: self.publish_params_checker.all_arg_name[0],
264
+ ConstStrForClassMethod.CLS_NAME: cls.__name__,
265
+ ConstStrForClassMethod.CLS_FILE: Path(sys.modules[cls.__module__].__file__).resolve().as_posix(),
266
+ }
262
267
  elif self.publisher_params.consuming_function_kind == FunctionKind.INSTANCE_METHOD:
263
- if not hasattr(func_args[0],ConstStrForClassMethod.OBJ_INIT_PARAMS):
268
+ obj = func_args[0]
269
+ cls = type(obj)
270
+ if not hasattr(obj, ConstStrForClassMethod.OBJ_INIT_PARAMS):
264
271
  raise ValueError(f'消费函数 {self.publisher_params.consuming_function} 是实例方法,实例必须有 {ConstStrForClassMethod.OBJ_INIT_PARAMS} 属性')
265
272
  func_args_list[0] = {ConstStrForClassMethod.FIRST_PARAM_NAME: self.publish_params_checker.all_arg_name[0],
266
- ConstStrForClassMethod.OBJ_INIT_PARAMS: getattr(func_args[0],ConstStrForClassMethod.OBJ_INIT_PARAMS),
267
- ConstStrForClassMethod.CLS_NAME: self.publisher_params.consuming_function_class_name}
273
+ ConstStrForClassMethod.CLS_NAME: cls.__name__,
274
+ ConstStrForClassMethod.CLS_FILE: Path(sys.modules[cls.__module__].__file__).resolve().as_posix(),
275
+ ConstStrForClassMethod.OBJ_INIT_PARAMS: getattr(obj, ConstStrForClassMethod.OBJ_INIT_PARAMS),
276
+
277
+ }
268
278
 
269
279
  for index, arg in enumerate(func_args_list):
270
280
  # print(index,arg,self.publish_params_checker.position_arg_name_list)
@@ -63,7 +63,7 @@ def show_funboost_flag():
63
63
 
64
64
  logger_prompt.debug('\033[0m' + funboost_flag_str2 + '\033[0m')
65
65
 
66
- logger_prompt.debug(f'''分布式函数调度框架funboost文档地址: \033[0m https://funboost.readthedocs.io/zh/latest/ \033[0m ''')
66
+ logger_prompt.debug(f'''分布式函数调度框架funboost文档地址: \033[0m https://funboost.readthedocs.io/zh-cn/latest/ \033[0m ''')
67
67
 
68
68
 
69
69
  show_funboost_flag()
@@ -1,59 +1,59 @@
1
- from aioredis.client import Redis, StrictRedis
2
- from aioredis.connection import (
3
- BlockingConnectionPool,
4
- Connection,
5
- ConnectionPool,
6
- SSLConnection,
7
- UnixDomainSocketConnection,
8
- )
9
- from aioredis.exceptions import (
10
- AuthenticationError,
11
- AuthenticationWrongNumberOfArgsError,
12
- BusyLoadingError,
13
- ChildDeadlockedError,
14
- ConnectionError,
15
- DataError,
16
- InvalidResponse,
17
- PubSubError,
18
- ReadOnlyError,
19
- RedisError,
20
- ResponseError,
21
- TimeoutError,
22
- WatchError,
23
- )
24
- from aioredis.utils import from_url
25
-
26
-
27
- def int_or_str(value):
28
- try:
29
- return int(value)
30
- except ValueError:
31
- return value
32
-
33
-
34
- __version__ = "2.0.1"
35
- VERSION = tuple(map(int_or_str, __version__.split(".")))
36
-
37
- __all__ = [
38
- "AuthenticationError",
39
- "AuthenticationWrongNumberOfArgsError",
40
- "BlockingConnectionPool",
41
- "BusyLoadingError",
42
- "ChildDeadlockedError",
43
- "Connection",
44
- "ConnectionError",
45
- "ConnectionPool",
46
- "DataError",
47
- "from_url",
48
- "InvalidResponse",
49
- "PubSubError",
50
- "ReadOnlyError",
51
- "Redis",
52
- "RedisError",
53
- "ResponseError",
54
- "SSLConnection",
55
- "StrictRedis",
56
- "TimeoutError",
57
- "UnixDomainSocketConnection",
58
- "WatchError",
59
- ]
1
+ from aioredis.client import Redis, StrictRedis
2
+ from aioredis.connection import (
3
+ BlockingConnectionPool,
4
+ Connection,
5
+ ConnectionPool,
6
+ SSLConnection,
7
+ UnixDomainSocketConnection,
8
+ )
9
+ from aioredis.exceptions import (
10
+ AuthenticationError,
11
+ AuthenticationWrongNumberOfArgsError,
12
+ BusyLoadingError,
13
+ ChildDeadlockedError,
14
+ ConnectionError,
15
+ DataError,
16
+ InvalidResponse,
17
+ PubSubError,
18
+ ReadOnlyError,
19
+ RedisError,
20
+ ResponseError,
21
+ TimeoutError,
22
+ WatchError,
23
+ )
24
+ from aioredis.utils import from_url
25
+
26
+
27
+ def int_or_str(value):
28
+ try:
29
+ return int(value)
30
+ except ValueError:
31
+ return value
32
+
33
+
34
+ __version__ = "2.0.1"
35
+ VERSION = tuple(map(int_or_str, __version__.split(".")))
36
+
37
+ __all__ = [
38
+ "AuthenticationError",
39
+ "AuthenticationWrongNumberOfArgsError",
40
+ "BlockingConnectionPool",
41
+ "BusyLoadingError",
42
+ "ChildDeadlockedError",
43
+ "Connection",
44
+ "ConnectionError",
45
+ "ConnectionPool",
46
+ "DataError",
47
+ "from_url",
48
+ "InvalidResponse",
49
+ "PubSubError",
50
+ "ReadOnlyError",
51
+ "Redis",
52
+ "RedisError",
53
+ "ResponseError",
54
+ "SSLConnection",
55
+ "StrictRedis",
56
+ "TimeoutError",
57
+ "UnixDomainSocketConnection",
58
+ "WatchError",
59
+ ]