onestep 0.3.81__py3-none-any.whl → 0.4.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 onestep might be problematic. Click here for more details.

onestep/__init__.py CHANGED
@@ -23,8 +23,6 @@ __all__ = [
23
23
  # broker
24
24
  'BaseBroker',
25
25
  'BaseConsumer',
26
- 'BaseLocalBroker',
27
- 'BaseLocalConsumer',
28
26
  'MemoryBroker',
29
27
  'RabbitMQBroker',
30
28
  'WebHookBroker',
@@ -61,4 +59,4 @@ __all__ = [
61
59
  '__version__'
62
60
  ]
63
61
 
64
- __version__ = '0.3.81'
62
+ __version__ = '0.4.0'
onestep/cli.py CHANGED
@@ -22,8 +22,9 @@ def parse_args():
22
22
  parser = argparse.ArgumentParser(
23
23
  description='run onestep'
24
24
  )
25
- parser.add_argument(
26
- "step",
25
+ group = parser.add_mutually_exclusive_group(required=True)
26
+ group.add_argument(
27
+ "step", nargs='?',
27
28
  help="the run step",
28
29
  )
29
30
  parser.add_argument(
@@ -39,6 +40,11 @@ def parse_args():
39
40
  "--path", "-P", default=".", nargs="*", type=str,
40
41
  help="the step import path (default: current running directory)"
41
42
  )
43
+ group.add_argument(
44
+ "--cron",
45
+ help="the cron expression to test",
46
+ type=str
47
+ )
42
48
  return parser.parse_args()
43
49
 
44
50
 
@@ -46,10 +52,20 @@ def main():
46
52
  args = parse_args()
47
53
  for path in args.path:
48
54
  sys.path.insert(0, path)
55
+ if args.cron:
56
+ from croniter import croniter
57
+ from datetime import datetime
58
+ cron = croniter(args.cron, datetime.now())
59
+ for _ in range(10):
60
+ print(cron.get_next(datetime))
61
+ return
62
+
49
63
  logger.info(f"OneStep {__version__} is start up.")
50
64
  try:
51
65
  importlib.import_module(args.step)
52
66
  step.start(group=args.group, block=True, print_jobs=args.print)
67
+ except ModuleNotFoundError:
68
+ logger.error(f"Module `{args.step}` not found.")
53
69
  except KeyboardInterrupt:
54
70
  step.shutdown()
55
71
 
onestep/onestep.py CHANGED
@@ -241,6 +241,7 @@ class step:
241
241
  }
242
242
 
243
243
  def __call__(self, func, *_args, **_kwargs):
244
+ func.__step_params__ = self.params
244
245
  if iscoroutinefunction(func) or isasyncgenfunction(func):
245
246
  os = AsyncOneStep(fn=func, **self.params)
246
247
  else:
onestep/retry.py CHANGED
@@ -31,6 +31,30 @@ class AlwaysRetry(BaseRetry):
31
31
  return RetryStatus.CONTINUE
32
32
 
33
33
 
34
+ class AllRetry(BaseRetry):
35
+ def __init__(self, *retries):
36
+ self.retries = retries
37
+
38
+ def __call__(self, message) -> Optional[RetryStatus]:
39
+ for retry in self.retries:
40
+ status = retry(message)
41
+ if status != RetryStatus.CONTINUE:
42
+ return status
43
+ return RetryStatus.CONTINUE
44
+
45
+
46
+ class AnyRetry(BaseRetry):
47
+ def __init__(self, *retries):
48
+ self.retries = retries
49
+
50
+ def __call__(self, message) -> Optional[RetryStatus]:
51
+ for retry in self.retries:
52
+ status = retry(message)
53
+ if status == RetryStatus.CONTINUE:
54
+ return RetryStatus.CONTINUE
55
+ return RetryStatus.END_WITH_CALLBACK
56
+
57
+
34
58
  class TimesRetry(BaseRetry):
35
59
 
36
60
  def __init__(self, times: int = 3):
onestep/worker.py CHANGED
@@ -74,42 +74,58 @@ class BaseWorker:
74
74
  message.broker = message.broker or self.broker
75
75
  logger.debug(f"{self.instance.name} receive message<{message}> from {self.broker!r}")
76
76
  message_received.send(self, message=message)
77
+
77
78
  try:
78
79
  self.instance.before_emit("consume", message=message)
79
-
80
80
  self._run_real_instance(message)
81
- message_consumed.send(self, message=message)
82
- message.confirm()
83
-
81
+ self.handle_success(message)
84
82
  self.instance.after_emit("consume", message=message)
85
83
  except (exception.DropMessage, exception.RejectMessage) as e:
86
- message_drop.send(self, message=message, reason=e)
87
- logger.warning(f"{self.instance.name} dropped <{type(e).__name__}: {str(e)}>")
88
- message.reject()
84
+ self.handle_drop(message, e)
89
85
  except exception.RequeueMessage as e:
90
- message_requeue.send(self, message=message, reason=e)
91
- logger.warning(f"{self.instance.name} requeue <{type(e).__name__}: {str(e)}>")
92
- message.requeue(is_source=True)
86
+ self.handle_requeue(message, e)
93
87
  except Exception as e:
94
88
  message_error.send(self, message=message, error=e)
95
- if self.instance.state.debug:
96
- logger.exception(f"{self.instance.name} run error <{type(e).__name__}: {str(e)}>")
97
- else:
98
- logger.error(f"{self.instance.name} run error <{type(e).__name__}: {str(e)}>")
99
- message.set_exception()
100
-
101
- retry_status = self.retry(message)
102
- if retry_status is RetryStatus.END_WITH_CALLBACK:
103
- if self.error_callback:
104
- self.error_callback(message)
105
- message.reject()
106
- elif retry_status is RetryStatus.END_IGNORE_CALLBACK:
107
- # 由于是队列内重试,不会触发错误回调
108
- message.requeue()
89
+ self.handle_error(message, e)
90
+ self.handle_retry(message)
109
91
  finally:
110
- # When message is triggered by cancel_consume, it will be shutdown
111
- if self.broker.cancel_consume and self.broker.cancel_consume(message):
112
- self.shutdown()
92
+ self.handle_cancel_consume(message)
93
+
94
+ def handle_success(self, message):
95
+ message_consumed.send(self, message=message)
96
+ message.confirm()
97
+
98
+ def handle_drop(self, message, reason):
99
+ message_drop.send(self, message=message, reason=reason)
100
+ logger.warning(f"{self.instance.name} dropped <{type(reason).__name__}: {str(reason)}>")
101
+ message.reject()
102
+
103
+ def handle_requeue(self, message, reason):
104
+ message_requeue.send(self, message=message, reason=reason)
105
+ logger.warning(f"{self.instance.name} requeue <{type(reason).__name__}: {str(reason)}>")
106
+ message.requeue(is_source=True)
107
+
108
+ def handle_error(self, message, error):
109
+ if self.instance.state.debug:
110
+ logger.exception(f"{self.instance.name} run error <{type(error).__name__}: {str(error)}>")
111
+ else:
112
+ logger.error(f"{self.instance.name} run error <{type(error).__name__}: {str(error)}>")
113
+ message.set_exception()
114
+
115
+ def handle_cancel_consume(self, message):
116
+ if self.broker.cancel_consume and self.broker.cancel_consume(message):
117
+ self.shutdown()
118
+
119
+ def handle_retry(self, message):
120
+ retry_status = self.retry(message)
121
+ if retry_status is RetryStatus.END_WITH_CALLBACK:
122
+ if self.error_callback:
123
+ self.error_callback(message)
124
+ message.reject()
125
+ elif retry_status is RetryStatus.END_IGNORE_CALLBACK:
126
+ message.requeue()
127
+ elif retry_status is RetryStatus.CONTINUE:
128
+ message.requeue()
113
129
 
114
130
  def __repr__(self):
115
131
  return f"<{self.__class__.__name__} {self.instance.name}>"
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: onestep
3
- Version: 0.3.81
4
- Summary:
3
+ Version: 0.4.1
4
+ Summary: 仅需一步,轻松实现分布式异步任务。
5
5
  Author: miclon
6
6
  Author-email: jcnd@163.com
7
7
  Requires-Python: >=3.8,<4.0
@@ -15,7 +15,7 @@ Provides-Extra: redis
15
15
  Requires-Dist: asgiref (>=3.6.0,<4.0.0)
16
16
  Requires-Dist: blinker (>=1.5,<2.0)
17
17
  Requires-Dist: croniter (>=1.3.8,<2.0.0)
18
- Requires-Dist: use-rabbitmq (>=0.1.6,<0.2.0)
18
+ Requires-Dist: use-rabbitmq (>=0.2.1,<0.3.0)
19
19
  Requires-Dist: use-redis (>=0.1.6,<0.2.0) ; extra == "redis"
20
20
  Description-Content-Type: text/markdown
21
21
 
@@ -1,4 +1,4 @@
1
- onestep/__init__.py,sha256=GnX4nALDbR8LcbwMEaeZKUQl9f7cnYAVEVWLUQXfgcY,1466
1
+ onestep/__init__.py,sha256=F38-j9JgPMyUe0zBf-ao-f2ailidPI_DJQE4ddGCOX0,1417
2
2
  onestep/_utils.py,sha256=ySYmy-o2o3BurvLfuLWKGXR8TLwug6aTDNMvA3_QjKM,414
3
3
  onestep/broker/__init__.py,sha256=L-roNwPZVKsjytOlKCOlyAyvfejI28FyOj9uzfyXcrk,257
4
4
  onestep/broker/base.py,sha256=Ryo-0YekdZfpfSSqdmh7jsmNONc_GmlYFYadt_n5bds,4141
@@ -9,19 +9,19 @@ onestep/broker/redis/__init__.py,sha256=lqjvBKpMGf6I34nyJTEAq7XU2a8aQemhMGCbb5aB
9
9
  onestep/broker/redis/pubsub.py,sha256=_p2bKqXu0gYjKz2DsS8UdpkN5dCy94xf_xYx5NFuKpY,2674
10
10
  onestep/broker/redis/stream.py,sha256=uQJncD93Fz8pdP_NdgyQ1UAXwIouh7AFA9_naXaeiJM,3470
11
11
  onestep/broker/webhook.py,sha256=Zg22QxKPqJzdxjBsglUcL7P1RcM8FltcHpHXJiJPYgM,2392
12
- onestep/cli.py,sha256=KfJFpccpfNrhULJmDymrW5bFBGXapdL57ESZdgaFbG8,1399
12
+ onestep/cli.py,sha256=JU3xQCy0Zc8Ou6AH4j37_bqw5GQ7C2wll9MWQZFo5jY,1902
13
13
  onestep/exception.py,sha256=T-tqfRrJZT9Y85qe-1l-1PcHZzV2jxv-61HAhOc4AKE,753
14
14
  onestep/message.py,sha256=W37HKnIDxpd5UmtDbPTw2DTb3lfxu9Vs2KYIiCr5b2s,4057
15
15
  onestep/middleware/__init__.py,sha256=MP_45lqr4pecmbzQBnn2-AODQ0N_Fss8nl2SA7Zzljo,347
16
16
  onestep/middleware/base.py,sha256=adWQ_Lx2Nkaw4ySojIaa3lwUIUu97pHR_l5YMr0lrbw,975
17
17
  onestep/middleware/config.py,sha256=WZIvGXhpdSQRAFTbEWXcZdnhFcbvhGkLdkFIj-_QuZM,2438
18
18
  onestep/middleware/unique.py,sha256=e3nWHW2yxHFWT9PqiA96sOA1CZZVTbC3bOwUgxN9iaQ,1351
19
- onestep/onestep.py,sha256=cUuBSHJPucXFu86wxDFkXeetBJS7Fxu9r1c3OFfsgS4,9329
20
- onestep/retry.py,sha256=_bl_-0FEMai9KLZ0DkamYwUoUVPf6BjUDpn8SrfqQV4,3009
19
+ onestep/onestep.py,sha256=IQGOfhfbneXCaINqMzO-5wjWpmE5dISEZQtmG3bZ3EU,9372
20
+ onestep/retry.py,sha256=fPO139hQrcMjXZuQ4QfFaQR57VEqv_EKS2WSz92Ayvc,3706
21
21
  onestep/signal.py,sha256=tz9bGzTFZeBviG_iaGLfy4OyFKlWat6szEI6kWEGfTA,337
22
22
  onestep/state.py,sha256=UVG91CXCabU64X6qgcO0S7RzbBP8ut0ID7aTMww94us,618
23
- onestep/worker.py,sha256=A-XKvWz7ceRodMItjHKSN9DVTk3OoA0jsfmmBZ9z19U,6449
24
- onestep-0.3.81.dist-info/METADATA,sha256=khDghCE0BG8tvoUWBlVn8xtArfzkE-h65orC1eNyq_4,2523
25
- onestep-0.3.81.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
26
- onestep-0.3.81.dist-info/entry_points.txt,sha256=ZfWnNQqiGujz2PPLjSlKPocOFRryL7Ot0vQ41TU1xw0,44
27
- onestep-0.3.81.dist-info/RECORD,,
23
+ onestep/worker.py,sha256=8Bmbie-KrZxnHbne1RvNL3v8j1PObfd12Yp9jmzAFYg,6855
24
+ onestep-0.4.1.dist-info/METADATA,sha256=WoZmHjd1LmL9MvamCVyUsEakOTmReNSg2FSBHBCqd2w,2573
25
+ onestep-0.4.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
26
+ onestep-0.4.1.dist-info/entry_points.txt,sha256=ZfWnNQqiGujz2PPLjSlKPocOFRryL7Ot0vQ41TU1xw0,44
27
+ onestep-0.4.1.dist-info/RECORD,,