dv-flow-mgr 0.0.1.13730579777a1__tar.gz → 0.0.1.13777805368a1__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 (103) hide show
  1. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/pyproject.toml +1 -1
  3. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/__main__.py +1 -1
  4. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/cmds/cmd_run.py +2 -0
  5. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/pkg_rgy.py +4 -0
  6. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/std/fileset.py +2 -0
  7. dv_flow_mgr-0.0.1.13777805368a1/src/dv_flow/mgr/task_listener_log.py +50 -0
  8. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_runner.py +17 -6
  9. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  10. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +1 -0
  11. dv_flow_mgr-0.0.1.13777805368a1/tests/unit/test_markers.py +45 -0
  12. dv_flow_mgr-0.0.1.13730579777a1/src/dv_flow/mgr/task_listener_log.py +0 -27
  13. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/.github/workflows/ci.yml +0 -0
  14. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/.gitignore +0 -0
  15. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/.vscode/settings.json +0 -0
  16. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/LICENSE +0 -0
  17. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/README.md +0 -0
  18. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/KeyArchitecture.md +0 -0
  19. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/Makefile +0 -0
  20. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/Notes.md +0 -0
  21. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/Roadmap.md +0 -0
  22. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/RundirLayout.md +0 -0
  23. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/Stages.md +0 -0
  24. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/Steps.md +0 -0
  25. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/Tasks.md +0 -0
  26. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/TypesAndDefs.md +0 -0
  27. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/Usecases.md +0 -0
  28. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/conf.py +0 -0
  29. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/index.rst +0 -0
  30. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/intro.rst +0 -0
  31. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/quickstart.rst +0 -0
  32. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/docs/reference.rst +0 -0
  33. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/fwperiph_dma.pss +0 -0
  34. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/ivpm.yaml +0 -0
  35. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/setup.cfg +0 -0
  36. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/__init__.py +0 -0
  37. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/eval_jq.py +0 -0
  38. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/expr_eval.py +0 -0
  39. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/expr_parser.py +0 -0
  40. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/fileset.py +0 -0
  41. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/fragment_def.py +0 -0
  42. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/out +0 -0
  43. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/package.py +0 -0
  44. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/package_def.py +0 -0
  45. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
  46. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/param.py +0 -0
  47. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/param_def.py +0 -0
  48. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/param_ref_eval.py +0 -0
  49. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/parsetab.py +0 -0
  50. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/share/flow.json +0 -0
  51. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/std/exec.py +0 -0
  52. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/std/flow.dv +0 -0
  53. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/std/message.py +0 -0
  54. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/std/task_null.py +0 -0
  55. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task.py +0 -0
  56. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_ctor.py +0 -0
  57. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_data.py +0 -0
  58. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_def.py +0 -0
  59. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_exec_data.py +0 -0
  60. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_graph_builder.py +0 -0
  61. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_graph_runner.py +0 -0
  62. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_graph_runner_local.py +0 -0
  63. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_impl_data.py +0 -0
  64. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_memento.py +0 -0
  65. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_node.py +0 -0
  66. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_output.py +0 -0
  67. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/task_params_ctor.py +0 -0
  68. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/type.py +0 -0
  69. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/type_def.py +0 -0
  70. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow/mgr/util.py +0 -0
  71. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  72. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  73. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  74. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  75. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/examples/example1/example1.flow +0 -0
  76. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/system/test_depends.py +0 -0
  77. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/system/test_pkg_discovery.py +0 -0
  78. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/system/test_stdlib.py +0 -0
  79. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/__init__.py +0 -0
  80. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
  81. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
  82. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
  83. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
  84. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  85. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
  86. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
  87. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
  88. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
  89. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  90. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  91. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  92. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  93. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/test_data_merge.py +0 -0
  94. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/test_expr_eval.py +0 -0
  95. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/test_expr_parser.py +0 -0
  96. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/test_fileset.py +0 -0
  97. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/test_imports.py +0 -0
  98. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/test_parse.py +0 -0
  99. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/test_pyclass.py +0 -0
  100. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/test_pytask_smoke.py +0 -0
  101. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/test_smoke copy.sav +0 -0
  102. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/tests/unit/test_smoke.py +0 -0
  103. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13777805368a1}/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.13730579777a1
3
+ Version: 0.0.1.13777805368a1
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.13730579777a1"
8
+ version = "0.0.1.13777805368a1"
9
9
  dependencies = [
10
10
  'jq',
11
11
  'pydantic',
@@ -56,7 +56,7 @@ def main():
56
56
  }
57
57
  logging.basicConfig(level=opt_m[args.log_level])
58
58
 
59
- args.func(args)
59
+ return args.func(args)
60
60
 
61
61
  if __name__ == "__main__":
62
62
  main()
@@ -76,4 +76,6 @@ class CmdRun(object):
76
76
 
77
77
  asyncio.run(runner.run(tasks))
78
78
 
79
+ return runner.status
80
+
79
81
 
@@ -89,6 +89,7 @@ class PkgRgy(object):
89
89
  self._log.debug("<-- registerPackage %s" % pkg_def.name)
90
90
 
91
91
  def _discover_plugins(self):
92
+ self._log.debug("--> discover_plugins")
92
93
  # Register built-in package
93
94
  self._pkg_m["std"] = (os.path.join(os.path.dirname(__file__), "std/flow.dv"), None)
94
95
 
@@ -102,6 +103,7 @@ class PkgRgy(object):
102
103
  from importlib.metadata import entry_points
103
104
 
104
105
  discovered_plugins = entry_points(group='dv_flow.mgr')
106
+ self._log.debug("discovered_plugins: %s" % str(discovered_plugins))
105
107
  for p in discovered_plugins:
106
108
  try:
107
109
  mod = p.load()
@@ -110,6 +112,7 @@ class PkgRgy(object):
110
112
  pkg_m = mod.dvfm_packages()
111
113
 
112
114
  for name,path in pkg_m.items():
115
+ self._log.debug("Registering package %s: %s" % (name, path))
113
116
  if name in self._pkg_m.keys():
114
117
  raise Exception("Package %s already registered using path %s. Conflicting path: %s" % (
115
118
  name, self._pkg_m[name][0], path))
@@ -121,6 +124,7 @@ class PkgRgy(object):
121
124
  # self._pkgs = {}
122
125
  # for pkg in self._load_pkg_list():
123
126
  # self._pkgs[pkg.name] = pkg
127
+ self._log.debug("<-- discover_plugins")
124
128
 
125
129
  def copy(self):
126
130
  ret = PkgRgy()
@@ -43,6 +43,8 @@ async def FileSet(runner, input) -> TaskDataResult:
43
43
 
44
44
  _log.debug("glob_root: %s" % glob_root)
45
45
 
46
+ # TODO: throw error if 'type' is not set
47
+
46
48
  fs = _FileSet(
47
49
  filetype=input.params.type,
48
50
  src=input.name,
@@ -0,0 +1,50 @@
1
+ import dataclasses as dc
2
+ from rich.console import Console
3
+
4
+ @dc.dataclass
5
+ class TaskListenerLog(object):
6
+ console : Console = dc.field(default_factory=Console)
7
+ level : int = 0
8
+ quiet : bool = False
9
+
10
+ def event(self, task : 'Task', reason : 'Reason'):
11
+ if reason == 'enter':
12
+ self.level += 1
13
+ if not self.quiet:
14
+ self.console.print("[green]>[%d][/green] Task %s" % (self.level, task.name))
15
+ elif reason == 'leave':
16
+ if self.quiet:
17
+ if task.result.changed:
18
+ self.console.print("[green]Done:[/green] %s" % (task.name,))
19
+ else:
20
+ sev_pref_m = {
21
+ "info": "[blue]I[/blue]",
22
+ "warn": "[yellow]W[/yellow]",
23
+ "error": "[red]E[/red]",
24
+ }
25
+ for m in task.result.markers:
26
+ msg = " %s %s: %s" % (
27
+ sev_pref_m[m.severity],
28
+ task.name,
29
+ m.msg)
30
+
31
+ self.console.print(msg)
32
+
33
+ if m.loc is not None:
34
+ if m.loc.line != -1 and m.loc.pos != -1:
35
+ self.console.print(" %s:%d:%d" % (m.loc.path, m.loc.line, m.loc.pos))
36
+ elif m.loc.line != -1:
37
+ self.console.print(" %s:%d" % (m.loc.path, m.loc.line))
38
+ else:
39
+ self.console.print(" %s" % m.loc.path)
40
+
41
+ pass
42
+ if task.result.status == 0:
43
+ self.console.print("[green]<[%d][/green] Task %s" % (self.level, task.name))
44
+ else:
45
+ self.console.print("[red]<[%d][/red] Task %s" % (self.level, task.name))
46
+ self.level -= 1
47
+ else:
48
+ self.console.print("[red]-[/red] Task %s" % task.name)
49
+ pass
50
+
@@ -38,6 +38,7 @@ class TaskRunner(object):
38
38
  @dc.dataclass
39
39
  class TaskSetRunner(TaskRunner):
40
40
  nproc : int = 8
41
+ status : int = 0
41
42
 
42
43
  _anon_tid : int = 1
43
44
 
@@ -87,6 +88,7 @@ class TaskSetRunner(TaskRunner):
87
88
 
88
89
  active_task_l = []
89
90
  done_task_s = set()
91
+ self.status = 0
90
92
  for active_s in order:
91
93
  done = True
92
94
  for t in active_s:
@@ -101,11 +103,13 @@ class TaskSetRunner(TaskRunner):
101
103
  dst_memento[tt.name] = tt.result.memento.model_dump()
102
104
  else:
103
105
  dst_memento[tt.name] = None
106
+ status |= tt.result.status
104
107
  self._notify(tt, "leave")
105
108
  done_task_s.add(tt)
106
109
  active_task_l.pop(i)
107
110
  break
108
- if t not in done_task_s:
111
+
112
+ if self.status == 0 and t not in done_task_s:
109
113
  memento = src_memento.get(t.name, None)
110
114
  dirname = t.name
111
115
  invalid_chars_pattern = r'[\/:*?"<>|#%&{}\$\\!\'`;=@+]'
@@ -123,8 +127,13 @@ class TaskSetRunner(TaskRunner):
123
127
  rundir,
124
128
  memento))
125
129
  active_task_l.append((t, coro))
130
+
131
+ if self.status != 0:
132
+ self._log.debug("Exiting due to status: %d", self.status)
133
+ break
126
134
 
127
- # Now, wait for tasks to complete
135
+ # All pending tasks in the task-group have been launched
136
+ # Wait for them to all complete
128
137
  if len(active_task_l):
129
138
  # TODO: Shouldn't gather here -- reach to each completion
130
139
  coros = list(at[1] for at in active_task_l)
@@ -134,8 +143,13 @@ class TaskSetRunner(TaskRunner):
134
143
  dst_memento[tt[0].name] = tt[0].result.memento.model_dump()
135
144
  else:
136
145
  dst_memento[tt[0].name] = None
146
+ self.status |= tt[0].result.status
137
147
  self._notify(tt[0], "leave")
138
148
  active_task_l.clear()
149
+
150
+ if self.status != 0:
151
+ self._log.debug("Exiting due to status: %d", self.status)
152
+ break
139
153
 
140
154
  with open(os.path.join(self.rundir, "cache", "mementos.json"), "w") as f:
141
155
  json.dump(dst_memento, f)
@@ -145,10 +159,6 @@ class TaskSetRunner(TaskRunner):
145
159
  else:
146
160
  return task.output
147
161
 
148
-
149
-
150
- pass
151
-
152
162
  def _buildDepMap(self, dep_m, task : TaskNode):
153
163
  if task.name is None:
154
164
  task.name = "anon_%d" % self._anon_tid
@@ -176,6 +186,7 @@ class SingleTaskRunner(TaskRunner):
176
186
  # print("Field: %s" % field.name)
177
187
 
178
188
  input = TaskDataInput(
189
+ name=task.name,
179
190
  changed=changed,
180
191
  srcdir=task.srcdir,
181
192
  rundir=self.rundir,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.13730579777a1
3
+ Version: 0.0.1.13777805368a1
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
@@ -78,6 +78,7 @@ tests/unit/test_expr_eval.py
78
78
  tests/unit/test_expr_parser.py
79
79
  tests/unit/test_fileset.py
80
80
  tests/unit/test_imports.py
81
+ tests/unit/test_markers.py
81
82
  tests/unit/test_parse.py
82
83
  tests/unit/test_pyclass.py
83
84
  tests/unit/test_pytask_smoke.py
@@ -0,0 +1,45 @@
1
+ import asyncio
2
+ import pytest
3
+ from typing import List, Union
4
+ import dataclasses as dc
5
+ import pydantic.dataclasses as pdc
6
+ from pydantic import BaseModel
7
+ from dv_flow.mgr.param import Param, ParamT
8
+ from dv_flow.mgr.task import Task
9
+ from dv_flow.mgr.task_data import TaskDataResult, TaskMarker, TaskMarkerLoc
10
+ from dv_flow.mgr.task_node import task as t_decorator
11
+ from dv_flow.mgr.task_node import task
12
+ from dv_flow.mgr.task_runner import SingleTaskRunner, TaskSetRunner
13
+ from dv_flow.mgr.task_listener_log import TaskListenerLog
14
+
15
+ def test_smoke_1(tmpdir):
16
+
17
+ class Params(BaseModel):
18
+ p1 : str = None
19
+
20
+ called = False
21
+
22
+ @task(Params)
23
+ async def MyTask(runner, input):
24
+ nonlocal called
25
+ called = True
26
+ print("Hello from run")
27
+ return TaskDataResult(
28
+ status=1,
29
+ markers=[
30
+ TaskMarker(msg="testing", severity="info",
31
+ loc=TaskMarkerLoc(
32
+ path="file1",
33
+ line=1,
34
+ pos=1
35
+ ))
36
+ ]
37
+ )
38
+
39
+ task1 = MyTask("task1", srcdir="srcdir", p1="p1")
40
+ runner = TaskSetRunner("rundir")
41
+ runner.add_listener(TaskListenerLog().event)
42
+
43
+ result = asyncio.run(runner.run(task1))
44
+
45
+ assert called
@@ -1,27 +0,0 @@
1
- import dataclasses as dc
2
- from rich.console import Console
3
-
4
- @dc.dataclass
5
- class TaskListenerLog(object):
6
- console : Console = dc.field(default_factory=Console)
7
- level : int = 0
8
- quiet : bool = False
9
-
10
- def event(self, task : 'Task', reason : 'Reason'):
11
- if reason == 'enter':
12
- self.level += 1
13
- if not self.quiet:
14
- self.console.print("[green]>[%d][/green] Task %s" % (self.level, task.name))
15
- elif reason == 'leave':
16
- for m in task.result.markers:
17
- print(" %s" % m)
18
- if self.quiet:
19
- if task.result.changed:
20
- self.console.print("[green]Done:[/green] %s" % (task.name,))
21
- else:
22
- self.console.print("[green]<[%d][/green] Task %s" % (self.level, task.name))
23
- self.level -= 1
24
- else:
25
- self.console.print("[red]-[/red] Task %s" % task.name)
26
- pass
27
-