zrb 1.0.0a5__py3-none-any.whl → 1.0.0a6__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.
zrb/builtin/todo.py CHANGED
@@ -156,7 +156,6 @@ def todo_log(ctx: AnyContext):
156
156
  todo_task = cascade_todo_task(todo_task)
157
157
  current_duration = todo_task.keyval.get("duration", "0")
158
158
  todo_task.keyval["duration"] = add_durations(current_duration, ctx.input.duration)
159
- print(current_duration, todo_task.keyval)
160
159
  # Save todo list
161
160
  save_todo_list(todo_file_path, todo_list)
162
161
  # Add log work
zrb/runner/web_app.py CHANGED
@@ -142,9 +142,3 @@ def create_app(root_group: AnyGroup, port: int = WEB_HTTP_PORT):
142
142
  raise HTTPException(status_code=500, detail=str(e))
143
143
 
144
144
  return app
145
-
146
-
147
- # async def run_web_server(app: FastAPI, port: int = WEB_HTTP_PORT):
148
- # config = Config(app=app, host="0.0.0.0", port=port, loop="asyncio")
149
- # server = Server(config)
150
- # await server.serve()
zrb/task/any_task.py CHANGED
@@ -74,6 +74,12 @@ class AnyTask(ABC):
74
74
  """Task fallbacks"""
75
75
  pass
76
76
 
77
+ @property
78
+ @abstractmethod
79
+ def successors(self) -> list["AnyTask"]:
80
+ """Task successors"""
81
+ pass
82
+
77
83
  @property
78
84
  @abstractmethod
79
85
  def readiness_checks(self) -> list["AnyTask"]:
@@ -81,8 +87,38 @@ class AnyTask(ABC):
81
87
  pass
82
88
 
83
89
  @abstractmethod
84
- def append_upstreams(self, upstreams: "AnyTask" | list["AnyTask"]):
85
- """Sets the upstream tasks that this task depends on.
90
+ def append_fallback(self, fallbacks: "AnyTask" | list["AnyTask"]):
91
+ """Add the fallback tasks.
92
+
93
+ Args:
94
+ fallbacks (AnyTask | list[AnyTask]): A single fallback task or
95
+ a list of fallback tasks.
96
+ """
97
+ pass
98
+
99
+ @abstractmethod
100
+ def append_successor(self, successors: "AnyTask" | list["AnyTask"]):
101
+ """Add the successor tasks.
102
+
103
+ Args:
104
+ successors (AnyTask | list[AnyTask]): A single successor task or
105
+ a list of successor tasks.
106
+ """
107
+ pass
108
+
109
+ @abstractmethod
110
+ def append_readiness_check(self, readiness_checks: "AnyTask" | list["AnyTask"]):
111
+ """Add the readiness_check tasks.
112
+
113
+ Args:
114
+ readiness_checks (AnyTask | list[AnyTask]): A single readiness_check task or
115
+ a list of readiness_check tasks.
116
+ """
117
+ pass
118
+
119
+ @abstractmethod
120
+ def append_upstream(self, upstreams: "AnyTask" | list["AnyTask"]):
121
+ """Add the upstream tasks that this task depends on.
86
122
 
87
123
  Args:
88
124
  upstreams (AnyTask | list[AnyTask]): A single upstream task or
zrb/task/base_task.py CHANGED
@@ -38,6 +38,7 @@ class BaseTask(AnyTask):
38
38
  monitor_readiness: bool = False,
39
39
  upstream: list[AnyTask] | AnyTask | None = None,
40
40
  fallback: list[AnyTask] | AnyTask | None = None,
41
+ successor: list[AnyTask] | AnyTask | None = None,
41
42
  ):
42
43
  self._name = name
43
44
  self._color = color
@@ -50,6 +51,7 @@ class BaseTask(AnyTask):
50
51
  self._retry_period = retry_period
51
52
  self._upstreams = upstream
52
53
  self._fallbacks = fallback
54
+ self._successors = successor
53
55
  self._readiness_checks = readiness_check
54
56
  self._readiness_check_delay = readiness_check_delay
55
57
  self._readiness_check_period = readiness_check_period
@@ -65,17 +67,17 @@ class BaseTask(AnyTask):
65
67
  def __rshift__(self, other: AnyTask | list[AnyTask]) -> AnyTask:
66
68
  try:
67
69
  if isinstance(other, AnyTask):
68
- other.append_upstreams(self)
70
+ other.append_upstream(self)
69
71
  elif isinstance(other, list):
70
72
  for task in other:
71
- task.append_upstreams(self)
73
+ task.append_upstream(self)
72
74
  return other
73
75
  except Exception as e:
74
76
  raise ValueError(f"Invalid operation {self} >> {other}: {e}")
75
77
 
76
78
  def __lshift__(self, other: AnyTask | list[AnyTask]) -> AnyTask:
77
79
  try:
78
- self.append_upstreams(other)
80
+ self.append_upstream(other)
79
81
  return self
80
82
  except Exception as e:
81
83
  raise ValueError(f"Invalid operation {self} << {other}: {e}")
@@ -142,6 +144,44 @@ class BaseTask(AnyTask):
142
144
  return [self._fallbacks]
143
145
  return self._fallbacks
144
146
 
147
+ def append_fallback(self, fallbacks: AnyTask | list[AnyTask]):
148
+ fallback_list = [fallbacks] if isinstance(fallbacks, AnyTask) else fallbacks
149
+ for fallback in fallback_list:
150
+ self.__append_fallback(fallback)
151
+
152
+ def __append_fallback(self, fallback: AnyTask):
153
+ # Make sure self._fallbacks is a list
154
+ if self._fallbacks is None:
155
+ self._fallbacks = []
156
+ elif isinstance(self._fallbacks, AnyTask):
157
+ self._fallbacks = [self._fallbacks]
158
+ # Add fallback if it was not on self._fallbacks
159
+ if fallback not in self._fallbacks:
160
+ self._fallbacks.append(fallback)
161
+
162
+ @property
163
+ def successors(self) -> list[AnyTask]:
164
+ if self._successors is None:
165
+ return []
166
+ elif isinstance(self._successors, AnyTask):
167
+ return [self._successors]
168
+ return self._successors
169
+
170
+ def append_successor(self, successors: AnyTask | list[AnyTask]):
171
+ successor_list = [successors] if isinstance(successors, AnyTask) else successors
172
+ for successor in successor_list:
173
+ self.__append_successor(successor)
174
+
175
+ def __append_successor(self, successor: AnyTask):
176
+ # Make sure self._successors is a list
177
+ if self._successors is None:
178
+ self._successors = []
179
+ elif isinstance(self._successors, AnyTask):
180
+ self._successors = [self._successors]
181
+ # Add successor if it was not on self._successors
182
+ if successor not in self._successors:
183
+ self._successors.append(successor)
184
+
145
185
  @property
146
186
  def readiness_checks(self) -> list[AnyTask]:
147
187
  if self._readiness_checks is None:
@@ -150,6 +190,25 @@ class BaseTask(AnyTask):
150
190
  return [self._readiness_checks]
151
191
  return self._readiness_checks
152
192
 
193
+ def append_readiness_check(self, readiness_checks: AnyTask | list[AnyTask]):
194
+ readiness_check_list = (
195
+ [readiness_checks]
196
+ if isinstance(readiness_checks, AnyTask)
197
+ else readiness_checks
198
+ )
199
+ for readiness_check in readiness_check_list:
200
+ self.__append_readiness_check(readiness_check)
201
+
202
+ def __append_readiness_check(self, readiness_check: AnyTask):
203
+ # Make sure self._readiness_checks is a list
204
+ if self._readiness_checks is None:
205
+ self._readiness_checks = []
206
+ elif isinstance(self._readiness_checks, AnyTask):
207
+ self._readiness_checks = [self._readiness_checks]
208
+ # Add readiness_check if it was not on self._readiness_checks
209
+ if readiness_check not in self._readiness_checks:
210
+ self._readiness_checks.append(readiness_check)
211
+
153
212
  @property
154
213
  def upstreams(self) -> list[AnyTask]:
155
214
  if self._upstreams is None:
@@ -158,7 +217,7 @@ class BaseTask(AnyTask):
158
217
  return [self._upstreams]
159
218
  return self._upstreams
160
219
 
161
- def append_upstreams(self, upstreams: AnyTask | list[AnyTask]):
220
+ def append_upstream(self, upstreams: AnyTask | list[AnyTask]):
162
221
  upstream_list = [upstreams] if isinstance(upstreams, AnyTask) else upstreams
163
222
  for upstream in upstream_list:
164
223
  self.__append_upstream(upstream)
@@ -374,6 +433,7 @@ class BaseTask(AnyTask):
374
433
  # Put result on xcom
375
434
  task_xcom: Xcom = ctx.xcom.get(self.name)
376
435
  task_xcom.push(result)
436
+ await run_async(self.__exec_successors(session))
377
437
  return result
378
438
  except (asyncio.CancelledError, KeyboardInterrupt):
379
439
  ctx.log_info("Marked as failed")
@@ -390,6 +450,13 @@ class BaseTask(AnyTask):
390
450
  await run_async(self.__exec_fallbacks(session))
391
451
  raise e
392
452
 
453
+ async def __exec_successors(self, session: AnySession) -> Any:
454
+ successors: list[AnyTask] = self.successors
455
+ successor_coros = [
456
+ run_async(successor.exec_chain(session)) for successor in successors
457
+ ]
458
+ await asyncio.gather(*successor_coros)
459
+
393
460
  async def __exec_fallbacks(self, session: AnySession) -> Any:
394
461
  fallbacks: list[AnyTask] = self.fallbacks
395
462
  fallback_coros = [
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 1.0.0a5
3
+ Version: 1.0.0a6
4
4
  Summary: Your Automation Powerhouse
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later
@@ -74,7 +74,7 @@ zrb/builtin/shell/autocomplete/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
74
74
  zrb/builtin/shell/autocomplete/bash.py,sha256=-7YDVV7txgJH9mAYSYN0jmvUEeDIzWFvVNY-cY0myF8,1181
75
75
  zrb/builtin/shell/autocomplete/subcmd.py,sha256=WZI6cGWJcn80zSyxOHG7sCMO3Ucix3mZf4xm_xyB_Y0,606
76
76
  zrb/builtin/shell/autocomplete/zsh.py,sha256=9hlq0Wt3fhRz326mAQTypEd4_4lZdrbBx_3A-Ti3mvw,1022
77
- zrb/builtin/todo.py,sha256=tMz3ACo5TibJok9Dyw3T8rtSIFZYyL4ZdqXvL6sfmT8,6855
77
+ zrb/builtin/todo.py,sha256=_mIKFD0Ah37yzDjn5-gbYvdbYLX4g5w4N2LKsz0JV6A,6809
78
78
  zrb/callback/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
79
  zrb/callback/any_callback.py,sha256=Yhdv5UWHAZSVzj5K2JdxcVQx8x8VX8aZJEivj3NTfZc,247
80
80
  zrb/callback/callback.py,sha256=IQ7r9EnXYHHcNXKBJAk4WFqCqj7WDvflAuCyu5y-27I,849
@@ -112,7 +112,7 @@ zrb/input/str_input.py,sha256=NevZHX9rf1g8eMatPyy-kUX3DglrVAQpzvVpKAzf7bA,81
112
112
  zrb/input/text_input.py,sha256=te86xFpzIZnWb9xOeKHykNKTbY3pe1CdoaRCKr7UUQM,3054
113
113
  zrb/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
114
  zrb/runner/cli.py,sha256=tM61thLwJNfjrHFVJqWmGuzE0MB273JZ8ANlROsKH1E,7024
115
- zrb/runner/web_app.py,sha256=nV9WQIT1d7UxtJxRhB8_hxPtdpwRBaYswoh0dZj2KqA,6189
115
+ zrb/runner/web_app.py,sha256=giULuphQhb_lJP95RiXm5i-Uk9MrnIrSXhRVLK73-8s,5987
116
116
  zrb/runner/web_controller/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
117
  zrb/runner/web_controller/group_info_ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
118
  zrb/runner/web_controller/group_info_ui/controller.py,sha256=sI1UKnRcr5K-a_lGMm5H54hbhdQwIMLlXYmwfxoIqSY,2831
@@ -149,8 +149,8 @@ zrb/session_state_logger/any_session_state_logger.py,sha256=W_G1fCw9ZVj4LRTplTpB
149
149
  zrb/session_state_logger/default_session_state_logger.py,sha256=w_cAaNUg1ZmJk-ge1kh3xtag3SApC3ZdB3VbxUvU5Ro,197
150
150
  zrb/session_state_logger/file_session_state_logger.py,sha256=0lMtx7Othu4-jhL_iDHFbZWF_5HX84StU134QNCVgeQ,3753
151
151
  zrb/task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
152
- zrb/task/any_task.py,sha256=QCuFCDXmfzvS09SWN1uFGUHheJlkKkii5oZDjO3s9tA,3896
153
- zrb/task/base_task.py,sha256=pXFhZ0aJNdGXBBnOLSNiAXQ9MCRIpuqjB-Yfn_t8MB8,16293
152
+ zrb/task/any_task.py,sha256=9rCdKe-Sayr34Han9AsbhRxFpkbk6Rteg1DOyETulwQ,4917
153
+ zrb/task/base_task.py,sha256=Vn_MTR5aa3jIEWmh5LXpzezh-JwaEXPbjGKptx-Q-U8,19161
154
154
  zrb/task/base_trigger.py,sha256=milE5BNeIeq8jGCP38qTfstSvrc0CkSnO2sV-vlhzsM,4491
155
155
  zrb/task/cmd_task.py,sha256=3N3pyvz7qZ8lDB9pxGVFvfpubE33hXo48UKSmuZDGc0,10249
156
156
  zrb/task/http_check.py,sha256=TwQCql3589a4-H2c7hgS1HayyU-NdBAdJ4qQNTvjXHM,2474
@@ -191,7 +191,7 @@ zrb/util/string/name.py,sha256=8picJfUBXNpdh64GNaHv3om23QHhUZux7DguFLrXHp8,1163
191
191
  zrb/util/todo.py,sha256=Nbe1a-7O5FSkIE7BZxQQt7AhbHFPDbreJJI6C7Rga4o,9171
192
192
  zrb/xcom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
193
  zrb/xcom/xcom.py,sha256=P4aYHdE3FRsTsNrXGyW8N44IWZjw-vG_qys1Ymn3aBg,1572
194
- zrb-1.0.0a5.dist-info/METADATA,sha256=DRy4eC0I32_wytKpBkqDOomSb0eN_hSeCc_SrQ7aumQ,4105
195
- zrb-1.0.0a5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
196
- zrb-1.0.0a5.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
197
- zrb-1.0.0a5.dist-info/RECORD,,
194
+ zrb-1.0.0a6.dist-info/METADATA,sha256=iCUlGjhUx7-sUKffDJns3kMgzyt1GblHKpkUEjDn39U,4105
195
+ zrb-1.0.0a6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
196
+ zrb-1.0.0a6.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
197
+ zrb-1.0.0a6.dist-info/RECORD,,
File without changes