dv-flow-mgr 0.0.1.12968982426a1__tar.gz → 0.0.1.12971126211a1__tar.gz

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 (74) hide show
  1. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/pyproject.toml +1 -1
  3. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/__main__.py +13 -0
  4. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/cmds/cmd_run.py +4 -1
  5. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/package.py +4 -1
  6. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/package_def.py +148 -106
  7. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/std/fileset.py +7 -4
  8. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/std/task_null.py +1 -0
  9. dv_flow_mgr-0.0.1.12971126211a1/src/dv_flow/mgr/task.py +292 -0
  10. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/task_data.py +11 -8
  11. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/task_graph_builder.py +36 -60
  12. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/task_graph_runner_local.py +5 -4
  13. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  14. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +0 -2
  15. dv_flow_mgr-0.0.1.12968982426a1/src/dv_flow/mgr/task.py +0 -163
  16. dv_flow_mgr-0.0.1.12968982426a1/tests/sys/test_pkg_discovery.py +0 -127
  17. dv_flow_mgr-0.0.1.12968982426a1/tests/system/test_depends.py +0 -143
  18. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/.github/workflows/ci.yml +0 -0
  19. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/.gitignore +0 -0
  20. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/.vscode/settings.json +0 -0
  21. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/LICENSE +0 -0
  22. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/README.md +0 -0
  23. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/docs/Makefile +0 -0
  24. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/docs/Notes.md +0 -0
  25. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/docs/Roadmap.md +0 -0
  26. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/docs/Stages.md +0 -0
  27. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/docs/TypesAndDefs.md +0 -0
  28. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/docs/conf.py +0 -0
  29. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/docs/index.rst +0 -0
  30. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/docs/intro.rst +0 -0
  31. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/docs/quickstart.rst +0 -0
  32. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/docs/reference.rst +0 -0
  33. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/ivpm.yaml +0 -0
  34. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/setup.cfg +0 -0
  35. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/__init__.py +0 -0
  36. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/fileset.py +0 -0
  37. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/fragment_def.py +0 -0
  38. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
  39. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/pkg_rgy.py +0 -0
  40. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/share/flow.json +0 -0
  41. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/std/flow.dv +0 -0
  42. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/std/message.py +0 -0
  43. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/task_def.py +0 -0
  44. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/task_graph_runner.py +0 -0
  45. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/task_memento.py +0 -0
  46. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow/mgr/util.py +0 -0
  47. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  48. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  49. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  50. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  51. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/examples/example1/example1.flow +0 -0
  52. {dv_flow_mgr-0.0.1.12968982426a1/tests/sys → dv_flow_mgr-0.0.1.12971126211a1/tests/system}/test_depends.py +0 -0
  53. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/system/test_pkg_discovery.py +0 -0
  54. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/system/test_stdlib.py +0 -0
  55. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/__init__.py +0 -0
  56. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
  57. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
  58. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
  59. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
  60. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  61. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
  62. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
  63. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
  64. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
  65. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  66. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  67. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  68. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  69. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/test_data_merge.py +0 -0
  70. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/test_fileset.py +0 -0
  71. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/test_pyclass.py +0 -0
  72. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/test_smoke copy.sav +0 -0
  73. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/test_smoke.py +0 -0
  74. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12971126211a1}/tests/unit/test_stdlib.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.12968982426a1
3
+ Version: 0.0.1.12971126211a1
4
4
  Summary: DV Flow Manager is a build system for silicon design
5
5
  Author-email: Matthew Ballance <matt.ballance@gmail.com>
6
6
  License: Apache License
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "dv-flow-mgr"
8
- version = "0.0.1.12968982426a1"
8
+ version = "0.0.1.12971126211a1"
9
9
  dependencies = [
10
10
  'pydantic',
11
11
  'pyyaml',
@@ -20,10 +20,17 @@
20
20
  #*
21
21
  #****************************************************************************
22
22
  import argparse
23
+ import logging
23
24
  from .cmds.cmd_run import CmdRun
24
25
 
25
26
  def get_parser():
26
27
  parser = argparse.ArgumentParser(description='dv_flow_mgr')
28
+ parser.add_argument("-d", "--debug",
29
+ help="Enable debug",
30
+ action="store_true")
31
+ parser.add_argument("-v", "--verbose",
32
+ help="Enable verbose output",
33
+ action="store_true")
27
34
  subparsers = parser.add_subparsers(required=True)
28
35
 
29
36
  run_parser = subparsers.add_parser('run', help='run a flow')
@@ -35,6 +42,12 @@ def get_parser():
35
42
  def main():
36
43
  parser = get_parser()
37
44
  args = parser.parse_args()
45
+
46
+ if args.debug:
47
+ logging.basicConfig(level=logging.DEBUG)
48
+ elif args.verbose:
49
+ logging.basicConfig(level=logging.INFO)
50
+
38
51
  args.func(args)
39
52
 
40
53
  if __name__ == "__main__":
@@ -1,5 +1,7 @@
1
1
  import asyncio
2
2
  import os
3
+ import logging
4
+ from typing import ClassVar
3
5
  from ..task_graph_runner import TaskGraphRunner
4
6
  from ..util import loadProjPkgDef
5
7
  from ..task_graph_builder import TaskGraphBuilder
@@ -8,6 +10,7 @@ from ..pkg_rgy import PkgRgy
8
10
 
9
11
 
10
12
  class CmdRun(object):
13
+ _log : ClassVar = logging.getLogger("CmdRun")
11
14
 
12
15
  def __call__(self, args):
13
16
 
@@ -17,7 +20,7 @@ class CmdRun(object):
17
20
  if pkg is None:
18
21
  raise Exception("Failed to find a 'flow.dv' file that defines a package in %s or its parent directories" % os.getcwd())
19
22
 
20
- print("pkg: %s" % pkg.name)
23
+ self._log.debug("Root flow file defines package: %s" % pkg.name)
21
24
 
22
25
  if len(args.tasks) > 0:
23
26
  pass
@@ -20,7 +20,8 @@
20
20
  #*
21
21
  #****************************************************************************
22
22
  import dataclasses as dc
23
- from typing import Any, Dict
23
+ import logging
24
+ from typing import Any, ClassVar, Dict
24
25
  from .task import TaskCtor
25
26
 
26
27
  @dc.dataclass
@@ -30,8 +31,10 @@ class Package(object):
30
31
  # Package holds constructors for tasks
31
32
  # - Dict holds the default parameters for the task
32
33
  tasks : Dict[str,TaskCtor] = dc.field(default_factory=dict)
34
+ _log : ClassVar = logging.getLogger("Package")
33
35
 
34
36
  def getTaskCtor(self, name : str) -> TaskCtor:
37
+ self._log.debug("-- %s::getTaskCtor: %s" % (self.name, name))
35
38
  if name not in self.tasks.keys():
36
39
  raise Exception("Task %s not present in package %s" % (name, self.name))
37
40
  return self.tasks[name]
@@ -32,7 +32,7 @@ from typing import Any, Dict, List, Callable, Tuple, ClassVar
32
32
  from .fragment_def import FragmentDef
33
33
  from .package import Package
34
34
  from .package_import_spec import PackageImportSpec, PackageSpec
35
- from .task import TaskCtor, TaskParams
35
+ from .task import TaskCtor, TaskCtorProxy, TaskCtorCls, TaskCtorParam, TaskCtorParamCls
36
36
  from .task_def import TaskDef, TaskSpec
37
37
  from .std.task_null import TaskNull
38
38
 
@@ -90,53 +90,131 @@ class PackageDef(BaseModel):
90
90
  self._log.debug("<-- mkPackage %s" % self.name)
91
91
  return ret
92
92
 
93
- def mkTaskCtor(self, session, task, srcdir, tasks_m) -> TaskCtor:
94
- ctor_t : TaskCtor = None
93
+ def getTaskCtor(self, session, task_name, tasks_m):
94
+ self._log.debug("--> getTaskCtor")
95
+ # Find package (not package_def) that implements this task
96
+ # Insert an indirect reference to that tasks's constructor
97
+ last_dot = task_name.rfind('.')
98
+
99
+ if last_dot != -1:
100
+ pkg_name = task_name[:last_dot]
101
+ task_name = task_name[last_dot+1:]
102
+ else:
103
+ pkg_name = None
104
+
105
+ if pkg_name is not None:
106
+ self._log.debug("Package-qualified 'uses'")
107
+ pkg = session.getPackage(PackageSpec(pkg_name))
108
+ if pkg is None:
109
+ raise Exception("Failed to find package %s" % pkg_name)
110
+ ctor_t = pkg.getTaskCtor(task_name)
111
+ else:
112
+ self._log.debug("Unqualified 'uses'")
113
+ if task_name not in tasks_m.keys():
114
+ raise Exception("Failed to find task %s" % task_name)
115
+ if len(tasks_m[task_name]) != 3:
116
+ raise Exception("Task %s not fully defined" % task_name)
95
117
 
96
- if task.uses is not None:
97
- # Find package (not package_def) that implements this task
98
- # Insert an indirect reference to that tasks's constructor
99
- last_dot = task.uses.rfind('.')
118
+ ctor_t = tasks_m[task_name][2]
119
+ return ctor_t
100
120
 
101
- if last_dot != -1:
102
- pkg_name = task.uses[:last_dot]
103
- task_name = task.uses[last_dot+1:]
104
- else:
105
- pkg_name = None
106
- task_name = task.uses
107
-
108
- if pkg_name is not None:
109
- pkg = session.getPackage(PackageSpec(pkg_name))
110
- if pkg is None:
111
- raise Exception("Failed to find package %s" % pkg_name)
112
- ctor_t = pkg.getTaskCtor(task_name)
113
- ctor_t = ctor_t.copy()
114
- ctor_t.srcdir = srcdir
115
- else:
116
- if task_name not in tasks_m.keys():
117
- raise Exception("Failed to find task %s" % task_name)
118
- if len(tasks_m[task_name]) == 3:
119
- ctor_t = tasks_m[task_name][2].copy()
120
- ctor_t.srcdir = srcdir
121
- else:
122
- task_i = tasks_m[task_name]
123
- ctor_t = self.mkTaskCtor(
124
- session,
125
- task=task_i[0],
126
- srcdir=srcdir,
127
- tasks_m=tasks_m)
128
- tasks_m[task_name] = ctor_t
129
-
130
- if ctor_t is None:
131
- # Provide a default implementation
132
- ctor_t = TaskCtor(
133
- task_ctor=TaskNull,
134
- param_ctor=TaskParams,
135
- srcdir=srcdir)
121
+ def handleParams(self, task, ctor_t):
122
+
123
+ if task.params is not None and len(task.params) > 0:
124
+ decl_params = False
125
+
126
+ # First, add in a parameter-setting stage
127
+ ctor_t = TaskCtorParam(
128
+ name=ctor_t.name,
129
+ uses=ctor_t,
130
+ srcdir=ctor_t.srcdir)
131
+ # ctor_t.params.update(task.params)
132
+
133
+ for value in task.params.values():
134
+ if "type" in value:
135
+ decl_params = True
136
+ break
137
+
138
+ if decl_params:
139
+ # We need to combine base parameters with new parameters
140
+ field_m = {}
141
+ # First, add parameters from the base class
142
+ base_o = ctor_t.mkParams()
143
+ for fname,info in base_o.model_fields.items():
144
+ self._log.debug("Field: %s (%s)" % (fname, info.default))
145
+ field_m[fname] = (info.annotation, info.default)
146
+ ptype_m = {
147
+ "str" : str,
148
+ "int" : int,
149
+ "float" : float,
150
+ "bool" : bool,
151
+ "list" : List
152
+ }
153
+ pdflt_m = {
154
+ "str" : "",
155
+ "int" : 0,
156
+ "float" : 0.0,
157
+ "bool" : False,
158
+ "list" : []
159
+ }
160
+ for p in task.params.keys():
161
+ param = task.params[p]
162
+ if type(param) == dict and "type" in param.keys():
163
+ ptype_s = param["type"]
164
+ if ptype_s not in ptype_m.keys():
165
+ raise Exception("Unknown type %s" % ptype_s)
166
+ ptype = ptype_m[ptype_s]
167
+
168
+ if p in field_m.keys():
169
+ raise Exception("Duplicate field %s" % p)
170
+ if "value" in param.keys():
171
+ field_m[p] = (ptype, param["value"])
172
+ else:
173
+ field_m[p] = (ptype, pdflt_m[ptype_s])
174
+ else:
175
+ if p not in field_m.keys():
176
+ raise Exception("Field %s not found" % p)
177
+ if type(param) != dict:
178
+ value = param
179
+ elif "value" in param.keys():
180
+ value = param["value"]
181
+ else:
182
+ raise Exception("No value specified for param %s: %s" % (
183
+ p, str(param)))
184
+ field_m[p] = (field_m[p][0], value)
185
+ self._log.debug("field_m: %s" % str(field_m))
186
+ param_t = pydantic.create_model(
187
+ "Task%sParams" % task.name, **field_m)
188
+ ctor_t = TaskCtorParamCls(
189
+ name=ctor_t.name,
190
+ uses=ctor_t,
191
+ params_ctor=param_t)
192
+ else: # no new parameters declared
193
+ for p in task.params.keys():
194
+ param = task.params[p]
195
+ if p not in field_m.keys():
196
+ raise Exception("Field %s not found" % p)
197
+ if type(param) != dict:
198
+ value = param
199
+ elif "value" in param.keys():
200
+ value = param["value"]
201
+ else:
202
+ raise Exception("No value specified for param %s: %s" % (
203
+ p, str(param)))
204
+ field_m[p] = (field_m[p][0], value)
205
+ ctor_t.params[p] = value
136
206
 
207
+ return ctor_t
208
+
209
+ def mkTaskCtor(self, session, task, srcdir, tasks_m) -> TaskCtor:
210
+ self._log.debug("--> %s::mkTaskCtor %s" % (self.name, task.name))
211
+ ctor_t : TaskCtor = None
212
+
213
+ # Determine the implementation constructor first
137
214
  if task.pyclass is not None:
138
215
  # Built-in impl
139
216
  # Now, lookup the class
217
+ self._log.debug("Use PyClass implementation")
140
218
  last_dot = task.pyclass.rfind('.')
141
219
  clsname = task.pyclass[last_dot+1:]
142
220
  modname = task.pyclass[:last_dot]
@@ -154,72 +232,36 @@ class PackageDef(BaseModel):
154
232
 
155
233
  if not hasattr(mod, clsname):
156
234
  raise Exception("Class %s not found in module %s" % (clsname, modname))
157
- ctor_t.task_ctor = getattr(mod, clsname)
158
-
159
- if task.uses is None:
160
- ctor_t.param_ctor = TaskParams
161
-
162
- decl_params = False
163
- for value in task.params.values():
164
- if "type" in value:
165
- decl_params = True
166
- break
167
-
168
- if decl_params:
169
- # We need to combine base parameters with new parameters
170
- field_m = {}
171
- # First, add parameters from the base class
172
- for fname,info in ctor_t.param_ctor.model_fields.items():
173
- self._log.debug("Field: %s (%s)" % (fname, info.default))
174
- field_m[fname] = (info.annotation, info.default)
175
- ptype_m = {
176
- "str" : str,
177
- "int" : int,
178
- "float" : float,
179
- "bool" : bool,
180
- "list" : List
181
- }
182
- pdflt_m = {
183
- "str" : "",
184
- "int" : 0,
185
- "float" : 0.0,
186
- "bool" : False,
187
- "list" : []
188
- }
189
- for p in task.params.keys():
190
- param = task.params[p]
191
- if type(param) == dict and "type" in param.keys():
192
- ptype_s = param["type"]
193
- if ptype_s not in ptype_m.keys():
194
- raise Exception("Unknown type %s" % ptype_s)
195
- ptype = ptype_m[ptype_s]
196
-
197
- if p in field_m.keys():
198
- raise Exception("Duplicate field %s" % p)
199
- if "value" in param.keys():
200
- field_m[p] = (ptype, param["value"])
201
- else:
202
- field_m[p] = (ptype, pdflt_m[ptype_s])
203
- else:
204
- if p not in field_m.keys():
205
- raise Exception("Field %s not found" % p)
206
- if type(param) != dict:
207
- value = param
208
- elif "value" in param.keys():
209
- value = param["value"]
210
- else:
211
- raise Exception("No value specified for param %s: %s" % (
212
- p, str(param)))
213
- field_m[p] = (field_m[p][0], value)
214
- self._log.debug("field_m: %s" % str(field_m))
215
- ctor_t.param_ctor = pydantic.create_model(
216
- "Task%sParams" % task.name, **field_m)
235
+ task_ctor = getattr(mod, clsname)
236
+
237
+ # Determine if we need to use a new
238
+
239
+ if task.uses is not None:
240
+ uses = self.getTaskCtor(session, task.uses, tasks_m)
241
+ else:
242
+ uses = None
243
+
244
+ ctor_t = TaskCtorCls(
245
+ name=task.name,
246
+ uses=uses,
247
+ task_ctor=task_ctor,
248
+ srcdir=srcdir)
249
+ elif task.uses is not None:
250
+ # Use the existing (base) to create the implementation
251
+ ctor_t = TaskCtor(
252
+ name=task.name,
253
+ uses=self.getTaskCtor(session, task.uses, tasks_m),
254
+ srcdir=srcdir)
217
255
  else:
218
- if len(task.params) > 0:
219
- ctor_t.params = task.params
220
- if len(task.depends) > 0:
221
- ctor_t.depends.extend(task.depends)
256
+ self._log.debug("Use 'Null' as the class implementation")
257
+ ctor_t = TaskCtorCls(
258
+ name=task.name,
259
+ task_ctor=TaskNull,
260
+ srcdir=srcdir)
261
+
262
+ ctor_t = self.handleParams(task, ctor_t)
222
263
 
264
+ self._log.debug("<-- %s::mkTaskCtor %s" % (self.name, task.name))
223
265
  return ctor_t
224
266
 
225
267
  @staticmethod
@@ -2,8 +2,9 @@
2
2
  import os
3
3
  import fnmatch
4
4
  import glob
5
+ import logging
5
6
  import pydantic.dataclasses as dc
6
- from typing import List, Tuple
7
+ from typing import ClassVar, List, Tuple
7
8
  from dv_flow.mgr import Task, TaskData, TaskMemento
8
9
  from dv_flow.mgr import FileSet as _FileSet
9
10
 
@@ -12,8 +13,10 @@ class TaskFileSetMemento(TaskMemento):
12
13
 
13
14
  class FileSet(Task):
14
15
 
16
+ _log : ClassVar = logging.getLogger("FileSet")
17
+
15
18
  async def run(self, input : TaskData) -> TaskData:
16
- print("TaskFileSet run: %s: basedir=%s, base=%s type=%s include=%s" % (
19
+ self._log.debug("TaskFileSet run: %s: basedir=%s, base=%s type=%s include=%s" % (
17
20
  self.name,
18
21
  self.srcdir,
19
22
  self.params.base, self.params.type, str(self.params.include)
@@ -52,8 +55,8 @@ class FileSet(Task):
52
55
  if ex_memento is not None and not input.changed:
53
56
  ex_memento.files.sort(key=lambda x: x[0])
54
57
  memento.files.sort(key=lambda x: x[0])
55
- print("ex_memento.files: %s" % str(ex_memento.files))
56
- print("memento.files: %s" % str(memento.files))
58
+ self._log.debug("ex_memento.files: %s" % str(ex_memento.files))
59
+ self._log.debug("memento.files: %s" % str(memento.files))
57
60
  input.changed = ex_memento != memento
58
61
  else:
59
62
  input.changed = True
@@ -6,5 +6,6 @@ class TaskNull(Task):
6
6
 
7
7
  async def run(self, input : TaskData) -> TaskData:
8
8
  # No memento ; data pass-through
9
+ self._log.debug("%s: TaskNull.run" % self.name)
9
10
  return input
10
11