dv-flow-mgr 0.0.1.13525773676a1__py3-none-any.whl → 0.0.1.13577785562a1__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/eval_jq.py +16 -0
- dv_flow/mgr/expr_eval.py +21 -5
- dv_flow/mgr/param.py +20 -0
- dv_flow/mgr/param_ref_eval.py +4 -3
- dv_flow/mgr/task_node.py +33 -14
- {dv_flow_mgr-0.0.1.13525773676a1.dist-info → dv_flow_mgr-0.0.1.13577785562a1.dist-info}/METADATA +1 -1
- {dv_flow_mgr-0.0.1.13525773676a1.dist-info → dv_flow_mgr-0.0.1.13577785562a1.dist-info}/RECORD +11 -9
- {dv_flow_mgr-0.0.1.13525773676a1.dist-info → dv_flow_mgr-0.0.1.13577785562a1.dist-info}/WHEEL +1 -1
- {dv_flow_mgr-0.0.1.13525773676a1.dist-info → dv_flow_mgr-0.0.1.13577785562a1.dist-info}/LICENSE +0 -0
- {dv_flow_mgr-0.0.1.13525773676a1.dist-info → dv_flow_mgr-0.0.1.13577785562a1.dist-info}/entry_points.txt +0 -0
- {dv_flow_mgr-0.0.1.13525773676a1.dist-info → dv_flow_mgr-0.0.1.13577785562a1.dist-info}/top_level.txt +0 -0
dv_flow/mgr/eval_jq.py
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
import jq
|
3
|
+
|
4
|
+
def eval_jq(input, args):
|
5
|
+
if len(args) != 1:
|
6
|
+
raise Exception("jq requires a single argument")
|
7
|
+
|
8
|
+
filt = jq.compile(args[0])
|
9
|
+
|
10
|
+
if type(input) == str:
|
11
|
+
ret = filt.input_text(input).text()
|
12
|
+
else:
|
13
|
+
ret = filt.input_value(input).text()
|
14
|
+
|
15
|
+
|
16
|
+
return ret
|
dv_flow/mgr/expr_eval.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
|
2
2
|
import dataclasses as dc
|
3
|
+
import json
|
3
4
|
from typing import Any, Callable, Dict, List
|
4
5
|
from .expr_parser import ExprVisitor, Expr, ExprBin, ExprBinOp, ExprCall, ExprId, ExprString, ExprInt
|
5
6
|
|
@@ -18,15 +19,30 @@ class ExprEval(ExprVisitor):
|
|
18
19
|
return val
|
19
20
|
|
20
21
|
def _toString(self, val):
|
22
|
+
rval = val
|
23
|
+
if type(val) != str:
|
24
|
+
obj = self._toObject(val)
|
25
|
+
rval = json.dumps(obj)
|
26
|
+
return rval
|
27
|
+
# if isinstance(val, list):
|
28
|
+
# val = '[' + ",".join(self._toString(v) for v in val) + ']'
|
29
|
+
# elif hasattr(val, "model_dump_json"):
|
30
|
+
# val = val.model_dump_json()
|
31
|
+
# return val
|
32
|
+
|
33
|
+
def _toObject(self, val):
|
34
|
+
rval = val
|
21
35
|
if isinstance(val, list):
|
22
|
-
|
23
|
-
elif hasattr(val, "
|
24
|
-
|
25
|
-
|
36
|
+
rval = list(self._toObject(v) for v in val)
|
37
|
+
elif hasattr(val, "model_dump"):
|
38
|
+
rval = val.model_dump()
|
39
|
+
|
40
|
+
return rval
|
26
41
|
|
27
42
|
def visitExprId(self, e : ExprId):
|
28
43
|
if e.id in self.variables:
|
29
|
-
|
44
|
+
# Always represent data as a JSON object
|
45
|
+
self.value = self._toObject(self.variables[e.id])
|
30
46
|
else:
|
31
47
|
raise Exception("Variable '%s' not found" % e.id)
|
32
48
|
|
dv_flow/mgr/param.py
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
from pydantic import BaseModel
|
3
|
+
import pydantic.dataclasses as pdc
|
4
|
+
from typing import Any, List, Union
|
5
|
+
|
6
|
+
class ParamMeta(type):
|
7
|
+
def __getitem__(self, T):
|
8
|
+
ret = Union[T, Param]
|
9
|
+
return ret
|
10
|
+
|
11
|
+
class ParamT(metaclass=ParamMeta):
|
12
|
+
pass
|
13
|
+
|
14
|
+
class Param(BaseModel):
|
15
|
+
append : Union[Any,List] = pdc.Field(default=None)
|
16
|
+
prepend : Union[Any,List] = pdc.Field(default=None)
|
17
|
+
append_path : Union[Any,List] = pdc.Field(default=None, alias="append-path")
|
18
|
+
prepend_path : Union[Any,List] = pdc.Field(default=None, alias="prepend-path")
|
19
|
+
|
20
|
+
|
dv_flow/mgr/param_ref_eval.py
CHANGED
@@ -2,6 +2,7 @@ import dataclasses as dc
|
|
2
2
|
import json
|
3
3
|
from .expr_eval import ExprEval
|
4
4
|
from .expr_parser import ExprParser
|
5
|
+
from .eval_jq import eval_jq
|
5
6
|
|
6
7
|
@dc.dataclass
|
7
8
|
class ParamRefEval(object):
|
@@ -9,6 +10,9 @@ class ParamRefEval(object):
|
|
9
10
|
parser : ExprParser = ExprParser()
|
10
11
|
expr_eval : ExprEval = ExprEval()
|
11
12
|
|
13
|
+
def __post_init__(self):
|
14
|
+
self.expr_eval.methods["jq"] = eval_jq
|
15
|
+
|
12
16
|
def eval(self, val : str) -> str:
|
13
17
|
idx = 0
|
14
18
|
|
@@ -22,12 +26,9 @@ class ParamRefEval(object):
|
|
22
26
|
raise Exception("unterminated variable ref")
|
23
27
|
|
24
28
|
ref = val[idx+3:eidx].strip()
|
25
|
-
print("ref: %s" % ref)
|
26
29
|
|
27
30
|
expr_ast = self.parser.parse(ref)
|
28
|
-
print("expr_ast: %s" % str(expr_ast))
|
29
31
|
exp_val = self.expr_eval.eval(expr_ast)
|
30
|
-
print("exp_val: %s" % str(exp_val))
|
31
32
|
|
32
33
|
# Replacing [idx..eidx+2] with len(exp_val)
|
33
34
|
val = val[:idx] + exp_val + val[eidx+2:]
|
dv_flow/mgr/task_node.py
CHANGED
@@ -6,6 +6,7 @@ from typing import Any, Callable, ClassVar, Dict, List
|
|
6
6
|
from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
|
7
7
|
from .task_params_ctor import TaskParamsCtor
|
8
8
|
from .param_ref_eval import ParamRefEval
|
9
|
+
from .param import Param
|
9
10
|
|
10
11
|
@dc.dataclass
|
11
12
|
class TaskNode(object):
|
@@ -47,12 +48,17 @@ class TaskNode(object):
|
|
47
48
|
|
48
49
|
for name,field in self.params.model_fields.items():
|
49
50
|
value = getattr(self.params, name)
|
50
|
-
if value
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
51
|
+
if type(value) == str:
|
52
|
+
if value.find("${{") != -1:
|
53
|
+
new_val = eval.eval(value)
|
54
|
+
setattr(self.params, name, new_val)
|
55
|
+
elif isinstance(value, list):
|
56
|
+
for i,elem in enumerate(value):
|
57
|
+
if elem.find("${{") != -1:
|
58
|
+
new_val = eval.eval(elem)
|
59
|
+
value[i] = new_val
|
60
|
+
else:
|
61
|
+
raise Exception("Unhandled param type: %s" % str(value))
|
56
62
|
|
57
63
|
input = TaskDataInput(
|
58
64
|
changed=changed,
|
@@ -81,12 +87,6 @@ class TaskNode(object):
|
|
81
87
|
def __hash__(self):
|
82
88
|
return id(self)
|
83
89
|
|
84
|
-
@staticmethod
|
85
|
-
def task(paramT):
|
86
|
-
def wrapper(T):
|
87
|
-
ctor = TaskNodeCtorWrapper(T.__name__, T, paramT)
|
88
|
-
return ctor
|
89
|
-
return wrapper
|
90
90
|
|
91
91
|
@dc.dataclass
|
92
92
|
class TaskNodeCtor(object):
|
@@ -97,7 +97,6 @@ class TaskNodeCtor(object):
|
|
97
97
|
"""
|
98
98
|
name : str
|
99
99
|
|
100
|
-
|
101
100
|
def mkTaskNode(self, srcdir, params, name=None) -> TaskNode:
|
102
101
|
raise NotImplementedError("mkTaskNode in type %s" % str(type(self)))
|
103
102
|
|
@@ -138,5 +137,25 @@ class TaskNodeCtorWrapper(TaskNodeCtor):
|
|
138
137
|
str(type(obj)),
|
139
138
|
key))
|
140
139
|
else:
|
141
|
-
|
140
|
+
if isinstance(value, Param):
|
141
|
+
if value.append is not None:
|
142
|
+
ex_value = getattr(obj, key, [])
|
143
|
+
ex_value.extend(value.append)
|
144
|
+
setattr(obj, key, ex_value)
|
145
|
+
elif value.prepend is not None:
|
146
|
+
ex_value = getattr(obj, key, [])
|
147
|
+
value = value.copy()
|
148
|
+
value.extend(ex_value)
|
149
|
+
setattr(obj, key, value)
|
150
|
+
pass
|
151
|
+
else:
|
152
|
+
raise Exception("Unhandled value spec: %s" % str(value))
|
153
|
+
else:
|
154
|
+
setattr(obj, key, value)
|
142
155
|
return obj
|
156
|
+
|
157
|
+
def task(paramT):
|
158
|
+
def wrapper(T):
|
159
|
+
ctor = TaskNodeCtorWrapper(T.__name__, T, paramT)
|
160
|
+
return ctor
|
161
|
+
return wrapper
|
{dv_flow_mgr-0.0.1.13525773676a1.dist-info → dv_flow_mgr-0.0.1.13577785562a1.dist-info}/RECORD
RENAMED
@@ -1,6 +1,7 @@
|
|
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/
|
3
|
+
dv_flow/mgr/eval_jq.py,sha256=Ue-qkyNW6uOu2Wy8u6nrTbPPY7ujaHd0-4iki0eV3Ec,294
|
4
|
+
dv_flow/mgr/expr_eval.py,sha256=Mp0TvrV6gZWcj1uYwLfPNI-ARwwdAfwntE5byLBfBuY,2276
|
4
5
|
dv_flow/mgr/expr_parser.py,sha256=aR8n6hgk5xmFknIaSVC02K-So-eU4pkkFtwb7zWsSPs,5474
|
5
6
|
dv_flow/mgr/fileset.py,sha256=FNvC5sU2ArxJ0OO3v8dXTv8zX-bZ5t0a0ljne0fQQ1o,1150
|
6
7
|
dv_flow/mgr/fragment_def.py,sha256=cyzp1XeWtNOaagScmeS-BPsoXj9j2LTBbKq5ZUioz8I,1641
|
@@ -8,8 +9,9 @@ dv_flow/mgr/out,sha256=d8GGBi3J43fhdLBlnsUbzBfRe0TD0QTP3nOTz54l2bI,200
|
|
8
9
|
dv_flow/mgr/package.py,sha256=878twhPD-E1pFlDNUtuyeFEgJ_Y89b560og4St-Iwrs,1679
|
9
10
|
dv_flow/mgr/package_def.py,sha256=dwvs-7kGEp7wFrBK2Fybysb-vSKwtWOtxTrg1VIaL14,14975
|
10
11
|
dv_flow/mgr/package_import_spec.py,sha256=ah3r15v5Jdub2poc3sgi6Uar1L3oGoYsCPPNiOHV-a4,1760
|
12
|
+
dv_flow/mgr/param.py,sha256=3BY-ucig6JRw73FhjyJQL-vpd57qhAzixgZ8I5FoUpw,553
|
11
13
|
dv_flow/mgr/param_def.py,sha256=e2WvRCMArbgcsKC4TKQqZTscZmCdo3WvVR6w3LN0VK8,727
|
12
|
-
dv_flow/mgr/param_ref_eval.py,sha256=
|
14
|
+
dv_flow/mgr/param_ref_eval.py,sha256=dpV6IPdTtZHLy8maTsN61Ce1Cc5M5dLQW5sauNujEMU,1090
|
13
15
|
dv_flow/mgr/parsetab.py,sha256=enSOnMQ-woIsMEzHyeYiefvhAl8enxfX9Ct_o8-jkqs,3780
|
14
16
|
dv_flow/mgr/pkg_rgy.py,sha256=2R_EaeBDJn5qUq9DzSnLc37wUP36MWSv-p0LgUjJRAg,4471
|
15
17
|
dv_flow/mgr/task.py,sha256=kLQSvnVwj9ROIDtxq8lLu-4mJizTxOqvUeogmgN6QAA,5976
|
@@ -22,7 +24,7 @@ dv_flow/mgr/task_graph_runner.py,sha256=jUGI49QvxUCfQoKQDDk2psbeapIcCg72qNOW1Jip
|
|
22
24
|
dv_flow/mgr/task_graph_runner_local.py,sha256=OrydPwtQ8E7hYWvSXx0h7lI3nfUNFyklULhsyMwz9dA,4687
|
23
25
|
dv_flow/mgr/task_impl_data.py,sha256=bFPijoKrh9x7fZN2DsvRJp0UHo-gGM0VjtDQISyfhFk,321
|
24
26
|
dv_flow/mgr/task_memento.py,sha256=C7VTQpBhDEoYuDmE6YTM-6TLMLnqHp6Y0Vat1aTgtCs,1096
|
25
|
-
dv_flow/mgr/task_node.py,sha256=
|
27
|
+
dv_flow/mgr/task_node.py,sha256=uCsyNT9IQu0cok27qTEi4iTB6FqobXbx7hbVAmjELKc,5130
|
26
28
|
dv_flow/mgr/task_output.py,sha256=l-W-FvVo6YDah1RQS-I9N0KUtB3vp-kl7lxIdmNz0l4,178
|
27
29
|
dv_flow/mgr/task_params_ctor.py,sha256=aXgB8o9xFPjaEjGW_xYkEC0N0apzGzGUPDj7g2ZLvus,1112
|
28
30
|
dv_flow/mgr/task_runner.py,sha256=JmerE6CyXiJJK7-n6P65OzwW9UTYFQqV8Cck7eHe0B8,3882
|
@@ -35,9 +37,9 @@ dv_flow/mgr/std/fileset.py,sha256=uP7bGntRq-Tn5_GEFnt0_J_OAmfvep3GlCwCuE8by4o,27
|
|
35
37
|
dv_flow/mgr/std/flow.dv,sha256=j9wLrF3Ghh1ZLbJxmk7WiNiRYUYEer-8CCUA5hsgtfk,1409
|
36
38
|
dv_flow/mgr/std/message.py,sha256=BPTHnEMD4tBufQ9LvsS9Sa_0xjaJATbBpwqosWslvVA,193
|
37
39
|
dv_flow/mgr/std/task_null.py,sha256=KObmjG_4D08GJ1k6neqKIQrFY72Sj0jLnwXxEkq5HA0,321
|
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.
|
43
|
-
dv_flow_mgr-0.0.1.
|
40
|
+
dv_flow_mgr-0.0.1.13577785562a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
41
|
+
dv_flow_mgr-0.0.1.13577785562a1.dist-info/METADATA,sha256=UeJMpl2RnCOQX98UgtpVXI3qjSPhe4Zs_Gcg4-Cv4hE,13276
|
42
|
+
dv_flow_mgr-0.0.1.13577785562a1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
43
|
+
dv_flow_mgr-0.0.1.13577785562a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
|
44
|
+
dv_flow_mgr-0.0.1.13577785562a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
|
45
|
+
dv_flow_mgr-0.0.1.13577785562a1.dist-info/RECORD,,
|
{dv_flow_mgr-0.0.1.13525773676a1.dist-info → dv_flow_mgr-0.0.1.13577785562a1.dist-info}/LICENSE
RENAMED
File without changes
|
File without changes
|
File without changes
|