dv-flow-mgr 0.0.1.13661289604a1__py3-none-any.whl → 0.0.1.13689116055a1__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/__init__.py +1 -0
- dv_flow/mgr/__main__.py +15 -10
- dv_flow/mgr/cmds/cmd_run.py +5 -24
- dv_flow/mgr/package_def.py +35 -7
- dv_flow/mgr/std/message.py +1 -1
- dv_flow/mgr/task_def.py +1 -0
- dv_flow/mgr/task_graph_builder.py +19 -2
- dv_flow/mgr/task_listener_log.py +15 -3
- dv_flow/mgr/task_node.py +80 -29
- dv_flow/mgr/task_output.py +3 -2
- {dv_flow_mgr-0.0.1.13661289604a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/METADATA +1 -1
- {dv_flow_mgr-0.0.1.13661289604a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/RECORD +16 -16
- {dv_flow_mgr-0.0.1.13661289604a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/LICENSE +0 -0
- {dv_flow_mgr-0.0.1.13661289604a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/WHEEL +0 -0
- {dv_flow_mgr-0.0.1.13661289604a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/entry_points.txt +0 -0
- {dv_flow_mgr-0.0.1.13661289604a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/top_level.txt +0 -0
dv_flow/mgr/__init__.py
CHANGED
dv_flow/mgr/__main__.py
CHANGED
@@ -25,12 +25,15 @@ from .cmds.cmd_run import CmdRun
|
|
25
25
|
|
26
26
|
def get_parser():
|
27
27
|
parser = argparse.ArgumentParser(description='dv_flow_mgr')
|
28
|
-
parser.add_argument("-d", "--debug",
|
29
|
-
|
30
|
-
|
31
|
-
parser.add_argument("-
|
32
|
-
help="
|
33
|
-
|
28
|
+
# parser.add_argument("-d", "--debug",
|
29
|
+
# help="Enable debug",
|
30
|
+
# action="store_true")
|
31
|
+
parser.add_argument("--log-level",
|
32
|
+
help="Configures debug level [INFO, DEBUG]",
|
33
|
+
choices=("NONE", "INFO", "DEBUG"))
|
34
|
+
# parser.add_argument("-v", "--verbose",
|
35
|
+
# help="Enable verbose output",
|
36
|
+
# action="store_true")
|
34
37
|
subparsers = parser.add_subparsers(required=True)
|
35
38
|
|
36
39
|
run_parser = subparsers.add_parser('run', help='run a flow')
|
@@ -43,10 +46,12 @@ def main():
|
|
43
46
|
parser = get_parser()
|
44
47
|
args = parser.parse_args()
|
45
48
|
|
46
|
-
if args.
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
if args.log_level is not None and args.log_level != "NONE":
|
50
|
+
opt_m = {
|
51
|
+
"INFO": logging.INFO,
|
52
|
+
"DEBUG": logging.DEBUG
|
53
|
+
}
|
54
|
+
logging.basicConfig(level=opt_m[args.log_level])
|
50
55
|
|
51
56
|
args.func(args)
|
52
57
|
|
dv_flow/mgr/cmds/cmd_run.py
CHANGED
@@ -6,6 +6,8 @@ from ..task_graph_runner import TaskGraphRunner
|
|
6
6
|
from ..util import loadProjPkgDef
|
7
7
|
from ..task_graph_builder import TaskGraphBuilder
|
8
8
|
from ..task_graph_runner_local import TaskGraphRunnerLocal
|
9
|
+
from ..task_runner import TaskSetRunner
|
10
|
+
from ..task_listener_log import TaskListenerLog
|
9
11
|
from ..pkg_rgy import PkgRgy
|
10
12
|
|
11
13
|
|
@@ -57,7 +59,9 @@ class CmdRun(object):
|
|
57
59
|
rundir = os.path.join(pkg.basedir, "rundir")
|
58
60
|
|
59
61
|
builder = TaskGraphBuilder(root_pkg=pkg, rundir=rundir)
|
60
|
-
runner =
|
62
|
+
runner = TaskSetRunner(rundir)
|
63
|
+
|
64
|
+
runner.add_listener(TaskListenerLog().event)
|
61
65
|
|
62
66
|
tasks = []
|
63
67
|
|
@@ -69,27 +73,4 @@ class CmdRun(object):
|
|
69
73
|
|
70
74
|
asyncio.run(runner.run(tasks))
|
71
75
|
|
72
|
-
# rgy = PkgRgy.inst()
|
73
|
-
# rgy.registerPackage(pkg)
|
74
|
-
|
75
|
-
|
76
|
-
# srcdir = os.getcwd()
|
77
|
-
|
78
|
-
# session = Session(srcdir, rundir)
|
79
|
-
|
80
|
-
# package = session.load(srcdir)
|
81
|
-
|
82
|
-
# graphs = []
|
83
|
-
# for task in args.tasks:
|
84
|
-
# if task.find(".") == -1:
|
85
|
-
# task = package.name + "." + task
|
86
|
-
# subgraph = session.mkTaskGraph(task)
|
87
|
-
# graphs.append(subgraph)
|
88
|
-
|
89
|
-
# awaitables = [subgraph.do_run() for subgraph in graphs]
|
90
|
-
# print("%d awaitables" % len(awaitables))
|
91
|
-
|
92
|
-
# out = asyncio.get_event_loop().run_until_complete(asyncio.gather(*awaitables))
|
93
|
-
|
94
|
-
# print("out: %s" % str(out))
|
95
76
|
|
dv_flow/mgr/package_def.py
CHANGED
@@ -56,6 +56,10 @@ class PackageDef(BaseModel):
|
|
56
56
|
basedir : str = None
|
57
57
|
_log : ClassVar = logging.getLogger("PackageDef")
|
58
58
|
|
59
|
+
def __post_init__(self):
|
60
|
+
for t in self.tasks:
|
61
|
+
t.fullname = self.name + "." + t.name
|
62
|
+
|
59
63
|
def getTask(self, name : str) -> 'TaskDef':
|
60
64
|
for t in self.tasks:
|
61
65
|
if t.name == name:
|
@@ -83,11 +87,13 @@ class PackageDef(BaseModel):
|
|
83
87
|
# Now we have a unified map of the tasks declared in this package
|
84
88
|
for name in list(tasks_m.keys()):
|
85
89
|
task_i = tasks_m[name]
|
90
|
+
fullname = self.name + "." + name
|
86
91
|
if len(task_i) < 3:
|
87
92
|
# Need to create the task ctor
|
88
93
|
ctor_t = self.mkTaskCtor(session, task_i[0], task_i[1], tasks_m)
|
89
94
|
tasks_m[name] = (task_i[0], task_i[1], ctor_t)
|
90
95
|
ret.tasks[name] = tasks_m[name][2]
|
96
|
+
ret.tasks[fullname] = tasks_m[name][2]
|
91
97
|
|
92
98
|
session.pop_package(ret)
|
93
99
|
|
@@ -95,7 +101,7 @@ class PackageDef(BaseModel):
|
|
95
101
|
return ret
|
96
102
|
|
97
103
|
def getTaskCtor(self, session, task_name, tasks_m):
|
98
|
-
self._log.debug("--> getTaskCtor")
|
104
|
+
self._log.debug("--> getTaskCtor %s" % task_name)
|
99
105
|
# Find package (not package_def) that implements this task
|
100
106
|
# Insert an indirect reference to that tasks's constructor
|
101
107
|
last_dot = task_name.rfind('.')
|
@@ -128,13 +134,19 @@ class PackageDef(BaseModel):
|
|
128
134
|
ctor_t : TaskCtor = None
|
129
135
|
base_params : BaseModel = None
|
130
136
|
callable = None
|
131
|
-
passthrough =
|
137
|
+
passthrough = task.passthrough
|
132
138
|
needs = [] if task.needs is None else task.needs.copy()
|
133
139
|
|
134
140
|
if task.uses is not None:
|
141
|
+
self._log.debug("Uses: %s" % task.uses)
|
135
142
|
base_ctor_t = self.getTaskCtor(session, task.uses, tasks_m)
|
136
143
|
base_params = base_ctor_t.mkTaskParams()
|
137
144
|
|
145
|
+
if base_ctor_t is None:
|
146
|
+
self._log.error("Failed to load task ctor %s" % task.uses)
|
147
|
+
else:
|
148
|
+
self._log.debug("No 'uses' specified")
|
149
|
+
|
138
150
|
# Determine the implementation constructor first
|
139
151
|
if task.pytask is not None:
|
140
152
|
# Built-in impl
|
@@ -160,7 +172,7 @@ class PackageDef(BaseModel):
|
|
160
172
|
callable = getattr(mod, clsname)
|
161
173
|
|
162
174
|
# Determine if we need to use a new
|
163
|
-
paramT = self._getParamT(task, base_params)
|
175
|
+
paramT = self._getParamT(session, task, base_params)
|
164
176
|
|
165
177
|
if callable is not None:
|
166
178
|
ctor_t = TaskNodeCtorTask(
|
@@ -184,7 +196,7 @@ class PackageDef(BaseModel):
|
|
184
196
|
ctor_t = TaskNodeCtorTask(
|
185
197
|
name=task.name,
|
186
198
|
srcdir=srcdir,
|
187
|
-
paramT=
|
199
|
+
paramT=paramT,
|
188
200
|
passthrough=passthrough,
|
189
201
|
needs=needs,
|
190
202
|
task=TaskNull)
|
@@ -192,7 +204,8 @@ class PackageDef(BaseModel):
|
|
192
204
|
self._log.debug("<-- %s::mkTaskCtor %s" % (self.name, task.name))
|
193
205
|
return ctor_t
|
194
206
|
|
195
|
-
def _getParamT(self, task, base_t : BaseModel):
|
207
|
+
def _getParamT(self, session, task, base_t : BaseModel):
|
208
|
+
self._log.debug("--> _getParamT %s" % task.fullname)
|
196
209
|
# Get the base parameter type (if available)
|
197
210
|
# We will build a new type with updated fields
|
198
211
|
|
@@ -214,6 +227,8 @@ class PackageDef(BaseModel):
|
|
214
227
|
fields = []
|
215
228
|
field_m : Dict[str,int] = {}
|
216
229
|
|
230
|
+
pkg = session.package()
|
231
|
+
|
217
232
|
# First, pull out existing fields (if there's a base type)
|
218
233
|
if base_t is not None:
|
219
234
|
self._log.debug("Base type: %s" % str(base_t))
|
@@ -255,6 +270,11 @@ class PackageDef(BaseModel):
|
|
255
270
|
|
256
271
|
params_t = pydantic.create_model("Task%sParams" % task.name, **field_m)
|
257
272
|
|
273
|
+
self._log.debug("== Params")
|
274
|
+
for name,info in params_t.model_fields.items():
|
275
|
+
self._log.debug(" %s: %s" % (name, str(info)))
|
276
|
+
|
277
|
+
self._log.debug("<-- _getParamT %s" % task.name)
|
258
278
|
return params_t
|
259
279
|
|
260
280
|
@staticmethod
|
@@ -273,7 +293,15 @@ class PackageDef(BaseModel):
|
|
273
293
|
doc = yaml.load(fp, Loader=yaml.FullLoader)
|
274
294
|
if "package" not in doc.keys():
|
275
295
|
raise Exception("Missing 'package' key in %s" % root)
|
276
|
-
|
296
|
+
try:
|
297
|
+
pkg = PackageDef(**(doc["package"]))
|
298
|
+
|
299
|
+
for t in pkg.tasks:
|
300
|
+
t.fullname = pkg.name + "." + t.name
|
301
|
+
|
302
|
+
except Exception as e:
|
303
|
+
PackageDef._log.error("Failed to load package from %s" % root)
|
304
|
+
raise e
|
277
305
|
pkg.basedir = os.path.dirname(root)
|
278
306
|
|
279
307
|
# for t in pkg.tasks:
|
@@ -353,7 +381,7 @@ class PackageDef(BaseModel):
|
|
353
381
|
|
354
382
|
with open(file, "r") as fp:
|
355
383
|
doc = yaml.load(fp, Loader=yaml.FullLoader)
|
356
|
-
PackageDef._log.debug("doc: %s" % str(doc)
|
384
|
+
PackageDef._log.debug("doc: %s" % str(doc))
|
357
385
|
if "fragment" in doc.keys():
|
358
386
|
# Merge the package definition
|
359
387
|
frag = FragmentDef(**(doc["fragment"]))
|
dv_flow/mgr/std/message.py
CHANGED
dv_flow/mgr/task_def.py
CHANGED
@@ -33,6 +33,7 @@ class TaskSpec(object):
|
|
33
33
|
class TaskDef(BaseModel):
|
34
34
|
"""Holds definition information (ie the YAML view) for a task"""
|
35
35
|
name : str
|
36
|
+
fullname : str = dc.Field(default=None)
|
36
37
|
# type : Union[str,TaskSpec] = dc.Field(default_factory=list)
|
37
38
|
uses : str = dc.Field(default=None)
|
38
39
|
pytask : str = dc.Field(default=None)
|
@@ -27,7 +27,7 @@ from .package_def import PackageDef, PackageSpec
|
|
27
27
|
from .pkg_rgy import PkgRgy
|
28
28
|
from .task import Task
|
29
29
|
from .task_node import TaskNodeCtor
|
30
|
-
from typing import Dict, List
|
30
|
+
from typing import Dict, List, Union
|
31
31
|
|
32
32
|
@dc.dataclass
|
33
33
|
class TaskGraphBuilder(object):
|
@@ -178,8 +178,25 @@ class TaskGraphBuilder(object):
|
|
178
178
|
self._logger.debug("<-- getPackage: %s" % str(pkg))
|
179
179
|
|
180
180
|
return pkg
|
181
|
+
|
182
|
+
def mkTaskNode(self, task_t, name=None, srcdir=None, needs=None, **kwargs):
|
183
|
+
self._logger.debug("--> mkTaskNode: %s" % task_t)
|
184
|
+
ctor = self.getTaskCtor(task_t)
|
185
|
+
self._logger.debug("ctor: %s" % ctor.name)
|
186
|
+
params = ctor.mkTaskParams(kwargs)
|
187
|
+
ret = ctor.mkTaskNode(
|
188
|
+
params=params,
|
189
|
+
name=name,
|
190
|
+
srcdir=srcdir,
|
191
|
+
needs=needs)
|
192
|
+
self._logger.debug("<-- mkTaskNode: %s" % task_t)
|
193
|
+
return ret
|
181
194
|
|
182
|
-
def getTaskCtor(self, spec : 'TaskSpec', pkg : PackageDef = None) -> 'TaskCtor':
|
195
|
+
def getTaskCtor(self, spec : Union[str,'TaskSpec'], pkg : PackageDef = None) -> 'TaskCtor':
|
196
|
+
from .task_def import TaskSpec
|
197
|
+
if type(spec) == str:
|
198
|
+
spec = TaskSpec(spec)
|
199
|
+
|
183
200
|
self._logger.debug("--> getTaskCtor %s" % spec.name)
|
184
201
|
spec_e = spec.name.split(".")
|
185
202
|
task_name = spec_e[-1]
|
dv_flow/mgr/task_listener_log.py
CHANGED
@@ -1,15 +1,27 @@
|
|
1
1
|
import dataclasses as dc
|
2
|
+
from rich.console import Console
|
2
3
|
|
4
|
+
@dc.dataclass
|
3
5
|
class TaskListenerLog(object):
|
6
|
+
console : Console = dc.field(default_factory=Console)
|
7
|
+
level : int = 0
|
8
|
+
quiet : bool = True
|
4
9
|
|
5
10
|
def event(self, task : 'Task', reason : 'Reason'):
|
6
11
|
if reason == 'enter':
|
7
|
-
|
12
|
+
self.level += 1
|
13
|
+
if not self.quiet:
|
14
|
+
self.console.print("[green]>[%d][/green] Task %s" % (self.level, task.name))
|
8
15
|
elif reason == 'leave':
|
9
16
|
for m in task.result.markers:
|
10
17
|
print(" %s" % m)
|
11
|
-
|
18
|
+
if self.quiet:
|
19
|
+
if task.result.changed:
|
20
|
+
self.console.print("[green]Done:[/green] %s" % (task.name,))
|
21
|
+
else:
|
22
|
+
self.console.print("[green]<[%d][/green] Task %s" % (self.level, task.name))
|
23
|
+
self.level -= 1
|
12
24
|
else:
|
13
|
-
print("- Task %s" % task.name
|
25
|
+
self.console.print("[red]-[/red] Task %s" % task.name)
|
14
26
|
pass
|
15
27
|
|
dv_flow/mgr/task_node.py
CHANGED
@@ -3,6 +3,7 @@ import sys
|
|
3
3
|
import dataclasses as dc
|
4
4
|
import pydantic.dataclasses as pdc
|
5
5
|
import logging
|
6
|
+
import toposort
|
6
7
|
from typing import Any, Callable, ClassVar, Dict, List
|
7
8
|
from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
|
8
9
|
from .task_params_ctor import TaskParamsCtor
|
@@ -38,19 +39,46 @@ class TaskNode(object):
|
|
38
39
|
runner,
|
39
40
|
rundir,
|
40
41
|
memento : Any = None) -> 'TaskDataResult':
|
42
|
+
self._log.debug("--> do_run: %s" % self.name)
|
41
43
|
changed = False
|
42
44
|
for dep in self.needs:
|
43
45
|
changed |= dep.changed
|
44
46
|
|
45
47
|
# TODO: Form dep-map from inputs
|
46
|
-
|
47
|
-
|
48
|
+
|
49
|
+
dep_m = {}
|
50
|
+
for need in self.needs:
|
51
|
+
self._log.debug("dep %s dep_m: %s" % (need.name, str(dep_m)))
|
52
|
+
for subdep in need.output.dep_m.keys():
|
53
|
+
if subdep not in dep_m.keys():
|
54
|
+
dep_m[subdep] = []
|
55
|
+
dep_m[subdep].extend(need.output.dep_m[subdep])
|
56
|
+
|
57
|
+
self._log.debug("input dep_m: %s" % str(dep_m))
|
58
|
+
sorted = toposort.toposort(dep_m)
|
59
|
+
|
60
|
+
in_params_m = {}
|
48
61
|
for need in self.needs:
|
49
|
-
|
62
|
+
for p in need.output.output:
|
63
|
+
if p.src not in in_params_m.keys():
|
64
|
+
in_params_m[p.src] = []
|
65
|
+
in_params_m[p.src].append(p)
|
66
|
+
|
67
|
+
# in_params holds parameter sets ordered by dependency
|
68
|
+
in_params = []
|
69
|
+
for sorted_s in sorted:
|
70
|
+
self._log.debug("sorted_s: %s" % str(sorted_s))
|
71
|
+
for dep in sorted_s:
|
72
|
+
if dep in in_params_m.keys():
|
73
|
+
self._log.debug("(%s) Extend with: %s" % (dep, str(in_params_m[dep])))
|
74
|
+
in_params.extend(in_params_m[dep])
|
75
|
+
|
76
|
+
self._log.debug("in_params[1]: %s" % ",".join(p.src for p in in_params))
|
50
77
|
|
51
78
|
# Create an evaluator for substituting param values
|
52
79
|
eval = ParamRefEval()
|
53
80
|
|
81
|
+
self._log.debug("in_params[2]: %s" % ",".join(p.src for p in in_params))
|
54
82
|
eval.setVar("in", in_params)
|
55
83
|
|
56
84
|
for name,field in self.params.model_fields.items():
|
@@ -58,6 +86,7 @@ class TaskNode(object):
|
|
58
86
|
if type(value) == str:
|
59
87
|
if value.find("${{") != -1:
|
60
88
|
new_val = eval.eval(value)
|
89
|
+
self._log.debug("Param %s: Evaluate expression \"%s\" => \"%s\"" % (name, value, new_val))
|
61
90
|
setattr(self.params, name, new_val)
|
62
91
|
elif isinstance(value, list):
|
63
92
|
for i,elem in enumerate(value):
|
@@ -75,20 +104,40 @@ class TaskNode(object):
|
|
75
104
|
params=self.params,
|
76
105
|
memento=memento)
|
77
106
|
|
78
|
-
|
107
|
+
self._log.debug("--> Call task method %s" % str(self.task))
|
79
108
|
self.result : TaskDataResult = await self.task(self, input)
|
80
|
-
|
109
|
+
self._log.debug("<-- Call task method %s" % str(self.task))
|
81
110
|
|
82
|
-
|
83
|
-
|
111
|
+
output=self.result.output.copy()
|
112
|
+
for out in output:
|
113
|
+
out.src = self.name
|
114
|
+
|
115
|
+
self._log.debug("output[1]: %s" % str(output))
|
116
|
+
|
117
|
+
if self.passthrough:
|
118
|
+
self._log.debug("passthrough: %s" % self.name)
|
119
|
+
# Add an entry for ourselves
|
120
|
+
dep_m[self.name] = list(need.name for need in self.needs)
|
121
|
+
|
122
|
+
for need in self.needs:
|
123
|
+
output.extend(need.output.output)
|
124
|
+
else:
|
125
|
+
# empty dependency map
|
126
|
+
dep_m = {
|
127
|
+
self.name : []
|
128
|
+
}
|
129
|
+
|
130
|
+
self._log.debug("output dep_m: %s" % str(dep_m))
|
131
|
+
self._log.debug("output[2]: %s" % str(output))
|
84
132
|
|
85
133
|
# Store the result
|
86
134
|
self.output = TaskDataOutput(
|
87
135
|
changed=self.result.changed,
|
88
136
|
dep_m=dep_m,
|
89
|
-
output=
|
137
|
+
output=output)
|
90
138
|
|
91
139
|
# TODO:
|
140
|
+
self._log.debug("<-- do_run: %s" % self.name)
|
92
141
|
|
93
142
|
return self.result
|
94
143
|
|
@@ -108,6 +157,29 @@ class TaskNodeCtor(object):
|
|
108
157
|
paramT : Any
|
109
158
|
passthrough : bool
|
110
159
|
|
160
|
+
def __call__(self,
|
161
|
+
name=None,
|
162
|
+
srcdir=None,
|
163
|
+
params=None,
|
164
|
+
needs=None,
|
165
|
+
passthrough=None,
|
166
|
+
**kwargs):
|
167
|
+
"""Convenience method for direct creation of tasks"""
|
168
|
+
if params is None:
|
169
|
+
params = self.mkTaskParams(kwargs)
|
170
|
+
|
171
|
+
node = self.mkTaskNode(
|
172
|
+
srcdir=srcdir,
|
173
|
+
params=params,
|
174
|
+
name=name,
|
175
|
+
needs=needs)
|
176
|
+
if passthrough is not None:
|
177
|
+
node.passthrough = passthrough
|
178
|
+
else:
|
179
|
+
node.passthrough = self.passthrough
|
180
|
+
|
181
|
+
return node
|
182
|
+
|
111
183
|
def getNeeds(self) -> List[str]:
|
112
184
|
return []
|
113
185
|
|
@@ -188,28 +260,7 @@ class TaskNodeCtorTask(TaskNodeCtorDefBase):
|
|
188
260
|
class TaskNodeCtorWrapper(TaskNodeCtor):
|
189
261
|
T : Any
|
190
262
|
|
191
|
-
def __call__(self,
|
192
|
-
name=None,
|
193
|
-
srcdir=None,
|
194
|
-
params=None,
|
195
|
-
needs=None,
|
196
|
-
passthrough=None,
|
197
|
-
**kwargs):
|
198
|
-
"""Convenience method for direct creation of tasks"""
|
199
|
-
if params is None:
|
200
|
-
params = self.mkTaskParams(kwargs)
|
201
|
-
|
202
|
-
node = self.mkTaskNode(
|
203
|
-
srcdir=srcdir,
|
204
|
-
params=params,
|
205
|
-
name=name,
|
206
|
-
needs=needs)
|
207
|
-
if passthrough is not None:
|
208
|
-
node.passthrough = passthrough
|
209
|
-
else:
|
210
|
-
node.passthrough = self.passthrough
|
211
263
|
|
212
|
-
return node
|
213
264
|
|
214
265
|
def mkTaskNode(self, params, srcdir=None, name=None, needs=None) -> TaskNode:
|
215
266
|
node = TaskNode(name, srcdir, params, self.T, needs=needs)
|
dv_flow/mgr/task_output.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
from pydantic import BaseModel, Field
|
2
|
-
from typing import Any, List
|
2
|
+
from typing import Any, Dict, List
|
3
3
|
|
4
4
|
class TaskOutput(BaseModel):
|
5
5
|
type : str
|
6
|
-
params : List[Any] = Field(default_factory=list, alias="with")
|
6
|
+
params : List[Any] = Field(default_factory=list, alias="with")
|
7
|
+
deps : Dict[str,List[str]] = Field(default_factory=dict)
|
{dv_flow_mgr-0.0.1.13661289604a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/RECORD
RENAMED
@@ -1,5 +1,5 @@
|
|
1
|
-
dv_flow/mgr/__init__.py,sha256=
|
2
|
-
dv_flow/mgr/__main__.py,sha256=
|
1
|
+
dv_flow/mgr/__init__.py,sha256=2iTpSe1M8g_u2UlAQFa3XFfqcw8gBOWdBvrstce1c5E,403
|
2
|
+
dv_flow/mgr/__main__.py,sha256=_qiAyACu_Ugo64EIQDWmC0v92nHeaZCxequXTKoCRyo,2030
|
3
3
|
dv_flow/mgr/eval_jq.py,sha256=Ue-qkyNW6uOu2Wy8u6nrTbPPY7ujaHd0-4iki0eV3Ec,294
|
4
4
|
dv_flow/mgr/expr_eval.py,sha256=Mp0TvrV6gZWcj1uYwLfPNI-ARwwdAfwntE5byLBfBuY,2276
|
5
5
|
dv_flow/mgr/expr_parser.py,sha256=FhBTkKKkJXubGHUzmcMWubPfPklYLGzVz1jK4-dYb44,5702
|
@@ -7,7 +7,7 @@ dv_flow/mgr/fileset.py,sha256=ewyjKLzuOecZg0vtabN_UkbzNEnk1sXgrH8uDyeKB60,1184
|
|
7
7
|
dv_flow/mgr/fragment_def.py,sha256=cyzp1XeWtNOaagScmeS-BPsoXj9j2LTBbKq5ZUioz8I,1641
|
8
8
|
dv_flow/mgr/out,sha256=d8GGBi3J43fhdLBlnsUbzBfRe0TD0QTP3nOTz54l2bI,200
|
9
9
|
dv_flow/mgr/package.py,sha256=878twhPD-E1pFlDNUtuyeFEgJ_Y89b560og4St-Iwrs,1679
|
10
|
-
dv_flow/mgr/package_def.py,sha256=
|
10
|
+
dv_flow/mgr/package_def.py,sha256=EaDPLljg6iewOuZwUgAF4lTkLH9fYAgigD2klXaKBRE,14779
|
11
11
|
dv_flow/mgr/package_import_spec.py,sha256=ah3r15v5Jdub2poc3sgi6Uar1L3oGoYsCPPNiOHV-a4,1760
|
12
12
|
dv_flow/mgr/param.py,sha256=3BY-ucig6JRw73FhjyJQL-vpd57qhAzixgZ8I5FoUpw,553
|
13
13
|
dv_flow/mgr/param_def.py,sha256=gLua-EQiY8V2CFX-2svLRIlrs8PEeGh4-EPtn4a2Mng,712
|
@@ -17,31 +17,31 @@ dv_flow/mgr/pkg_rgy.py,sha256=2R_EaeBDJn5qUq9DzSnLc37wUP36MWSv-p0LgUjJRAg,4471
|
|
17
17
|
dv_flow/mgr/task.py,sha256=kLQSvnVwj9ROIDtxq8lLu-4mJizTxOqvUeogmgN6QAA,5976
|
18
18
|
dv_flow/mgr/task_ctor.py,sha256=hlfl-UVvyjzLFN6D0Oel9eBs0xUQPqCX7gQ0uEHoL7o,1382
|
19
19
|
dv_flow/mgr/task_data.py,sha256=F0X-e0IHTh06Z0F67TWIUPKuJYf6JPzZyMPrDzOJvK0,11409
|
20
|
-
dv_flow/mgr/task_def.py,sha256=
|
20
|
+
dv_flow/mgr/task_def.py,sha256=T06dvQegPJunH8ekuN5aPxIVcaUWiv5qkfqbZnCacLk,1923
|
21
21
|
dv_flow/mgr/task_exec_data.py,sha256=aT__kmVmNxqnS_GbTRS1vrYgKiv8cH-HUSmRb6YYKsI,640
|
22
|
-
dv_flow/mgr/task_graph_builder.py,sha256=
|
22
|
+
dv_flow/mgr/task_graph_builder.py,sha256=fEqJalmDDDzayJbuyDWAcmumDGK3XgnZmcScoBY8HGg,7887
|
23
23
|
dv_flow/mgr/task_graph_runner.py,sha256=jUGI49QvxUCfQoKQDDk2psbeapIcCg72qNOW1JipHzM,2182
|
24
24
|
dv_flow/mgr/task_graph_runner_local.py,sha256=OrydPwtQ8E7hYWvSXx0h7lI3nfUNFyklULhsyMwz9dA,4687
|
25
25
|
dv_flow/mgr/task_impl_data.py,sha256=bFPijoKrh9x7fZN2DsvRJp0UHo-gGM0VjtDQISyfhFk,321
|
26
|
-
dv_flow/mgr/task_listener_log.py,sha256=
|
26
|
+
dv_flow/mgr/task_listener_log.py,sha256=u7hm8Q8ZVCIY25mNQEI3DIgSMJ_zJ5nbvqukGMXyido,934
|
27
27
|
dv_flow/mgr/task_memento.py,sha256=C7VTQpBhDEoYuDmE6YTM-6TLMLnqHp6Y0Vat1aTgtCs,1096
|
28
|
-
dv_flow/mgr/task_node.py,sha256=
|
29
|
-
dv_flow/mgr/task_output.py,sha256=
|
28
|
+
dv_flow/mgr/task_node.py,sha256=5R51VLuHDFnY3c5E8kLccxFRoshJRB1bDKJXIJr9EKc,10394
|
29
|
+
dv_flow/mgr/task_output.py,sha256=dkJhhNRFGFQSkVsw_bGirK0_0ghTxBYq1LjRMZCVWnA,245
|
30
30
|
dv_flow/mgr/task_params_ctor.py,sha256=aXgB8o9xFPjaEjGW_xYkEC0N0apzGzGUPDj7g2ZLvus,1112
|
31
31
|
dv_flow/mgr/task_runner.py,sha256=Ky10BWKy_NhvJp2nsbB0pyS8n1K0pKatBEmTdD1ZKOc,7071
|
32
32
|
dv_flow/mgr/type.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
33
|
dv_flow/mgr/type_def.py,sha256=KdhuNlfw-NKU-4VZFCnMPyj775yEB7cpr5tz73a9yuQ,259
|
34
34
|
dv_flow/mgr/util.py,sha256=06eVyURF4ga-s8C9Sd3ZSDebwO4QS0XXaB8xADVbWRc,1437
|
35
|
-
dv_flow/mgr/cmds/cmd_run.py,sha256=
|
35
|
+
dv_flow/mgr/cmds/cmd_run.py,sha256=r5j-T121oXYDyOYfrCZSjzeblp1awiAn17HkPtLaGg4,2372
|
36
36
|
dv_flow/mgr/share/flow.json,sha256=lNmZex9NXkYbyb2aZseQfUOkV9CMyfH0iLODEI7EPBw,5096
|
37
37
|
dv_flow/mgr/std/exec.py,sha256=ETx9xSxhdCD_iw6pcmhrafDCJ-41AneyEAPwQf3q-3w,452
|
38
38
|
dv_flow/mgr/std/fileset.py,sha256=abHgTxz25FD1ep5QXlCZKt4gCyfplJsjx6LyfQ11f_Q,2683
|
39
39
|
dv_flow/mgr/std/flow.dv,sha256=jlFOh3xVECOzHws7x6YvJ9eCIGHM5gsPeEnheiGOukY,1553
|
40
|
-
dv_flow/mgr/std/message.py,sha256=
|
40
|
+
dv_flow/mgr/std/message.py,sha256=T8Ye44784rD6CT2qIAP5SD7sKPdAlGMFimc4IaPCxxE,200
|
41
41
|
dv_flow/mgr/std/task_null.py,sha256=UKwUnqwFPBY8BO44ZAPcgehQB59kHZFa1qyZc1TwUqE,196
|
42
|
-
dv_flow_mgr-0.0.1.
|
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.
|
42
|
+
dv_flow_mgr-0.0.1.13689116055a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
43
|
+
dv_flow_mgr-0.0.1.13689116055a1.dist-info/METADATA,sha256=fuUi6tX_RwxMXl0XsApdKkyUlKyKOgYaouavIevi0w4,13276
|
44
|
+
dv_flow_mgr-0.0.1.13689116055a1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
45
|
+
dv_flow_mgr-0.0.1.13689116055a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
|
46
|
+
dv_flow_mgr-0.0.1.13689116055a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
|
47
|
+
dv_flow_mgr-0.0.1.13689116055a1.dist-info/RECORD,,
|
{dv_flow_mgr-0.0.1.13661289604a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/LICENSE
RENAMED
File without changes
|
{dv_flow_mgr-0.0.1.13661289604a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|
File without changes
|