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.
Files changed (37) hide show
  1. dv_flow/mgr/__init__.py +4 -0
  2. dv_flow/mgr/cmds/cmd_run.py +6 -1
  3. dv_flow/mgr/cmds/cmd_show.py +3 -3
  4. dv_flow/mgr/config_def.py +1 -1
  5. dv_flow/mgr/expr_eval.py +24 -1
  6. dv_flow/mgr/expr_parser.py +26 -1
  7. dv_flow/mgr/package.py +13 -6
  8. dv_flow/mgr/package_def.py +3 -4
  9. dv_flow/mgr/package_loader.py +252 -120
  10. dv_flow/mgr/param_def.py +7 -2
  11. dv_flow/mgr/param_ref_eval.py +3 -0
  12. dv_flow/mgr/parser.out +258 -138
  13. dv_flow/mgr/parsetab.py +20 -17
  14. dv_flow/mgr/std/flow.dv +31 -53
  15. dv_flow/mgr/std/incdirs.py +18 -0
  16. dv_flow/mgr/task.py +1 -0
  17. dv_flow/mgr/task_def.py +5 -1
  18. dv_flow/mgr/task_graph_builder.py +265 -24
  19. dv_flow/mgr/task_graph_dot_writer.py +32 -3
  20. dv_flow/mgr/task_listener_log.py +46 -31
  21. dv_flow/mgr/task_node.py +3 -0
  22. dv_flow/mgr/task_node_compound.py +1 -0
  23. dv_flow/mgr/task_node_ctor_wrapper.py +3 -1
  24. dv_flow/mgr/task_node_ctxt.py +7 -0
  25. dv_flow/mgr/task_node_leaf.py +77 -54
  26. dv_flow/mgr/task_run_ctxt.py +18 -0
  27. dv_flow/mgr/task_runner.py +8 -5
  28. dv_flow/mgr/type.py +33 -0
  29. dv_flow/mgr/type_def.py +4 -2
  30. dv_flow/mgr/util/util.py +9 -0
  31. dv_flow/mgr/yaml_srcinfo_loader.py +1 -0
  32. {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/METADATA +1 -1
  33. {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/RECORD +37 -35
  34. {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/WHEEL +1 -1
  35. {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/entry_points.txt +0 -0
  36. {dv_flow_mgr-1.0.0.14528489065a1.dist-info → dv_flow_mgr-1.5.0.dist-info}/licenses/LICENSE +0 -0
  37. {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
@@ -31,3 +31,7 @@ from .task_node_ctor_wrapper import task
31
31
  from .task_runner import TaskSetRunner
32
32
  from .task_listener_log import TaskListenerLog
33
33
 
34
+ VERSION="1.5.0"
35
+ SUFFIX="14762702318rc0"
36
+ __version__="%s%s" % (BASE, SUFFIX)
37
+
@@ -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())
@@ -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.tasks:
50
+ for task in pkg.task_m.values():
51
51
  tasks.append(task)
52
- for frag in pkg._fragment_l:
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._basedir, "rundir")
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 and task overrides")
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, ExprCall, ExprId, ExprString, ExprInt
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
@@ -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
- params : Dict[str,Any] = dc.field(default_factory=dict)
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
- types : Dict[str,Any] = dc.field(default_factory=dict)
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 = set()
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.add(name)
92
+ if name not in imports.keys():
93
+ imports[name] = p.basedir
87
94
  collect_imports(p)
88
95
  collect_imports(self)
89
96
 
@@ -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 : List[ParamDef] = dc.Field(
62
- default_factory=list, alias="with",
63
- description="List of package parameters to set")
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")