dv-flow-mgr 0.0.1.13489806632a1__py3-none-any.whl → 0.0.1.13525773676a1__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/expr_eval.py +13 -3
- dv_flow/mgr/param_ref_eval.py +44 -0
- dv_flow/mgr/task_data.py +8 -3
- dv_flow/mgr/task_node.py +63 -1
- dv_flow/mgr/task_runner.py +4 -45
- {dv_flow_mgr-0.0.1.13489806632a1.dist-info → dv_flow_mgr-0.0.1.13525773676a1.dist-info}/METADATA +1 -1
- {dv_flow_mgr-0.0.1.13489806632a1.dist-info → dv_flow_mgr-0.0.1.13525773676a1.dist-info}/RECORD +11 -10
- {dv_flow_mgr-0.0.1.13489806632a1.dist-info → dv_flow_mgr-0.0.1.13525773676a1.dist-info}/WHEEL +1 -1
- {dv_flow_mgr-0.0.1.13489806632a1.dist-info → dv_flow_mgr-0.0.1.13525773676a1.dist-info}/LICENSE +0 -0
- {dv_flow_mgr-0.0.1.13489806632a1.dist-info → dv_flow_mgr-0.0.1.13525773676a1.dist-info}/entry_points.txt +0 -0
- {dv_flow_mgr-0.0.1.13489806632a1.dist-info → dv_flow_mgr-0.0.1.13525773676a1.dist-info}/top_level.txt +0 -0
dv_flow/mgr/expr_eval.py
CHANGED
@@ -9,16 +9,26 @@ class ExprEval(ExprVisitor):
|
|
9
9
|
variables : Dict[str, object] = dc.field(default_factory=dict)
|
10
10
|
value : Any = None
|
11
11
|
|
12
|
-
def eval(self, e : Expr):
|
12
|
+
def eval(self, e : Expr) -> str:
|
13
13
|
self.value = None
|
14
14
|
e.accept(self)
|
15
|
-
|
15
|
+
|
16
|
+
val = self._toString(self.value)
|
17
|
+
|
18
|
+
return val
|
19
|
+
|
20
|
+
def _toString(self, val):
|
21
|
+
if isinstance(val, list):
|
22
|
+
val = '[' + ",".join(self._toString(v) for v in val) + ']'
|
23
|
+
elif hasattr(val, "model_dump_json"):
|
24
|
+
val = val.model_dump_json()
|
25
|
+
return val
|
16
26
|
|
17
27
|
def visitExprId(self, e : ExprId):
|
18
28
|
if e.id in self.variables:
|
19
29
|
self.value = self.variables[e.id]
|
20
30
|
else:
|
21
|
-
raise Exception("Variable %s not found" % e.id)
|
31
|
+
raise Exception("Variable '%s' not found" % e.id)
|
22
32
|
|
23
33
|
def visitExprString(self, e : ExprString):
|
24
34
|
self.value = e.value
|
@@ -0,0 +1,44 @@
|
|
1
|
+
import dataclasses as dc
|
2
|
+
import json
|
3
|
+
from .expr_eval import ExprEval
|
4
|
+
from .expr_parser import ExprParser
|
5
|
+
|
6
|
+
@dc.dataclass
|
7
|
+
class ParamRefEval(object):
|
8
|
+
|
9
|
+
parser : ExprParser = ExprParser()
|
10
|
+
expr_eval : ExprEval = ExprEval()
|
11
|
+
|
12
|
+
def eval(self, val : str) -> str:
|
13
|
+
idx = 0
|
14
|
+
|
15
|
+
while True:
|
16
|
+
idx = val.find("${{", idx)
|
17
|
+
|
18
|
+
if idx != -1:
|
19
|
+
eidx = val.find("}}", idx+1)
|
20
|
+
|
21
|
+
if eidx == -1:
|
22
|
+
raise Exception("unterminated variable ref")
|
23
|
+
|
24
|
+
ref = val[idx+3:eidx].strip()
|
25
|
+
print("ref: %s" % ref)
|
26
|
+
|
27
|
+
expr_ast = self.parser.parse(ref)
|
28
|
+
print("expr_ast: %s" % str(expr_ast))
|
29
|
+
exp_val = self.expr_eval.eval(expr_ast)
|
30
|
+
print("exp_val: %s" % str(exp_val))
|
31
|
+
|
32
|
+
# Replacing [idx..eidx+2] with len(exp_val)
|
33
|
+
val = val[:idx] + exp_val + val[eidx+2:]
|
34
|
+
idx += len(exp_val)
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
else:
|
39
|
+
break
|
40
|
+
|
41
|
+
return val
|
42
|
+
|
43
|
+
def setVar(self, name, value):
|
44
|
+
self.expr_eval.variables[name] = value
|
dv_flow/mgr/task_data.py
CHANGED
@@ -37,6 +37,10 @@ class TaskMarker(BaseModel):
|
|
37
37
|
severity : str
|
38
38
|
loc : TaskMarkerLoc = dc.Field(default=None)
|
39
39
|
|
40
|
+
class TaskParameterSet(BaseModel):
|
41
|
+
task : str = None # Name of the task that produced this param set
|
42
|
+
seq : int = -1 # Order in which the param-set must appear
|
43
|
+
|
40
44
|
class TaskDataInput(BaseModel):
|
41
45
|
changed : bool
|
42
46
|
srcdir : str
|
@@ -46,14 +50,15 @@ class TaskDataInput(BaseModel):
|
|
46
50
|
|
47
51
|
class TaskDataResult(BaseModel):
|
48
52
|
changed : bool = dc.Field(default=True)
|
49
|
-
output : List[
|
53
|
+
output : List[TaskParameterSet] = dc.Field(default_factory=list)
|
50
54
|
memento : Any = dc.Field(default=None)
|
51
55
|
markers : List[TaskMarker] = dc.Field(default_factory=list)
|
52
56
|
status : int = dc.Field(default=0)
|
53
57
|
|
54
58
|
class TaskDataOutput(BaseModel):
|
55
|
-
changed : bool
|
56
|
-
output : List[
|
59
|
+
changed : bool = True
|
60
|
+
output : List[TaskParameterSet] = dc.Field(default_factory=list)
|
61
|
+
dep_m : Dict[str,List[str]] = dc.Field(default_factory=dict)
|
57
62
|
|
58
63
|
class TaskDataParamOpE(enum.Enum):
|
59
64
|
Set = enum.auto()
|
dv_flow/mgr/task_node.py
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
|
2
2
|
import dataclasses as dc
|
3
|
+
import pydantic.dataclasses as pdc
|
3
4
|
import logging
|
4
5
|
from typing import Any, Callable, ClassVar, Dict, List
|
5
6
|
from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
|
6
7
|
from .task_params_ctor import TaskParamsCtor
|
8
|
+
from .param_ref_eval import ParamRefEval
|
7
9
|
|
8
10
|
@dc.dataclass
|
9
11
|
class TaskNode(object):
|
@@ -24,6 +26,58 @@ class TaskNode(object):
|
|
24
26
|
|
25
27
|
_log : ClassVar = logging.getLogger("TaskNode")
|
26
28
|
|
29
|
+
async def do_run(self,
|
30
|
+
runner,
|
31
|
+
rundir,
|
32
|
+
memento : Any = None) -> 'TaskDataResult':
|
33
|
+
changed = False
|
34
|
+
for dep in self.needs:
|
35
|
+
changed |= dep.changed
|
36
|
+
|
37
|
+
# TODO: Form dep-map from inputs
|
38
|
+
# TODO: Order param sets according to dep-map
|
39
|
+
in_params = []
|
40
|
+
for need in self.needs:
|
41
|
+
in_params.extend(need.output.output)
|
42
|
+
|
43
|
+
# TODO: create an evaluator for substituting param values
|
44
|
+
eval = ParamRefEval()
|
45
|
+
|
46
|
+
eval.setVar("in", in_params)
|
47
|
+
|
48
|
+
for name,field in self.params.model_fields.items():
|
49
|
+
value = getattr(self.params, name)
|
50
|
+
if value.find("${{") != -1:
|
51
|
+
new_val = eval.eval(value)
|
52
|
+
setattr(self.params, name, new_val)
|
53
|
+
print("TODO: expand")
|
54
|
+
print("Field: %s %s" % (name, str(value)))
|
55
|
+
pass
|
56
|
+
|
57
|
+
input = TaskDataInput(
|
58
|
+
changed=changed,
|
59
|
+
srcdir=self.srcdir,
|
60
|
+
rundir=rundir,
|
61
|
+
params=self.params,
|
62
|
+
memento=memento)
|
63
|
+
|
64
|
+
# TODO: notify of task start
|
65
|
+
ret : TaskDataResult = await self.task(self, input)
|
66
|
+
# TODO: notify of task complete
|
67
|
+
|
68
|
+
# TODO: form a dep map from the outgoing param sets
|
69
|
+
dep_m = {}
|
70
|
+
|
71
|
+
# Store the result
|
72
|
+
self.output = TaskDataOutput(
|
73
|
+
changed=ret.changed,
|
74
|
+
dep_m=dep_m,
|
75
|
+
output=ret.output.copy())
|
76
|
+
|
77
|
+
# TODO:
|
78
|
+
|
79
|
+
return ret
|
80
|
+
|
27
81
|
def __hash__(self):
|
28
82
|
return id(self)
|
29
83
|
|
@@ -76,5 +130,13 @@ class TaskNodeCtorWrapper(TaskNodeCtor):
|
|
76
130
|
|
77
131
|
def mkTaskParams(self, params : Dict) -> Any:
|
78
132
|
obj = self.paramT()
|
79
|
-
|
133
|
+
|
134
|
+
# Apply user-specified params
|
135
|
+
for key,value in params.items():
|
136
|
+
if not hasattr(obj, key):
|
137
|
+
raise Exception("Parameters class %s does not contain field %s" % (
|
138
|
+
str(type(obj)),
|
139
|
+
key))
|
140
|
+
else:
|
141
|
+
setattr(obj, key, value)
|
80
142
|
return obj
|
dv_flow/mgr/task_runner.py
CHANGED
@@ -53,7 +53,10 @@ class TaskSetRunner(TaskRunner):
|
|
53
53
|
active_task_l.pop(i)
|
54
54
|
break
|
55
55
|
if t not in done_task_s:
|
56
|
-
coro = asyncio.Task(
|
56
|
+
coro = asyncio.Task(t.do_run(
|
57
|
+
self,
|
58
|
+
self.rundir, # TODO
|
59
|
+
None)) # TODO: memento
|
57
60
|
active_task_l.append((t, coro))
|
58
61
|
|
59
62
|
# Now, wait for tasks to complete
|
@@ -64,50 +67,6 @@ class TaskSetRunner(TaskRunner):
|
|
64
67
|
|
65
68
|
pass
|
66
69
|
|
67
|
-
async def do_run(self,
|
68
|
-
task : 'TaskNode',
|
69
|
-
memento : Any = None) -> 'TaskDataResult':
|
70
|
-
changed = False
|
71
|
-
for dep in task.needs:
|
72
|
-
changed |= dep.changed
|
73
|
-
|
74
|
-
# TODO: create an evaluator for substituting param values
|
75
|
-
eval = None
|
76
|
-
|
77
|
-
for field in dc.fields(task.params):
|
78
|
-
print("Field: %s" % field.name)
|
79
|
-
|
80
|
-
input = TaskDataInput(
|
81
|
-
changed=changed,
|
82
|
-
srcdir=task.srcdir,
|
83
|
-
rundir=self.rundir,
|
84
|
-
params=task.params,
|
85
|
-
memento=memento)
|
86
|
-
|
87
|
-
# TODO: notify of task start
|
88
|
-
ret : TaskDataResult = await task.task(self, input)
|
89
|
-
# TODO: notify of task complete
|
90
|
-
|
91
|
-
# Store the result
|
92
|
-
task.output = TaskDataOutput(
|
93
|
-
changed=ret.changed,
|
94
|
-
output=ret.output.copy())
|
95
|
-
|
96
|
-
# # By definition, none of this have run, since we just ran
|
97
|
-
# for dep in task.dependents:
|
98
|
-
# is_sat = True
|
99
|
-
# for need in dep.needs:
|
100
|
-
# if need.output is None:
|
101
|
-
# is_sat = False
|
102
|
-
# break
|
103
|
-
|
104
|
-
# if is_sat:
|
105
|
-
# # TODO: queue task for evaluation
|
106
|
-
# pass
|
107
|
-
# TODO:
|
108
|
-
|
109
|
-
return ret
|
110
|
-
|
111
70
|
def _buildDepMap(self, dep_m, task : TaskNode):
|
112
71
|
if task not in dep_m.keys():
|
113
72
|
dep_m[task] = set(task.needs)
|
{dv_flow_mgr-0.0.1.13489806632a1.dist-info → dv_flow_mgr-0.0.1.13525773676a1.dist-info}/RECORD
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
dv_flow/mgr/__init__.py,sha256=IZA7I1u7RH34DrJXSkETxWFpK5Jn_A2zXfnCAzJ8XxA,289
|
2
2
|
dv_flow/mgr/__main__.py,sha256=uik6gDAvtZNG0yyDKYc4FTl6R1QHAR543jNG2lCAa6E,1771
|
3
|
-
dv_flow/mgr/expr_eval.py,sha256=
|
3
|
+
dv_flow/mgr/expr_eval.py,sha256=M8qTIEnnbff8BCbxvNIztYyG-BJGSe_cLexfqYr3E0w,1807
|
4
4
|
dv_flow/mgr/expr_parser.py,sha256=aR8n6hgk5xmFknIaSVC02K-So-eU4pkkFtwb7zWsSPs,5474
|
5
5
|
dv_flow/mgr/fileset.py,sha256=FNvC5sU2ArxJ0OO3v8dXTv8zX-bZ5t0a0ljne0fQQ1o,1150
|
6
6
|
dv_flow/mgr/fragment_def.py,sha256=cyzp1XeWtNOaagScmeS-BPsoXj9j2LTBbKq5ZUioz8I,1641
|
@@ -9,11 +9,12 @@ dv_flow/mgr/package.py,sha256=878twhPD-E1pFlDNUtuyeFEgJ_Y89b560og4St-Iwrs,1679
|
|
9
9
|
dv_flow/mgr/package_def.py,sha256=dwvs-7kGEp7wFrBK2Fybysb-vSKwtWOtxTrg1VIaL14,14975
|
10
10
|
dv_flow/mgr/package_import_spec.py,sha256=ah3r15v5Jdub2poc3sgi6Uar1L3oGoYsCPPNiOHV-a4,1760
|
11
11
|
dv_flow/mgr/param_def.py,sha256=e2WvRCMArbgcsKC4TKQqZTscZmCdo3WvVR6w3LN0VK8,727
|
12
|
+
dv_flow/mgr/param_ref_eval.py,sha256=MLJNUgvvgxEPzr16vLPUvGwn9lHkKohr7xVAaZhU7Yk,1129
|
12
13
|
dv_flow/mgr/parsetab.py,sha256=enSOnMQ-woIsMEzHyeYiefvhAl8enxfX9Ct_o8-jkqs,3780
|
13
14
|
dv_flow/mgr/pkg_rgy.py,sha256=2R_EaeBDJn5qUq9DzSnLc37wUP36MWSv-p0LgUjJRAg,4471
|
14
15
|
dv_flow/mgr/task.py,sha256=kLQSvnVwj9ROIDtxq8lLu-4mJizTxOqvUeogmgN6QAA,5976
|
15
16
|
dv_flow/mgr/task_ctor.py,sha256=hlfl-UVvyjzLFN6D0Oel9eBs0xUQPqCX7gQ0uEHoL7o,1382
|
16
|
-
dv_flow/mgr/task_data.py,sha256=
|
17
|
+
dv_flow/mgr/task_data.py,sha256=9c5NrVZWECHFXrCPOpwZBQXRhr1O3ni5aFeP2I1P5Rw,11398
|
17
18
|
dv_flow/mgr/task_def.py,sha256=WAW1fPXUfUiQcfmgCx0iCMddMBKATDa5RsRztJWRbUk,1819
|
18
19
|
dv_flow/mgr/task_exec_data.py,sha256=aT__kmVmNxqnS_GbTRS1vrYgKiv8cH-HUSmRb6YYKsI,640
|
19
20
|
dv_flow/mgr/task_graph_builder.py,sha256=-lRSjWU2UJf3euVIFtoVIU7Qdox7MI1sKERWg1k7U_g,7058
|
@@ -21,10 +22,10 @@ dv_flow/mgr/task_graph_runner.py,sha256=jUGI49QvxUCfQoKQDDk2psbeapIcCg72qNOW1Jip
|
|
21
22
|
dv_flow/mgr/task_graph_runner_local.py,sha256=OrydPwtQ8E7hYWvSXx0h7lI3nfUNFyklULhsyMwz9dA,4687
|
22
23
|
dv_flow/mgr/task_impl_data.py,sha256=bFPijoKrh9x7fZN2DsvRJp0UHo-gGM0VjtDQISyfhFk,321
|
23
24
|
dv_flow/mgr/task_memento.py,sha256=C7VTQpBhDEoYuDmE6YTM-6TLMLnqHp6Y0Vat1aTgtCs,1096
|
24
|
-
dv_flow/mgr/task_node.py,sha256=
|
25
|
+
dv_flow/mgr/task_node.py,sha256=CTMfBzKR_kSs10sLxA0NC9HihqsOTHJ49k5oPfcZyNU,4192
|
25
26
|
dv_flow/mgr/task_output.py,sha256=l-W-FvVo6YDah1RQS-I9N0KUtB3vp-kl7lxIdmNz0l4,178
|
26
27
|
dv_flow/mgr/task_params_ctor.py,sha256=aXgB8o9xFPjaEjGW_xYkEC0N0apzGzGUPDj7g2ZLvus,1112
|
27
|
-
dv_flow/mgr/task_runner.py,sha256=
|
28
|
+
dv_flow/mgr/task_runner.py,sha256=JmerE6CyXiJJK7-n6P65OzwW9UTYFQqV8Cck7eHe0B8,3882
|
28
29
|
dv_flow/mgr/type.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
29
30
|
dv_flow/mgr/type_def.py,sha256=KdhuNlfw-NKU-4VZFCnMPyj775yEB7cpr5tz73a9yuQ,259
|
30
31
|
dv_flow/mgr/util.py,sha256=06eVyURF4ga-s8C9Sd3ZSDebwO4QS0XXaB8xADVbWRc,1437
|
@@ -34,9 +35,9 @@ dv_flow/mgr/std/fileset.py,sha256=uP7bGntRq-Tn5_GEFnt0_J_OAmfvep3GlCwCuE8by4o,27
|
|
34
35
|
dv_flow/mgr/std/flow.dv,sha256=j9wLrF3Ghh1ZLbJxmk7WiNiRYUYEer-8CCUA5hsgtfk,1409
|
35
36
|
dv_flow/mgr/std/message.py,sha256=BPTHnEMD4tBufQ9LvsS9Sa_0xjaJATbBpwqosWslvVA,193
|
36
37
|
dv_flow/mgr/std/task_null.py,sha256=KObmjG_4D08GJ1k6neqKIQrFY72Sj0jLnwXxEkq5HA0,321
|
37
|
-
dv_flow_mgr-0.0.1.
|
38
|
-
dv_flow_mgr-0.0.1.
|
39
|
-
dv_flow_mgr-0.0.1.
|
40
|
-
dv_flow_mgr-0.0.1.
|
41
|
-
dv_flow_mgr-0.0.1.
|
42
|
-
dv_flow_mgr-0.0.1.
|
38
|
+
dv_flow_mgr-0.0.1.13525773676a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
39
|
+
dv_flow_mgr-0.0.1.13525773676a1.dist-info/METADATA,sha256=Bg3ASctj2O6u1eTnAZ9_FKztQjpslQZC0fr7SCSqg6c,13276
|
40
|
+
dv_flow_mgr-0.0.1.13525773676a1.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
|
41
|
+
dv_flow_mgr-0.0.1.13525773676a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
|
42
|
+
dv_flow_mgr-0.0.1.13525773676a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
|
43
|
+
dv_flow_mgr-0.0.1.13525773676a1.dist-info/RECORD,,
|
{dv_flow_mgr-0.0.1.13489806632a1.dist-info → dv_flow_mgr-0.0.1.13525773676a1.dist-info}/LICENSE
RENAMED
File without changes
|
File without changes
|
File without changes
|