dv-flow-mgr 0.0.1.13862597957a1__py3-none-any.whl → 0.0.1.13885203883a1__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.
- dv_flow/mgr/task_def.py +6 -1
- dv_flow/mgr/task_node.py +37 -42
- dv_flow/mgr/task_runner.py +3 -3
- {dv_flow_mgr-0.0.1.13862597957a1.dist-info → dv_flow_mgr-0.0.1.13885203883a1.dist-info}/METADATA +1 -1
- {dv_flow_mgr-0.0.1.13862597957a1.dist-info → dv_flow_mgr-0.0.1.13885203883a1.dist-info}/RECORD +9 -9
- {dv_flow_mgr-0.0.1.13862597957a1.dist-info → dv_flow_mgr-0.0.1.13885203883a1.dist-info}/LICENSE +0 -0
- {dv_flow_mgr-0.0.1.13862597957a1.dist-info → dv_flow_mgr-0.0.1.13885203883a1.dist-info}/WHEEL +0 -0
- {dv_flow_mgr-0.0.1.13862597957a1.dist-info → dv_flow_mgr-0.0.1.13885203883a1.dist-info}/entry_points.txt +0 -0
- {dv_flow_mgr-0.0.1.13862597957a1.dist-info → dv_flow_mgr-0.0.1.13885203883a1.dist-info}/top_level.txt +0 -0
dv_flow/mgr/task_def.py
CHANGED
@@ -30,6 +30,11 @@ from .task_output import TaskOutput
|
|
30
30
|
class TaskSpec(object):
|
31
31
|
name : str
|
32
32
|
|
33
|
+
@dc.dataclass
|
34
|
+
class NeedSpec(object):
|
35
|
+
name : str
|
36
|
+
block : bool = False
|
37
|
+
|
33
38
|
class TaskDef(BaseModel):
|
34
39
|
"""Holds definition information (ie the YAML view) for a task"""
|
35
40
|
name : str
|
@@ -39,7 +44,7 @@ class TaskDef(BaseModel):
|
|
39
44
|
pytask : str = dc.Field(default=None)
|
40
45
|
desc : str = dc.Field(default="")
|
41
46
|
doc : str = dc.Field(default="")
|
42
|
-
needs : List[Union[str,TaskSpec]] = dc.Field(default_factory=list, alias="needs")
|
47
|
+
needs : List[Union[str,NeedSpec,TaskSpec]] = dc.Field(default_factory=list, alias="needs")
|
43
48
|
params: Dict[str,Union[str,list,ParamDef]] = dc.Field(default_factory=dict, alias="with")
|
44
49
|
passthrough: bool = dc.Field(default=False)
|
45
50
|
consumes : List[Any] = dc.Field(default_factory=list)
|
dv_flow/mgr/task_node.py
CHANGED
@@ -25,7 +25,7 @@ import dataclasses as dc
|
|
25
25
|
import pydantic.dataclasses as pdc
|
26
26
|
import logging
|
27
27
|
import toposort
|
28
|
-
from typing import Any, Callable, ClassVar, Dict, List
|
28
|
+
from typing import Any, Callable, ClassVar, Dict, List, Tuple
|
29
29
|
from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
|
30
30
|
from .task_params_ctor import TaskParamsCtor
|
31
31
|
from .param_ref_eval import ParamRefEval
|
@@ -46,7 +46,7 @@ class TaskNode(object):
|
|
46
46
|
changed : bool = False
|
47
47
|
passthrough : bool = False
|
48
48
|
consumes : List[Any] = dc.field(default_factory=list)
|
49
|
-
needs : List['TaskNode'] = dc.field(default_factory=list)
|
49
|
+
needs : List[Tuple['TaskNode',bool]] = dc.field(default_factory=list)
|
50
50
|
rundir : str = dc.field(default=None)
|
51
51
|
output : TaskDataOutput = dc.field(default=None)
|
52
52
|
result : TaskDataResult = dc.field(default=None)
|
@@ -58,6 +58,10 @@ class TaskNode(object):
|
|
58
58
|
def __post_init__(self):
|
59
59
|
if self.needs is None:
|
60
60
|
self.needs = []
|
61
|
+
else:
|
62
|
+
for i,need in enumerate(self.needs):
|
63
|
+
if not isinstance(need, tuple):
|
64
|
+
self.needs[i] = (need, False)
|
61
65
|
|
62
66
|
async def do_run(self,
|
63
67
|
runner,
|
@@ -65,7 +69,7 @@ class TaskNode(object):
|
|
65
69
|
memento : Any = None) -> 'TaskDataResult':
|
66
70
|
self._log.debug("--> do_run: %s" % self.name)
|
67
71
|
changed = False
|
68
|
-
for dep in self.needs:
|
72
|
+
for dep,_ in self.needs:
|
69
73
|
changed |= dep.changed
|
70
74
|
|
71
75
|
self.rundir = rundir
|
@@ -73,22 +77,30 @@ class TaskNode(object):
|
|
73
77
|
# TODO: Form dep-map from inputs
|
74
78
|
|
75
79
|
dep_m = {}
|
76
|
-
for need in self.needs:
|
80
|
+
for need,block in self.needs:
|
77
81
|
self._log.debug("dep %s dep_m: %s" % (need.name, str(dep_m)))
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
+
if not block:
|
83
|
+
for subdep in need.output.dep_m.keys():
|
84
|
+
if subdep not in dep_m.keys():
|
85
|
+
dep_m[subdep] = []
|
86
|
+
for dep in need.output.dep_m[subdep]:
|
87
|
+
if dep not in dep_m[subdep]:
|
88
|
+
dep_m[subdep].append(dep)
|
82
89
|
self._log.debug("input dep_m: %s %s" % (self.name, str(dep_m)))
|
83
90
|
|
84
91
|
sorted = toposort.toposort(dep_m)
|
85
92
|
|
86
93
|
in_params_m = {}
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
94
|
+
added_srcs = set()
|
95
|
+
for need,block in self.needs:
|
96
|
+
if not block:
|
97
|
+
for p in need.output.output:
|
98
|
+
# Avoid adding parameters from a single task more than once
|
99
|
+
if p.src not in added_srcs:
|
100
|
+
added_srcs.add(p.src)
|
101
|
+
if p.src not in in_params_m.keys():
|
102
|
+
in_params_m[p.src] = []
|
103
|
+
in_params_m[p.src].append(p)
|
92
104
|
|
93
105
|
# in_params holds parameter sets ordered by dependency
|
94
106
|
in_params = []
|
@@ -126,8 +138,6 @@ class TaskNode(object):
|
|
126
138
|
if elem.find("${{") != -1:
|
127
139
|
new_val = eval.eval(elem)
|
128
140
|
value[i] = new_val
|
129
|
-
else:
|
130
|
-
raise Exception("Unhandled param type: %s" % str(value))
|
131
141
|
|
132
142
|
input = TaskDataInput(
|
133
143
|
name=self.name,
|
@@ -150,43 +160,28 @@ class TaskNode(object):
|
|
150
160
|
|
151
161
|
# Pass-through all dependencies
|
152
162
|
# Add an entry for ourselves
|
153
|
-
dep_m[self.name] = list(need.name for need in self.needs)
|
163
|
+
dep_m[self.name] = list(need.name for need,_ in self.needs)
|
154
164
|
|
155
165
|
if self.passthrough:
|
156
166
|
self._log.debug("passthrough: %s" % self.name)
|
157
167
|
|
158
168
|
if self.consumes is None and len(self.consumes):
|
159
169
|
self._log.debug("Propagating all input parameters to output")
|
160
|
-
for need in self.needs:
|
161
|
-
|
170
|
+
for need,block in self.needs:
|
171
|
+
if not block:
|
172
|
+
output.extend(need.output.output)
|
162
173
|
else:
|
163
174
|
# Filter out parameter sets that were consumed
|
164
175
|
self._log.debug("Propagating non-consumed input parameters to output")
|
165
176
|
self._log.debug("consumes: %s" % str(self.consumes))
|
166
|
-
for need in self.needs:
|
167
|
-
|
168
|
-
|
169
|
-
self.
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
# consumed = False
|
175
|
-
# for c in self.consumes:
|
176
|
-
# match = False
|
177
|
-
# for k,v in c.items():
|
178
|
-
# self._log.debug("k,v: %s,%s" % (k,v))
|
179
|
-
# if hasattr(out, k):
|
180
|
-
# self._log.debug("has attribute: %s" % str(getattr(out ,k)))
|
181
|
-
# if getattr(out, k) == v:
|
182
|
-
# self._log.debug("match")
|
183
|
-
# match = True
|
184
|
-
# break
|
185
|
-
# if match:
|
186
|
-
# consumed = True
|
187
|
-
# break
|
188
|
-
|
189
|
-
# if not consumed:
|
177
|
+
for need,block in self.needs:
|
178
|
+
if not block:
|
179
|
+
for out in need.output.output:
|
180
|
+
if not self._matches(out, self.consumes):
|
181
|
+
self._log.debug("Propagating type %s from %s" % (
|
182
|
+
getattr(out, "type", "<unknown>"),
|
183
|
+
getattr(out, "src", "<unknown>")))
|
184
|
+
output.append(out)
|
190
185
|
else:
|
191
186
|
self._log.debug("non-passthrough: %s (only local outputs propagated)" % self.name)
|
192
187
|
# empty dependency map
|
dv_flow/mgr/task_runner.py
CHANGED
@@ -194,8 +194,8 @@ class TaskSetRunner(TaskRunner):
|
|
194
194
|
self._anon_tid += 1
|
195
195
|
|
196
196
|
if task not in dep_m.keys():
|
197
|
-
dep_m[task] = set(task.needs)
|
198
|
-
for need in task.needs:
|
197
|
+
dep_m[task] = set(task[0] for task in task.needs)
|
198
|
+
for need,block in task.needs:
|
199
199
|
self._buildDepMap(dep_m, need)
|
200
200
|
|
201
201
|
@dc.dataclass
|
@@ -205,7 +205,7 @@ class SingleTaskRunner(TaskRunner):
|
|
205
205
|
task : 'Task',
|
206
206
|
memento : Any = None) -> 'TaskDataResult':
|
207
207
|
changed = False
|
208
|
-
for dep in task.needs:
|
208
|
+
for dep,_ in task.needs:
|
209
209
|
changed |= dep.changed
|
210
210
|
|
211
211
|
# TODO: create an evaluator for substituting param values
|
{dv_flow_mgr-0.0.1.13862597957a1.dist-info → dv_flow_mgr-0.0.1.13885203883a1.dist-info}/RECORD
RENAMED
@@ -17,7 +17,7 @@ dv_flow/mgr/pkg_rgy.py,sha256=U5LgBsdCpVJ7tXjlTsn_Qjf9OoEEOjyWsYNsOecS2uQ,5337
|
|
17
17
|
dv_flow/mgr/task.py,sha256=BmS0wd51l4tpTrsit3-ugCB5VGnwpMJNl0dfJfHS4DQ,5981
|
18
18
|
dv_flow/mgr/task_ctor.py,sha256=YDYb5uW9Js7MnA8GqbYJljNCbeJFKGveZ2v-IJRgIa8,2221
|
19
19
|
dv_flow/mgr/task_data.py,sha256=ysawiUcbQu-ImNSgU5LsfOWlBKdfBt_8juwSacnAqAQ,11437
|
20
|
-
dv_flow/mgr/task_def.py,sha256=
|
20
|
+
dv_flow/mgr/task_def.py,sha256=BJKZZE8yO_kcKaf36HnzTkhYaC0DPIya4IKlKNM4s5I,2080
|
21
21
|
dv_flow/mgr/task_exec_data.py,sha256=-mh9G2-iq6ioB7v7QrHiQAOEwd_hDKhnVf2Mb_IHRtg,1483
|
22
22
|
dv_flow/mgr/task_graph_builder.py,sha256=EYFsMZCDDHMEFWZOVSpPb7KBVE6N6XyL4KFzJVrPSPE,10106
|
23
23
|
dv_flow/mgr/task_graph_runner.py,sha256=LZ5cTXLQlcK348AxTYKqfpsFFmxA3aseGfholvQW39s,2187
|
@@ -25,10 +25,10 @@ dv_flow/mgr/task_graph_runner_local.py,sha256=quAxmF1go2iVhBDieksg3brAZukIvpvF-8
|
|
25
25
|
dv_flow/mgr/task_impl_data.py,sha256=jpO7kQ6AjYcOOfpgFIPCEYA1pQbVwFcIY_SY3Q53eGk,1163
|
26
26
|
dv_flow/mgr/task_listener_log.py,sha256=b7caUHERGkN6eT8IinBJTdZpwASUs8xAqDmtEymMKzQ,3529
|
27
27
|
dv_flow/mgr/task_memento.py,sha256=CV3d1J4ADhMpqvYPfWvUI7duSFCbLEzY41y2GZBHIhM,1101
|
28
|
-
dv_flow/mgr/task_node.py,sha256=
|
28
|
+
dv_flow/mgr/task_node.py,sha256=xPCarkVSj9rZ1v12WiHtMOe-nMKHbkaUpP9-edQOXek,14828
|
29
29
|
dv_flow/mgr/task_output.py,sha256=ZwyvwnYj_gHOEFAEOH3m24Xfc4Cn77hb1j7LkX8_3C4,1086
|
30
30
|
dv_flow/mgr/task_params_ctor.py,sha256=BPkbnoCtzhCxc1g8CJ6VimCcm5UAu92PXeDMhQ4lYsQ,1957
|
31
|
-
dv_flow/mgr/task_runner.py,sha256=
|
31
|
+
dv_flow/mgr/task_runner.py,sha256=TB4feCEItxufUyyBSwNNY3OkQ0yjSO0fUfjga0u7rsg,8790
|
32
32
|
dv_flow/mgr/type.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
33
|
dv_flow/mgr/type_def.py,sha256=NDeyplKrPnWwEv4yHkhXEMK9d9j39b5MOeLB-1Mchqo,1095
|
34
34
|
dv_flow/mgr/util.py,sha256=BLp-25Ph9roqo1O3VHI5sKhwxQ0wUU7znFwcSKt0hpA,1442
|
@@ -40,9 +40,9 @@ dv_flow/mgr/std/fileset.py,sha256=5IxS6T-x0wzA6fdEQcfHZ9kNP8IpH9hfJ3UMhL4A6Iw,39
|
|
40
40
|
dv_flow/mgr/std/flow.dv,sha256=CcQOvSfT0JgsaNf7dH8gfbG8lPvQQXw9W9gqrT52Pw0,2025
|
41
41
|
dv_flow/mgr/std/message.py,sha256=_Gox9oBzL9ZYG1JfJ-WYPXojVLqGNaKxZ9tpLVT0LO0,1035
|
42
42
|
dv_flow/mgr/std/task_null.py,sha256=dw6LXBXVwth6gLPeduDvlz5znAhcVpDH8r1DticD-0w,1041
|
43
|
-
dv_flow_mgr-0.0.1.
|
44
|
-
dv_flow_mgr-0.0.1.
|
45
|
-
dv_flow_mgr-0.0.1.
|
46
|
-
dv_flow_mgr-0.0.1.
|
47
|
-
dv_flow_mgr-0.0.1.
|
48
|
-
dv_flow_mgr-0.0.1.
|
43
|
+
dv_flow_mgr-0.0.1.13885203883a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
44
|
+
dv_flow_mgr-0.0.1.13885203883a1.dist-info/METADATA,sha256=lH34dG2edpLv69XsxqBilTInQ_C4sfWeBkvy_3xM-Cw,13314
|
45
|
+
dv_flow_mgr-0.0.1.13885203883a1.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
|
46
|
+
dv_flow_mgr-0.0.1.13885203883a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
|
47
|
+
dv_flow_mgr-0.0.1.13885203883a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
|
48
|
+
dv_flow_mgr-0.0.1.13885203883a1.dist-info/RECORD,,
|
{dv_flow_mgr-0.0.1.13862597957a1.dist-info → dv_flow_mgr-0.0.1.13885203883a1.dist-info}/LICENSE
RENAMED
File without changes
|
{dv_flow_mgr-0.0.1.13862597957a1.dist-info → dv_flow_mgr-0.0.1.13885203883a1.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|
File without changes
|