dv-flow-mgr 0.0.1.13979842530a1__py3-none-any.whl → 0.0.1.14013608039a1__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/cmds/cmd_run.py +2 -2
- dv_flow/mgr/fragment_def.py +1 -1
- dv_flow/mgr/package_def.py +41 -23
- dv_flow/mgr/param_def.py +8 -3
- dv_flow/mgr/util/__init__.py +3 -0
- dv_flow/mgr/util/__main__.py +36 -0
- dv_flow/mgr/util/cmds/__init__.py +0 -0
- dv_flow/mgr/util/cmds/cmd_schema.py +63 -0
- dv_flow/mgr/{util.py → util/util.py} +1 -1
- {dv_flow_mgr-0.0.1.13979842530a1.dist-info → dv_flow_mgr-0.0.1.14013608039a1.dist-info}/METADATA +1 -1
- {dv_flow_mgr-0.0.1.13979842530a1.dist-info → dv_flow_mgr-0.0.1.14013608039a1.dist-info}/RECORD +15 -11
- {dv_flow_mgr-0.0.1.13979842530a1.dist-info → dv_flow_mgr-0.0.1.14013608039a1.dist-info}/WHEEL +0 -0
- {dv_flow_mgr-0.0.1.13979842530a1.dist-info → dv_flow_mgr-0.0.1.14013608039a1.dist-info}/entry_points.txt +0 -0
- {dv_flow_mgr-0.0.1.13979842530a1.dist-info → dv_flow_mgr-0.0.1.14013608039a1.dist-info}/licenses/LICENSE +0 -0
- {dv_flow_mgr-0.0.1.13979842530a1.dist-info → dv_flow_mgr-0.0.1.14013608039a1.dist-info}/top_level.txt +0 -0
dv_flow/mgr/cmds/cmd_run.py
CHANGED
@@ -50,7 +50,7 @@ class CmdRun(object):
|
|
50
50
|
tasks = []
|
51
51
|
for task in pkg.tasks:
|
52
52
|
tasks.append(task)
|
53
|
-
for frag in pkg.
|
53
|
+
for frag in pkg._fragment_l:
|
54
54
|
for task in frag.tasks:
|
55
55
|
tasks.append(task)
|
56
56
|
tasks.sort(key=lambda x: x.name)
|
@@ -75,7 +75,7 @@ class CmdRun(object):
|
|
75
75
|
# Maybe separate into a task-graph builder and a task-graph runner
|
76
76
|
|
77
77
|
# TODO: allow user to specify run root -- maybe relative to some fixed directory?
|
78
|
-
rundir = os.path.join(pkg.
|
78
|
+
rundir = os.path.join(pkg._basedir, "rundir")
|
79
79
|
|
80
80
|
builder = TaskGraphBuilder(root_pkg=pkg, rundir=rundir)
|
81
81
|
runner = TaskSetRunner(rundir)
|
dv_flow/mgr/fragment_def.py
CHANGED
@@ -34,7 +34,7 @@ class FragmentDef(BaseModel):
|
|
34
34
|
fragments: List[str] = dc.Field(default_factory=list)
|
35
35
|
types : List[TypeDef] = dc.Field(default_factory=list)
|
36
36
|
|
37
|
-
|
37
|
+
_basedir : str = None
|
38
38
|
|
39
39
|
def getTask(self, name : str) -> 'TaskDef':
|
40
40
|
for t in self.tasks:
|
dv_flow/mgr/package_def.py
CHANGED
@@ -63,15 +63,33 @@ class PackageDef(BaseModel):
|
|
63
63
|
default_factory=list, alias="with",
|
64
64
|
description="List of package parameters to set")
|
65
65
|
|
66
|
-
|
67
|
-
|
66
|
+
_fragment_l : List['FragmentDef'] = []
|
67
|
+
_subpkg_m : Dict[str,'PackageDef'] = {}
|
68
68
|
|
69
69
|
# import_m : Dict['PackageSpec','Package'] = dc.Field(default_factory=dict)
|
70
70
|
|
71
|
-
|
71
|
+
_basedir : str = None
|
72
72
|
_log : ClassVar = logging.getLogger("PackageDef")
|
73
73
|
|
74
|
+
@property
|
75
|
+
def fragment_l(self):
|
76
|
+
return self._fragment_l
|
77
|
+
|
78
|
+
@property
|
79
|
+
def subpkg_m(self):
|
80
|
+
return self._subpkg_m
|
81
|
+
|
82
|
+
@property
|
83
|
+
def basedir(self):
|
84
|
+
return self._basedir
|
85
|
+
|
86
|
+
@basedir.setter
|
87
|
+
def basedir(self, v):
|
88
|
+
self._basedir = v
|
89
|
+
|
74
90
|
def __post_init__(self):
|
91
|
+
self._fragment_l = []
|
92
|
+
self._subpkg_m = {}
|
75
93
|
for t in self.tasks:
|
76
94
|
t.fullname = self.name + "." + t.name
|
77
95
|
|
@@ -91,13 +109,13 @@ class PackageDef(BaseModel):
|
|
91
109
|
for task in self.tasks:
|
92
110
|
if task.name in tasks_m.keys():
|
93
111
|
raise Exception("Duplicate task %s" % task.name)
|
94
|
-
tasks_m[task.name] = (task, self.
|
112
|
+
tasks_m[task.name] = (task, self._basedir, ) # We'll add a TaskCtor later
|
95
113
|
|
96
|
-
for frag in self.
|
114
|
+
for frag in self._fragment_l:
|
97
115
|
for task in frag.tasks:
|
98
116
|
if task.name in tasks_m.keys():
|
99
117
|
raise Exception("Duplicate task %s" % task.name)
|
100
|
-
tasks_m[task.name] = (task, frag.
|
118
|
+
tasks_m[task.name] = (task, frag._basedir, ) # We'll add a TaskCtor later
|
101
119
|
|
102
120
|
# Now we have a unified map of the tasks declared in this package
|
103
121
|
for name in list(tasks_m.keys()):
|
@@ -179,14 +197,14 @@ class PackageDef(BaseModel):
|
|
179
197
|
|
180
198
|
try:
|
181
199
|
if modname not in sys.modules:
|
182
|
-
if self.
|
183
|
-
sys.path.append(self.
|
200
|
+
if self._basedir not in sys.path:
|
201
|
+
sys.path.append(self._basedir)
|
184
202
|
mod = importlib.import_module(modname)
|
185
203
|
else:
|
186
204
|
mod = sys.modules[modname]
|
187
205
|
except ModuleNotFoundError as e:
|
188
|
-
raise Exception("Failed to import module %s (
|
189
|
-
modname, self.
|
206
|
+
raise Exception("Failed to import module %s (_basedir=%s): %s" % (
|
207
|
+
modname, self._basedir, str(e)))
|
190
208
|
|
191
209
|
if not hasattr(mod, clsname):
|
192
210
|
raise Exception("Method %s not found in module %s" % (clsname, modname))
|
@@ -326,10 +344,10 @@ class PackageDef(BaseModel):
|
|
326
344
|
except Exception as e:
|
327
345
|
PackageDef._log.error("Failed to load package from %s" % root)
|
328
346
|
raise e
|
329
|
-
pkg.
|
347
|
+
pkg._basedir = os.path.dirname(root)
|
330
348
|
|
331
349
|
# for t in pkg.tasks:
|
332
|
-
# t.
|
350
|
+
# t._basedir = os.path.dirname(root)
|
333
351
|
|
334
352
|
if exp_pkg_name is not None:
|
335
353
|
if exp_pkg_name != pkg.name:
|
@@ -347,7 +365,7 @@ class PackageDef(BaseModel):
|
|
347
365
|
PackageDef._loadFragmentSpec(pkg, spec, file_s)
|
348
366
|
|
349
367
|
if len(pkg.imports) > 0:
|
350
|
-
cls._log.info("Loading imported packages (
|
368
|
+
cls._log.info("Loading imported packages (_basedir=%s)" % pkg._basedir)
|
351
369
|
for imp in pkg.imports:
|
352
370
|
if type(imp) == str:
|
353
371
|
imp_path = imp
|
@@ -359,8 +377,8 @@ class PackageDef(BaseModel):
|
|
359
377
|
cls._log.info("Loading imported package %s" % imp_path)
|
360
378
|
|
361
379
|
if not os.path.isabs(imp_path):
|
362
|
-
cls._log.debug("
|
363
|
-
imp_path = os.path.join(pkg.
|
380
|
+
cls._log.debug("_basedir: %s ; imp_path: %s" % (pkg._basedir, imp_path))
|
381
|
+
imp_path = os.path.join(pkg._basedir, imp_path)
|
364
382
|
|
365
383
|
# Search down the tree looking for a flow.dv file
|
366
384
|
if os.path.isdir(imp_path):
|
@@ -389,7 +407,7 @@ class PackageDef(BaseModel):
|
|
389
407
|
|
390
408
|
sub_pkg = PackageDef.load(imp_path)
|
391
409
|
cls._log.info("Loaded imported package %s" % sub_pkg.name)
|
392
|
-
pkg.
|
410
|
+
pkg._subpkg_m[sub_pkg.name] = sub_pkg
|
393
411
|
|
394
412
|
file_s.pop()
|
395
413
|
|
@@ -407,10 +425,10 @@ class PackageDef(BaseModel):
|
|
407
425
|
if "package" not in doc.keys():
|
408
426
|
raise Exception("Missing 'package' key in %s" % root)
|
409
427
|
pkg = PackageDef(**(doc["package"]))
|
410
|
-
pkg.
|
428
|
+
pkg._basedir = None
|
411
429
|
|
412
430
|
# for t in pkg.tasks:
|
413
|
-
# t.
|
431
|
+
# t._basedir = os.path.dirname(root)
|
414
432
|
|
415
433
|
if exp_pkg_name is not None:
|
416
434
|
if exp_pkg_name != pkg.name:
|
@@ -427,10 +445,10 @@ class PackageDef(BaseModel):
|
|
427
445
|
# - File path
|
428
446
|
# - Directory path
|
429
447
|
|
430
|
-
if os.path.isfile(os.path.join(pkg.
|
448
|
+
if os.path.isfile(os.path.join(pkg._basedir, spec)):
|
431
449
|
PackageDef._loadFragmentFile(pkg, spec, file_s)
|
432
|
-
elif os.path.isdir(os.path.join(pkg.
|
433
|
-
PackageDef._loadFragmentDir(pkg, os.path.join(pkg.
|
450
|
+
elif os.path.isdir(os.path.join(pkg._basedir, spec)):
|
451
|
+
PackageDef._loadFragmentDir(pkg, os.path.join(pkg._basedir, spec), file_s)
|
434
452
|
else:
|
435
453
|
raise Exception("Fragment spec %s not found" % spec)
|
436
454
|
|
@@ -454,7 +472,7 @@ class PackageDef(BaseModel):
|
|
454
472
|
if "fragment" in doc.keys():
|
455
473
|
# Merge the package definition
|
456
474
|
frag = FragmentDef(**(doc["fragment"]))
|
457
|
-
frag.
|
458
|
-
pkg.
|
475
|
+
frag._basedir = os.path.dirname(file)
|
476
|
+
pkg._fragment_l.append(frag)
|
459
477
|
else:
|
460
478
|
print("Warning: file %s is not a fragment" % file)
|
dv_flow/mgr/param_def.py
CHANGED
@@ -23,15 +23,20 @@ from typing import Any, List, Union
|
|
23
23
|
from pydantic import BaseModel, Field
|
24
24
|
|
25
25
|
class ListType(BaseModel):
|
26
|
-
item : Union[str, 'ComplexType']
|
26
|
+
# item : Union[str, 'ComplexType']
|
27
|
+
item : Union[str, Any]
|
27
28
|
|
28
29
|
class MapType(BaseModel):
|
29
|
-
key : Union[str, 'ComplexType']
|
30
|
-
item : Union[str, 'ComplexType']
|
30
|
+
# key : Union[str, 'ComplexType']
|
31
|
+
# item : Union[str, 'ComplexType']
|
32
|
+
key : Union[str, Any]
|
33
|
+
item : Union[str, Any]
|
31
34
|
|
32
35
|
class ComplexType(BaseModel):
|
33
36
|
list : Union[ListType, None] = None
|
34
37
|
map : Union[MapType, None] = None
|
38
|
+
# list : Union[Any, None] = None
|
39
|
+
# map : Union[Any, None] = None
|
35
40
|
|
36
41
|
class ParamDef(BaseModel):
|
37
42
|
doc : str = None
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import argparse
|
2
|
+
import logging
|
3
|
+
from .cmds.cmd_schema import CmdSchema
|
4
|
+
|
5
|
+
def get_parser():
|
6
|
+
parser = argparse.ArgumentParser(description="dv-flow-mgr.util")
|
7
|
+
parser.add_argument("--log-level",
|
8
|
+
help="Configures debug level [INFO, DEBUG]",
|
9
|
+
choices=("NONE", "INFO", "DEBUG"))
|
10
|
+
|
11
|
+
subparsers = parser.add_subparsers(required=True)
|
12
|
+
|
13
|
+
schema = subparsers.add_parser('schema', help='Write schema')
|
14
|
+
schema.add_argument("-o", "--output",
|
15
|
+
help="Destination file",
|
16
|
+
default="-")
|
17
|
+
schema.set_defaults(f=CmdSchema())
|
18
|
+
|
19
|
+
return parser
|
20
|
+
|
21
|
+
|
22
|
+
def main():
|
23
|
+
parser = get_parser()
|
24
|
+
args = parser.parse_args()
|
25
|
+
|
26
|
+
if args.log_level is not None and args.log_level != "NONE":
|
27
|
+
opt_m = {
|
28
|
+
"INFO": logging.INFO,
|
29
|
+
"DEBUG": logging.DEBUG
|
30
|
+
}
|
31
|
+
logging.basicConfig(level=opt_m[args.log_level])
|
32
|
+
|
33
|
+
args.f(args)
|
34
|
+
|
35
|
+
if __name__ == "__main__":
|
36
|
+
main()
|
File without changes
|
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
import json
|
3
|
+
import sys
|
4
|
+
from pydantic import BaseModel
|
5
|
+
import pydantic.dataclasses as pdc
|
6
|
+
from typing import Union
|
7
|
+
from ...fragment_def import FragmentDef
|
8
|
+
from ...package_def import PackageDef
|
9
|
+
|
10
|
+
class DvFlowSchema(BaseModel):
|
11
|
+
root : Union[PackageDef,FragmentDef] = pdc.Field(default=None)
|
12
|
+
|
13
|
+
class CmdSchema(object):
|
14
|
+
|
15
|
+
def __call__(self, args):
|
16
|
+
if args.output == "-":
|
17
|
+
fp = sys.stdout
|
18
|
+
else:
|
19
|
+
fp = open(args.output, "w")
|
20
|
+
|
21
|
+
root_s = DvFlowSchema.model_json_schema(
|
22
|
+
ref_template="#/defs/{model}"
|
23
|
+
)
|
24
|
+
pkg_s = PackageDef.model_json_schema(
|
25
|
+
ref_template="#/defs/{model}"
|
26
|
+
)
|
27
|
+
frag_s = FragmentDef.model_json_schema(
|
28
|
+
ref_template="#/defs/{model}"
|
29
|
+
)
|
30
|
+
|
31
|
+
defs = {}
|
32
|
+
print("root_s keys: %s" % " ".join(root_s.keys()))
|
33
|
+
print("root_s defs: %s" % " ".join(root_s["$defs"].keys()))
|
34
|
+
defs.update(root_s["$defs"])
|
35
|
+
# defs.update(pkg_s["$defs"])
|
36
|
+
# defs.update(frag_s["$defs"])
|
37
|
+
|
38
|
+
for td in defs.keys():
|
39
|
+
defs[td]["$$target"] = "#/defs/%s" % td
|
40
|
+
|
41
|
+
root = {
|
42
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
43
|
+
"$id": "https://dv-flow.github.io/flow.dv.schema.json",
|
44
|
+
"title": "DV Flow-specification schema",
|
45
|
+
"description": "Flow-specification schema",
|
46
|
+
"type": "object",
|
47
|
+
"properties": {
|
48
|
+
"package": {
|
49
|
+
"$ref": "#/defs/PackageDef",
|
50
|
+
"title": "Package Definition",
|
51
|
+
"description": "Package Definition"
|
52
|
+
},
|
53
|
+
"fragment": {
|
54
|
+
"$ref": "#/defs/FragmentDef"
|
55
|
+
}
|
56
|
+
},
|
57
|
+
"defs": defs,
|
58
|
+
}
|
59
|
+
|
60
|
+
fp.write(json.dumps(root, indent=2))
|
61
|
+
|
62
|
+
if fp != sys.stdout:
|
63
|
+
fp.close()
|
@@ -21,7 +21,7 @@
|
|
21
21
|
#****************************************************************************
|
22
22
|
import os
|
23
23
|
import yaml
|
24
|
-
from
|
24
|
+
from ..package_def import PackageDef
|
25
25
|
|
26
26
|
def loadProjPkgDef(path):
|
27
27
|
"""Locates the project's flow spec and returns the PackageDef"""
|
{dv_flow_mgr-0.0.1.13979842530a1.dist-info → dv_flow_mgr-0.0.1.14013608039a1.dist-info}/RECORD
RENAMED
@@ -4,13 +4,13 @@ dv_flow/mgr/eval_jq.py,sha256=bRsHtaN51qIOiZK1VJV52W0-vj5VH0nQ7XIFebZi5kI,1129
|
|
4
4
|
dv_flow/mgr/expr_eval.py,sha256=N_8hRIgzJK9JVqhRt8F9rc4S7AAdKHMMltafqk6KhJs,3113
|
5
5
|
dv_flow/mgr/expr_parser.py,sha256=P6u2FdSXeZbdamC3zpEnYKLcK2RULQJfSoev2Ol75fE,6543
|
6
6
|
dv_flow/mgr/fileset.py,sha256=cfKem8w5Xw4AUQkC0gyCXof2OlnoJ1t06Iw7IvMyihs,1245
|
7
|
-
dv_flow/mgr/fragment_def.py,sha256=
|
7
|
+
dv_flow/mgr/fragment_def.py,sha256=AHx3ITbiNbGCzlDk5FM8Iimm0GJnWXDDRAoRC1b41jM,1647
|
8
8
|
dv_flow/mgr/out,sha256=d8GGBi3J43fhdLBlnsUbzBfRe0TD0QTP3nOTz54l2bI,200
|
9
9
|
dv_flow/mgr/package.py,sha256=D-jH3jqoiQG3xZIYgteFLZ4vQ0ZfkbhnW1u6wlyAJMc,1684
|
10
|
-
dv_flow/mgr/package_def.py,sha256=
|
10
|
+
dv_flow/mgr/package_def.py,sha256=0Xv759yzK5n4SKJQBGMPZ06cTNBHt1dtbgKK8fySHJw,18008
|
11
11
|
dv_flow/mgr/package_import_spec.py,sha256=aZMpnS9a5NFY76_pYXEuO3-Mkc_xFzy73fdrUe_54Dc,1760
|
12
12
|
dv_flow/mgr/param.py,sha256=kkxMRGf6mPjSZJsjgLKH2vJL62Sn0ZESvjBLkEYOp20,1386
|
13
|
-
dv_flow/mgr/param_def.py,sha256=
|
13
|
+
dv_flow/mgr/param_def.py,sha256=mkAw3DanIxcVWRYeh9lUAfUMkpqDFly_Ku_iobr4ix8,1745
|
14
14
|
dv_flow/mgr/param_ref_eval.py,sha256=5yH37oIX6f2qmk7GfRgNT5qZx0jm3CJFgB9lLDZZ1yQ,1981
|
15
15
|
dv_flow/mgr/parsetab.py,sha256=I-p3nC60t9jiNtPhKyl_sE92SiP96zJLnNdydcLy33g,3780
|
16
16
|
dv_flow/mgr/pkg_rgy.py,sha256=d1nIjRm3ymMNJT-yiMDxCS6bFisTPvLMqh5VrfsHVKM,5404
|
@@ -27,8 +27,7 @@ dv_flow/mgr/task_params_ctor.py,sha256=BPkbnoCtzhCxc1g8CJ6VimCcm5UAu92PXeDMhQ4lY
|
|
27
27
|
dv_flow/mgr/task_runner.py,sha256=6yoNzAGb79vgYG95ku_4Kr90cgztdisSICFfV5Ykf9c,8936
|
28
28
|
dv_flow/mgr/type.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
29
29
|
dv_flow/mgr/type_def.py,sha256=NDeyplKrPnWwEv4yHkhXEMK9d9j39b5MOeLB-1Mchqo,1095
|
30
|
-
dv_flow/mgr/
|
31
|
-
dv_flow/mgr/cmds/cmd_run.py,sha256=J6uCzzhtGHD9MYkvE0PpX4dkk5KlY3iW7yZ29iBO3js,3196
|
30
|
+
dv_flow/mgr/cmds/cmd_run.py,sha256=VL0LU0zYnClQ8Id30sxMN_fHJzQFJsOuj7qDG7GTT60,3198
|
32
31
|
dv_flow/mgr/share/flow.json,sha256=lNmZex9NXkYbyb2aZseQfUOkV9CMyfH0iLODEI7EPBw,5096
|
33
32
|
dv_flow/mgr/std/create_file.py,sha256=wmn5N_mObx_wr2LPdKOVbNmdM71hhs3UXOv6Ap9l3Ts,2726
|
34
33
|
dv_flow/mgr/std/exec.py,sha256=UChqa_tAjvdB1NjqTsvlPgFomP8hMsX2rAOPyUonNpk,3896
|
@@ -36,9 +35,14 @@ dv_flow/mgr/std/fileset.py,sha256=5IxS6T-x0wzA6fdEQcfHZ9kNP8IpH9hfJ3UMhL4A6Iw,39
|
|
36
35
|
dv_flow/mgr/std/flow.dv,sha256=rl0VZt_H-TyIJq0iERai07aDDZHI86mNozs4gUxidDA,3759
|
37
36
|
dv_flow/mgr/std/message.py,sha256=_Gox9oBzL9ZYG1JfJ-WYPXojVLqGNaKxZ9tpLVT0LO0,1035
|
38
37
|
dv_flow/mgr/std/task_null.py,sha256=dw6LXBXVwth6gLPeduDvlz5znAhcVpDH8r1DticD-0w,1041
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
dv_flow_mgr-0.0.1.
|
38
|
+
dv_flow/mgr/util/__init__.py,sha256=6uuA6z5cKS2hcjJw6YyEM2M79g6OpXb6tZF_Gku-AGU,22
|
39
|
+
dv_flow/mgr/util/__main__.py,sha256=F0LXpCDpYTPalSo0dc1h_qZkip5v1AZYYh-vcYbh5s0,983
|
40
|
+
dv_flow/mgr/util/util.py,sha256=yg9oTPRiO87mkCSOQpOtlG9vyKPQzY3qp4OJkEMbWyY,1443
|
41
|
+
dv_flow/mgr/util/cmds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
42
|
+
dv_flow/mgr/util/cmds/cmd_schema.py,sha256=lrEI-Jwb8j4I4yYOn9hq7_7NYbK8leVxLesrHyEWm-E,1879
|
43
|
+
dv_flow_mgr-0.0.1.14013608039a1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
44
|
+
dv_flow_mgr-0.0.1.14013608039a1.dist-info/METADATA,sha256=dyZoT5Y1QN06lhNQw7MyAC4TsSNVM-VyX0GRWVxuePs,13336
|
45
|
+
dv_flow_mgr-0.0.1.14013608039a1.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
46
|
+
dv_flow_mgr-0.0.1.14013608039a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
|
47
|
+
dv_flow_mgr-0.0.1.14013608039a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
|
48
|
+
dv_flow_mgr-0.0.1.14013608039a1.dist-info/RECORD,,
|
{dv_flow_mgr-0.0.1.13979842530a1.dist-info → dv_flow_mgr-0.0.1.14013608039a1.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|