dv-flow-mgr 0.0.1.13667970156a1__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/__main__.py +15 -10
- dv_flow/mgr/cmds/cmd_run.py +5 -24
- dv_flow/mgr/package_def.py +7 -2
- dv_flow/mgr/std/message.py +1 -1
- dv_flow/mgr/task_graph_builder.py +8 -4
- dv_flow/mgr/task_listener_log.py +8 -2
- dv_flow/mgr/task_node.py +57 -8
- dv_flow/mgr/task_output.py +3 -2
- {dv_flow_mgr-0.0.1.13667970156a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/METADATA +1 -1
- {dv_flow_mgr-0.0.1.13667970156a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/RECORD +14 -14
- {dv_flow_mgr-0.0.1.13667970156a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/LICENSE +0 -0
- {dv_flow_mgr-0.0.1.13667970156a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/WHEEL +0 -0
- {dv_flow_mgr-0.0.1.13667970156a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/entry_points.txt +0 -0
- {dv_flow_mgr-0.0.1.13667970156a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/top_level.txt +0 -0
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
@@ -134,7 +134,7 @@ class PackageDef(BaseModel):
|
|
134
134
|
ctor_t : TaskCtor = None
|
135
135
|
base_params : BaseModel = None
|
136
136
|
callable = None
|
137
|
-
passthrough =
|
137
|
+
passthrough = task.passthrough
|
138
138
|
needs = [] if task.needs is None else task.needs.copy()
|
139
139
|
|
140
140
|
if task.uses is not None:
|
@@ -142,6 +142,11 @@ class PackageDef(BaseModel):
|
|
142
142
|
base_ctor_t = self.getTaskCtor(session, task.uses, tasks_m)
|
143
143
|
base_params = base_ctor_t.mkTaskParams()
|
144
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
|
+
|
145
150
|
# Determine the implementation constructor first
|
146
151
|
if task.pytask is not None:
|
147
152
|
# Built-in impl
|
@@ -376,7 +381,7 @@ class PackageDef(BaseModel):
|
|
376
381
|
|
377
382
|
with open(file, "r") as fp:
|
378
383
|
doc = yaml.load(fp, Loader=yaml.FullLoader)
|
379
|
-
PackageDef._log.debug("doc: %s" % str(doc)
|
384
|
+
PackageDef._log.debug("doc: %s" % str(doc))
|
380
385
|
if "fragment" in doc.keys():
|
381
386
|
# Merge the package definition
|
382
387
|
frag = FragmentDef(**(doc["fragment"]))
|
dv_flow/mgr/std/message.py
CHANGED
@@ -179,14 +179,18 @@ class TaskGraphBuilder(object):
|
|
179
179
|
|
180
180
|
return pkg
|
181
181
|
|
182
|
-
def mkTaskNode(self,
|
183
|
-
|
184
|
-
|
185
|
-
|
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
|
dv_flow/mgr/task_listener_log.py
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
@@ -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
|
|
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.13667970156a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/RECORD
RENAMED
@@ -1,5 +1,5 @@
|
|
1
1
|
dv_flow/mgr/__init__.py,sha256=2iTpSe1M8g_u2UlAQFa3XFfqcw8gBOWdBvrstce1c5E,403
|
2
|
-
dv_flow/mgr/__main__.py,sha256=
|
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
|
@@ -19,29 +19,29 @@ dv_flow/mgr/task_ctor.py,sha256=hlfl-UVvyjzLFN6D0Oel9eBs0xUQPqCX7gQ0uEHoL7o,1382
|
|
19
19
|
dv_flow/mgr/task_data.py,sha256=F0X-e0IHTh06Z0F67TWIUPKuJYf6JPzZyMPrDzOJvK0,11409
|
20
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.13667970156a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/LICENSE
RENAMED
File without changes
|
{dv_flow_mgr-0.0.1.13667970156a1.dist-info → dv_flow_mgr-0.0.1.13689116055a1.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|
File without changes
|