runnable 0.3.0__py3-none-any.whl → 0.4.0__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.
- runnable/__init__.py +12 -1
- runnable/sdk.py +157 -37
- {runnable-0.3.0.dist-info → runnable-0.4.0.dist-info}/METADATA +1 -1
- {runnable-0.3.0.dist-info → runnable-0.4.0.dist-info}/RECORD +7 -7
- {runnable-0.3.0.dist-info → runnable-0.4.0.dist-info}/LICENSE +0 -0
- {runnable-0.3.0.dist-info → runnable-0.4.0.dist-info}/WHEEL +0 -0
- {runnable-0.3.0.dist-info → runnable-0.4.0.dist-info}/entry_points.txt +0 -0
runnable/__init__.py
CHANGED
@@ -24,7 +24,18 @@ from runnable.interaction import (
|
|
24
24
|
set_parameter,
|
25
25
|
track_this,
|
26
26
|
) # noqa
|
27
|
-
from runnable.sdk import
|
27
|
+
from runnable.sdk import (
|
28
|
+
Stub,
|
29
|
+
Pipeline,
|
30
|
+
Parallel,
|
31
|
+
Map,
|
32
|
+
Catalog,
|
33
|
+
Success,
|
34
|
+
Fail,
|
35
|
+
PythonTask,
|
36
|
+
NotebookTask,
|
37
|
+
ShellTask,
|
38
|
+
) # noqa
|
28
39
|
|
29
40
|
|
30
41
|
# TODO: Think of model registry as a central place to store models.
|
runnable/sdk.py
CHANGED
@@ -3,9 +3,9 @@ from __future__ import annotations
|
|
3
3
|
import logging
|
4
4
|
import os
|
5
5
|
from abc import ABC, abstractmethod
|
6
|
-
from typing import Any, Dict, List, Optional, Union
|
6
|
+
from typing import Any, Callable, Dict, List, Optional, Union
|
7
7
|
|
8
|
-
from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, computed_field,
|
8
|
+
from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, computed_field, model_validator
|
9
9
|
from rich import print
|
10
10
|
from typing_extensions import Self
|
11
11
|
|
@@ -15,11 +15,8 @@ from runnable.nodes import TraversalNode
|
|
15
15
|
|
16
16
|
logger = logging.getLogger(defaults.LOGGER_NAME)
|
17
17
|
|
18
|
-
StepType = Union["Stub", "
|
19
|
-
TraversalTypes = Union["Stub", "
|
20
|
-
|
21
|
-
|
22
|
-
ALLOWED_COMMAND_TYPES = ["shell", "python", "notebook"]
|
18
|
+
StepType = Union["Stub", "PythonTask", "NotebookTask", "ShellTask", "Success", "Fail", "Parallel", "Map"]
|
19
|
+
TraversalTypes = Union["Stub", "PythonTask", "NotebookTask", "ShellTask", "Parallel", "Map"]
|
23
20
|
|
24
21
|
|
25
22
|
class Catalog(BaseModel):
|
@@ -106,10 +103,7 @@ class BaseTraversal(ABC, BaseModel):
|
|
106
103
|
...
|
107
104
|
|
108
105
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
class Task(BaseTraversal):
|
106
|
+
class BaseTask(BaseTraversal):
|
113
107
|
"""
|
114
108
|
An execution node of the pipeline.
|
115
109
|
Please refer to [concepts](concepts/task.md) for more information.
|
@@ -157,41 +151,166 @@ class Task(BaseTraversal):
|
|
157
151
|
|
158
152
|
"""
|
159
153
|
|
160
|
-
command: str = Field(alias="command")
|
161
|
-
command_type: str = Field(default="python")
|
162
154
|
catalog: Optional[Catalog] = Field(default=None, alias="catalog")
|
163
155
|
overrides: Dict[str, Any] = Field(default_factory=dict, alias="overrides")
|
164
156
|
|
157
|
+
def create_node(self) -> TaskNode:
|
158
|
+
if not self.next_node:
|
159
|
+
if not (self.terminate_with_failure or self.terminate_with_success):
|
160
|
+
raise AssertionError("A node not being terminated must have a user defined next node")
|
161
|
+
|
162
|
+
print(self.model_dump(exclude_none=True))
|
163
|
+
return TaskNode.parse_from_config(self.model_dump(exclude_none=True))
|
164
|
+
|
165
|
+
|
166
|
+
class PythonTask(BaseTask):
|
167
|
+
"""
|
168
|
+
An execution node of the pipeline of python functions.
|
169
|
+
Please refer to [concepts](concepts/task.md) for more information.
|
170
|
+
|
171
|
+
Attributes:
|
172
|
+
name (str): The name of the node.
|
173
|
+
function (callable): The function to execute.
|
174
|
+
catalog (Optional[Catalog]): The catalog to sync data from/to.
|
175
|
+
Please see Catalog about the structure of the catalog.
|
176
|
+
overrides (Dict[str, Any]): Any overrides to the command.
|
177
|
+
Individual tasks can override the global configuration config by referring to the
|
178
|
+
specific override.
|
179
|
+
|
180
|
+
For example,
|
181
|
+
### Global configuration
|
182
|
+
```yaml
|
183
|
+
executor:
|
184
|
+
type: local-container
|
185
|
+
config:
|
186
|
+
docker_image: "runnable/runnable:latest"
|
187
|
+
overrides:
|
188
|
+
custom_docker_image:
|
189
|
+
docker_image: "runnable/runnable:custom"
|
190
|
+
```
|
191
|
+
### Task specific configuration
|
192
|
+
```python
|
193
|
+
task = PythonTask(name="task", function="function'",
|
194
|
+
overrides={'local-container': custom_docker_image})
|
195
|
+
```
|
196
|
+
|
197
|
+
terminate_with_failure (bool): Whether to terminate the pipeline with a failure after this node.
|
198
|
+
terminate_with_success (bool): Whether to terminate the pipeline with a success after this node.
|
199
|
+
on_failure (str): The name of the node to execute if the step fails.
|
200
|
+
|
201
|
+
"""
|
202
|
+
|
203
|
+
function: Callable = Field(exclude=True)
|
204
|
+
|
205
|
+
@computed_field
|
206
|
+
def command_type(self) -> str:
|
207
|
+
return "python"
|
208
|
+
|
209
|
+
@computed_field
|
210
|
+
def command(self) -> str:
|
211
|
+
module = self.function.__module__
|
212
|
+
name = self.function.__name__
|
213
|
+
|
214
|
+
return f"{module}.{name}"
|
215
|
+
|
216
|
+
|
217
|
+
class NotebookTask(BaseTask):
|
218
|
+
"""
|
219
|
+
An execution node of the pipeline of type notebook.
|
220
|
+
Please refer to [concepts](concepts/task.md) for more information.
|
221
|
+
|
222
|
+
Attributes:
|
223
|
+
name (str): The name of the node.
|
224
|
+
notebook: The path to the notebook
|
225
|
+
catalog (Optional[Catalog]): The catalog to sync data from/to.
|
226
|
+
Please see Catalog about the structure of the catalog.
|
227
|
+
returns: A list of the names of variables to return from the notebook.
|
228
|
+
overrides (Dict[str, Any]): Any overrides to the command.
|
229
|
+
Individual tasks can override the global configuration config by referring to the
|
230
|
+
specific override.
|
231
|
+
|
232
|
+
For example,
|
233
|
+
### Global configuration
|
234
|
+
```yaml
|
235
|
+
executor:
|
236
|
+
type: local-container
|
237
|
+
config:
|
238
|
+
docker_image: "runnable/runnable:latest"
|
239
|
+
overrides:
|
240
|
+
custom_docker_image:
|
241
|
+
docker_image: "runnable/runnable:custom"
|
242
|
+
```
|
243
|
+
### Task specific configuration
|
244
|
+
```python
|
245
|
+
task = NotebookTask(name="task", notebook="evaluation.ipynb",
|
246
|
+
overrides={'local-container': custom_docker_image})
|
247
|
+
```
|
248
|
+
notebook_output_path (Optional[str]): The path to save the notebook output.
|
249
|
+
Only used when command_type is 'notebook', defaults to command+_out.ipynb
|
250
|
+
optional_ploomber_args (Optional[Dict[str, Any]]): Any optional ploomber args.
|
251
|
+
Only used when command_type is 'notebook', defaults to {}
|
252
|
+
|
253
|
+
terminate_with_failure (bool): Whether to terminate the pipeline with a failure after this node.
|
254
|
+
terminate_with_success (bool): Whether to terminate the pipeline with a success after this node.
|
255
|
+
on_failure (str): The name of the node to execute if the step fails.
|
256
|
+
|
257
|
+
"""
|
258
|
+
|
259
|
+
notebook: str = Field(alias="command")
|
260
|
+
|
165
261
|
notebook_output_path: Optional[str] = Field(default=None, alias="notebook_output_path")
|
166
262
|
optional_ploomber_args: Optional[Dict[str, Any]] = Field(default=None, alias="optional_ploomber_args")
|
167
|
-
|
263
|
+
returns: List[str] = Field(default_factory=list, alias="returns")
|
168
264
|
|
169
|
-
@
|
170
|
-
|
171
|
-
|
172
|
-
if value not in ALLOWED_COMMAND_TYPES:
|
173
|
-
raise ValueError(f"Invalid command_type: {value}")
|
174
|
-
return value
|
265
|
+
@computed_field
|
266
|
+
def command_type(self) -> str:
|
267
|
+
return "notebook"
|
175
268
|
|
176
|
-
@model_validator(mode="after")
|
177
|
-
def check_notebook_args(self) -> "Task":
|
178
|
-
if self.command_type != "notebook":
|
179
|
-
assert (
|
180
|
-
self.notebook_output_path is None
|
181
|
-
), "Only command_types of 'notebook' can be used with notebook_output_path"
|
182
269
|
|
183
|
-
|
184
|
-
|
185
|
-
|
270
|
+
class ShellTask(BaseTask):
|
271
|
+
"""
|
272
|
+
An execution node of the pipeline of type shell.
|
273
|
+
Please refer to [concepts](concepts/task.md) for more information.
|
186
274
|
|
187
|
-
|
188
|
-
|
275
|
+
Attributes:
|
276
|
+
name (str): The name of the node.
|
277
|
+
command: The shell command to execute.
|
278
|
+
catalog (Optional[Catalog]): The catalog to sync data from/to.
|
279
|
+
Please see Catalog about the structure of the catalog.
|
280
|
+
returns: A list of the names of variables to capture from environment variables of shell.
|
281
|
+
overrides (Dict[str, Any]): Any overrides to the command.
|
282
|
+
Individual tasks can override the global configuration config by referring to the
|
283
|
+
specific override.
|
189
284
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
285
|
+
For example,
|
286
|
+
### Global configuration
|
287
|
+
```yaml
|
288
|
+
executor:
|
289
|
+
type: local-container
|
290
|
+
config:
|
291
|
+
docker_image: "runnable/runnable:latest"
|
292
|
+
overrides:
|
293
|
+
custom_docker_image:
|
294
|
+
docker_image: "runnable/runnable:custom"
|
295
|
+
```
|
296
|
+
### Task specific configuration
|
297
|
+
```python
|
298
|
+
task = ShellTask(name="task", command="exit 0",
|
299
|
+
overrides={'local-container': custom_docker_image})
|
300
|
+
```
|
301
|
+
|
302
|
+
terminate_with_failure (bool): Whether to terminate the pipeline with a failure after this node.
|
303
|
+
terminate_with_success (bool): Whether to terminate the pipeline with a success after this node.
|
304
|
+
on_failure (str): The name of the node to execute if the step fails.
|
305
|
+
|
306
|
+
"""
|
307
|
+
|
308
|
+
command: str = Field(alias="command")
|
309
|
+
returns: List[str] = Field(default_factory=list, alias="returns")
|
310
|
+
|
311
|
+
@computed_field
|
312
|
+
def command_type(self) -> str:
|
313
|
+
return "shell"
|
195
314
|
|
196
315
|
|
197
316
|
class Stub(BaseTraversal):
|
@@ -343,7 +462,8 @@ class Pipeline(BaseModel):
|
|
343
462
|
A Pipeline is a directed acyclic graph of Steps that define a workflow.
|
344
463
|
|
345
464
|
Attributes:
|
346
|
-
steps (List[Stub |
|
465
|
+
steps (List[Stub | PythonTask | NotebookTask | ShellTask | Parallel | Map | Success | Fail]):
|
466
|
+
A list of Steps that make up the Pipeline.
|
347
467
|
start_at (Stub | Task | Parallel | Map): The name of the first Step in the Pipeline.
|
348
468
|
name (str, optional): The name of the Pipeline. Defaults to "".
|
349
469
|
description (str, optional): A description of the Pipeline. Defaults to "".
|
@@ -1,4 +1,4 @@
|
|
1
|
-
runnable/__init__.py,sha256=
|
1
|
+
runnable/__init__.py,sha256=v0QgHL7uvEWKecAOJ_bVYHYM9O5B4xCICCLZVBO6Ci8,923
|
2
2
|
runnable/catalog.py,sha256=OUaQ73DWfTsMmq2sKlBn0aDz031mupladNGVuF3pWm0,3985
|
3
3
|
runnable/cli.py,sha256=2NkFHfo1n1Aeq0gPO-SW_T_GsEY1qS1-IdoAJR_0Qhc,9800
|
4
4
|
runnable/context.py,sha256=rP22KqTsLrnpVTe05W80W2jMoAFm8NfkVkYY49Mu2ZA,1025
|
@@ -58,12 +58,12 @@ runnable/names.py,sha256=vn92Kv9ANROYSZX6Z4z1v_WA3WiEdIYmG6KEStBFZug,8134
|
|
58
58
|
runnable/nodes.py,sha256=7ztYtTf4GthbutwR56lDqu4ANDLrN5zHqJNvLD_PTOo,16458
|
59
59
|
runnable/parameters.py,sha256=IT-7OUbYmRQuVtzAsG6L7Q4TkGaovmsQ4ErStcSXwmQ,6434
|
60
60
|
runnable/pickler.py,sha256=rrFRc6SMrV6Pxd9r7aMtUou8z-HLL1un4QfH_non4XE,2679
|
61
|
-
runnable/sdk.py,sha256=
|
61
|
+
runnable/sdk.py,sha256=UVxXV-eYnWZnGKOsx7CA8gAI-ArOQAFdF_or_apauD0,22292
|
62
62
|
runnable/secrets.py,sha256=dakb7WRloWVo-KpQp6Vy4rwFdGi58BTlT4OifQY106I,2324
|
63
63
|
runnable/tasks.py,sha256=eG-L8mB5Kp4m-HChwvcZkXkueS9IA7VQ-tQKmr87lrQ,13604
|
64
64
|
runnable/utils.py,sha256=jfgx2_lYCCKUASM7vEGZXdizRFg6EvV9pyZSlhhMKMk,19801
|
65
|
-
runnable-0.
|
66
|
-
runnable-0.
|
67
|
-
runnable-0.
|
68
|
-
runnable-0.
|
69
|
-
runnable-0.
|
65
|
+
runnable-0.4.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
66
|
+
runnable-0.4.0.dist-info/METADATA,sha256=1zNN1GWpwwS2VsHE5K2b34LknyPZmRt1kAHourIA_m8,16185
|
67
|
+
runnable-0.4.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
68
|
+
runnable-0.4.0.dist-info/entry_points.txt,sha256=wmEeo0n87KXEXxYLN6vzrd-690-1UhE0niJHMhz7f-o,1640
|
69
|
+
runnable-0.4.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|