dv-flow-mgr 0.0.1.12968982426a1__tar.gz → 0.0.1.12981364130a1__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.12981364130a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/pyproject.toml +1 -1
  3. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/__main__.py +13 -0
  4. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/cmds/cmd_run.py +4 -1
  5. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/package.py +4 -1
  6. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/package_def.py +149 -106
  7. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/std/fileset.py +7 -4
  8. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/std/task_null.py +1 -0
  9. dv_flow_mgr-0.0.1.12981364130a1/src/dv_flow/mgr/task.py +292 -0
  10. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/task_data.py +11 -8
  11. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/task_graph_builder.py +36 -60
  12. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/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.12981364130a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  14. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +0 -2
  15. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/system/test_depends.py +6 -3
  16. dv_flow_mgr-0.0.1.12968982426a1/src/dv_flow/mgr/task.py +0 -163
  17. dv_flow_mgr-0.0.1.12968982426a1/tests/sys/test_depends.py +0 -143
  18. dv_flow_mgr-0.0.1.12968982426a1/tests/sys/test_pkg_discovery.py +0 -127
  19. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/.github/workflows/ci.yml +0 -0
  20. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/.gitignore +0 -0
  21. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/.vscode/settings.json +0 -0
  22. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/LICENSE +0 -0
  23. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/README.md +0 -0
  24. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/docs/Makefile +0 -0
  25. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/docs/Notes.md +0 -0
  26. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/docs/Roadmap.md +0 -0
  27. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/docs/Stages.md +0 -0
  28. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/docs/TypesAndDefs.md +0 -0
  29. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/docs/conf.py +0 -0
  30. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/docs/index.rst +0 -0
  31. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/docs/intro.rst +0 -0
  32. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/docs/quickstart.rst +0 -0
  33. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/docs/reference.rst +0 -0
  34. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/ivpm.yaml +0 -0
  35. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/setup.cfg +0 -0
  36. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/__init__.py +0 -0
  37. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/fileset.py +0 -0
  38. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/fragment_def.py +0 -0
  39. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
  40. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/pkg_rgy.py +0 -0
  41. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/share/flow.json +0 -0
  42. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/std/flow.dv +0 -0
  43. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/std/message.py +0 -0
  44. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/task_def.py +0 -0
  45. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/task_graph_runner.py +0 -0
  46. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/task_memento.py +0 -0
  47. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow/mgr/util.py +0 -0
  48. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  49. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  50. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  51. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  52. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/examples/example1/example1.flow +0 -0
  53. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/system/test_pkg_discovery.py +0 -0
  54. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/system/test_stdlib.py +0 -0
  55. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/unit/__init__.py +0 -0
  56. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/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.12981364130a1}/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.12981364130a1}/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.12981364130a1}/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.12981364130a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  61. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/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.12981364130a1}/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.12981364130a1}/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.12981364130a1}/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.12981364130a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  66. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  67. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  68. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  69. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/unit/test_data_merge.py +0 -0
  70. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/unit/test_fileset.py +0 -0
  71. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/unit/test_pyclass.py +0 -0
  72. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/unit/test_smoke copy.sav +0 -0
  73. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/tests/unit/test_smoke.py +0 -0
  74. {dv_flow_mgr-0.0.1.12968982426a1 → dv_flow_mgr-0.0.1.12981364130a1}/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.12981364130a1
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.12981364130a1"
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,132 @@ 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
+ field_m = {}
139
+ # First, add parameters from the base class
140
+ base_o = ctor_t.mkParams()
141
+ for fname,info in base_o.model_fields.items():
142
+ self._log.debug("Field: %s (%s)" % (fname, info.default))
143
+ field_m[fname] = (info.annotation, info.default)
144
+
145
+ if decl_params:
146
+ # We need to combine base parameters with new parameters
147
+ ptype_m = {
148
+ "str" : str,
149
+ "int" : int,
150
+ "float" : float,
151
+ "bool" : bool,
152
+ "list" : List
153
+ }
154
+ pdflt_m = {
155
+ "str" : "",
156
+ "int" : 0,
157
+ "float" : 0.0,
158
+ "bool" : False,
159
+ "list" : []
160
+ }
161
+ for p in task.params.keys():
162
+ param = task.params[p]
163
+ if type(param) == dict and "type" in param.keys():
164
+ ptype_s = param["type"]
165
+ if ptype_s not in ptype_m.keys():
166
+ raise Exception("Unknown type %s" % ptype_s)
167
+ ptype = ptype_m[ptype_s]
168
+
169
+ if p in field_m.keys():
170
+ raise Exception("Duplicate field %s" % p)
171
+ if "value" in param.keys():
172
+ field_m[p] = (ptype, param["value"])
173
+ else:
174
+ field_m[p] = (ptype, pdflt_m[ptype_s])
175
+ else:
176
+ if p not in field_m.keys():
177
+ raise Exception("Field %s not found" % p)
178
+ if type(param) != dict:
179
+ value = param
180
+ elif "value" in param.keys():
181
+ value = param["value"]
182
+ else:
183
+ raise Exception("No value specified for param %s: %s" % (
184
+ p, str(param)))
185
+ field_m[p] = (field_m[p][0], value)
186
+ self._log.debug("field_m: %s" % str(field_m))
187
+ param_t = pydantic.create_model(
188
+ "Task%sParams" % task.name, **field_m)
189
+ ctor_t = TaskCtorParamCls(
190
+ name=ctor_t.name,
191
+ uses=ctor_t,
192
+ params_ctor=param_t)
193
+ else: # no new parameters declared
194
+ for p in task.params.keys():
195
+ param = task.params[p]
196
+ if p not in field_m.keys():
197
+ raise Exception("Field %s not found" % p)
198
+ if type(param) != dict:
199
+ value = param
200
+ elif "value" in param.keys():
201
+ value = param["value"]
202
+ else:
203
+ raise Exception("No value specified for param %s: %s" % (
204
+ p, str(param)))
205
+ field_m[p] = (field_m[p][0], value)
206
+ ctor_t.params[p] = value
136
207
 
208
+ return ctor_t
209
+
210
+ def mkTaskCtor(self, session, task, srcdir, tasks_m) -> TaskCtor:
211
+ self._log.debug("--> %s::mkTaskCtor %s" % (self.name, task.name))
212
+ ctor_t : TaskCtor = None
213
+
214
+ # Determine the implementation constructor first
137
215
  if task.pyclass is not None:
138
216
  # Built-in impl
139
217
  # Now, lookup the class
218
+ self._log.debug("Use PyClass implementation")
140
219
  last_dot = task.pyclass.rfind('.')
141
220
  clsname = task.pyclass[last_dot+1:]
142
221
  modname = task.pyclass[:last_dot]
@@ -154,72 +233,36 @@ class PackageDef(BaseModel):
154
233
 
155
234
  if not hasattr(mod, clsname):
156
235
  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)
236
+ task_ctor = getattr(mod, clsname)
237
+
238
+ # Determine if we need to use a new
239
+
240
+ if task.uses is not None:
241
+ uses = self.getTaskCtor(session, task.uses, tasks_m)
242
+ else:
243
+ uses = None
244
+
245
+ ctor_t = TaskCtorCls(
246
+ name=task.name,
247
+ uses=uses,
248
+ task_ctor=task_ctor,
249
+ srcdir=srcdir)
250
+ elif task.uses is not None:
251
+ # Use the existing (base) to create the implementation
252
+ ctor_t = TaskCtor(
253
+ name=task.name,
254
+ uses=self.getTaskCtor(session, task.uses, tasks_m),
255
+ srcdir=srcdir)
217
256
  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)
257
+ self._log.debug("Use 'Null' as the class implementation")
258
+ ctor_t = TaskCtorCls(
259
+ name=task.name,
260
+ task_ctor=TaskNull,
261
+ srcdir=srcdir)
262
+
263
+ ctor_t = self.handleParams(task, ctor_t)
222
264
 
265
+ self._log.debug("<-- %s::mkTaskCtor %s" % (self.name, task.name))
223
266
  return ctor_t
224
267
 
225
268
  @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