dv-flow-mgr 1.0.0.14528489065a1__py3-none-any.whl → 1.5.0__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 +4 -0
- dv_flow/mgr/cmds/cmd_run.py +6 -1
- dv_flow/mgr/cmds/cmd_show.py +3 -3
- dv_flow/mgr/config_def.py +1 -1
- dv_flow/mgr/expr_eval.py +24 -1
- dv_flow/mgr/expr_parser.py +26 -1
- dv_flow/mgr/package.py +13 -6
- dv_flow/mgr/package_def.py +3 -4
- dv_flow/mgr/package_loader.py +252 -120
- dv_flow/mgr/param_def.py +7 -2
- dv_flow/mgr/param_ref_eval.py +3 -0
- dv_flow/mgr/parser.out +258 -138
- dv_flow/mgr/parsetab.py +20 -17
- dv_flow/mgr/std/flow.dv +31 -53
- dv_flow/mgr/std/incdirs.py +18 -0
- dv_flow/mgr/task.py +1 -0
- dv_flow/mgr/task_def.py +5 -1
- dv_flow/mgr/task_graph_builder.py +265 -24
- dv_flow/mgr/task_graph_dot_writer.py +32 -3
- dv_flow/mgr/task_listener_log.py +46 -31
- dv_flow/mgr/task_node.py +3 -0
- dv_flow/mgr/task_node_compound.py +1 -0
- dv_flow/mgr/task_node_ctor_wrapper.py +3 -1
- dv_flow/mgr/task_node_ctxt.py +7 -0
- dv_flow/mgr/task_node_leaf.py +77 -54
- dv_flow/mgr/task_run_ctxt.py +18 -0
- dv_flow/mgr/task_runner.py +8 -5
- dv_flow/mgr/type.py +33 -0
- dv_flow/mgr/type_def.py +4 -2
- dv_flow/mgr/util/util.py +9 -0
- dv_flow/mgr/yaml_srcinfo_loader.py +1 -0
- {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/METADATA +1 -1
- {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/RECORD +37 -35
- {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/WHEEL +1 -1
- {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/entry_points.txt +0 -0
- {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/licenses/LICENSE +0 -0
- {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/top_level.txt +0 -0
dv_flow/mgr/__init__.py
CHANGED
dv_flow/mgr/cmds/cmd_run.py
CHANGED
@@ -24,6 +24,7 @@ import os
|
|
24
24
|
import logging
|
25
25
|
from typing import ClassVar
|
26
26
|
from ..util import loadProjPkgDef
|
27
|
+
from ..task_data import SeverityE
|
27
28
|
from ..task_graph_builder import TaskGraphBuilder
|
28
29
|
from ..task_runner import TaskSetRunner
|
29
30
|
from ..task_listener_log import TaskListenerLog
|
@@ -42,7 +43,11 @@ class CmdRun(object):
|
|
42
43
|
|
43
44
|
# First, find the project we're working with
|
44
45
|
listener = TaskListenerLog()
|
45
|
-
pkg = loadProjPkgDef(rootdir, listener=listener)
|
46
|
+
pkg = loadProjPkgDef(rootdir, listener=listener.marker)
|
47
|
+
|
48
|
+
if listener.has_severity[SeverityE.Error] > 0:
|
49
|
+
print("Error(s) encountered while loading package definition")
|
50
|
+
return 1
|
46
51
|
|
47
52
|
if pkg is None:
|
48
53
|
raise Exception("Failed to find a 'flow.dv' file that defines a package in %s or its parent directories" % os.getcwd())
|
dv_flow/mgr/cmds/cmd_show.py
CHANGED
@@ -47,9 +47,9 @@ class CmdShow(object):
|
|
47
47
|
if args.task is None:
|
48
48
|
# Print out available tasks
|
49
49
|
tasks = []
|
50
|
-
for task in pkg.
|
50
|
+
for task in pkg.task_m.values():
|
51
51
|
tasks.append(task)
|
52
|
-
for frag in pkg.
|
52
|
+
for frag in pkg.fragment_def_l:
|
53
53
|
for task in frag.tasks:
|
54
54
|
tasks.append(task)
|
55
55
|
tasks.sort(key=lambda x: x.name)
|
@@ -66,7 +66,7 @@ class CmdShow(object):
|
|
66
66
|
"<no descripion>"
|
67
67
|
print("%s - %s" % (t.name.ljust(max_name_len), desc))
|
68
68
|
else:
|
69
|
-
rundir = os.path.join(pkg.
|
69
|
+
rundir = os.path.join(pkg.basedir, "rundir")
|
70
70
|
|
71
71
|
builder = TaskGraphBuilder(root_pkg=pkg, rundir=rundir)
|
72
72
|
|
dv_flow/mgr/config_def.py
CHANGED
@@ -27,7 +27,7 @@ class ConfigDef(BaseModel):
|
|
27
27
|
description="Name of the configuration to use as a base")
|
28
28
|
overrides : List[OverrideDef] = pdc.Field(
|
29
29
|
default_factory=list,
|
30
|
-
description="List of package
|
30
|
+
description="List of package overrides")
|
31
31
|
extensions : List[ExtendDef] = pdc.Field(
|
32
32
|
default_factory=list,
|
33
33
|
description="List of extensions to apply")
|
dv_flow/mgr/expr_eval.py
CHANGED
@@ -22,7 +22,8 @@
|
|
22
22
|
import dataclasses as dc
|
23
23
|
import json
|
24
24
|
from typing import Any, Callable, Dict, List
|
25
|
-
from .expr_parser import ExprVisitor, Expr, ExprBin, ExprBinOp
|
25
|
+
from .expr_parser import ExprVisitor, Expr, ExprBin, ExprBinOp
|
26
|
+
from .expr_parser import ExprCall, ExprHId, ExprId, ExprString, ExprInt
|
26
27
|
|
27
28
|
@dc.dataclass
|
28
29
|
class ExprEval(ExprVisitor):
|
@@ -30,6 +31,9 @@ class ExprEval(ExprVisitor):
|
|
30
31
|
variables : Dict[str, object] = dc.field(default_factory=dict)
|
31
32
|
value : Any = None
|
32
33
|
|
34
|
+
def set(self, name : str, value : object):
|
35
|
+
self.variables[name] = value
|
36
|
+
|
33
37
|
def eval(self, e : Expr) -> str:
|
34
38
|
self.value = None
|
35
39
|
e.accept(self)
|
@@ -59,6 +63,25 @@ class ExprEval(ExprVisitor):
|
|
59
63
|
|
60
64
|
return rval
|
61
65
|
|
66
|
+
def visitExprHId(self, e : ExprHId):
|
67
|
+
print("Hid: %s" % ".".join(e.id))
|
68
|
+
if e.id[0] in self.variables:
|
69
|
+
# Always represent data as a JSON object
|
70
|
+
root = self.variables[e.id[0]]
|
71
|
+
for i in range(1, len(e.id)):
|
72
|
+
if isinstance(root, dict):
|
73
|
+
if e.id[i] in root.keys():
|
74
|
+
root = root[e.id[i]]
|
75
|
+
else:
|
76
|
+
raise Exception("Sub-element '%s' not found in '%s'" % (e.id[i], ".".join(e.id)))
|
77
|
+
elif hasattr(root, e.id[i]):
|
78
|
+
root = getattr(root, e.id[i])
|
79
|
+
else:
|
80
|
+
raise Exception("Sub-element '%s' not found in '%s'" % (e.id[i], ".".join(e.id)))
|
81
|
+
self.value = root
|
82
|
+
else:
|
83
|
+
raise Exception("Variable '%s' not found" % e.id[0])
|
84
|
+
|
62
85
|
def visitExprId(self, e : ExprId):
|
63
86
|
if e.id in self.variables:
|
64
87
|
# Always represent data as a JSON object
|
dv_flow/mgr/expr_parser.py
CHANGED
@@ -37,6 +37,13 @@ class ExprId(Expr):
|
|
37
37
|
def accept(self, v):
|
38
38
|
v.visitExprId(self)
|
39
39
|
|
40
|
+
@dc.dataclass
|
41
|
+
class ExprHId(Expr):
|
42
|
+
id : List[str] = dc.field(default_factory=list)
|
43
|
+
|
44
|
+
def accept(self, v):
|
45
|
+
v.visitExprHId(self)
|
46
|
+
|
40
47
|
class ExprBinOp(enum.Enum):
|
41
48
|
Pipe = enum.auto()
|
42
49
|
Plus = enum.auto()
|
@@ -76,6 +83,9 @@ class ExprInt(Expr):
|
|
76
83
|
v.visitExprInt(self)
|
77
84
|
|
78
85
|
class ExprVisitor(object):
|
86
|
+
def visitExprHId(self, e : ExprId):
|
87
|
+
pass
|
88
|
+
|
79
89
|
def visitExprId(self, e : ExprId):
|
80
90
|
pass
|
81
91
|
|
@@ -148,7 +158,7 @@ class ExprParser(object):
|
|
148
158
|
return cls._inst
|
149
159
|
|
150
160
|
tokens = (
|
151
|
-
'ID','NUMBER','COMMA',
|
161
|
+
'ID', 'DOT', 'NUMBER','COMMA',
|
152
162
|
'PLUS','MINUS','TIMES','DIVIDE',
|
153
163
|
'LPAREN','RPAREN','PIPE','STRING1','STRING2'
|
154
164
|
)
|
@@ -163,6 +173,7 @@ class ExprParser(object):
|
|
163
173
|
t_LPAREN = r'\('
|
164
174
|
t_RPAREN = r'\)'
|
165
175
|
t_ID = r'[a-zA-Z_][a-zA-Z0-9_]*'
|
176
|
+
t_DOT = r'\.'
|
166
177
|
t_PIPE = r'\|'
|
167
178
|
|
168
179
|
def t_NUMBER(self, t):
|
@@ -244,6 +255,20 @@ class ExprParser(object):
|
|
244
255
|
'expression : ID'
|
245
256
|
t[0] = ExprId(t[1])
|
246
257
|
|
258
|
+
def p_expression_hid(self, t):
|
259
|
+
'expression : hier_id'
|
260
|
+
t[0] = t[1]
|
261
|
+
|
262
|
+
def p_hier_id(self, t):
|
263
|
+
'''hier_id : ID DOT hier_id
|
264
|
+
| ID'''
|
265
|
+
if len(t) == 2:
|
266
|
+
t[0] = ExprHId()
|
267
|
+
t[0].id.append(t[1])
|
268
|
+
else:
|
269
|
+
t[3].id.insert(0, t[1])
|
270
|
+
t[0] = t[3]
|
271
|
+
|
247
272
|
def p_expression_string1(self, t):
|
248
273
|
'expression : STRING1'
|
249
274
|
t[0] = ExprString(t[1])
|
dv_flow/mgr/package.py
CHANGED
@@ -26,16 +26,17 @@ from .fragment_def import FragmentDef
|
|
26
26
|
from .package_def import PackageDef
|
27
27
|
from .srcinfo import SrcInfo
|
28
28
|
from .task import Task
|
29
|
+
from .type import Type
|
29
30
|
|
30
31
|
@dc.dataclass
|
31
32
|
class Package(object):
|
32
33
|
pkg_def : PackageDef
|
33
34
|
basedir : str = None
|
34
|
-
|
35
|
+
paramT : Any = None
|
35
36
|
# Package holds constructors for tasks
|
36
37
|
# - Dict holds the default parameters for the task
|
37
38
|
task_m : Dict[str,Task] = dc.field(default_factory=dict)
|
38
|
-
|
39
|
+
type_m : Dict[str,Type] = dc.field(default_factory=dict)
|
39
40
|
fragment_def_l : List[FragmentDef] = dc.field(default_factory=list)
|
40
41
|
pkg_m : Dict[str, 'Package'] = dc.field(default_factory=dict)
|
41
42
|
srcinfo : SrcInfo = None
|
@@ -53,17 +54,23 @@ class Package(object):
|
|
53
54
|
|
54
55
|
def dump(self):
|
55
56
|
tasks = {}
|
57
|
+
types = {}
|
56
58
|
for k, v in self.task_m.items():
|
57
59
|
tasks[k] = v.dump()
|
60
|
+
for k, v in self.type_m.items():
|
61
|
+
types[k] = v.dump()
|
58
62
|
|
59
63
|
pkg = {
|
60
64
|
"name": self.name,
|
61
65
|
"basedir": self.basedir,
|
62
|
-
"params": self.params,
|
63
66
|
"tasks": tasks,
|
67
|
+
"types": types,
|
64
68
|
"fragments": [f.dump() for f in self.fragment_def_l]
|
65
69
|
}
|
66
70
|
|
71
|
+
if self.paramT is not None:
|
72
|
+
pkg["paramT"] = self.paramT().model_dump()
|
73
|
+
|
67
74
|
return pkg
|
68
75
|
|
69
76
|
def __hash__(self):
|
@@ -79,11 +86,11 @@ class Package(object):
|
|
79
86
|
dict: Dictionary containing required package data and markers
|
80
87
|
"""
|
81
88
|
# Collect all imported packages recursively
|
82
|
-
imports =
|
89
|
+
imports = {}
|
83
90
|
def collect_imports(pkg):
|
84
91
|
for name, p in pkg.pkg_m.items():
|
85
|
-
if name not in imports:
|
86
|
-
imports.
|
92
|
+
if name not in imports.keys():
|
93
|
+
imports[name] = p.basedir
|
87
94
|
collect_imports(p)
|
88
95
|
collect_imports(self)
|
89
96
|
|
dv_flow/mgr/package_def.py
CHANGED
@@ -43,7 +43,6 @@ from .type_def import TypeDef
|
|
43
43
|
class PackageDef(BaseModel):
|
44
44
|
name : str = dc.Field(
|
45
45
|
description="Name of the package")
|
46
|
-
params : Dict[str,Any] = dc.Field(default_factory=dict)
|
47
46
|
type : List[PackageSpec] = dc.Field(default_factory=list)
|
48
47
|
tasks : List[TaskDef] = dc.Field(
|
49
48
|
default_factory=list,
|
@@ -58,9 +57,9 @@ class PackageDef(BaseModel):
|
|
58
57
|
uses : str = dc.Field(
|
59
58
|
default=None,
|
60
59
|
description="Name of the package to use as a base")
|
61
|
-
params :
|
62
|
-
default_factory=
|
63
|
-
description="
|
60
|
+
params : Dict[str,Union[str,list,ParamDef]] = dc.Field(
|
61
|
+
default_factory=dict, alias="with",
|
62
|
+
description="Package parameters")
|
64
63
|
configs : List[ConfigDef] = dc.Field(
|
65
64
|
default_factory=list,
|
66
65
|
description="List of package configurations")
|