dv-flow-mgr 0.0.2.14180132375a1__tar.gz → 1.0.0.14370600369a1__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.
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/PKG-INFO +1 -1
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Roadmap.md +28 -14
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Stages.md +20 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/pyproject.toml +1 -1
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/__init__.py +2 -1
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/cmds/cmd_graph.py +2 -3
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/cmds/cmd_run.py +7 -9
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/cmds/cmd_show.py +1 -2
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/cond_def.py +16 -0
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/config.py +7 -0
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/config_def.py +33 -0
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/exec_callable.py +88 -0
- dv_flow_mgr-0.0.2.14180132375a1/src/dv_flow/mgr/pkg_rgy.py → dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/ext_rgy.py +44 -35
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/extend_def.py +21 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/fragment_def.py +4 -3
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/need_def.py +6 -0
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/null_callable.py +10 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/package.py +30 -6
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/package_def.py +172 -0
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/package_loader.py +701 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/param_def.py +2 -1
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/parser.out +567 -0
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/pytask_callable.py +25 -0
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/root_package.py +9 -0
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/shell_callable.py +14 -0
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/srcinfo.py +15 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/flow.dv +25 -4
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/task.py +68 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_def.py +36 -24
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/task_graph_builder.py +684 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_listener_log.py +4 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor.py +11 -3
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_compound.py +30 -34
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_leaf.py +25 -3
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_params_ctor.py +0 -1
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_run_ctxt.py +4 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_runner.py +2 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/util/cmds/cmd_schema.py +0 -2
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/util/util.py +4 -3
- dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/yaml_srcinfo_loader.py +55 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +20 -1
- dv_flow_mgr-1.0.0.14370600369a1/tests/unit/marker_collector.py +22 -0
- dv_flow_mgr-1.0.0.14370600369a1/tests/unit/task_listener_test.py +11 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_compound_task.py +81 -8
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_fileset.py +12 -11
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_imports.py +6 -6
- dv_flow_mgr-1.0.0.14370600369a1/tests/unit/test_load_package.py +332 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_pyclass.py +75 -17
- dv_flow_mgr-1.0.0.14370600369a1/tests/unit/test_pyexec.py +41 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_smoke.py +8 -5
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_stdlib.py +2 -2
- dv_flow_mgr-0.0.2.14180132375a1/src/dv_flow/mgr/package_def.py +0 -573
- dv_flow_mgr-0.0.2.14180132375a1/src/dv_flow/mgr/task_graph_builder.py +0 -421
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/.github/workflows/ci.yml +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/.gitignore +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/.vscode/settings.json +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/LICENSE +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/README.md +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/ChangeLog.md +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/KeyArchitecture.md +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Makefile +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Notes.md +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/RundirLayout.md +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Steps.md +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Tasks.md +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/TypesAndDefs.md +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Usecases.md +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/cmdref.rst +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/conf.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/index.rst +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/pytask_api.rst +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/quickstart.rst +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/fwperiph_dma.pss +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/ivpm.yaml +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/setup.cfg +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/__main__.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/eval_jq.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/expr_eval.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/expr_parser.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/fileset.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/listener_list.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/out +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/param.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/param_ref_eval.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/parsetab.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/share/flow.json +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/create_file.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/exec.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/fileset.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/message.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/task_null.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_data.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_graph_dot_writer.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_compound.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_compound_proxy.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_def_base.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_proxy.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_task.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_wrapper.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_output.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/type.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/type_def.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/util/__init__.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/util/__main__.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/util/cmds/__init__.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/examples/example1/example1.flow +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/system/test_depends.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/system/test_pkg_discovery.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/system/test_stdlib.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/__init__.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/proj1/proj1.dfs +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/proj2/proj2.dfs +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/proj3/proj3.dfs +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_data_merge.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_dataflow.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_expr_eval.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_expr_parser.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_markers.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_parse.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_pytask_smoke.py +0 -0
- {dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_smoke copy.sav +0 -0
@@ -5,24 +5,24 @@ semantic definition of how task graphs defined using the flow specification
|
|
5
5
|
are evaluated.
|
6
6
|
|
7
7
|
## 1.0.0
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
* Package definition
|
9
|
+
* Package import
|
10
|
+
* Task definition
|
11
|
+
* "with" variable usage
|
12
|
+
* Operations on input and output data
|
13
|
+
* Operations on task parameters
|
14
|
+
* Package fragments
|
15
|
+
* Define task status. Tasks can have at least two types of failures
|
16
|
+
* Pass/Fail: Fail halts successors
|
17
17
|
- Fail must come with a message and extra info
|
18
|
-
|
18
|
+
* Status markers/counters
|
19
19
|
- errors / warnings / notes
|
20
20
|
- Want known fileset to capture logfiles and related info
|
21
21
|
- Central params and datasets?
|
22
22
|
- Datasets preserve dependency relationships
|
23
23
|
- Datasets are the best way to aggregate settings
|
24
|
-
|
25
|
-
|
24
|
+
* Typed parameter sets
|
25
|
+
* Dependencies provide order in which to evaluate
|
26
26
|
- Operations on variables
|
27
27
|
|
28
28
|
## 2.0.0
|
@@ -38,11 +38,11 @@ are evaluated.
|
|
38
38
|
determine up-to-date status on a whole collection of source
|
39
39
|
|
40
40
|
## 3.0.0
|
41
|
-
|
41
|
+
* JQ-based data extraction
|
42
42
|
- YAML task templates / expansions
|
43
43
|
- Support for annotating job requirements
|
44
44
|
- Support capturing schema for structured task data
|
45
|
-
|
45
|
+
~ Mark tasks as producing and accepting certain data
|
46
46
|
- FileSet task `produces` fileset of `type`
|
47
47
|
- SimImage task `accepts` systemVerilogSource, verilogSource, verilogPreCompLib, etc
|
48
48
|
=> Mostly useful for checking and suggestion
|
@@ -131,3 +131,17 @@ are evaluated.
|
|
131
131
|
- Allow files to be attached as part of the result
|
132
132
|
|
133
133
|
- Allow need relationships to be conditional
|
134
|
+
|
135
|
+
|
136
|
+
# Apr-May
|
137
|
+
- Configuration
|
138
|
+
- Conditional needs
|
139
|
+
- package-level parameters
|
140
|
+
-
|
141
|
+
- Subgraph builders
|
142
|
+
- Python
|
143
|
+
- Matrix strategy
|
144
|
+
|
145
|
+
- Identify export tasks
|
146
|
+
|
147
|
+
- Interop w/external formats
|
@@ -179,3 +179,23 @@ Key: all
|
|
179
179
|
- end-to-end system check
|
180
180
|
- avoid recompile when primary sources do not change
|
181
181
|
|
182
|
+
# Load/Elab/Build Refactor
|
183
|
+
- Separated loading from graph building
|
184
|
+
- Now, package and task information is produced with source info
|
185
|
+
- Working on recreating the task-node builder
|
186
|
+
- Consider getting rid of the Ctor infrastructure
|
187
|
+
- Have parameter-type info
|
188
|
+
- Have inheritance info
|
189
|
+
- Have fully-qualified names for all dependencies
|
190
|
+
- In this mode, graph builder would:
|
191
|
+
- Find named 'task' object
|
192
|
+
- Determine how to create a node and parameters from it
|
193
|
+
- Task should save statically-specified parameter values
|
194
|
+
- GraphBuilder can apply programmatically-specified parameters
|
195
|
+
- What is a programmatically-specified task?
|
196
|
+
- Prototype for a task node
|
197
|
+
- Not necessarily registered with the package loader
|
198
|
+
- Should have similar characteristics to a task (?)
|
199
|
+
- Maybe just a direct way to create a task node
|
200
|
+
- Don't think we expect the system to create is programmatically...
|
201
|
+
|
{dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/__init__.py
RENAMED
@@ -20,7 +20,8 @@
|
|
20
20
|
#*
|
21
21
|
#****************************************************************************
|
22
22
|
from .package_def import *
|
23
|
-
from .
|
23
|
+
from .package_loader import PackageLoader
|
24
|
+
from .ext_rgy import ExtRgy
|
24
25
|
from .task_data import *
|
25
26
|
from .task_def import *
|
26
27
|
from .task_graph_builder import TaskGraphBuilder
|
@@ -27,7 +27,6 @@ from ..util import loadProjPkgDef
|
|
27
27
|
from ..task_graph_builder import TaskGraphBuilder
|
28
28
|
from ..task_runner import TaskSetRunner
|
29
29
|
from ..task_listener_log import TaskListenerLog
|
30
|
-
from ..pkg_rgy import PkgRgy
|
31
30
|
from ..task_graph_dot_writer import TaskGraphDotWriter
|
32
31
|
|
33
32
|
|
@@ -66,11 +65,11 @@ class CmdGraph(object):
|
|
66
65
|
"<no descripion>"
|
67
66
|
print("%s - %s" % (t.name.ljust(max_name_len), desc))
|
68
67
|
else:
|
69
|
-
rundir = os.path.join(pkg.
|
68
|
+
rundir = os.path.join(pkg.basedir, "rundir")
|
70
69
|
|
71
70
|
builder = TaskGraphBuilder(root_pkg=pkg, rundir=rundir)
|
72
71
|
|
73
|
-
t = builder.
|
72
|
+
t = builder.mkTaskNode(pkg.name + "." + args.task)
|
74
73
|
|
75
74
|
TaskGraphDotWriter().write(
|
76
75
|
t,
|
{dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/cmds/cmd_run.py
RENAMED
@@ -27,7 +27,6 @@ from ..util import loadProjPkgDef
|
|
27
27
|
from ..task_graph_builder import TaskGraphBuilder
|
28
28
|
from ..task_runner import TaskSetRunner
|
29
29
|
from ..task_listener_log import TaskListenerLog
|
30
|
-
from ..pkg_rgy import PkgRgy
|
31
30
|
|
32
31
|
|
33
32
|
class CmdRun(object):
|
@@ -36,7 +35,8 @@ class CmdRun(object):
|
|
36
35
|
def __call__(self, args):
|
37
36
|
|
38
37
|
# First, find the project we're working with
|
39
|
-
|
38
|
+
listener = TaskListenerLog()
|
39
|
+
pkg = loadProjPkgDef(os.getcwd(), listener=listener)
|
40
40
|
|
41
41
|
if pkg is None:
|
42
42
|
raise Exception("Failed to find a 'flow.dv' file that defines a package in %s or its parent directories" % os.getcwd())
|
@@ -48,11 +48,8 @@ class CmdRun(object):
|
|
48
48
|
else:
|
49
49
|
# Print out available tasks
|
50
50
|
tasks = []
|
51
|
-
for task in pkg.
|
51
|
+
for task in pkg.task_m.values():
|
52
52
|
tasks.append(task)
|
53
|
-
for frag in pkg._fragment_l:
|
54
|
-
for task in frag.tasks:
|
55
|
-
tasks.append(task)
|
56
53
|
tasks.sort(key=lambda x: x.name)
|
57
54
|
|
58
55
|
max_name_len = 0
|
@@ -75,7 +72,8 @@ class CmdRun(object):
|
|
75
72
|
# Maybe separate into a task-graph builder and a task-graph runner
|
76
73
|
|
77
74
|
# TODO: allow user to specify run root -- maybe relative to some fixed directory?
|
78
|
-
rundir = os.path.join(pkg.
|
75
|
+
rundir = os.path.join(pkg.basedir, "rundir")
|
76
|
+
|
79
77
|
|
80
78
|
if args.clean:
|
81
79
|
print("Note: Cleaning rundir %s" % rundir)
|
@@ -89,14 +87,14 @@ class CmdRun(object):
|
|
89
87
|
if args.j != -1:
|
90
88
|
runner.nproc = int(args.j)
|
91
89
|
|
92
|
-
runner.add_listener(
|
90
|
+
runner.add_listener(listener.event)
|
93
91
|
|
94
92
|
tasks = []
|
95
93
|
|
96
94
|
for spec in args.tasks:
|
97
95
|
if spec.find('.') == -1:
|
98
96
|
spec = pkg.name + "." + spec
|
99
|
-
task = builder.
|
97
|
+
task = builder.mkTaskNode(spec)
|
100
98
|
tasks.append(task)
|
101
99
|
|
102
100
|
asyncio.run(runner.run(tasks))
|
{dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/cmds/cmd_show.py
RENAMED
@@ -28,7 +28,6 @@ from ..util import loadProjPkgDef
|
|
28
28
|
from ..task_graph_builder import TaskGraphBuilder
|
29
29
|
from ..task_runner import TaskSetRunner
|
30
30
|
from ..task_listener_log import TaskListenerLog
|
31
|
-
from ..pkg_rgy import PkgRgy
|
32
31
|
from ..task_graph_dot_writer import TaskGraphDotWriter
|
33
32
|
|
34
33
|
|
@@ -73,7 +72,7 @@ class CmdShow(object):
|
|
73
72
|
|
74
73
|
|
75
74
|
if args.all:
|
76
|
-
t = builder.
|
75
|
+
t = builder.mkTaskNode(pkg.name + "." + args.task)
|
77
76
|
dep_m = TaskSetRunner(rundir=None).buildDepMap(t)
|
78
77
|
|
79
78
|
order = list(toposort.toposort(dep_m))
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
import pydantic.dataclasses as pdc
|
3
|
+
from pydantic import BaseModel
|
4
|
+
|
5
|
+
#
|
6
|
+
# - task:
|
7
|
+
# needs:
|
8
|
+
# - if: abc
|
9
|
+
# then: abc
|
10
|
+
# else: def
|
11
|
+
#
|
12
|
+
class CondDef(BaseModel):
|
13
|
+
if_then : str = pdc.Field(
|
14
|
+
description="Condition to evaluate")
|
15
|
+
then : str = pdc.Field(
|
16
|
+
description="Task to execute if the condition is true")
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
import pydantic.dataclasses as pdc
|
3
|
+
from pydantic import BaseModel
|
4
|
+
from typing import List, Union, Any
|
5
|
+
from .extend_def import ExtendDef
|
6
|
+
from .param_def import ParamDef
|
7
|
+
|
8
|
+
class OverrideDef(BaseModel):
|
9
|
+
"""Override definition"""
|
10
|
+
package : Union[str, None] = pdc.Field(
|
11
|
+
description="Package to override")
|
12
|
+
task : Union[str, None] = pdc.Field(
|
13
|
+
description="Task to override")
|
14
|
+
value : str = pdc.Field(
|
15
|
+
description="Override to use",
|
16
|
+
alias="with")
|
17
|
+
|
18
|
+
class ConfigDef(BaseModel):
|
19
|
+
name : str = pdc.Field(
|
20
|
+
description="Name of the configuration")
|
21
|
+
params : List[ParamDef] = pdc.Field(
|
22
|
+
default_factory=list,
|
23
|
+
description="List of configuration parameters",
|
24
|
+
alias="with")
|
25
|
+
uses : str = pdc.Field(
|
26
|
+
default=None,
|
27
|
+
description="Name of the configuration to use as a base")
|
28
|
+
overrides : List[OverrideDef] = pdc.Field(
|
29
|
+
default_factory=list,
|
30
|
+
description="List of package and task overrides")
|
31
|
+
extensions : List[ExtendDef] = pdc.Field(
|
32
|
+
default_factory=list,
|
33
|
+
description="List of extensions to apply")
|
@@ -0,0 +1,88 @@
|
|
1
|
+
import dataclasses as dc
|
2
|
+
import importlib
|
3
|
+
import importlib.util
|
4
|
+
import logging
|
5
|
+
import os
|
6
|
+
import sys
|
7
|
+
from typing import ClassVar, List
|
8
|
+
from .task_data import TaskDataResult
|
9
|
+
|
10
|
+
@dc.dataclass
|
11
|
+
class ExecCallable(object):
|
12
|
+
body : str
|
13
|
+
_log : ClassVar = logging.getLogger("ExecCallable")
|
14
|
+
|
15
|
+
async def __call__(self, ctxt, input):
|
16
|
+
self._log.debug("--> ExecCallable")
|
17
|
+
self._log.debug("Body:\n%s" % self.body)
|
18
|
+
|
19
|
+
# If it is a single line, then we have a spec to load
|
20
|
+
# Otherwise, we have an inline task
|
21
|
+
|
22
|
+
if self.body.find("\n") == -1:
|
23
|
+
# Two forms:
|
24
|
+
# <path>::method
|
25
|
+
# <method-path>
|
26
|
+
|
27
|
+
ci = self.body.find("::")
|
28
|
+
if ci != -1:
|
29
|
+
# have a file to load
|
30
|
+
file = self.body[:ci]
|
31
|
+
method = self.body[ci+2:]
|
32
|
+
spec = importlib.util.spec_from_file_location(input.name, file)
|
33
|
+
module = importlib.util.module_from_spec(spec)
|
34
|
+
sys.modules[input.name] = module
|
35
|
+
spec.loader.exec_module(module)
|
36
|
+
|
37
|
+
callable = getattr(module, method)
|
38
|
+
pass
|
39
|
+
else:
|
40
|
+
# self._log.debug("Use PyTask implementation")
|
41
|
+
last_dot = self.body.rfind('.')
|
42
|
+
clsname = self.body[last_dot+1:]
|
43
|
+
modname = self.body[:last_dot]
|
44
|
+
|
45
|
+
try:
|
46
|
+
if modname not in sys.modules:
|
47
|
+
if input.srcdir not in sys.path:
|
48
|
+
sys.path.append(input.srcdir)
|
49
|
+
mod = importlib.import_module(modname)
|
50
|
+
else:
|
51
|
+
mod = sys.modules[modname]
|
52
|
+
except ModuleNotFoundError as e:
|
53
|
+
raise Exception("Failed to import module %s: %s" % (modname, str(e)))
|
54
|
+
|
55
|
+
if not hasattr(mod, clsname):
|
56
|
+
raise Exception("Method %s not found in module %s" % (clsname, modname))
|
57
|
+
callable = getattr(mod, clsname)
|
58
|
+
else:
|
59
|
+
text_lines = self.body.splitlines()
|
60
|
+
|
61
|
+
least_whitespace = 2^32
|
62
|
+
have_content = False
|
63
|
+
for line in text_lines:
|
64
|
+
line_no_leading_ws = line.lstrip()
|
65
|
+
if line_no_leading_ws != "":
|
66
|
+
have_content = True
|
67
|
+
leading_ws = len(line) - len(line_no_leading_ws)
|
68
|
+
if leading_ws < least_whitespace:
|
69
|
+
least_whitespace = leading_ws
|
70
|
+
# Remove leading whitespace
|
71
|
+
if have_content:
|
72
|
+
for i,line in enumerate(text_lines):
|
73
|
+
if len(line) >= least_whitespace:
|
74
|
+
text_lines[i] = line[least_whitespace:]
|
75
|
+
|
76
|
+
method = "async def pytask(ctxt, input):\n" + "\n".join([" %s" % l for l in text_lines])
|
77
|
+
|
78
|
+
exec(method)
|
79
|
+
|
80
|
+
callable = locals()['pytask']
|
81
|
+
|
82
|
+
result = await callable(ctxt, input)
|
83
|
+
|
84
|
+
if result is None:
|
85
|
+
result = TaskDataResult()
|
86
|
+
|
87
|
+
self._log.debug("<-- ExecCallable")
|
88
|
+
return result
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#****************************************************************************
|
2
|
-
#*
|
2
|
+
#* ext_rgy.py
|
3
3
|
#*
|
4
4
|
#* Copyright 2023-2025 Matthew Ballance and Contributors
|
5
5
|
#*
|
@@ -19,18 +19,23 @@
|
|
19
19
|
#* Author:
|
20
20
|
#*
|
21
21
|
#****************************************************************************
|
22
|
+
import dataclasses as dc
|
22
23
|
import os
|
23
24
|
import logging
|
24
25
|
import sys
|
25
|
-
from typing import Dict, Tuple
|
26
|
-
from .
|
26
|
+
from typing import Callable, ClassVar, Dict, Tuple
|
27
|
+
from .exec_callable import ExecCallable
|
28
|
+
from .pytask_callable import PytaskCallable
|
29
|
+
from .shell_callable import ShellCallable
|
27
30
|
|
28
|
-
|
29
|
-
|
31
|
+
@dc.dataclass
|
32
|
+
class ExtRgy(object):
|
33
|
+
_inst : ClassVar = None
|
30
34
|
|
31
35
|
def __init__(self):
|
32
36
|
self._pkgpath = []
|
33
|
-
self._pkg_m : Dict[str,
|
37
|
+
self._pkg_m : Dict[str, str] = {}
|
38
|
+
self._shell_m : Dict[str, Callable] = {}
|
34
39
|
self._log = logging.getLogger(type(self).__name__)
|
35
40
|
self._override_m : Dict[str,str] = {}
|
36
41
|
|
@@ -47,21 +52,19 @@ class PkgRgy(object):
|
|
47
52
|
return True
|
48
53
|
else:
|
49
54
|
return False
|
50
|
-
|
51
|
-
def
|
52
|
-
self.
|
55
|
+
|
56
|
+
def findShell(self, name) -> Callable:
|
57
|
+
if name in self._shell_m.keys():
|
58
|
+
return self._shell_m[name]
|
59
|
+
|
60
|
+
def findPackagePath(self, name) -> str:
|
61
|
+
ret = None
|
62
|
+
self._log.debug("--> findPackagePath(%s)" % name)
|
53
63
|
if name in self._pkg_m.keys():
|
54
|
-
|
55
|
-
pkg_def = PackageDef.load(self._pkg_m[name][0])
|
56
|
-
# Load the package
|
57
|
-
self._pkg_m[name] = (
|
58
|
-
self._pkg_m[name][0],
|
59
|
-
pkg_def
|
60
|
-
)
|
61
|
-
ret = self._pkg_m[name][1]
|
64
|
+
ret = self._pkg_m[name]
|
62
65
|
else:
|
63
66
|
ret = self._findOnPath(name)
|
64
|
-
self._log.debug("<--
|
67
|
+
self._log.debug("<-- findPackagePath(%s)" % name)
|
65
68
|
return ret
|
66
69
|
|
67
70
|
def _findOnPath(self, name):
|
@@ -72,33 +75,31 @@ class PkgRgy(object):
|
|
72
75
|
else:
|
73
76
|
name_pref = None
|
74
77
|
|
75
|
-
|
78
|
+
ret = None
|
76
79
|
|
77
80
|
for path in self._pkgpath:
|
78
81
|
if os.path.isfile(os.path.join(path, name_dir, "flow.dv")):
|
79
|
-
|
82
|
+
ret = os.path.join(path, name_dir, "flow.dv")
|
80
83
|
elif name_pref is not None and os.path.isfile(os.path.join(path, name_pref, name_s[-1] + ".dv")):
|
81
|
-
|
84
|
+
ret = os.path.join(path, name_pref, name_s[-1] + ".dv")
|
82
85
|
elif os.path.isfile(os.path.join(path, name + ".dv")):
|
83
|
-
|
86
|
+
ret = os.path.join(path, name + ".dv")
|
84
87
|
|
85
|
-
if
|
86
|
-
self._pkg_m[name] =
|
88
|
+
if ret is not None:
|
89
|
+
self._pkg_m[name] = ret
|
87
90
|
break
|
88
91
|
|
89
|
-
return
|
90
|
-
|
91
|
-
def registerPackage(self, pkg_def):
|
92
|
-
self._log.debug("--> registerPackage %s" % pkg_def.name)
|
93
|
-
if pkg_def.name in self._pkg_m.keys():
|
94
|
-
raise Exception("Duplicate package %s" % pkg_def.name)
|
95
|
-
self._pkg_m[pkg_def.name] = (pkg_def.basedir, pkg_def)
|
96
|
-
self._log.debug("<-- registerPackage %s" % pkg_def.name)
|
92
|
+
return ret
|
97
93
|
|
98
94
|
def _discover_plugins(self):
|
99
95
|
self._log.debug("--> discover_plugins")
|
100
96
|
# Register built-in package
|
101
|
-
self._pkg_m["std"] =
|
97
|
+
self._pkg_m["std"] = os.path.join(os.path.dirname(__file__), "std/flow.dv")
|
98
|
+
|
99
|
+
# Register built-in shells
|
100
|
+
self._shell_m["shell"] = ShellCallable
|
101
|
+
self._shell_m["pytask"] = ExecCallable
|
102
|
+
|
102
103
|
|
103
104
|
if "DV_FLOW_PATH" in os.environ.keys() and os.environ["DV_FLOW_PATH"] != "":
|
104
105
|
paths = os.environ["DV_FLOW_PATH"].split(':')
|
@@ -124,7 +125,15 @@ class PkgRgy(object):
|
|
124
125
|
self._log.debug("Package %s already registered using path %s. Conflicting path: %s" % (
|
125
126
|
name, self._pkg_m[name][0], path))
|
126
127
|
else:
|
127
|
-
self._pkg_m[name] =
|
128
|
+
self._pkg_m[name] = path
|
129
|
+
if hasattr(mod, "dvfm_shells"):
|
130
|
+
shell_m = mod.dvfm_shells()
|
131
|
+
for name, shell in shell_m.items():
|
132
|
+
self._log.debug("Registering shell %s" % name)
|
133
|
+
if name in self._shell_m.keys():
|
134
|
+
self._log.debug("Shell %s already registered" % name)
|
135
|
+
else:
|
136
|
+
self._shell_m[name] = shell
|
128
137
|
except Exception as e:
|
129
138
|
self._log.critical("Error loading plugin %s: %s" % (p.name, str(e)))
|
130
139
|
raise e
|
@@ -135,7 +144,7 @@ class PkgRgy(object):
|
|
135
144
|
self._log.debug("<-- discover_plugins")
|
136
145
|
|
137
146
|
def copy(self):
|
138
|
-
ret =
|
147
|
+
ret = ExtRgy()
|
139
148
|
ret._pkgpath = self._pkgpath.copy()
|
140
149
|
ret._pkg_m = self._pkg_m.copy()
|
141
150
|
return ret
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
import pydantic.dataclasses as pdc
|
3
|
+
from pydantic import BaseModel
|
4
|
+
from typing import List, Union
|
5
|
+
from .param_def import ParamDef
|
6
|
+
|
7
|
+
class ExtendDef(BaseModel):
|
8
|
+
"""Extension definition"""
|
9
|
+
task : str = pdc.Field(
|
10
|
+
description="Name of the task to extend")
|
11
|
+
params : List[ParamDef] = pdc.Field(
|
12
|
+
default_factory=list,
|
13
|
+
description="Parameter extensions to apply to the task",
|
14
|
+
alias="with")
|
15
|
+
uses : str = pdc.Field(
|
16
|
+
default=None,
|
17
|
+
description="Name of the extension to use as a base")
|
18
|
+
needs: List[str] = pdc.Field(
|
19
|
+
default_factory=list,
|
20
|
+
description="List of tasks to depend on")
|
21
|
+
|
{dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/fragment_def.py
RENAMED
@@ -23,8 +23,8 @@ import pydantic.dataclasses as dc
|
|
23
23
|
import json
|
24
24
|
from pydantic import BaseModel
|
25
25
|
from typing import Any, Dict, List, Union
|
26
|
-
from .package import Package
|
27
26
|
from .package_import_spec import PackageImportSpec
|
27
|
+
from .srcinfo import SrcInfo
|
28
28
|
from .task_def import TaskDef
|
29
29
|
from .type_def import TypeDef
|
30
30
|
|
@@ -33,6 +33,7 @@ class FragmentDef(BaseModel):
|
|
33
33
|
imports : List[Union[str,PackageImportSpec]] = dc.Field(default_factory=list, alias="imports")
|
34
34
|
fragments: List[str] = dc.Field(default_factory=list)
|
35
35
|
types : List[TypeDef] = dc.Field(default_factory=list)
|
36
|
+
srcinfo : SrcInfo = dc.Field(default=None)
|
36
37
|
|
37
38
|
_basedir : str = None
|
38
39
|
|
@@ -41,6 +42,6 @@ class FragmentDef(BaseModel):
|
|
41
42
|
if t.name == name:
|
42
43
|
return t
|
43
44
|
|
44
|
-
def apply(self, session, pkg : Package):
|
45
|
-
pass
|
45
|
+
# def apply(self, session, pkg : Package):
|
46
|
+
# pass
|
46
47
|
|
{dv_flow_mgr-0.0.2.14180132375a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/package.py
RENAMED
@@ -21,25 +21,49 @@
|
|
21
21
|
#****************************************************************************
|
22
22
|
import dataclasses as dc
|
23
23
|
import logging
|
24
|
-
from typing import Any, ClassVar, Dict
|
25
|
-
from .
|
24
|
+
from typing import Any, ClassVar, Dict, List
|
25
|
+
from .fragment_def import FragmentDef
|
26
|
+
from .package_def import PackageDef
|
27
|
+
from .task import Task
|
26
28
|
|
27
29
|
@dc.dataclass
|
28
30
|
class Package(object):
|
29
|
-
|
31
|
+
pkg_def : PackageDef
|
32
|
+
basedir : str = None
|
30
33
|
params : Dict[str,Any] = dc.field(default_factory=dict)
|
31
34
|
# Package holds constructors for tasks
|
32
35
|
# - Dict holds the default parameters for the task
|
33
|
-
|
36
|
+
task_m : Dict[str,Task] = dc.field(default_factory=dict)
|
34
37
|
types : Dict[str,Any] = dc.field(default_factory=dict)
|
38
|
+
fragment_def_l : List[FragmentDef] = dc.field(default_factory=list)
|
39
|
+
pkg_m : Dict[str, 'Package'] = dc.field(default_factory=dict)
|
35
40
|
_log : ClassVar = logging.getLogger("Package")
|
36
41
|
|
37
|
-
|
42
|
+
@property
|
43
|
+
def name(self):
|
44
|
+
return self.pkg_def.name
|
45
|
+
|
46
|
+
def getTaskCtor(self, name : str) -> Task:
|
38
47
|
self._log.debug("-- %s::getTaskCtor: %s" % (self.name, name))
|
39
48
|
if name not in self.tasks.keys():
|
40
49
|
raise Exception("Task %s not present in package %s" % (name, self.name))
|
41
50
|
return self.tasks[name]
|
51
|
+
|
52
|
+
def dump(self):
|
53
|
+
tasks = {}
|
54
|
+
for k, v in self.task_m.items():
|
55
|
+
tasks[k] = v.dump()
|
56
|
+
|
57
|
+
pkg = {
|
58
|
+
"name": self.name,
|
59
|
+
"basedir": self.basedir,
|
60
|
+
"params": self.params,
|
61
|
+
"tasks": tasks,
|
62
|
+
"fragments": [f.dump() for f in self.fragment_def_l]
|
63
|
+
}
|
64
|
+
|
65
|
+
return pkg
|
42
66
|
|
43
67
|
def __hash__(self):
|
44
|
-
return
|
68
|
+
return id(self)
|
45
69
|
|