dv-flow-mgr 0.0.1.13979842530a1__tar.gz → 0.0.1.14097297609a1__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 (123) hide show
  1. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/Makefile +2 -1
  3. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/Roadmap.md +2 -0
  4. dv_flow_mgr-0.0.1.14097297609a1/docs/cmdref.rst +9 -0
  5. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/conf.py +1 -0
  6. dv_flow_mgr-0.0.1.14097297609a1/docs/index.rst +21 -0
  7. dv_flow_mgr-0.0.1.14097297609a1/docs/pytask_api.rst +61 -0
  8. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/ivpm.yaml +2 -0
  9. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/pyproject.toml +1 -1
  10. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/__init__.py +2 -2
  11. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/__main__.py +26 -1
  12. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/cmds/cmd_graph.py +82 -0
  13. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/cmds/cmd_run.py +2 -2
  14. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/cmds/cmd_show.py +107 -0
  15. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/fileset.py +1 -0
  16. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/fragment_def.py +1 -1
  17. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/package.py +3 -3
  18. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/package_def.py +121 -33
  19. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/param_def.py +8 -3
  20. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/std/message.py +1 -1
  21. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/task_data.py +24 -20
  22. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/task_def.py +0 -1
  23. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/task_graph_builder.py +121 -12
  24. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/task_graph_dot_writer.py +78 -0
  25. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/task_node.py +102 -0
  26. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/task_node_compound.py +13 -1
  27. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/task_node_ctor.py +118 -0
  28. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/task_node_ctor_compound.py +117 -0
  29. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/task_node_ctor_compound_proxy.py +65 -0
  30. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/task_node_ctor_def_base.py +47 -0
  31. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/task_node_ctor_proxy.py +56 -0
  32. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/task_node_ctor_task.py +64 -0
  33. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/task_node_ctor_wrapper.py +96 -0
  34. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/task_node_leaf.py +170 -0
  35. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/task_runner.py +11 -6
  36. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/util/__init__.py +3 -0
  37. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/util/__main__.py +36 -0
  38. dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/util/cmds/cmd_schema.py +63 -0
  39. {dv_flow_mgr-0.0.1.13979842530a1/src/dv_flow/mgr → dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/util}/util.py +1 -1
  40. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  41. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +18 -6
  42. dv_flow_mgr-0.0.1.14097297609a1/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
  43. dv_flow_mgr-0.0.1.14097297609a1/tests/unit/test_compound_task.py +194 -0
  44. dv_flow_mgr-0.0.1.14097297609a1/tests/unit/test_dataflow.py +91 -0
  45. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_fileset.py +1 -1
  46. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_markers.py +2 -8
  47. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_pytask_smoke.py +2 -4
  48. dv_flow_mgr-0.0.1.13979842530a1/docs/index.rst +0 -34
  49. dv_flow_mgr-0.0.1.13979842530a1/docs/intro.rst +0 -191
  50. dv_flow_mgr-0.0.1.13979842530a1/docs/pytask_api.rst +0 -13
  51. dv_flow_mgr-0.0.1.13979842530a1/docs/reference.rst +0 -53
  52. dv_flow_mgr-0.0.1.13979842530a1/docs/stdlib.rst +0 -6
  53. dv_flow_mgr-0.0.1.13979842530a1/src/dv_flow/mgr/task.py +0 -181
  54. dv_flow_mgr-0.0.1.13979842530a1/src/dv_flow/mgr/task_ctor.py +0 -64
  55. dv_flow_mgr-0.0.1.13979842530a1/src/dv_flow/mgr/task_node.py +0 -425
  56. dv_flow_mgr-0.0.1.13979842530a1/tests/unit/test_compound_task.py +0 -44
  57. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/.github/workflows/ci.yml +0 -0
  58. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/.gitignore +0 -0
  59. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/.vscode/settings.json +0 -0
  60. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/LICENSE +0 -0
  61. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/README.md +0 -0
  62. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/KeyArchitecture.md +0 -0
  63. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/Notes.md +0 -0
  64. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/RundirLayout.md +0 -0
  65. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/Stages.md +0 -0
  66. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/Steps.md +0 -0
  67. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/Tasks.md +0 -0
  68. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/TypesAndDefs.md +0 -0
  69. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/Usecases.md +0 -0
  70. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/docs/quickstart.rst +0 -0
  71. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/fwperiph_dma.pss +0 -0
  72. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/setup.cfg +0 -0
  73. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/eval_jq.py +0 -0
  74. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/expr_eval.py +0 -0
  75. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/expr_parser.py +0 -0
  76. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/out +0 -0
  77. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
  78. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/param.py +0 -0
  79. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/param_ref_eval.py +0 -0
  80. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/parsetab.py +0 -0
  81. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/pkg_rgy.py +0 -0
  82. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/share/flow.json +0 -0
  83. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/std/create_file.py +0 -0
  84. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/std/exec.py +0 -0
  85. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/std/fileset.py +0 -0
  86. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/std/flow.dv +0 -0
  87. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/std/task_null.py +0 -0
  88. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/task_listener_log.py +0 -0
  89. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/task_output.py +0 -0
  90. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/task_params_ctor.py +0 -0
  91. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/type.py +0 -0
  92. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow/mgr/type_def.py +0 -0
  93. /dv_flow_mgr-0.0.1.13979842530a1/tests/unit/data/fileset/test1 copy/files1/file1_1.sv → /dv_flow_mgr-0.0.1.14097297609a1/src/dv_flow/mgr/util/cmds/__init__.py +0 -0
  94. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  95. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  96. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  97. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  98. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/examples/example1/example1.flow +0 -0
  99. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/system/test_depends.py +0 -0
  100. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/system/test_pkg_discovery.py +0 -0
  101. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/system/test_stdlib.py +0 -0
  102. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/__init__.py +0 -0
  103. /dv_flow_mgr-0.0.1.13979842530a1/tests/unit/data/fileset/test1/files1/file1_2.sv → /dv_flow_mgr-0.0.1.14097297609a1/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
  104. /dv_flow_mgr-0.0.1.13979842530a1/tests/unit/data/fileset/test1/files2/file2_1.sv → /dv_flow_mgr-0.0.1.14097297609a1/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
  105. /dv_flow_mgr-0.0.1.13979842530a1/tests/unit/data/fileset/test1/files2/file2_2.sv → /dv_flow_mgr-0.0.1.14097297609a1/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
  106. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  107. {dv_flow_mgr-0.0.1.13979842530a1/tests/unit/data/fileset/test1 → dv_flow_mgr-0.0.1.14097297609a1/tests/unit/data/fileset/test1 copy}/files1/file1_1.sv +0 -0
  108. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
  109. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
  110. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
  111. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  112. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  113. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  114. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  115. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_data_merge.py +0 -0
  116. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_expr_eval.py +0 -0
  117. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_expr_parser.py +0 -0
  118. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_imports.py +0 -0
  119. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_parse.py +0 -0
  120. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_pyclass.py +0 -0
  121. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_smoke copy.sav +0 -0
  122. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_smoke.py +0 -0
  123. {dv_flow_mgr-0.0.1.13979842530a1 → dv_flow_mgr-0.0.1.14097297609a1}/tests/unit/test_stdlib.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.13979842530a1
3
+ Version: 0.0.1.14097297609a1
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
@@ -1,4 +1,5 @@
1
1
  DOCS_DIR:=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))
2
+ PROJ_DIR:=$(shell cd $(DOCS_DIR)/.. ; pwd)
2
3
  # Minimal makefile for Sphinx documentation
3
4
  #
4
5
 
@@ -18,4 +19,4 @@ help:
18
19
  # Catch-all target: route all unknown targets to Sphinx using the new
19
20
  # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
20
21
  %: Makefile
21
- @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
22
+ @PYTHONPATH=$(PROJ_DIR)/src:$(PYTHONPATH) $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
@@ -129,3 +129,5 @@ are evaluated.
129
129
  - Enables users to easily click on first N warnings/errors in each step
130
130
  without needing to find and open a logfile
131
131
  - Allow files to be attached as part of the result
132
+
133
+ - Allow need relationships to be conditional
@@ -0,0 +1,9 @@
1
+ #################
2
+ Command reference
3
+ #################
4
+
5
+ .. argparse::
6
+ :module: dv_flow.mgr.__main__
7
+ :func: get_parser
8
+ :prog: dfm
9
+
@@ -14,6 +14,7 @@ author = 'Matthew Ballance'
14
14
  # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
15
15
 
16
16
  extensions = [
17
+ 'sphinxarg.ext',
17
18
  'sphinx-jsonschema',
18
19
  'sphinxcontrib.mermaid',
19
20
  'sphinxcontrib-dv-flow'
@@ -0,0 +1,21 @@
1
+ .. DV Flow Manager documentation master file, created by
2
+ sphinx-quickstart on Tue Jan 7 02:06:13 2025.
3
+ You can adapt this file completely to your liking, but it should at least
4
+ contain the root `toctree` directive.
5
+
6
+ DV Flow Manager
7
+ ===============
8
+
9
+ DV Flow Manager is an execution engine for the DV Flow build
10
+ specification. This YAML-based format captures design and verification
11
+ (DV) tasks and dataflow in a way that enables concurrent execution and
12
+ efficient avoidance of redundant work.
13
+ You can learn more about the input specification <here>.
14
+
15
+ .. toctree::
16
+ :maxdepth: 2
17
+ :caption: Contents:
18
+
19
+ quickstart
20
+ cmdref
21
+ pytask_api
@@ -0,0 +1,61 @@
1
+ ===============
2
+ Python Task API
3
+ ===============
4
+
5
+ The core implementation for tasks is provided by a Python `async` method.
6
+ This method is passed two parameters:
7
+
8
+ * `runner` - Services that the task runner provides for the use of tasks
9
+ * `input` - The input data for the task
10
+
11
+ The method must return a `TaskDataResult` object with the execution
12
+ status of the task, result data, markers, and memento data.
13
+
14
+ TaskDataInput
15
+ =============
16
+
17
+ An object of type `TaskDataInput` is passed as the `input` parameter
18
+ of the runner method.
19
+
20
+ .. autoclass:: dv_flow.mgr.TaskDataInput
21
+ :members:
22
+ :exclude-members: model_config
23
+
24
+ TaskDataItem
25
+ =============
26
+
27
+ Data is passed between tasks via `TaskDataItem`-derived objects.
28
+ Each task may produce 0 or more `TaskDataItem` objects as output.
29
+ A task receives all the `TaskDataItem` objects produced by its
30
+ dependencies.
31
+
32
+ .. autoclass:: dv_flow.mgr.TaskDataItem
33
+ :members:
34
+ :exclude-members: model_config
35
+
36
+
37
+ TaskDataResult
38
+ ==============
39
+ Task implementation methods must return an object of type
40
+ `TaskDataResult`. This object contains key data about
41
+ task execution.
42
+
43
+ .. autoclass:: dv_flow.mgr.TaskDataResult
44
+ :members:
45
+ :exclude-members: model_config
46
+
47
+ TaskMarker
48
+ ==========
49
+ Tasks may produce markers to highlight key information to the
50
+ user. A marker is typically a pointer to a file location with
51
+ an associated severity level (error, warning, info).
52
+
53
+
54
+ .. autoclass:: dv_flow.mgr.TaskMarker
55
+ :members:
56
+ :exclude-members: model_config
57
+
58
+ .. autoclass:: dv_flow.mgr.TaskMarkerLoc
59
+ :members:
60
+ :exclude-members: model_config
61
+
@@ -21,6 +21,8 @@ package:
21
21
  src: pypi
22
22
  - name: Sphinx
23
23
  src: pypi
24
+ - name: sphinx-argparse
25
+ src: pypi
24
26
  - name: sphinx-jsonschema
25
27
  # src: pypi
26
28
  url: https://github.com/lnoor/sphinx-jsonschema.git
@@ -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.13979842530a1"
8
+ version = "0.0.1.14097297609a1"
9
9
  dependencies = [
10
10
  'jq',
11
11
  'pydantic',
@@ -21,10 +21,10 @@
21
21
  #****************************************************************************
22
22
  from .package_def import *
23
23
  from .pkg_rgy import PkgRgy
24
- from .task import *
25
24
  from .task_data import *
26
25
  from .task_graph_builder import TaskGraphBuilder
27
- from .task_node import task
26
+ from .task_runner import TaskRunner
27
+ from .task_node_ctor_wrapper import task
28
28
  from .task_runner import TaskSetRunner
29
29
  from .task_listener_log import TaskListenerLog
30
30
 
@@ -21,10 +21,14 @@
21
21
  #****************************************************************************
22
22
  import argparse
23
23
  import logging
24
+ from .cmds.cmd_graph import CmdGraph
24
25
  from .cmds.cmd_run import CmdRun
26
+ from .cmds.cmd_show import CmdShow
25
27
 
26
28
  def get_parser():
27
- parser = argparse.ArgumentParser(description='dv_flow_mgr')
29
+ parser = argparse.ArgumentParser(
30
+ description='dv_flow_mgr',
31
+ prog='dfm')
28
32
  # parser.add_argument("-d", "--debug",
29
33
  # help="Enable debug",
30
34
  # action="store_true")
@@ -36,6 +40,16 @@ def get_parser():
36
40
  # action="store_true")
37
41
  subparsers = parser.add_subparsers(required=True)
38
42
 
43
+ graph_parser = subparsers.add_parser('graph',
44
+ help='Generates the graph of a task')
45
+ graph_parser.add_argument("task", nargs="?", help="task to graph")
46
+ graph_parser.add_argument("-f", "--format", help="Specifies the output format",
47
+ default="dot")
48
+ graph_parser.add_argument("-o", "--output",
49
+ help="Specifies the output file",
50
+ default="-")
51
+ graph_parser.set_defaults(func=CmdGraph())
52
+
39
53
  run_parser = subparsers.add_parser('run', help='run a flow')
40
54
  run_parser.add_argument("tasks", nargs='*', help="tasks to run")
41
55
  run_parser.add_argument("-j",
@@ -43,6 +57,17 @@ def get_parser():
43
57
  type=int, default=-1)
44
58
  run_parser.set_defaults(func=CmdRun())
45
59
 
60
+ show_parser = subparsers.add_parser('show',
61
+ help='Display information about a task or tasks')
62
+ show_parser.add_argument("task", nargs='?', help="task to show")
63
+ show_parser.add_argument("-a", "--all",
64
+ action="store_true",
65
+ help="Shows all tasks required for the subject to run")
66
+ show_parser.add_argument("-v", "--verbose",
67
+ action="store_true",
68
+ help="Shows additional information about tasks")
69
+ show_parser.set_defaults(func=CmdShow())
70
+
46
71
  return parser
47
72
 
48
73
  def main():
@@ -0,0 +1,82 @@
1
+ #****************************************************************************
2
+ #* cmd_graph.py
3
+ #*
4
+ #* Copyright 2023-2025 Matthew Ballance and Contributors
5
+ #*
6
+ #* Licensed under the Apache License, Version 2.0 (the "License"); you may
7
+ #* not use this file except in compliance with the License.
8
+ #* You may obtain a copy of the License at:
9
+ #*
10
+ #* http://www.apache.org/licenses/LICENSE-2.0
11
+ #*
12
+ #* Unless required by applicable law or agreed to in writing, software
13
+ #* distributed under the License is distributed on an "AS IS" BASIS,
14
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ #* See the License for the specific language governing permissions and
16
+ #* limitations under the License.
17
+ #*
18
+ #* Created on:
19
+ #* Author:
20
+ #*
21
+ #****************************************************************************
22
+ import asyncio
23
+ import os
24
+ import logging
25
+ from typing import ClassVar
26
+ from ..util import loadProjPkgDef
27
+ from ..task_graph_builder import TaskGraphBuilder
28
+ from ..task_runner import TaskSetRunner
29
+ from ..task_listener_log import TaskListenerLog
30
+ from ..pkg_rgy import PkgRgy
31
+ from ..task_graph_dot_writer import TaskGraphDotWriter
32
+
33
+
34
+ class CmdGraph(object):
35
+ _log : ClassVar = logging.getLogger("CmdGraph")
36
+
37
+ def __call__(self, args):
38
+
39
+ # First, find the project we're working with
40
+ pkg = loadProjPkgDef(os.getcwd())
41
+
42
+ if pkg is None:
43
+ raise Exception("Failed to find a 'flow.dv' file that defines a package in %s or its parent directories" % os.getcwd())
44
+
45
+ self._log.debug("Root flow file defines package: %s" % pkg.name)
46
+
47
+ if args.task is None:
48
+ # Print out available tasks
49
+ tasks = []
50
+ for task in pkg.tasks:
51
+ tasks.append(task)
52
+ for frag in pkg._fragment_l:
53
+ for task in frag.tasks:
54
+ tasks.append(task)
55
+ tasks.sort(key=lambda x: x.name)
56
+
57
+ max_name_len = 0
58
+ for t in tasks:
59
+ if len(t.name) > max_name_len:
60
+ max_name_len = len(t.name)
61
+
62
+ print("No task specified. Available Tasks:")
63
+ for t in tasks:
64
+ desc = t.desc
65
+ if desc is None or t.desc == "":
66
+ "<no descripion>"
67
+ print("%s - %s" % (t.name.ljust(max_name_len), desc))
68
+ else:
69
+ rundir = os.path.join(pkg._basedir, "rundir")
70
+
71
+ builder = TaskGraphBuilder(root_pkg=pkg, rundir=rundir)
72
+
73
+ t = builder.mkTaskGraph(pkg.name + "." + args.task)
74
+
75
+ TaskGraphDotWriter().write(
76
+ t,
77
+ "-"
78
+ )
79
+
80
+ return 0
81
+
82
+
@@ -50,7 +50,7 @@ class CmdRun(object):
50
50
  tasks = []
51
51
  for task in pkg.tasks:
52
52
  tasks.append(task)
53
- for frag in pkg.fragment_l:
53
+ for frag in pkg._fragment_l:
54
54
  for task in frag.tasks:
55
55
  tasks.append(task)
56
56
  tasks.sort(key=lambda x: x.name)
@@ -75,7 +75,7 @@ class CmdRun(object):
75
75
  # Maybe separate into a task-graph builder and a task-graph runner
76
76
 
77
77
  # TODO: allow user to specify run root -- maybe relative to some fixed directory?
78
- rundir = os.path.join(pkg.basedir, "rundir")
78
+ rundir = os.path.join(pkg._basedir, "rundir")
79
79
 
80
80
  builder = TaskGraphBuilder(root_pkg=pkg, rundir=rundir)
81
81
  runner = TaskSetRunner(rundir)
@@ -0,0 +1,107 @@
1
+ #****************************************************************************
2
+ #* cmd_show.py
3
+ #*
4
+ #* Copyright 2023-2025 Matthew Ballance and Contributors
5
+ #*
6
+ #* Licensed under the Apache License, Version 2.0 (the "License"); you may
7
+ #* not use this file except in compliance with the License.
8
+ #* You may obtain a copy of the License at:
9
+ #*
10
+ #* http://www.apache.org/licenses/LICENSE-2.0
11
+ #*
12
+ #* Unless required by applicable law or agreed to in writing, software
13
+ #* distributed under the License is distributed on an "AS IS" BASIS,
14
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ #* See the License for the specific language governing permissions and
16
+ #* limitations under the License.
17
+ #*
18
+ #* Created on:
19
+ #* Author:
20
+ #*
21
+ #****************************************************************************
22
+ import asyncio
23
+ import os
24
+ import logging
25
+ import toposort
26
+ from typing import ClassVar
27
+ from ..util import loadProjPkgDef
28
+ from ..task_graph_builder import TaskGraphBuilder
29
+ from ..task_runner import TaskSetRunner
30
+ from ..task_listener_log import TaskListenerLog
31
+ from ..pkg_rgy import PkgRgy
32
+ from ..task_graph_dot_writer import TaskGraphDotWriter
33
+
34
+
35
+ class CmdShow(object):
36
+ _log : ClassVar = logging.getLogger("CmdGraph")
37
+
38
+ def __call__(self, args):
39
+
40
+ # First, find the project we're working with
41
+ pkg = loadProjPkgDef(os.getcwd())
42
+
43
+ if pkg is None:
44
+ raise Exception("Failed to find a 'flow.dv' file that defines a package in %s or its parent directories" % os.getcwd())
45
+
46
+ self._log.debug("Root flow file defines package: %s" % pkg.name)
47
+
48
+ if args.task is None:
49
+ # Print out available tasks
50
+ tasks = []
51
+ for task in pkg.tasks:
52
+ tasks.append(task)
53
+ for frag in pkg._fragment_l:
54
+ for task in frag.tasks:
55
+ tasks.append(task)
56
+ tasks.sort(key=lambda x: x.name)
57
+
58
+ max_name_len = 0
59
+ for t in tasks:
60
+ if len(t.name) > max_name_len:
61
+ max_name_len = len(t.name)
62
+
63
+ print("No task specified. Available Tasks:")
64
+ for t in tasks:
65
+ desc = t.desc
66
+ if desc is None or t.desc == "":
67
+ "<no descripion>"
68
+ print("%s - %s" % (t.name.ljust(max_name_len), desc))
69
+ else:
70
+ rundir = os.path.join(pkg._basedir, "rundir")
71
+
72
+ builder = TaskGraphBuilder(root_pkg=pkg, rundir=rundir)
73
+
74
+
75
+ if args.all:
76
+ t = builder.mkTaskGraph(pkg.name + "." + args.task)
77
+ dep_m = TaskSetRunner(rundir=None).buildDepMap(t)
78
+
79
+ order = list(toposort.toposort(dep_m))
80
+
81
+ print("Task: %s" % t.name)
82
+
83
+ last_s = set()
84
+ for i,s in enumerate(order):
85
+ print("-- TaskSet %d --" % (i+1))
86
+ for t in s:
87
+ print(" - %s" % t.name)
88
+ if args.verbose and len(t.params.model_fields.items()):
89
+ print(" params:")
90
+ for name,field in t.params.model_fields.items():
91
+ print(" - %s: %s" % (name, getattr(t.params, name)))
92
+ if len(t.needs):
93
+ print(" needs:")
94
+ for n in t.needs:
95
+ print(" - %s%s" % (
96
+ n[0].name,
97
+ ("*" if n[0] in last_s else "")))
98
+ last_s = s
99
+
100
+ pass
101
+ else:
102
+ # Show show info about the current task
103
+ pass
104
+
105
+ return 0
106
+
107
+
@@ -29,6 +29,7 @@ class FileSet(BaseModel):
29
29
  basedir : str
30
30
  name : str = ""
31
31
  src : str = None
32
+ seq : int = -1
32
33
  files : List[str] = dc.Field(default_factory=list)
33
34
  incdirs: List[str] = dc.Field(default_factory=list)
34
35
  params : Dict[str,str] = dc.Field(default_factory=dict)
@@ -34,7 +34,7 @@ class FragmentDef(BaseModel):
34
34
  fragments: List[str] = dc.Field(default_factory=list)
35
35
  types : List[TypeDef] = dc.Field(default_factory=list)
36
36
 
37
- basedir : str = None
37
+ _basedir : str = None
38
38
 
39
39
  def getTask(self, name : str) -> 'TaskDef':
40
40
  for t in self.tasks:
@@ -22,7 +22,7 @@
22
22
  import dataclasses as dc
23
23
  import logging
24
24
  from typing import Any, ClassVar, Dict
25
- from .task_ctor import TaskCtor
25
+ from .task_node_ctor import TaskNodeCtor
26
26
 
27
27
  @dc.dataclass
28
28
  class Package(object):
@@ -30,11 +30,11 @@ class Package(object):
30
30
  params : Dict[str,Any] = dc.field(default_factory=dict)
31
31
  # Package holds constructors for tasks
32
32
  # - Dict holds the default parameters for the task
33
- tasks : Dict[str,TaskCtor] = dc.field(default_factory=dict)
33
+ tasks : Dict[str,TaskNodeCtor] = dc.field(default_factory=dict)
34
34
  types : Dict[str,Any] = dc.field(default_factory=dict)
35
35
  _log : ClassVar = logging.getLogger("Package")
36
36
 
37
- def getTaskCtor(self, name : str) -> TaskCtor:
37
+ def getTaskCtor(self, name : str) -> TaskNodeCtor:
38
38
  self._log.debug("-- %s::getTaskCtor: %s" % (self.name, name))
39
39
  if name not in self.tasks.keys():
40
40
  raise Exception("Task %s not present in package %s" % (name, self.name))