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 CHANGED
@@ -9,4 +9,5 @@ from .task_graph_runner_local import TaskGraphRunnerLocal
9
9
  from .task_graph_builder import TaskGraphBuilder
10
10
  from .task_node import task
11
11
  from .task_runner import TaskSetRunner
12
+ from .task_listener_log import TaskListenerLog
12
13
 
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
 
@@ -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 = False
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=TaskNullParams,
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
- pkg = PackageDef(**(doc["package"]))
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), flush=True)
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"]))
@@ -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
@@ -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]
@@ -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
- print("> Task %s" % task.name, flush=True)
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
- print("< Task %s" % task.name, flush=True)
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, flush=True)
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
- # TODO: Order param sets according to dep-map
47
- in_params = []
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
- in_params.extend(need.output.output)
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
- # TODO: notify of task start
107
+ self._log.debug("--> Call task method %s" % str(self.task))
79
108
  self.result : TaskDataResult = await self.task(self, input)
80
- # TODO: notify of task complete
109
+ self._log.debug("<-- Call task method %s" % str(self.task))
81
110
 
82
- # TODO: form a dep map from the outgoing param sets
83
- dep_m = {}
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=self.result.output.copy())
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)
@@ -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.13661289604a1
3
+ Version: 0.0.1.13689116055a1
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
@@ -1,5 +1,5 @@
1
- dv_flow/mgr/__init__.py,sha256=3t0drSGSlmRfZyoXpj2PkBBUMScaRThyjwxxm9jwAQY,356
2
- dv_flow/mgr/__main__.py,sha256=uik6gDAvtZNG0yyDKYc4FTl6R1QHAR543jNG2lCAa6E,1771
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=EdKwyxqvWT8xQmALGa6BbNv0PMbDLZTr3A27L9coIzc,13761
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=PORXrUBoynoj_oYAVISR5NW53OZevZ6hL4T7TutkkHo,1879
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=sswBPUZg71dFT8kaB0towbWIadhNdbTy5gLgvC2uiVA,7276
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=B9-LEgSF2QwcUREBoUjEsS0rRYg1_ilFHBUKlNeT5YA,444
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=iQKiDTC8Oz8tQwLzJF4NpsREg8JPXI-rju5tG7P6dfw,8448
29
- dv_flow/mgr/task_output.py,sha256=l-W-FvVo6YDah1RQS-I9N0KUtB3vp-kl7lxIdmNz0l4,178
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=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.13661289604a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
43
- dv_flow_mgr-0.0.1.13661289604a1.dist-info/METADATA,sha256=V3jd8ZAWmysqtJOp69hwulv43S9RGefshb3nt4NE6M4,13276
44
- dv_flow_mgr-0.0.1.13661289604a1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
45
- dv_flow_mgr-0.0.1.13661289604a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
46
- dv_flow_mgr-0.0.1.13661289604a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
47
- dv_flow_mgr-0.0.1.13661289604a1.dist-info/RECORD,,
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,,