ddeutil-workflow 0.0.23__tar.gz → 0.0.24__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.
- {ddeutil_workflow-0.0.23/src/ddeutil_workflow.egg-info → ddeutil_workflow-0.0.24}/PKG-INFO +4 -3
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/README.md +2 -1
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/pyproject.toml +1 -1
- ddeutil_workflow-0.0.24/src/ddeutil/workflow/__about__.py +1 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/__cron.py +6 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/__init__.py +8 -7
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/api.py +2 -2
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/cli.py +2 -2
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/conf.py +18 -2
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/scheduler.py +189 -154
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/stage.py +5 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/utils.py +0 -4
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/workflow.py +121 -138
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24/src/ddeutil_workflow.egg-info}/PKG-INFO +4 -3
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil_workflow.egg-info/SOURCES.txt +6 -5
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil_workflow.egg-info/requires.txt +1 -1
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_conf.py +7 -1
- ddeutil_workflow-0.0.23/tests/test_on.py → ddeutil_workflow-0.0.24/tests/test_cron_on.py +9 -9
- ddeutil_workflow-0.0.23/tests/test_scheduler.py → ddeutil_workflow-0.0.24/tests/test_schedule.py +30 -46
- ddeutil_workflow-0.0.24/tests/test_schedule_control.py +32 -0
- ddeutil_workflow-0.0.24/tests/test_schedule_tasks.py +72 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow.py +1 -1
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_release.py +11 -0
- ddeutil_workflow-0.0.24/tests/test_workflow_schedule.py +118 -0
- ddeutil_workflow-0.0.24/tests/test_workflow_task.py +174 -0
- ddeutil_workflow-0.0.23/src/ddeutil/workflow/__about__.py +0 -1
- ddeutil_workflow-0.0.23/tests/test_scheduler_tasks.py +0 -60
- ddeutil_workflow-0.0.23/tests/test_workflow_schedule.py +0 -58
- ddeutil_workflow-0.0.23/tests/test_workflow_task_data.py +0 -82
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/LICENSE +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/setup.cfg +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/__types.py +0 -0
- /ddeutil_workflow-0.0.23/src/ddeutil/workflow/on.py → /ddeutil_workflow-0.0.24/src/ddeutil/workflow/cron.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/exceptions.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/job.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/params.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/repeat.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/result.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/route.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil_workflow.egg-info/dependency_links.txt +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil_workflow.egg-info/entry_points.txt +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil_workflow.egg-info/top_level.txt +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test__cron.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test__regex.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_conf_log.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_job.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_job_exec_py.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_job_exec_strategy.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_job_strategy.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_params.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_result.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_stage.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_stage_exec_bash.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_stage_exec_hook.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_stage_exec_py.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_stage_exec_trigger.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_utils.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_utils_filter.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_utils_tag.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_utils_template.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_exec.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_exec_hook.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_exec_needs.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_job_exec.py +0 -0
- {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_poke.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ddeutil-workflow
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.24
|
4
4
|
Summary: Lightweight workflow orchestration with less dependencies
|
5
5
|
Author-email: ddeutils <korawich.anu@gmail.com>
|
6
6
|
License: MIT
|
@@ -24,7 +24,7 @@ Description-Content-Type: text/markdown
|
|
24
24
|
License-File: LICENSE
|
25
25
|
Requires-Dist: ddeutil>=0.4.3
|
26
26
|
Requires-Dist: ddeutil-io[toml,yaml]>=0.2.3
|
27
|
-
Requires-Dist: pydantic==2.10.
|
27
|
+
Requires-Dist: pydantic==2.10.4
|
28
28
|
Requires-Dist: python-dotenv==1.0.1
|
29
29
|
Requires-Dist: typer==0.15.1
|
30
30
|
Requires-Dist: schedule<2.0.0,==1.2.2
|
@@ -196,7 +196,8 @@ and do not raise any error to you.
|
|
196
196
|
| `WORKFLOW_CORE_MAX_NUM_POKING` | Core | 4 | . | |
|
197
197
|
| `WORKFLOW_CORE_MAX_JOB_PARALLEL` | Core | 2 | The maximum job number that able to run parallel in workflow executor. | |
|
198
198
|
| `WORKFLOW_CORE_MAX_JOB_EXEC_TIMEOUT` | Core | 600 | | |
|
199
|
-
| `
|
199
|
+
| `WORKFLOW_CORE_MAX_CRON_PER_WORKFLOW` | Core | 5 | | |
|
200
|
+
| `WORKFLOW_CORE_MAX_QUEUE_COMPLETE_HIST` | Core | 16 | | |
|
200
201
|
| `WORKFLOW_CORE_GENERATE_ID_SIMPLE_MODE` | Core | true | A flog that enable generating ID with `md5` algorithm. | |
|
201
202
|
| `WORKFLOW_LOG_DEBUG_MODE` | Log | true | A flag that enable logging with debug level mode. | |
|
202
203
|
| `WORKFLOW_LOG_ENABLE_WRITE` | Log | true | A flag that enable logging object saving log to its destination. | |
|
@@ -163,7 +163,8 @@ and do not raise any error to you.
|
|
163
163
|
| `WORKFLOW_CORE_MAX_NUM_POKING` | Core | 4 | . | |
|
164
164
|
| `WORKFLOW_CORE_MAX_JOB_PARALLEL` | Core | 2 | The maximum job number that able to run parallel in workflow executor. | |
|
165
165
|
| `WORKFLOW_CORE_MAX_JOB_EXEC_TIMEOUT` | Core | 600 | | |
|
166
|
-
| `
|
166
|
+
| `WORKFLOW_CORE_MAX_CRON_PER_WORKFLOW` | Core | 5 | | |
|
167
|
+
| `WORKFLOW_CORE_MAX_QUEUE_COMPLETE_HIST` | Core | 16 | | |
|
167
168
|
| `WORKFLOW_CORE_GENERATE_ID_SIMPLE_MODE` | Core | true | A flog that enable generating ID with `md5` algorithm. | |
|
168
169
|
| `WORKFLOW_LOG_DEBUG_MODE` | Log | true | A flag that enable logging with debug level mode. | |
|
169
170
|
| `WORKFLOW_LOG_ENABLE_WRITE` | Log | true | A flag that enable logging object saving log to its destination. | |
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__: str = "0.0.24"
|
@@ -736,6 +736,12 @@ class CronRunner:
|
|
736
736
|
self.is_year: bool = isinstance(cron, CronJobYear)
|
737
737
|
self.reset_flag: bool = True
|
738
738
|
|
739
|
+
def __repr__(self) -> str:
|
740
|
+
return (
|
741
|
+
f"{self.__class__.__name__}(CronJob('{self.cron}'), "
|
742
|
+
f"{self.date:%Y-%m-%d %H:%M:%S}, tz='{self.tz}')"
|
743
|
+
)
|
744
|
+
|
739
745
|
def reset(self) -> None:
|
740
746
|
"""Resets the iterator to start time."""
|
741
747
|
self.date: datetime = self.__start_date
|
@@ -3,11 +3,17 @@
|
|
3
3
|
# Licensed under the MIT License. See LICENSE in the project root for
|
4
4
|
# license information.
|
5
5
|
# ------------------------------------------------------------------------------
|
6
|
+
from .__cron import CronRunner
|
6
7
|
from .conf import (
|
7
8
|
Config,
|
8
9
|
FileLog,
|
9
10
|
Loader,
|
10
11
|
)
|
12
|
+
from .cron import (
|
13
|
+
On,
|
14
|
+
YearOn,
|
15
|
+
interval2crontab,
|
16
|
+
)
|
11
17
|
from .exceptions import (
|
12
18
|
JobException,
|
13
19
|
ParamValueException,
|
@@ -19,11 +25,6 @@ from .job import (
|
|
19
25
|
Job,
|
20
26
|
Strategy,
|
21
27
|
)
|
22
|
-
from .on import (
|
23
|
-
On,
|
24
|
-
YearOn,
|
25
|
-
interval2crontab,
|
26
|
-
)
|
27
28
|
from .params import (
|
28
29
|
ChoiceParam,
|
29
30
|
DatetimeParam,
|
@@ -35,6 +36,7 @@ from .result import Result
|
|
35
36
|
from .scheduler import (
|
36
37
|
Schedule,
|
37
38
|
WorkflowSchedule,
|
39
|
+
schedule_runner,
|
38
40
|
)
|
39
41
|
from .stage import (
|
40
42
|
BashStage,
|
@@ -68,11 +70,10 @@ from .utils import (
|
|
68
70
|
map_post_filter,
|
69
71
|
not_in_template,
|
70
72
|
param2template,
|
71
|
-
queue2str,
|
72
73
|
str2template,
|
73
74
|
tag,
|
74
75
|
)
|
75
76
|
from .workflow import (
|
76
77
|
Workflow,
|
77
|
-
|
78
|
+
WorkflowTask,
|
78
79
|
)
|
@@ -23,7 +23,7 @@ from pydantic import BaseModel
|
|
23
23
|
from .__about__ import __version__
|
24
24
|
from .conf import config, get_logger
|
25
25
|
from .repeat import repeat_at, repeat_every
|
26
|
-
from .workflow import
|
26
|
+
from .workflow import WorkflowTask
|
27
27
|
|
28
28
|
load_dotenv()
|
29
29
|
logger = get_logger("ddeutil.workflow")
|
@@ -34,7 +34,7 @@ class State(TypedDict):
|
|
34
34
|
upper_result: dict[str, str]
|
35
35
|
scheduler: list[str]
|
36
36
|
workflow_threads: dict[str, Thread]
|
37
|
-
workflow_tasks: list[
|
37
|
+
workflow_tasks: list[WorkflowTask]
|
38
38
|
workflow_queue: dict[str, list[datetime]]
|
39
39
|
workflow_running: dict[str, list[datetime]]
|
40
40
|
|
@@ -73,10 +73,10 @@ def schedule(
|
|
73
73
|
if stop:
|
74
74
|
stop: datetime = stop.astimezone(tz=config.tz)
|
75
75
|
|
76
|
-
from .scheduler import
|
76
|
+
from .scheduler import schedule_runner
|
77
77
|
|
78
78
|
# NOTE: Start running workflow scheduler application.
|
79
|
-
workflow_rs: list[str] =
|
79
|
+
workflow_rs: list[str] = schedule_runner(
|
80
80
|
stop=stop, excluded=excluded, externals=json.loads(externals)
|
81
81
|
)
|
82
82
|
logger.info(f"Application run success: {workflow_rs}")
|
@@ -23,7 +23,7 @@ from pydantic import BaseModel, Field
|
|
23
23
|
from pydantic.functional_validators import model_validator
|
24
24
|
from typing_extensions import Self
|
25
25
|
|
26
|
-
from .__types import DictData
|
26
|
+
from .__types import DictData, TupleStr
|
27
27
|
|
28
28
|
AnyModel = TypeVar("AnyModel", bound=BaseModel)
|
29
29
|
AnyModelType = type[AnyModel]
|
@@ -32,6 +32,19 @@ load_dotenv()
|
|
32
32
|
|
33
33
|
env = os.getenv
|
34
34
|
|
35
|
+
__all__: TupleStr = (
|
36
|
+
"get_logger",
|
37
|
+
"Config",
|
38
|
+
"SimLoad",
|
39
|
+
"Loader",
|
40
|
+
"get_type",
|
41
|
+
"config",
|
42
|
+
"logger",
|
43
|
+
"FileLog",
|
44
|
+
"SQLiteLog",
|
45
|
+
"Log",
|
46
|
+
)
|
47
|
+
|
35
48
|
|
36
49
|
@lru_cache
|
37
50
|
def get_logger(name: str):
|
@@ -107,7 +120,10 @@ class Config:
|
|
107
120
|
os.getenv("WORKFLOW_CORE_MAX_NUM_POKING", "4")
|
108
121
|
)
|
109
122
|
max_on_per_workflow: int = int(
|
110
|
-
env("
|
123
|
+
env("WORKFLOW_CORE_MAX_CRON_PER_WORKFLOW", "5")
|
124
|
+
)
|
125
|
+
max_queue_complete_hist: int = int(
|
126
|
+
os.getenv("WORKFLOW_CORE_MAX_QUEUE_COMPLETE_HIST", "16")
|
111
127
|
)
|
112
128
|
|
113
129
|
# NOTE: Schedule App
|