dv-flow-mgr 0.0.1.13667970156a1__py3-none-any.whl → 0.0.1.13703952342a1__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/__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
- help="Enable debug",
30
- action="store_true")
31
- parser.add_argument("-v", "--verbose",
32
- help="Enable verbose output",
33
- action="store_true")
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.debug:
47
- logging.basicConfig(level=logging.DEBUG)
48
- elif args.verbose:
49
- logging.basicConfig(level=logging.INFO)
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
 
@@ -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 = TaskGraphRunnerLocal(rundir)
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
 
@@ -134,7 +134,8 @@ class PackageDef(BaseModel):
134
134
  ctor_t : TaskCtor = None
135
135
  base_params : BaseModel = None
136
136
  callable = None
137
- passthrough = False
137
+ passthrough = task.passthrough
138
+ consumes = task.consumes
138
139
  needs = [] if task.needs is None else task.needs.copy()
139
140
 
140
141
  if task.uses is not None:
@@ -142,6 +143,11 @@ class PackageDef(BaseModel):
142
143
  base_ctor_t = self.getTaskCtor(session, task.uses, tasks_m)
143
144
  base_params = base_ctor_t.mkTaskParams()
144
145
 
146
+ if base_ctor_t is None:
147
+ self._log.error("Failed to load task ctor %s" % task.uses)
148
+ else:
149
+ self._log.debug("No 'uses' specified")
150
+
145
151
  # Determine the implementation constructor first
146
152
  if task.pytask is not None:
147
153
  # Built-in impl
@@ -175,6 +181,7 @@ class PackageDef(BaseModel):
175
181
  srcdir=srcdir,
176
182
  paramT=paramT, # TODO: need to determine the parameter type
177
183
  passthrough=passthrough,
184
+ consumes=consumes,
178
185
  needs=needs, # TODO: need to determine the needs
179
186
  task=callable)
180
187
  elif base_ctor_t is not None:
@@ -184,6 +191,7 @@ class PackageDef(BaseModel):
184
191
  srcdir=srcdir,
185
192
  paramT=paramT, # TODO: need to determine the parameter type
186
193
  passthrough=passthrough,
194
+ consumes=consumes,
187
195
  needs=needs,
188
196
  uses=base_ctor_t)
189
197
  else:
@@ -193,6 +201,7 @@ class PackageDef(BaseModel):
193
201
  srcdir=srcdir,
194
202
  paramT=paramT,
195
203
  passthrough=passthrough,
204
+ consumes=consumes,
196
205
  needs=needs,
197
206
  task=TaskNull)
198
207
 
@@ -376,7 +385,7 @@ class PackageDef(BaseModel):
376
385
 
377
386
  with open(file, "r") as fp:
378
387
  doc = yaml.load(fp, Loader=yaml.FullLoader)
379
- PackageDef._log.debug("doc: %s" % str(doc), flush=True)
388
+ PackageDef._log.debug("doc: %s" % str(doc))
380
389
  if "fragment" in doc.keys():
381
390
  # Merge the package definition
382
391
  frag = FragmentDef(**(doc["fragment"]))
@@ -2,5 +2,5 @@
2
2
  from dv_flow.mgr import Task, TaskDataResult
3
3
 
4
4
  async def Message(runner, input) -> TaskDataResult:
5
- print("%s: %s" % (input.name, input.params.msg))
5
+ print("%s: %s" % (input.name, input.params.msg), flush=True)
6
6
  return TaskDataResult()
dv_flow/mgr/task_def.py CHANGED
@@ -42,6 +42,8 @@ class TaskDef(BaseModel):
42
42
  needs : List[Union[str,TaskSpec]] = dc.Field(default_factory=list, alias="needs")
43
43
  params: Dict[str,Union[str,ParamDef]] = dc.Field(default_factory=dict, alias="with")
44
44
  passthrough: bool = dc.Field(default=False)
45
+ consumes : List[Any] = dc.Field(default_factory=list)
46
+
45
47
  # out: List[TaskOutput] = dc.Field(default_factory=list)
46
48
 
47
49
  def copy(self) -> 'TaskDef':
@@ -179,14 +179,18 @@ class TaskGraphBuilder(object):
179
179
 
180
180
  return pkg
181
181
 
182
- def mkTaskNode(self, typename, name=None, srcdir=None, needs=None, **kwargs):
183
- ctor = self.getTaskCtor(typename)
184
- params = ctor.mkTaskParams(**kwargs)
185
- return ctor.mkTaskNode(
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(
186
188
  params=params,
187
189
  name=name,
188
190
  srcdir=srcdir,
189
191
  needs=needs)
192
+ self._logger.debug("<-- mkTaskNode: %s" % task_t)
193
+ return ret
190
194
 
191
195
  def getTaskCtor(self, spec : Union[str,'TaskSpec'], pkg : PackageDef = None) -> 'TaskCtor':
192
196
  from .task_def import TaskSpec
@@ -5,15 +5,21 @@ from rich.console import Console
5
5
  class TaskListenerLog(object):
6
6
  console : Console = dc.field(default_factory=Console)
7
7
  level : int = 0
8
+ quiet : bool = True
8
9
 
9
10
  def event(self, task : 'Task', reason : 'Reason'):
10
11
  if reason == 'enter':
11
12
  self.level += 1
12
- self.console.print("[green]>[%d][/green] Task %s" % (self.level, task.name))
13
+ if not self.quiet:
14
+ self.console.print("[green]>[%d][/green] Task %s" % (self.level, task.name))
13
15
  elif reason == 'leave':
14
16
  for m in task.result.markers:
15
17
  print(" %s" % m)
16
- self.console.print("[green]<[%d][/green] Task %s" % (self.level, task.name))
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))
17
23
  self.level -= 1
18
24
  else:
19
25
  self.console.print("[red]-[/red] Task %s" % task.name)
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
@@ -23,6 +24,7 @@ class TaskNode(object):
23
24
  # Runtime fields -- these get populated during execution
24
25
  changed : bool = False
25
26
  passthrough : bool = False
27
+ consumes : List[Any] = dc.field(default_factory=list)
26
28
  needs : List['TaskNode'] = dc.field(default_factory=list)
27
29
  rundir : str = dc.field(default=None)
28
30
  output : TaskDataOutput = dc.field(default=None)
@@ -38,19 +40,46 @@ class TaskNode(object):
38
40
  runner,
39
41
  rundir,
40
42
  memento : Any = None) -> 'TaskDataResult':
43
+ self._log.debug("--> do_run: %s" % self.name)
41
44
  changed = False
42
45
  for dep in self.needs:
43
46
  changed |= dep.changed
44
47
 
45
48
  # TODO: Form dep-map from inputs
46
- # TODO: Order param sets according to dep-map
47
- in_params = []
49
+
50
+ dep_m = {}
51
+ for need in self.needs:
52
+ self._log.debug("dep %s dep_m: %s" % (need.name, str(dep_m)))
53
+ for subdep in need.output.dep_m.keys():
54
+ if subdep not in dep_m.keys():
55
+ dep_m[subdep] = []
56
+ dep_m[subdep].extend(need.output.dep_m[subdep])
57
+
58
+ self._log.debug("input dep_m: %s" % str(dep_m))
59
+ sorted = toposort.toposort(dep_m)
60
+
61
+ in_params_m = {}
48
62
  for need in self.needs:
49
- in_params.extend(need.output.output)
63
+ for p in need.output.output:
64
+ if p.src not in in_params_m.keys():
65
+ in_params_m[p.src] = []
66
+ in_params_m[p.src].append(p)
67
+
68
+ # in_params holds parameter sets ordered by dependency
69
+ in_params = []
70
+ for sorted_s in sorted:
71
+ self._log.debug("sorted_s: %s" % str(sorted_s))
72
+ for dep in sorted_s:
73
+ if dep in in_params_m.keys():
74
+ self._log.debug("(%s) Extend with: %s" % (dep, str(in_params_m[dep])))
75
+ in_params.extend(in_params_m[dep])
76
+
77
+ self._log.debug("in_params[1]: %s" % ",".join(p.src for p in in_params))
50
78
 
51
79
  # Create an evaluator for substituting param values
52
80
  eval = ParamRefEval()
53
81
 
82
+ self._log.debug("in_params[2]: %s" % ",".join(p.src for p in in_params))
54
83
  eval.setVar("in", in_params)
55
84
 
56
85
  for name,field in self.params.model_fields.items():
@@ -58,6 +87,7 @@ class TaskNode(object):
58
87
  if type(value) == str:
59
88
  if value.find("${{") != -1:
60
89
  new_val = eval.eval(value)
90
+ self._log.debug("Param %s: Evaluate expression \"%s\" => \"%s\"" % (name, value, new_val))
61
91
  setattr(self.params, name, new_val)
62
92
  elif isinstance(value, list):
63
93
  for i,elem in enumerate(value):
@@ -75,20 +105,63 @@ class TaskNode(object):
75
105
  params=self.params,
76
106
  memento=memento)
77
107
 
78
- # TODO: notify of task start
108
+ self._log.debug("--> Call task method %s" % str(self.task))
79
109
  self.result : TaskDataResult = await self.task(self, input)
80
- # TODO: notify of task complete
110
+ self._log.debug("<-- Call task method %s" % str(self.task))
81
111
 
82
- # TODO: form a dep map from the outgoing param sets
83
- dep_m = {}
112
+ output=self.result.output.copy()
113
+ for out in output:
114
+ out.src = self.name
115
+
116
+ self._log.debug("output[1]: %s" % str(output))
117
+
118
+ if self.passthrough:
119
+ self._log.debug("passthrough: %s" % self.name)
120
+ # Add an entry for ourselves
121
+ dep_m[self.name] = list(need.name for need in self.needs)
122
+
123
+ if self.consumes is None and len(self.consumes):
124
+ self._log.debug("Propagating all input parameters to output")
125
+ for need in self.needs:
126
+ output.extend(need.output.output)
127
+ else:
128
+ # Filter out parameter sets that were consumed
129
+ self._log.debug("Propagating non-consumed input parameters to output")
130
+ for need in self.needs:
131
+ for out in need.output.output:
132
+ consumed = False
133
+ for c in self.consumes:
134
+ match = False
135
+ for k,v in c.items():
136
+ if hasattr(out, k) and getattr(out, k) == v:
137
+ match = True
138
+ break
139
+ if match:
140
+ consumed = True
141
+ break
142
+
143
+ if not consumed:
144
+ self._log.debug("Propagating type %s from %s" % (
145
+ getattr(out, "type", "<unknown>"),
146
+ getattr(out, "src", "<unknown>")))
147
+ output.append(out)
148
+ else:
149
+ # empty dependency map
150
+ dep_m = {
151
+ self.name : []
152
+ }
153
+
154
+ self._log.debug("output dep_m: %s" % str(dep_m))
155
+ self._log.debug("output[2]: %s" % str(output))
84
156
 
85
157
  # Store the result
86
158
  self.output = TaskDataOutput(
87
159
  changed=self.result.changed,
88
160
  dep_m=dep_m,
89
- output=self.result.output.copy())
161
+ output=output)
90
162
 
91
163
  # TODO:
164
+ self._log.debug("<-- do_run: %s" % self.name)
92
165
 
93
166
  return self.result
94
167
 
@@ -107,6 +180,7 @@ class TaskNodeCtor(object):
107
180
  srcdir : str
108
181
  paramT : Any
109
182
  passthrough : bool
183
+ consumes : List[Any]
110
184
 
111
185
  def __call__(self,
112
186
  name=None,
@@ -114,6 +188,7 @@ class TaskNodeCtor(object):
114
188
  params=None,
115
189
  needs=None,
116
190
  passthrough=None,
191
+ consumes=None,
117
192
  **kwargs):
118
193
  """Convenience method for direct creation of tasks"""
119
194
  if params is None:
@@ -128,6 +203,16 @@ class TaskNodeCtor(object):
128
203
  node.passthrough = passthrough
129
204
  else:
130
205
  node.passthrough = self.passthrough
206
+ if consumes is not None:
207
+ if node.consumes is None:
208
+ node.consumes = consumes
209
+ else:
210
+ node.consumes.extend(consumes)
211
+ else:
212
+ if node.consumes is None:
213
+ node.consumes = self.consumes
214
+ else:
215
+ node.consumes.extend(consumes)
131
216
 
132
217
  return node
133
218
 
@@ -191,6 +276,7 @@ class TaskNodeCtorProxy(TaskNodeCtorDefBase):
191
276
  srcdir = self.srcdir
192
277
  node = self.uses.mkTaskNode(params=params, srcdir=srcdir, name=name, needs=needs)
193
278
  node.passthrough = self.passthrough
279
+ node.consumes = self.consumes
194
280
  return node
195
281
 
196
282
  @dc.dataclass
@@ -203,6 +289,7 @@ class TaskNodeCtorTask(TaskNodeCtorDefBase):
203
289
 
204
290
  node = TaskNode(name, srcdir, params, self.task, needs=needs)
205
291
  node.passthrough = self.passthrough
292
+ node.consumes = self.consumes
206
293
  node.task = self.task
207
294
 
208
295
  return node
@@ -216,6 +303,7 @@ class TaskNodeCtorWrapper(TaskNodeCtor):
216
303
  def mkTaskNode(self, params, srcdir=None, name=None, needs=None) -> TaskNode:
217
304
  node = TaskNode(name, srcdir, params, self.T, needs=needs)
218
305
  node.passthrough = self.passthrough
306
+ node.consumes = self.consumes
219
307
  return node
220
308
 
221
309
  def mkTaskParams(self, params : Dict = None) -> Any:
@@ -245,7 +333,7 @@ class TaskNodeCtorWrapper(TaskNodeCtor):
245
333
  setattr(obj, key, value)
246
334
  return obj
247
335
 
248
- def task(paramT,passthrough=False):
336
+ def task(paramT,passthrough=False,consumes=None):
249
337
  """Decorator to wrap a task method as a TaskNodeCtor"""
250
338
  def wrapper(T):
251
339
  task_mname = T.__module__
@@ -255,6 +343,7 @@ def task(paramT,passthrough=False):
255
343
  srcdir=os.path.dirname(os.path.abspath(task_module.__file__)),
256
344
  paramT=paramT,
257
345
  passthrough=passthrough,
346
+ consumes=consumes,
258
347
  T=T)
259
348
  return ctor
260
349
  return wrapper
@@ -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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.13667970156a1
3
+ Version: 0.0.1.13703952342a1
4
4
  Summary: DV Flow Manager is a build system for silicon design
5
5
  Author-email: Matthew Ballance <matt.ballance@gmail.com>
6
6
  License: Apache License
@@ -206,7 +206,9 @@ License: Apache License
206
206
  limitations under the License.
207
207
 
208
208
  License-File: LICENSE
209
+ Requires-Dist: jq
209
210
  Requires-Dist: pydantic
210
211
  Requires-Dist: pyyaml
212
+ Requires-Dist: rich
211
213
  Requires-Dist: toposort
212
214
  Requires-Dist: svdep
@@ -1,5 +1,5 @@
1
1
  dv_flow/mgr/__init__.py,sha256=2iTpSe1M8g_u2UlAQFa3XFfqcw8gBOWdBvrstce1c5E,403
2
- dv_flow/mgr/__main__.py,sha256=uik6gDAvtZNG0yyDKYc4FTl6R1QHAR543jNG2lCAa6E,1771
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=ek60ERvWFOVlL71_Fgk1-RWQMrkxNt4USrfZXwLS2d0,14603
10
+ dv_flow/mgr/package_def.py,sha256=q8lT8MlDF7nDYTBqtPVQSXdGeN06kceZ3qBH7WhP0Bs,14917
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=T06dvQegPJunH8ekuN5aPxIVcaUWiv5qkfqbZnCacLk,1923
20
+ dv_flow/mgr/task_def.py,sha256=t5_oDTngtEPRdipQnuJ2ofJrpva1kTecHl4w4mI4GXE,1982
21
21
  dv_flow/mgr/task_exec_data.py,sha256=aT__kmVmNxqnS_GbTRS1vrYgKiv8cH-HUSmRb6YYKsI,640
22
- dv_flow/mgr/task_graph_builder.py,sha256=okqJDDu6qyubXQoyI-r0jUTd53Tq7ISSYCymZh_Cppw,7708
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=5N-WG6ii-R6XPbgPR6zcfKjABOoGYab6I_04Lfwux5Q,705
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=BxkjUJU7WdIhyBbP7FMBFY6EgHenhnnYGGdGW3Xukck,8450
29
- dv_flow/mgr/task_output.py,sha256=l-W-FvVo6YDah1RQS-I9N0KUtB3vp-kl7lxIdmNz0l4,178
28
+ dv_flow/mgr/task_node.py,sha256=leuQC3IPyZQsJKQwKBTQgvstXxH7Fk10eDINoaK7718,12212
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=eths8kT7mBmpZqwOuMtpKAaux4rg-f7hPBxxTHbpKT4,2903
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=CWrBKImbXKe2d7hJ223U3Ifuxo54zLpFPJviE8BUJvk,188
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.13667970156a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
43
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/METADATA,sha256=KkpZBeRE5Av-3wHTQewdBoyjAtM3voZTDxeXsjrsjhs,13276
44
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
45
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
46
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
47
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/RECORD,,
42
+ dv_flow_mgr-0.0.1.13703952342a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
43
+ dv_flow_mgr-0.0.1.13703952342a1.dist-info/METADATA,sha256=N1CO707jpDo9FEXJ2Xujl7IGNo4Bt8LRW1NrpJnK47k,13314
44
+ dv_flow_mgr-0.0.1.13703952342a1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
45
+ dv_flow_mgr-0.0.1.13703952342a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
46
+ dv_flow_mgr-0.0.1.13703952342a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
47
+ dv_flow_mgr-0.0.1.13703952342a1.dist-info/RECORD,,