runnable 0.10.0__py3-none-any.whl → 0.11.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.
@@ -1,49 +1,45 @@
1
- runnable/__init__.py,sha256=MEJVptRwgHJyQa07gpc0sGcdxoxwX-crhoyAZUEYjBs,619
2
- runnable/catalog.py,sha256=OUaQ73DWfTsMmq2sKlBn0aDz031mupladNGVuF3pWm0,3985
3
- runnable/cli.py,sha256=AZiZf2eRV7zMA7APg6dyTHWqK1--bQwdLiYP8olaKis,9589
4
- runnable/context.py,sha256=GOp-dRPMgYsbgjGy39yVsaWgu5l4RgUxN9-4nggoPmg,1048
5
- runnable/datastore.py,sha256=xtO6atOh1Zf_olvdzh3W_XisAviL26uZPR491N7tn-E,25354
6
- runnable/defaults.py,sha256=lN9HUjTaGGYBC8OPCGTNZXJ4xlOOzqUt-zDjY7GLnLI,4770
7
- runnable/entrypoints.py,sha256=tDQNSX3yx7zU5tqa1hxn3j4yHXfJ9Svg9CpPmEdBQ2o,15359
8
- runnable/exceptions.py,sha256=R__RzUWs7Ow7m7yqawi2w09XXI4OqmA67yeXkECM0xw,2419
1
+ runnable/__init__.py,sha256=C5ySSfN_vHWFTscnxLx3tfMjKT3Bs9jfUjXnDvun33Y,870
2
+ runnable/catalog.py,sha256=22OECi5TrpHErxYIhfx-lJ2vgBUi4-5V9CaYEVm98hE,4138
3
+ runnable/cli.py,sha256=RILUrEfzernuKD3dNdXPBkqN_1OgE5GosYRuInj0FVs,9618
4
+ runnable/context.py,sha256=QhiXJHRcEBfSKB1ijvL5yB9w44x0HCe7VEiwK1cUJ9U,1124
5
+ runnable/datastore.py,sha256=EgKi4_b5g6KbInpjMyw8Xwr-EgcSGi1Lx2u5vp4amSQ,27672
6
+ runnable/defaults.py,sha256=MOX7I2S6yO4FphZaZREFQca94a20oO8uvzXLd6GLKQs,4703
7
+ runnable/entrypoints.py,sha256=a8M7vb954as_ni7lM0t65czXQj2AHjB-KrQJ3zt3sWo,16397
8
+ runnable/exceptions.py,sha256=6NIYoTAzdKyGQ9PvW1Hu7b80OS746395KiGDhM7ThH8,2526
9
9
  runnable/executor.py,sha256=xfBighQ5t_vejohip000XfxLwsgechUE1ZMIJWrZbUA,14484
10
- runnable/experiment_tracker.py,sha256=bX2Vr73f3bsdnWqxjMSSiKA-WwqkUHfUzJQqZoQBpvY,3668
11
10
  runnable/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
11
  runnable/extensions/catalog/__init__.py,sha256=uXZ6D-Myr_J4HnBA4F5Hd7LZ0IAjQiFQYxRhMzejhQc,761
13
12
  runnable/extensions/catalog/file_system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- runnable/extensions/catalog/file_system/implementation.py,sha256=UNrJFV_tyMpknFKoCMXbBt-CWL4UpDxcwnMh43zVfpc,8958
13
+ runnable/extensions/catalog/file_system/implementation.py,sha256=9j920o9SULdcVp1Mr8FgeuV-Sv5bR3w5tcohChxHnak,9130
15
14
  runnable/extensions/catalog/k8s_pvc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
15
  runnable/extensions/catalog/k8s_pvc/implementation.py,sha256=oJDDI0APT7lrtjWmzYJRDHLGn3Vhbn2MdFSRYvFBUpY,436
17
16
  runnable/extensions/catalog/k8s_pvc/integration.py,sha256=OfrHbNFN8sR-wsVa4os3ajmWJFSd5H4KOHGVAmjRZTQ,1850
18
- runnable/extensions/executor/__init__.py,sha256=tIWUBWu5MNqHrfbOD83AgP59OkM2aJh3JUUQItIP6i4,24187
17
+ runnable/extensions/executor/__init__.py,sha256=eV3q_dL2cRqYaJ8RWV6Xk1__KMWMM2hUnQFT7Z5pRso,26698
19
18
  runnable/extensions/executor/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- runnable/extensions/executor/argo/implementation.py,sha256=wlDSD5RfZmrdQ65abXTZSdh4KUGv-IzQtbHVtDXNUgQ,43795
19
+ runnable/extensions/executor/argo/implementation.py,sha256=_BfxCe742S6uV-7PuQ53KjzwY-8Rq-5y9txOXMYf20U,43670
21
20
  runnable/extensions/executor/argo/specification.yaml,sha256=wXQcm2gOQYqy-IOQIhucohS32ZrHKCfGA5zZ0RraPYc,1276
22
21
  runnable/extensions/executor/k8s_job/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
22
  runnable/extensions/executor/k8s_job/implementation_FF.py,sha256=1IfVG1GRcJcVFzQ-WhkJsmzdJuj51QMxXylY9UrWM0U,10259
24
23
  runnable/extensions/executor/k8s_job/integration_FF.py,sha256=pG6HKhPMgCRIgu1PAnBvsfJQE1FxcjuSiC2I-Hn5sWo,2165
25
24
  runnable/extensions/executor/local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- runnable/extensions/executor/local/implementation.py,sha256=r9dSf2lSBGHihbGNhq_GPe3fHKLjf4KI3l-B4w2b5Ls,2468
25
+ runnable/extensions/executor/local/implementation.py,sha256=e8Tzv-FgQmJeUXVut96jeNERTR83JVG_zkQZMEjCVAs,2469
27
26
  runnable/extensions/executor/local_container/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
27
  runnable/extensions/executor/local_container/implementation.py,sha256=6kYMgdgE5JxZkVAidxsBSpqkHvyKMfEctgZWSZQEpXA,13979
29
28
  runnable/extensions/executor/mocked/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
29
  runnable/extensions/executor/mocked/implementation.py,sha256=ChdUyUsiXXjG_v80d0uLp76Nz4jqqGEry36gs9gNn9k,5082
31
30
  runnable/extensions/executor/retry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
31
  runnable/extensions/executor/retry/implementation.py,sha256=ZBSYpxSiAIt-SXPD-qIPP-MMo8b7sQ6UKOTJemAjXlI,6625
33
- runnable/extensions/experiment_tracker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- runnable/extensions/experiment_tracker/mlflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- runnable/extensions/experiment_tracker/mlflow/implementation.py,sha256=sc1Wm1LCf7wBX0BYVx3YVdwsR72AE0qIrzl7cEfIl58,3045
36
- runnable/extensions/nodes.py,sha256=Em-vs21ZfhyvFh-s6NZVhcUydSrX_mY8mb8-NUAO_w8,29883
32
+ runnable/extensions/nodes.py,sha256=5soHRhfT8FY2vnQa4kvRqeVphTq_t-GSw-ExNZfgB30,31965
37
33
  runnable/extensions/run_log_store/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
34
  runnable/extensions/run_log_store/chunked_file_system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- runnable/extensions/run_log_store/chunked_file_system/implementation.py,sha256=koHNG-Cv7mpt-rTNC3tiLBR8HcjnQ9L-EvQ4dtKkGRA,3170
35
+ runnable/extensions/run_log_store/chunked_file_system/implementation.py,sha256=wtOeREr9QyIuMHLCT7o_eDCJVCDsBvwmk89kos3dhfQ,3326
40
36
  runnable/extensions/run_log_store/chunked_k8s_pvc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
37
  runnable/extensions/run_log_store/chunked_k8s_pvc/implementation.py,sha256=iGzy-s1eT_kAJP7XgzDLmEMOGrBLvACIiGE_wM62jGE,579
42
38
  runnable/extensions/run_log_store/chunked_k8s_pvc/integration.py,sha256=atzdTy5HJ-bZsd6AzDP8kYRI1TshKxviBKeqY359TUs,1979
43
39
  runnable/extensions/run_log_store/db/implementation_FF.py,sha256=oEiG5ASWYYbwlBbnryKarQENB-L_yOsnZahbj2U0GdQ,5155
44
40
  runnable/extensions/run_log_store/db/integration_FF.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
41
  runnable/extensions/run_log_store/file_system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- runnable/extensions/run_log_store/file_system/implementation.py,sha256=PcaM8IKcj-b2iNE9Zup2eC6Y2-987uQzzb0skdd1QX4,4114
42
+ runnable/extensions/run_log_store/file_system/implementation.py,sha256=WxxfGCaDAB5zHMM3zv9aeDwXZ4DhtyzjXOjfjvyDoZ4,4288
47
43
  runnable/extensions/run_log_store/generic_chunked.py,sha256=rcY5f-MIYUUiM5iQnDHICOh7cKiOUSCeaxcBG9_fz-U,19390
48
44
  runnable/extensions/run_log_store/k8s_pvc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
45
  runnable/extensions/run_log_store/k8s_pvc/implementation.py,sha256=tLgXy9HUB_vlFVQ0Itk6PpNU3GlCOILN4vA3fm80jXI,542
@@ -53,18 +49,18 @@ runnable/extensions/secrets/dotenv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQe
53
49
  runnable/extensions/secrets/dotenv/implementation.py,sha256=3J5pofWahdZbnwnETwpspE5-PKyvmZF_vkfwA1X_bkA,3365
54
50
  runnable/extensions/secrets/env_secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
51
  runnable/extensions/secrets/env_secrets/implementation.py,sha256=5XiHdJvIr0-jkl4fGfEf26UsgE5Q2Z4oCc0RwjlJdJA,1236
56
- runnable/graph.py,sha256=w7qEnTuh6lvfeVSAbqNlwMufPqWL9espJI5s_G2prHM,15871
57
- runnable/integration.py,sha256=_jEm5PXl8pbvCmUGKjtssfZ2YtYnMzuRnjr2NySMqzs,7176
52
+ runnable/graph.py,sha256=18IpGYw5kgHP32m12WwXscx-kG5Kx-AuWS1LFbMfBLg,16202
53
+ runnable/integration.py,sha256=eb9qJVZR7Ehg0N1UnGPuyjJvoA-xQ1-xP7AlZHUXHqM,6705
58
54
  runnable/names.py,sha256=vn92Kv9ANROYSZX6Z4z1v_WA3WiEdIYmG6KEStBFZug,8134
59
- runnable/nodes.py,sha256=-vHtjyeRPfmKCmWjuYQItwdZIG3Rpv-IJlGQNbqj99c,16387
60
- runnable/parameters.py,sha256=-DtO-3LnsOt-wa9vqk3Mpq8OB-WVZf5xgEhtaointy0,5091
55
+ runnable/nodes.py,sha256=UqR-bJx0Hi7uLSUw_saB7VsNdFh3POKtdgsEPsasHfE,16576
56
+ runnable/parameters.py,sha256=KGGW8_uoIK2hd3EwzzBmoHBOrai3fh-SESNPpJRTfj4,5161
61
57
  runnable/pickler.py,sha256=5SDNf0miMUJ3ZauhQdzwk8_t-9jeOqaTjP5bvRnu9sU,2685
62
- runnable/sdk.py,sha256=_WXAfRgSOzZzqhh3d_t_sCUBLf7_0tHXz48a00ie0H4,25697
58
+ runnable/sdk.py,sha256=JsM27GUc3c57ZepK996FHtfzXP6FGs8MP-s96RC-_fo,27648
63
59
  runnable/secrets.py,sha256=dakb7WRloWVo-KpQp6Vy4rwFdGi58BTlT4OifQY106I,2324
64
- runnable/tasks.py,sha256=LSc6Un-vB0bGTayuxcR0VY6D7gilg8WQKIDEgP6Ge90,17663
65
- runnable/utils.py,sha256=mnxLzGjJKht5z46gz5EumNJaaY33dec26F8wRQQRsGY,19337
66
- runnable-0.10.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
67
- runnable-0.10.0.dist-info/METADATA,sha256=N1kPIVDGBJbWTYdSfuDR6AxQ4x4xoS-eM63RXo_xhKI,17063
68
- runnable-0.10.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
69
- runnable-0.10.0.dist-info/entry_points.txt,sha256=_elJX0RSR4u9IWIl8fwYNL-YBXoYaanYd415TJBmTRE,1710
70
- runnable-0.10.0.dist-info/RECORD,,
60
+ runnable/tasks.py,sha256=CH0W7evAZK5hco0medJS6DwHRr06bng7oB7xk0Xh6zQ,20618
61
+ runnable/utils.py,sha256=okZFGbJWqStl5Rq5vLhNUQZDv_vhcT58bq9MDrTVxhc,19449
62
+ runnable-0.11.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
63
+ runnable-0.11.1.dist-info/METADATA,sha256=IKuld8eA9gcb6y7YZaO-3Dpmw2x4U2wnPg0eag1fewU,17020
64
+ runnable-0.11.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
65
+ runnable-0.11.1.dist-info/entry_points.txt,sha256=Wy-dimdD2REO2a36Ri84fqGqA5iwGy2RIbdgRNtCNdM,1540
66
+ runnable-0.11.1.dist-info/RECORD,,
@@ -12,10 +12,6 @@ local-container=runnable.extensions.executor.local_container.implementation:Loca
12
12
  mocked=runnable.extensions.executor.mocked.implementation:MockedExecutor
13
13
  retry=runnable.extensions.executor.retry.implementation:RetryExecutor
14
14
 
15
- [experiment_tracker]
16
- do-nothing=runnable.experiment_tracker:DoNothingTracker
17
- mlflow=runnable.extensions.experiment_tracker.mlflow.implementation:MLFlowExperimentTracker
18
-
19
15
  [nodes]
20
16
  dag=runnable.extensions.nodes:DagNode
21
17
  fail=runnable.extensions.nodes:FailNode
@@ -1,139 +0,0 @@
1
- import contextlib
2
- import json
3
- import logging
4
- import os
5
- from abc import ABC, abstractmethod
6
- from collections import defaultdict
7
- from typing import Any, ContextManager, Dict, Tuple, Union
8
-
9
- from pydantic import BaseModel, ConfigDict
10
-
11
- import runnable.context as context
12
- from runnable import defaults
13
- from runnable.utils import remove_prefix
14
-
15
- logger = logging.getLogger(defaults.LOGGER_NAME)
16
-
17
-
18
- def retrieve_step_details(key: str) -> Tuple[str, int]:
19
- key = remove_prefix(key, defaults.TRACK_PREFIX)
20
- data = key.split(defaults.STEP_INDICATOR)
21
-
22
- key = data[0].lower()
23
- step = 0
24
-
25
- if len(data) > 1:
26
- step = int(data[1])
27
-
28
- return key, step
29
-
30
-
31
- def get_tracked_data() -> Dict[str, Any]:
32
- tracked_data: Dict[str, Any] = defaultdict(dict)
33
- for env_var, value in os.environ.items():
34
- if env_var.startswith(defaults.TRACK_PREFIX):
35
- key, step = retrieve_step_details(env_var)
36
-
37
- # print(value, type(value))
38
- try:
39
- value = json.loads(value)
40
- except json.decoder.JSONDecodeError:
41
- logger.warning(f"Tracker {key} could not be JSON decoded, adding the literal value")
42
-
43
- tracked_data[key][step] = value
44
- del os.environ[env_var]
45
-
46
- for key, value in tracked_data.items():
47
- if len(value) == 1:
48
- tracked_data[key] = value[0]
49
-
50
- return tracked_data
51
-
52
-
53
- # --8<-- [start:docs]
54
-
55
-
56
- class BaseExperimentTracker(ABC, BaseModel):
57
- """
58
- Base Experiment tracker class definition.
59
- """
60
-
61
- service_name: str = ""
62
- service_type: str = "experiment_tracker"
63
-
64
- @property
65
- def _context(self):
66
- return context.run_context
67
-
68
- model_config = ConfigDict(extra="forbid")
69
-
70
- @property
71
- def client_context(self) -> ContextManager:
72
- """
73
- Returns the client context.
74
- """
75
- return contextlib.nullcontext()
76
-
77
- def publish_data(self, tracked_data: Dict[str, Any]):
78
- for key, value in tracked_data.items():
79
- if isinstance(value, dict):
80
- for key2, value2 in value.items():
81
- self.log_metric(key, value2, step=key2)
82
- continue
83
- self.log_metric(key, value)
84
-
85
- @abstractmethod
86
- def log_metric(self, key: str, value: Union[int, float], step: int = 0):
87
- """
88
- Sets the metric in the experiment tracking.
89
-
90
- Args:
91
- key (str): The key against you want to store the value
92
- value (float): The value of the metric
93
- step (int): Optional step at which it was recorded
94
-
95
- Raises:
96
- NotImplementedError: Base class, hence not implemented
97
- """
98
- raise NotImplementedError
99
-
100
- @abstractmethod
101
- def log_parameter(self, key: str, value: Any):
102
- """
103
- Logs a parameter in the experiment tracking.
104
-
105
- Args:
106
- key (str): The key against you want to store the value
107
- value (any): The value of the metric
108
-
109
- Raises:
110
- NotImplementedError: Base class, hence not implemented
111
- """
112
- pass
113
-
114
-
115
- # --8<-- [end:docs]
116
-
117
-
118
- class DoNothingTracker(BaseExperimentTracker):
119
- """
120
- A Do nothing tracker
121
- """
122
-
123
- service_name: str = "do-nothing"
124
-
125
- def log_metric(self, key: str, value: Union[int, float], step: int = 0):
126
- """
127
- Sets the metric in the experiment tracking.
128
-
129
- Args:
130
- key (str): The key against you want to store the value
131
- value (float): The value of the metric
132
- """
133
- ...
134
-
135
- def log_parameter(self, key: str, value: Any):
136
- """
137
- Since this is a Do nothing tracker, we don't need to log anything.
138
- """
139
- ...
File without changes
File without changes
@@ -1,94 +0,0 @@
1
- import functools
2
- import logging
3
- from typing import Any, Union
4
-
5
- from pydantic import ConfigDict, PrivateAttr
6
-
7
- from runnable import defaults
8
- from runnable.experiment_tracker import BaseExperimentTracker
9
-
10
- logger = logging.getLogger(defaults.NAME)
11
-
12
-
13
- class MLFlowExperimentTracker(BaseExperimentTracker):
14
- """
15
- A MLFlow experiment tracker.
16
-
17
- TODO: Need to set up credentials from secrets
18
- """
19
-
20
- service_name: str = "mlflow"
21
-
22
- server_url: str
23
- autolog: bool = False
24
-
25
- _default_experiment_name: str = PrivateAttr(default="Default")
26
- _active_run_id: str = PrivateAttr(default="")
27
- _client: Any = PrivateAttr(default=None)
28
-
29
- model_config = ConfigDict(extra="forbid")
30
-
31
- def model_post_init(self, __context: Any) -> None:
32
- try:
33
- import mlflow
34
- except ImportError:
35
- raise Exception("You need to install mlflow to use MLFlowExperimentTracker.")
36
-
37
- self._client = mlflow
38
-
39
- self._client.set_tracking_uri(self.server_url)
40
-
41
- if self.autolog:
42
- self._client.autolog(log_models=False)
43
-
44
- @functools.cached_property
45
- def experiment_id(self):
46
- experiment_name = self._default_experiment_name
47
-
48
- # If a tag is provided, we should create that as our experiment
49
- if self._context.tag:
50
- experiment_name = self._context.tag
51
-
52
- experiment = self._client.get_experiment_by_name(experiment_name)
53
- if not experiment:
54
- # Create the experiment and get it.
55
- experiment = self._client.create_experiment(experiment_name)
56
- experiment = self._client.get_experiment(experiment)
57
-
58
- return experiment.experiment_id
59
-
60
- @functools.cached_property
61
- def run_name(self):
62
- return self._context.run_id
63
-
64
- @property
65
- def client_context(self):
66
- if self._active_run_id:
67
- return self._client.start_run(
68
- run_id=self._active_run_id, experiment_id=self.experiment_id, run_name=self.run_name
69
- )
70
-
71
- active_run = self._client.start_run(run_name=self.run_name, experiment_id=self.experiment_id)
72
- self._active_run_id = active_run.info.run_id
73
- return active_run
74
-
75
- def log_metric(self, key: str, value: Union[int, float], step: int = 0):
76
- """
77
- Sets the metric in the experiment tracking.
78
-
79
- Args:
80
- key (str): The key against you want to store the value
81
- value (Any): The value of the metric
82
- """
83
- if not isinstance(value, float) or isinstance(value, int):
84
- msg = f"Only float/int values are accepted as metrics. Setting the metric {key} as parameter {key}_{step}"
85
- logger.warning(msg)
86
- self.log_parameter(key=key, value=value, step=step)
87
- return
88
-
89
- with self.client_context as _:
90
- self._client.log_metric(key, float(value), step=step or None)
91
-
92
- def log_parameter(self, key: str, value: Any, step: int = 0):
93
- with self.client_context as _:
94
- self._client.log_param(key + f"_{str(step)}", value)