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.
Files changed (65) hide show
  1. {ddeutil_workflow-0.0.23/src/ddeutil_workflow.egg-info → ddeutil_workflow-0.0.24}/PKG-INFO +4 -3
  2. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/README.md +2 -1
  3. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/pyproject.toml +1 -1
  4. ddeutil_workflow-0.0.24/src/ddeutil/workflow/__about__.py +1 -0
  5. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/__cron.py +6 -0
  6. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/__init__.py +8 -7
  7. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/api.py +2 -2
  8. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/cli.py +2 -2
  9. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/conf.py +18 -2
  10. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/scheduler.py +189 -154
  11. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/stage.py +5 -0
  12. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/utils.py +0 -4
  13. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/workflow.py +121 -138
  14. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24/src/ddeutil_workflow.egg-info}/PKG-INFO +4 -3
  15. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil_workflow.egg-info/SOURCES.txt +6 -5
  16. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil_workflow.egg-info/requires.txt +1 -1
  17. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_conf.py +7 -1
  18. ddeutil_workflow-0.0.23/tests/test_on.py → ddeutil_workflow-0.0.24/tests/test_cron_on.py +9 -9
  19. ddeutil_workflow-0.0.23/tests/test_scheduler.py → ddeutil_workflow-0.0.24/tests/test_schedule.py +30 -46
  20. ddeutil_workflow-0.0.24/tests/test_schedule_control.py +32 -0
  21. ddeutil_workflow-0.0.24/tests/test_schedule_tasks.py +72 -0
  22. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow.py +1 -1
  23. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_release.py +11 -0
  24. ddeutil_workflow-0.0.24/tests/test_workflow_schedule.py +118 -0
  25. ddeutil_workflow-0.0.24/tests/test_workflow_task.py +174 -0
  26. ddeutil_workflow-0.0.23/src/ddeutil/workflow/__about__.py +0 -1
  27. ddeutil_workflow-0.0.23/tests/test_scheduler_tasks.py +0 -60
  28. ddeutil_workflow-0.0.23/tests/test_workflow_schedule.py +0 -58
  29. ddeutil_workflow-0.0.23/tests/test_workflow_task_data.py +0 -82
  30. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/LICENSE +0 -0
  31. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/setup.cfg +0 -0
  32. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/__types.py +0 -0
  33. /ddeutil_workflow-0.0.23/src/ddeutil/workflow/on.py → /ddeutil_workflow-0.0.24/src/ddeutil/workflow/cron.py +0 -0
  34. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/exceptions.py +0 -0
  35. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/job.py +0 -0
  36. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/params.py +0 -0
  37. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/repeat.py +0 -0
  38. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/result.py +0 -0
  39. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil/workflow/route.py +0 -0
  40. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil_workflow.egg-info/dependency_links.txt +0 -0
  41. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil_workflow.egg-info/entry_points.txt +0 -0
  42. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/src/ddeutil_workflow.egg-info/top_level.txt +0 -0
  43. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test__cron.py +0 -0
  44. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test__regex.py +0 -0
  45. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_conf_log.py +0 -0
  46. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_job.py +0 -0
  47. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_job_exec_py.py +0 -0
  48. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_job_exec_strategy.py +0 -0
  49. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_job_strategy.py +0 -0
  50. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_params.py +0 -0
  51. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_result.py +0 -0
  52. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_stage.py +0 -0
  53. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_stage_exec_bash.py +0 -0
  54. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_stage_exec_hook.py +0 -0
  55. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_stage_exec_py.py +0 -0
  56. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_stage_exec_trigger.py +0 -0
  57. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_utils.py +0 -0
  58. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_utils_filter.py +0 -0
  59. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_utils_tag.py +0 -0
  60. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_utils_template.py +0 -0
  61. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_exec.py +0 -0
  62. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_exec_hook.py +0 -0
  63. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_exec_needs.py +0 -0
  64. {ddeutil_workflow-0.0.23 → ddeutil_workflow-0.0.24}/tests/test_workflow_job_exec.py +0 -0
  65. {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.23
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.2
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
- | `WORKFLOW_CORE_MAX_ON_PER_WORKFLOW` | Core | 5 | | |
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
- | `WORKFLOW_CORE_MAX_ON_PER_WORKFLOW` | Core | 5 | | |
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. | |
@@ -28,7 +28,7 @@ requires-python = ">=3.9.13"
28
28
  dependencies = [
29
29
  "ddeutil>=0.4.3",
30
30
  "ddeutil-io[yaml,toml]>=0.2.3",
31
- "pydantic==2.10.2",
31
+ "pydantic==2.10.4",
32
32
  "python-dotenv==1.0.1",
33
33
  "typer==0.15.1",
34
34
  "schedule==1.2.2,<2.0.0",
@@ -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
- WorkflowTaskData,
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 WorkflowTaskData
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[WorkflowTaskData]
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 workflow_runner
76
+ from .scheduler import schedule_runner
77
77
 
78
78
  # NOTE: Start running workflow scheduler application.
79
- workflow_rs: list[str] = workflow_runner(
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("WORKFLOW_CORE_MAX_ON_PER_WORKFLOW", "5")
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