zrb 1.0.0a4__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 +0 -1
- zrb/runner/web_app.py +1 -7
- zrb/task/any_task.py +38 -2
- zrb/task/base_task.py +71 -4
- {zrb-1.0.0a4.dist-info → zrb-1.0.0a6.dist-info}/METADATA +1 -1
- {zrb-1.0.0a4.dist-info → zrb-1.0.0a6.dist-info}/RECORD +8 -8
- {zrb-1.0.0a4.dist-info → zrb-1.0.0a6.dist-info}/WHEEL +0 -0
- {zrb-1.0.0a4.dist-info → zrb-1.0.0a6.dist-info}/entry_points.txt +0 -0
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
@@ -27,7 +27,7 @@ def create_app(root_group: AnyGroup, port: int = WEB_HTTP_PORT):
|
|
27
27
|
from fastapi.responses import FileResponse, HTMLResponse
|
28
28
|
from fastapi.staticfiles import StaticFiles
|
29
29
|
|
30
|
-
_STATIC_DIR = os.path.join(os.path.dirname(__file__), "
|
30
|
+
_STATIC_DIR = os.path.join(os.path.dirname(__file__), "web_controller", "static")
|
31
31
|
_COROS = []
|
32
32
|
|
33
33
|
@asynccontextmanager
|
@@ -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
|
85
|
-
"""
|
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.
|
70
|
+
other.append_upstream(self)
|
69
71
|
elif isinstance(other, list):
|
70
72
|
for task in other:
|
71
|
-
task.
|
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.
|
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
|
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 = [
|
@@ -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=
|
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=
|
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=
|
153
|
-
zrb/task/base_task.py,sha256=
|
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.
|
195
|
-
zrb-1.0.
|
196
|
-
zrb-1.0.
|
197
|
-
zrb-1.0.
|
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
|
File without changes
|