dv-flow-mgr 0.0.1.13468776985a1__tar.gz → 0.0.1.13489806632a1__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.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/PKG-INFO +1 -1
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/Steps.md +42 -1
- dv_flow_mgr-0.0.1.13489806632a1/docs/Tasks.md +19 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/pyproject.toml +1 -1
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/package.py +1 -1
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/package_def.py +2 -1
- dv_flow_mgr-0.0.1.13489806632a1/src/dv_flow/mgr/task.py +182 -0
- dv_flow_mgr-0.0.1.13489806632a1/src/dv_flow/mgr/task_ctor.py +43 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_data.py +15 -5
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_def.py +1 -1
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_graph_builder.py +3 -3
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_graph_runner.py +4 -5
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_graph_runner_local.py +1 -1
- dv_flow_mgr-0.0.1.13489806632a1/src/dv_flow/mgr/task_node.py +80 -0
- dv_flow_mgr-0.0.1.13489806632a1/src/dv_flow/mgr/task_params_ctor.py +31 -0
- dv_flow_mgr-0.0.1.13489806632a1/src/dv_flow/mgr/task_runner.py +162 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +6 -0
- dv_flow_mgr-0.0.1.13489806632a1/tests/unit/test_pytask_smoke.py +96 -0
- dv_flow_mgr-0.0.1.13468776985a1/src/dv_flow/mgr/task.py +0 -200
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/.github/workflows/ci.yml +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/.gitignore +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/.vscode/settings.json +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/LICENSE +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/README.md +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/KeyArchitecture.md +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/Makefile +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/Notes.md +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/Roadmap.md +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/RundirLayout.md +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/Stages.md +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/TypesAndDefs.md +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/Usecases.md +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/conf.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/index.rst +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/intro.rst +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/quickstart.rst +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/docs/reference.rst +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/ivpm.yaml +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/setup.cfg +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/__init__.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/__main__.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/cmds/cmd_run.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/expr_eval.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/expr_parser.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/fileset.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/fragment_def.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/out +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/param_def.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/parsetab.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/pkg_rgy.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/share/flow.json +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/std/fileset.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/std/flow.dv +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/std/message.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/std/task_null.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_exec_data.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_impl_data.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_memento.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_output.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/type.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/type_def.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/util.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/examples/example1/example1.flow +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/system/test_depends.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/system/test_pkg_discovery.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/system/test_stdlib.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/__init__.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/proj1/proj1.dfs +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/proj2/proj2.dfs +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/data/proj3/proj3.dfs +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/test_data_merge.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/test_expr_eval.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/test_expr_parser.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/test_fileset.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/test_parse.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/test_pyclass.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/test_smoke copy.sav +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/test_smoke.py +0 -0
- {dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/tests/unit/test_stdlib.py +0 -0
@@ -65,4 +65,45 @@ Result Data
|
|
65
65
|
- Something needs to process result
|
66
66
|
- Save memento in central store (map of task-execution records)
|
67
67
|
- Organize with start/finish times, etc
|
68
|
-
|
68
|
+
|
69
|
+
#
|
70
|
+
- Create a task type from YAML
|
71
|
+
- Taskdef
|
72
|
+
- Create a task and parameter changes
|
73
|
+
- Params are given a value (most-common)
|
74
|
+
- Or, a mutator class instance to append/prepend/etc
|
75
|
+
|
76
|
+
files = factory.mkTask("std.FileSet",
|
77
|
+
srcdir=os.path.join(os.path.abspath(__file__)),
|
78
|
+
params=dict(
|
79
|
+
basedir="foo",
|
80
|
+
fileType="systemVerilog",
|
81
|
+
include="*.sv"
|
82
|
+
))
|
83
|
+
|
84
|
+
simImg = factory.mkTask("hdlsim.SimImg", needs=[files])
|
85
|
+
|
86
|
+
runner.run(simImg)
|
87
|
+
|
88
|
+
## Task constructor
|
89
|
+
- Creates the parameter-type data structure
|
90
|
+
- Creates the parameter-evaluation stack (stack of param-type structs)
|
91
|
+
- Creates the task (holding eval stack)
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
- Python layer than can be used with or wihout YAML meta-data
|
96
|
+
- Define Task, Define Params
|
97
|
+
- Maybe decorator to wrap Task as a Ctor?
|
98
|
+
- Must be able to work with YAML-defined content
|
99
|
+
- YAML layer simply populates Python layer
|
100
|
+
|
101
|
+
@Task.ctor(MyParams)
|
102
|
+
class MyTask(Task):
|
103
|
+
# Creates an inner static method ctor that can be passed as the constructor
|
104
|
+
|
105
|
+
factory.addTaskType(MyTask.ctor)
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
A task graph is composed of task nodes. A task is defined as the combination
|
3
|
+
of:
|
4
|
+
- behavior
|
5
|
+
- parameters data structure
|
6
|
+
- rules/process for specifying parameter values
|
7
|
+
|
8
|
+
Task behavior must:
|
9
|
+
- accept input data composed of:
|
10
|
+
- parameter data structure with values populated
|
11
|
+
- change notification
|
12
|
+
- (optional) meta-data
|
13
|
+
- produce result data composed of:
|
14
|
+
- list of parameter sets
|
15
|
+
- change notification
|
16
|
+
- (optional) meta-data
|
17
|
+
- (optional) markers
|
18
|
+
- execution status
|
19
|
+
|
{dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/package_def.py
RENAMED
@@ -33,7 +33,8 @@ from typing import Any, Dict, List, Callable, Tuple, ClassVar
|
|
33
33
|
from .fragment_def import FragmentDef
|
34
34
|
from .package import Package
|
35
35
|
from .package_import_spec import PackageImportSpec, PackageSpec
|
36
|
-
from .task import
|
36
|
+
#from .task import TaskCtorCls, TaskCtorParam, TaskCtorParamCls
|
37
|
+
from .task_ctor import TaskCtor
|
37
38
|
from .task_def import TaskDef, TaskSpec
|
38
39
|
from .std.task_null import TaskNull
|
39
40
|
from .type_def import TypeDef
|
@@ -0,0 +1,182 @@
|
|
1
|
+
#****************************************************************************
|
2
|
+
#* task.py
|
3
|
+
#*
|
4
|
+
#* Copyright 2023 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 os
|
23
|
+
import json
|
24
|
+
import dataclasses as dc
|
25
|
+
import logging
|
26
|
+
from pydantic import BaseModel
|
27
|
+
from typing import Any, Callable, ClassVar, Dict, List, Tuple
|
28
|
+
from .task_data import TaskData, TaskDataInput, TaskDataOutput, TaskDataResult
|
29
|
+
from .task_memento import TaskMemento
|
30
|
+
from .task_ctor import TaskParamsCtor
|
31
|
+
from .task_params_ctor import TaskParamsCtor
|
32
|
+
from .task_runner import TaskRunner
|
33
|
+
|
34
|
+
# @dc.dataclass
|
35
|
+
# class TaskSpec(object):
|
36
|
+
# name : str
|
37
|
+
|
38
|
+
# class TaskParams(BaseModel):
|
39
|
+
# pass
|
40
|
+
|
41
|
+
|
42
|
+
# @dc.dataclass
|
43
|
+
# class TaskCtorParam(TaskCtor):
|
44
|
+
# params : Dict[str,Any] = dc.field(default_factory=dict)
|
45
|
+
|
46
|
+
# _log : ClassVar = logging.getLogger("TaskCtorParam")
|
47
|
+
|
48
|
+
# def mkTask(self, name : str, depends, rundir, srcdir=None, params=None):
|
49
|
+
# self._log.debug("--> %s::mkTask" % self.name)
|
50
|
+
# if params is None:
|
51
|
+
# params = self.mkParams()
|
52
|
+
# if srcdir is None:
|
53
|
+
# srcdir = self.srcdir
|
54
|
+
|
55
|
+
# ret = self.uses.mkTask(name, depends, rundir, srcdir, params)
|
56
|
+
|
57
|
+
# self.applyParams(ret.params)
|
58
|
+
# self._log.debug("<-- %s::mkTask" % self.name)
|
59
|
+
|
60
|
+
# return ret
|
61
|
+
|
62
|
+
# def applyParams(self, params):
|
63
|
+
# self._log.debug("--> %s::applyParams: %s %s" % (self.name, str(type(self.params)), str(type(params))))
|
64
|
+
# if self.params is not None:
|
65
|
+
# for k,v in self.params.items():
|
66
|
+
# self._log.debug(" change %s %s=>%s" % (
|
67
|
+
# k,
|
68
|
+
# str(getattr(params, k)),
|
69
|
+
# str(v)))
|
70
|
+
# setattr(params, k, v)
|
71
|
+
# else:
|
72
|
+
# self._log.debug(" no params")
|
73
|
+
# self._log.debug("<-- %s::applyParams: %s" % (self.name, str(self.params)))
|
74
|
+
|
75
|
+
# @dc.dataclass
|
76
|
+
# class TaskCtorParamCls(TaskCtor):
|
77
|
+
# params_ctor : Callable = None
|
78
|
+
|
79
|
+
# _log : ClassVar = logging.getLogger("TaskCtorParamType")
|
80
|
+
|
81
|
+
# def mkParams(self):
|
82
|
+
# self._log.debug("--> %s::mkParams" % str(self.name))
|
83
|
+
# params = self.params_ctor()
|
84
|
+
# self._log.debug("<-- %s::mkParams: %s" % (str(self.name), str(type(params))))
|
85
|
+
# return params
|
86
|
+
|
87
|
+
# @dc.dataclass
|
88
|
+
# class TaskCtorCls(TaskCtor):
|
89
|
+
# task_ctor : Callable = None
|
90
|
+
|
91
|
+
# _log : ClassVar = logging.getLogger("TaskCtorCls")
|
92
|
+
|
93
|
+
# def mkTask(self, name : str, depends, rundir, srcdir=None, params=None):
|
94
|
+
# self._log.debug("--> %s::mkTask (%s) srcdir=%s" % (self.name, str(self.task_ctor), srcdir))
|
95
|
+
|
96
|
+
# if srcdir is None:
|
97
|
+
# srcdir = self.srcdir
|
98
|
+
|
99
|
+
# if params is None:
|
100
|
+
# params = self.mkParams()
|
101
|
+
|
102
|
+
# ret = self.task_ctor(
|
103
|
+
# name=name,
|
104
|
+
# depends=depends,
|
105
|
+
# rundir=rundir,
|
106
|
+
# srcdir=srcdir,
|
107
|
+
# params=params)
|
108
|
+
|
109
|
+
# # Update parameters on the way back
|
110
|
+
# self.applyParams(ret.params)
|
111
|
+
|
112
|
+
# self._log.debug("<-- %s::mkTask" % self.name)
|
113
|
+
# return ret
|
114
|
+
|
115
|
+
# @dc.dataclass
|
116
|
+
# class TaskCtorProxy(TaskCtor):
|
117
|
+
# task_ctor : TaskCtor = None
|
118
|
+
# param_ctor : Callable = None
|
119
|
+
|
120
|
+
# _log : ClassVar = logging.getLogger("TaskCtorProxy")
|
121
|
+
|
122
|
+
# def mkTask(self, *args, **kwargs):
|
123
|
+
# self._log.debug("--> %s::mkTask" % self.name)
|
124
|
+
# ret = self.task_ctor.mkTask(*args, **kwargs)
|
125
|
+
# self._log.debug("<-- %s::mkTask" % self.name)
|
126
|
+
# return ret
|
127
|
+
|
128
|
+
# def mkParams(self, params=None):
|
129
|
+
# self._log.debug("--> %s::mkParams: %s" % (self.name, str(self.params)))
|
130
|
+
|
131
|
+
# if params is None and self.param_ctor is not None:
|
132
|
+
# params = self.param_ctor()
|
133
|
+
|
134
|
+
# params = self.task_ctor.mkParams(params)
|
135
|
+
|
136
|
+
# if self.params is not None:
|
137
|
+
# for k,v in self.params.items():
|
138
|
+
# self._log.debug(" change %s %s=>%s" % (
|
139
|
+
# k,
|
140
|
+
# str(getattr(params, k)),
|
141
|
+
# str(v)))
|
142
|
+
# setattr(params, k, v)
|
143
|
+
# self._log.debug("<-- %s::mkParams: %s" % (self.name, str(self.params)))
|
144
|
+
# return params
|
145
|
+
|
146
|
+
|
147
|
+
@dc.dataclass
|
148
|
+
class Task(object):
|
149
|
+
"""Executable view of a task"""
|
150
|
+
# Ctor fields -- must specify on construction
|
151
|
+
name : str
|
152
|
+
srcdir : str
|
153
|
+
params : TaskParamsCtor
|
154
|
+
|
155
|
+
# Runtime fields -- these get populated during execution
|
156
|
+
changed : bool = False
|
157
|
+
needs : List['Task'] = dc.field(default_factory=list)
|
158
|
+
dependents : List['Task'] = dc.field(default_factory=list)
|
159
|
+
rundir : str = dc.field(default=None)
|
160
|
+
output : TaskDataOutput = dc.field(default=None)
|
161
|
+
|
162
|
+
_log : ClassVar = logging.getLogger("Task")
|
163
|
+
|
164
|
+
async def run(self,
|
165
|
+
runner : 'TaskRunner',
|
166
|
+
input : TaskDataInput) -> TaskDataResult:
|
167
|
+
raise NotImplementedError("TaskImpl.run() not implemented")
|
168
|
+
|
169
|
+
@staticmethod
|
170
|
+
def ctor(paramT):
|
171
|
+
def wrapper(T):
|
172
|
+
def mk_task(name, srcdir, params):
|
173
|
+
return T(name, srcdir, params)
|
174
|
+
def mk_params(**params):
|
175
|
+
ctor = TaskParamsCtor(paramT)
|
176
|
+
ctor.values.append(paramT(**params))
|
177
|
+
return ctor
|
178
|
+
T.mkTask = mk_task
|
179
|
+
T.mkParams = mk_params
|
180
|
+
return T
|
181
|
+
return wrapper
|
182
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import os
|
2
|
+
import json
|
3
|
+
import dataclasses as dc
|
4
|
+
import logging
|
5
|
+
from pydantic import BaseModel
|
6
|
+
from typing import Any, Callable, ClassVar, Dict, List, Tuple
|
7
|
+
from .task_data import TaskDataOutput, TaskDataResult
|
8
|
+
|
9
|
+
# TaskParamsCtor accepts an evaluation context and returns a task parameter object
|
10
|
+
TaskParamsCtor = Callable[[object], Any]
|
11
|
+
|
12
|
+
@dc.dataclass
|
13
|
+
class TaskCtor(object):
|
14
|
+
name : str
|
15
|
+
uses : 'TaskCtor' = None
|
16
|
+
srcdir : str = None
|
17
|
+
|
18
|
+
_log : ClassVar = logging.getLogger("TaskCtor")
|
19
|
+
|
20
|
+
def mkTask(self, name : str, srcdir=None) -> 'Task':
|
21
|
+
"""Creates a task object"""
|
22
|
+
if srcdir is None:
|
23
|
+
srcdir = self.srcdir
|
24
|
+
|
25
|
+
if self.uses is not None:
|
26
|
+
return self.uses.mkTask(name, srcdir)
|
27
|
+
else:
|
28
|
+
raise NotImplementedError("TaskCtor.mkTask() not implemented for %s" % str(type(self)))
|
29
|
+
|
30
|
+
def mkParams(self, params=None) -> TaskParamsCtor:
|
31
|
+
"""Creates a list of task-parameter objects used produce the params object"""
|
32
|
+
self._log.debug("--> %s::mkParams" % self.name)
|
33
|
+
if self.uses is not None:
|
34
|
+
params = self.uses.mkParams()
|
35
|
+
else:
|
36
|
+
params = TaskParams()
|
37
|
+
self._log.debug("<-- %s::mkParams: %s" % (self.name, str(params)))
|
38
|
+
|
39
|
+
return params
|
40
|
+
|
41
|
+
def applyParams(self, params):
|
42
|
+
if self.uses is not None:
|
43
|
+
self.uses.applyParams(params)
|
{dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_data.py
RENAMED
@@ -27,6 +27,16 @@ from typing import Any, ClassVar, Dict, Set, List, Tuple
|
|
27
27
|
from .fileset import FileSet
|
28
28
|
from toposort import toposort
|
29
29
|
|
30
|
+
class TaskMarkerLoc(BaseModel):
|
31
|
+
path : str
|
32
|
+
line : int = dc.Field(default=-1)
|
33
|
+
pos : int = dc.Field(default=-1)
|
34
|
+
|
35
|
+
class TaskMarker(BaseModel):
|
36
|
+
msg : str
|
37
|
+
severity : str
|
38
|
+
loc : TaskMarkerLoc = dc.Field(default=None)
|
39
|
+
|
30
40
|
class TaskDataInput(BaseModel):
|
31
41
|
changed : bool
|
32
42
|
srcdir : str
|
@@ -35,11 +45,11 @@ class TaskDataInput(BaseModel):
|
|
35
45
|
memento : Any
|
36
46
|
|
37
47
|
class TaskDataResult(BaseModel):
|
38
|
-
changed : bool
|
39
|
-
output : List[Any]
|
40
|
-
memento : Any
|
41
|
-
markers : List[
|
42
|
-
status : int
|
48
|
+
changed : bool = dc.Field(default=True)
|
49
|
+
output : List[Any] = dc.Field(default_factory=list)
|
50
|
+
memento : Any = dc.Field(default=None)
|
51
|
+
markers : List[TaskMarker] = dc.Field(default_factory=list)
|
52
|
+
status : int = dc.Field(default=0)
|
43
53
|
|
44
54
|
class TaskDataOutput(BaseModel):
|
45
55
|
changed : bool
|
{dv_flow_mgr-0.0.1.13468776985a1 → dv_flow_mgr-0.0.1.13489806632a1}/src/dv_flow/mgr/task_def.py
RENAMED
@@ -40,7 +40,7 @@ class TaskDef(BaseModel):
|
|
40
40
|
doc : str = dc.Field(default="")
|
41
41
|
depends : List[Union[str,TaskSpec]] = dc.Field(default_factory=list, alias="needs")
|
42
42
|
params: List[ParamDef] = dc.Field(default_factory=list, alias="with")
|
43
|
-
out: List[TaskOutput] = dc.Field(default_factory=list)
|
43
|
+
# out: List[TaskOutput] = dc.Field(default_factory=list)
|
44
44
|
|
45
45
|
def copy(self) -> 'TaskDef':
|
46
46
|
ret = TaskDef(
|
@@ -25,7 +25,7 @@ import logging
|
|
25
25
|
from .package import Package
|
26
26
|
from .package_def import PackageDef, PackageSpec
|
27
27
|
from .pkg_rgy import PkgRgy
|
28
|
-
from .task import Task
|
28
|
+
from .task import Task
|
29
29
|
from typing import Dict, List
|
30
30
|
|
31
31
|
@dc.dataclass
|
@@ -37,7 +37,7 @@ class TaskGraphBuilder(object):
|
|
37
37
|
_pkg_s : List[Package] = dc.field(default_factory=list)
|
38
38
|
_pkg_m : Dict[PackageSpec,Package] = dc.field(default_factory=dict)
|
39
39
|
_pkg_spec_s : List[PackageDef] = dc.field(default_factory=list)
|
40
|
-
_task_m : Dict[TaskSpec,Task] = dc.field(default_factory=dict)
|
40
|
+
_task_m : Dict['TaskSpec',Task] = dc.field(default_factory=dict)
|
41
41
|
_logger : logging.Logger = None
|
42
42
|
|
43
43
|
def __post_init__(self):
|
@@ -173,7 +173,7 @@ class TaskGraphBuilder(object):
|
|
173
173
|
|
174
174
|
return pkg
|
175
175
|
|
176
|
-
def getTaskCtor(self, spec : TaskSpec, pkg : PackageDef = None) -> 'TaskCtor':
|
176
|
+
def getTaskCtor(self, spec : 'TaskSpec', pkg : PackageDef = None) -> 'TaskCtor':
|
177
177
|
self._logger.debug("--> getTaskCtor %s" % spec.name)
|
178
178
|
spec_e = spec.name.split(".")
|
179
179
|
task_name = spec_e[-1]
|
@@ -21,20 +21,19 @@
|
|
21
21
|
#****************************************************************************
|
22
22
|
import asyncio
|
23
23
|
import os
|
24
|
-
import yaml
|
25
24
|
import dataclasses as dc
|
26
|
-
from typing import Any, Callable, ClassVar, Dict, List
|
25
|
+
from typing import Any, Callable, ClassVar, Dict, List, Tuple
|
27
26
|
from .task import Task
|
28
27
|
from .task_data import TaskData
|
28
|
+
from .task_runner import TaskRunner
|
29
29
|
|
30
30
|
@dc.dataclass
|
31
|
-
class TaskGraphRunner(
|
31
|
+
class TaskGraphRunner(TaskRunner):
|
32
32
|
"""Session manages execution of a task graph"""
|
33
33
|
|
34
|
-
rundir : str
|
35
|
-
|
36
34
|
_inst : ClassVar['TaskGraphRunner'] = None
|
37
35
|
|
36
|
+
|
38
37
|
# Search path for .dfs files
|
39
38
|
create_subprocess : Callable = asyncio.create_subprocess_exec
|
40
39
|
_root_dir : str = None
|
@@ -30,7 +30,7 @@ from .fragment_def import FragmentDef
|
|
30
30
|
from .package import Package
|
31
31
|
from .pkg_rgy import PkgRgy
|
32
32
|
from .package_def import PackageDef, PackageSpec
|
33
|
-
from .task import Task
|
33
|
+
from .task import Task
|
34
34
|
from .task_data import TaskData
|
35
35
|
from .task_graph_runner import TaskGraphRunner
|
36
36
|
|
@@ -0,0 +1,80 @@
|
|
1
|
+
|
2
|
+
import dataclasses as dc
|
3
|
+
import logging
|
4
|
+
from typing import Any, Callable, ClassVar, Dict, List
|
5
|
+
from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
|
6
|
+
from .task_params_ctor import TaskParamsCtor
|
7
|
+
|
8
|
+
@dc.dataclass
|
9
|
+
class TaskNode(object):
|
10
|
+
"""Executable view of a task"""
|
11
|
+
# Ctor fields -- must specify on construction
|
12
|
+
name : str
|
13
|
+
srcdir : str
|
14
|
+
# This can be the resolved parameters
|
15
|
+
params : TaskParamsCtor
|
16
|
+
|
17
|
+
task : Callable[['TaskRunner','TaskDataInput'],'TaskDataResult']
|
18
|
+
|
19
|
+
# Runtime fields -- these get populated during execution
|
20
|
+
changed : bool = False
|
21
|
+
needs : List['TaskNode'] = dc.field(default_factory=list)
|
22
|
+
rundir : str = dc.field(default=None)
|
23
|
+
output : TaskDataOutput = dc.field(default=None)
|
24
|
+
|
25
|
+
_log : ClassVar = logging.getLogger("TaskNode")
|
26
|
+
|
27
|
+
def __hash__(self):
|
28
|
+
return id(self)
|
29
|
+
|
30
|
+
@staticmethod
|
31
|
+
def task(paramT):
|
32
|
+
def wrapper(T):
|
33
|
+
ctor = TaskNodeCtorWrapper(T.__name__, T, paramT)
|
34
|
+
return ctor
|
35
|
+
return wrapper
|
36
|
+
|
37
|
+
@dc.dataclass
|
38
|
+
class TaskNodeCtor(object):
|
39
|
+
"""
|
40
|
+
Factory for a specific task type
|
41
|
+
- Produces a task parameters object, applying value-setting instructions
|
42
|
+
- Produces a TaskNode
|
43
|
+
"""
|
44
|
+
name : str
|
45
|
+
|
46
|
+
|
47
|
+
def mkTaskNode(self, srcdir, params, name=None) -> TaskNode:
|
48
|
+
raise NotImplementedError("mkTaskNode in type %s" % str(type(self)))
|
49
|
+
|
50
|
+
def mkTaskParams(self, params : Dict) -> Any:
|
51
|
+
raise NotImplementedError("mkTaskParams in type %s" % str(type(self)))
|
52
|
+
|
53
|
+
@dc.dataclass
|
54
|
+
class TaskNodeCtorWrapper(TaskNodeCtor):
|
55
|
+
T : Any
|
56
|
+
paramT : Any
|
57
|
+
|
58
|
+
def __call__(self,
|
59
|
+
srcdir,
|
60
|
+
name=None,
|
61
|
+
params=None,
|
62
|
+
needs=None,
|
63
|
+
**kwargs):
|
64
|
+
"""Convenience method for direct creation of tasks"""
|
65
|
+
if params is None:
|
66
|
+
params = self.mkTaskParams(kwargs)
|
67
|
+
|
68
|
+
node = self.mkTaskNode(srcdir, params, name)
|
69
|
+
if needs is not None:
|
70
|
+
node.needs.extend(needs)
|
71
|
+
return node
|
72
|
+
|
73
|
+
def mkTaskNode(self, srcdir, params, name=None) -> TaskNode:
|
74
|
+
node = TaskNode(name, srcdir, params, self.T)
|
75
|
+
return node
|
76
|
+
|
77
|
+
def mkTaskParams(self, params : Dict) -> Any:
|
78
|
+
obj = self.paramT()
|
79
|
+
# TODO: apply user-specified params
|
80
|
+
return obj
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import dataclasses as dc
|
2
|
+
from typing import Any, List
|
3
|
+
|
4
|
+
|
5
|
+
@dc.dataclass
|
6
|
+
class TaskParamsCtor(object):
|
7
|
+
|
8
|
+
paramT : Any = None
|
9
|
+
# List of parameter-setting sets, starting with inner-most
|
10
|
+
values : List[Any] = dc.field(default_factory=list)
|
11
|
+
|
12
|
+
def mk(self, input) -> Any:
|
13
|
+
params = self.paramT()
|
14
|
+
|
15
|
+
# Now, process each field
|
16
|
+
for field in dc.fields(self.paramT):
|
17
|
+
# Find the outer-most setting of the value
|
18
|
+
last_value_i = -1
|
19
|
+
for i in range(len(self.values)-1, -1, -1):
|
20
|
+
if hasattr(self.values[i], field.name) and getattr(self.values[i], field.name) is not None:
|
21
|
+
val = getattr(self.values[i], field.name)
|
22
|
+
# TODO: check if 'val' is a set or mutator
|
23
|
+
last_value_i = i
|
24
|
+
break
|
25
|
+
for i in range(last_value_i, -1, -1):
|
26
|
+
if hasattr(self.values[i], field.name):
|
27
|
+
val = getattr(self.values[i], field.name)
|
28
|
+
setattr(params, field.name, val)
|
29
|
+
|
30
|
+
print("params: %s" % str(params))
|
31
|
+
return params
|