ddeutil-workflow 0.0.57__py3-none-any.whl → 0.0.59__py3-none-any.whl

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/utils.py CHANGED
@@ -15,7 +15,7 @@ from inspect import isfunction
15
15
  from itertools import chain, islice, product
16
16
  from pathlib import Path
17
17
  from random import randrange
18
- from typing import Any, Final, TypeVar
18
+ from typing import Any, Final, Optional, TypeVar, Union
19
19
  from zoneinfo import ZoneInfo
20
20
 
21
21
  from ddeutil.core import hash_str
@@ -63,7 +63,7 @@ def clear_tz(dt: datetime) -> datetime:
63
63
  return dt.replace(tzinfo=None)
64
64
 
65
65
 
66
- def get_dt_now(tz: ZoneInfo | None = None, offset: float = 0.0) -> datetime:
66
+ def get_dt_now(tz: Optional[ZoneInfo] = None, offset: float = 0.0) -> datetime:
67
67
  """Return the current datetime object.
68
68
 
69
69
  :param tz: A ZoneInfo object for replace timezone of return datetime object.
@@ -76,7 +76,7 @@ def get_dt_now(tz: ZoneInfo | None = None, offset: float = 0.0) -> datetime:
76
76
 
77
77
 
78
78
  def get_d_now(
79
- tz: ZoneInfo | None = None, offset: float = 0.0
79
+ tz: Optional[ZoneInfo] = None, offset: float = 0.0
80
80
  ) -> date: # pragma: no cov
81
81
  """Return the current date object.
82
82
 
@@ -147,7 +147,7 @@ def gen_id(
147
147
  *,
148
148
  sensitive: bool = True,
149
149
  unique: bool = False,
150
- simple_mode: bool | None = None,
150
+ simple_mode: Optional[bool] = None,
151
151
  extras: DictData | None = None,
152
152
  ) -> str:
153
153
  """Generate running ID for able to tracking. This generates process use
@@ -197,7 +197,7 @@ def default_gen_id() -> str:
197
197
  return gen_id("manual", unique=True)
198
198
 
199
199
 
200
- def make_exec(path: str | Path) -> None:
200
+ def make_exec(path: Union[Path, str]) -> None:
201
201
  """Change mode of file to be executable file.
202
202
 
203
203
  :param path: A file path that want to make executable permission.
@@ -244,7 +244,7 @@ def cross_product(matrix: Matrix) -> Iterator[DictData]:
244
244
  )
245
245
 
246
246
 
247
- def batch(iterable: Iterator[Any] | range, n: int) -> Iterator[Any]:
247
+ def batch(iterable: Union[Iterator[Any], range], n: int) -> Iterator[Any]:
248
248
  """Batch data into iterators of length n. The last batch may be shorter.
249
249
 
250
250
  Example:
@@ -41,7 +41,7 @@ from typing_extensions import Self
41
41
  from .__cron import CronRunner
42
42
  from .__types import DictData, TupleStr
43
43
  from .conf import FileLoad, Loader, dynamic
44
- from .event import On
44
+ from .event import Crontab
45
45
  from .exceptions import WorkflowException
46
46
  from .job import Job
47
47
  from .logs import Audit, get_audit
@@ -69,10 +69,10 @@ __all__: TupleStr = (
69
69
  class ReleaseType(str, Enum):
70
70
  """Release Type Enum support the type field on the Release dataclass."""
71
71
 
72
- DEFAULT: str = "manual"
73
- SCHEDULE: str = "schedule"
74
- POKING: str = "poking"
75
- FORCE: str = "force"
72
+ DEFAULT = "manual"
73
+ SCHEDULE = "schedule"
74
+ POKING = "poking"
75
+ FORCE = "force"
76
76
 
77
77
 
78
78
  @total_ordering
@@ -105,14 +105,14 @@ class Release:
105
105
  return f"{self.date:%Y-%m-%d %H:%M:%S}"
106
106
 
107
107
  @classmethod
108
- def from_dt(cls, dt: datetime | str) -> Self:
108
+ def from_dt(cls, dt: Union[datetime, str]) -> Self:
109
109
  """Construct Release object from `datetime` or `str` objects.
110
110
 
111
111
  This method will replace second and millisecond value to 0 and
112
112
  replace timezone to the `tz` config setting or extras overriding before
113
113
  create Release object.
114
114
 
115
- :param dt: (datetime | str) A datetime object or string that want to
115
+ :param dt: (Union[datetime, str]) A datetime object or string that want to
116
116
  construct to the Release object.
117
117
 
118
118
  :raise TypeError: If the type of the dt argument does not valid with
@@ -129,7 +129,7 @@ class Release:
129
129
  )
130
130
  return cls(date=replace_sec(dt.replace(tzinfo=None)))
131
131
 
132
- def __eq__(self, other: Release | datetime) -> bool:
132
+ def __eq__(self, other: Union[Release, datetime]) -> bool:
133
133
  """Override equal property that will compare only the same type or
134
134
  datetime.
135
135
 
@@ -141,7 +141,7 @@ class Release:
141
141
  return self.date == other
142
142
  return NotImplemented
143
143
 
144
- def __lt__(self, other: Release | datetime) -> bool:
144
+ def __lt__(self, other: Union[Release, datetime]) -> bool:
145
145
  """Override less-than property that will compare only the same type or
146
146
  datetime.
147
147
 
@@ -209,7 +209,7 @@ class ReleaseQueue:
209
209
  """
210
210
  return len(self.queue) > 0
211
211
 
212
- def check_queue(self, value: Release | datetime) -> bool:
212
+ def check_queue(self, value: Union[Release, datetime]) -> bool:
213
213
  """Check a Release value already exists in list of tracking
214
214
  queues.
215
215
 
@@ -314,7 +314,7 @@ class ReleaseQueue:
314
314
 
315
315
 
316
316
  class Workflow(BaseModel):
317
- """Workflow model that use to keep the `Job` and `On` models.
317
+ """Workflow model that use to keep the `Job` and `Crontab` models.
318
318
 
319
319
  This is the main future of this project because it uses to be workflow
320
320
  data for running everywhere that you want or using it to scheduler task in
@@ -338,9 +338,9 @@ class Workflow(BaseModel):
338
338
  default_factory=dict,
339
339
  description="A parameters that need to use on this workflow.",
340
340
  )
341
- on: list[On] = Field(
341
+ on: list[Crontab] = Field(
342
342
  default_factory=list,
343
- description="A list of On instance for this workflow schedule.",
343
+ description="A list of Crontab instance for this workflow schedule.",
344
344
  )
345
345
  jobs: dict[str, Job] = Field(
346
346
  default_factory=dict,
@@ -447,9 +447,9 @@ class Workflow(BaseModel):
447
447
  @field_validator("on", mode="after")
448
448
  def __on_no_dup_and_reach_limit__(
449
449
  cls,
450
- value: list[On],
450
+ value: list[Crontab],
451
451
  info: ValidationInfo,
452
- ) -> list[On]:
452
+ ) -> list[Crontab]:
453
453
  """Validate the on fields should not contain duplicate values and if it
454
454
  contains the every minute value more than one value, it will remove to
455
455
  only one value.
@@ -458,7 +458,7 @@ class Workflow(BaseModel):
458
458
 
459
459
  :param value: A list of on object.
460
460
 
461
- :rtype: list[On]
461
+ :rtype: list[Crontab]
462
462
  """
463
463
  set_ons: set[str] = {str(on.cronjob) for on in value}
464
464
  if len(set_ons) != len(value):
@@ -476,7 +476,7 @@ class Workflow(BaseModel):
476
476
  if len(set_tz) > 1:
477
477
  raise ValueError(
478
478
  f"The on fields should not contain multiple timezone, "
479
- f"{list[set_tz]}."
479
+ f"{list(set_tz)}."
480
480
  )
481
481
 
482
482
  extras: Optional[DictData] = info.data.get("extras")
@@ -563,11 +563,11 @@ class Workflow(BaseModel):
563
563
  adding jobs key to this parameter.
564
564
  """
565
565
  # VALIDATE: Incoming params should have keys that set on this workflow.
566
- if check_key := tuple(
566
+ if check_key := [
567
567
  f"{k!r}"
568
568
  for k in self.params
569
569
  if (k not in params and self.params[k].required)
570
- ):
570
+ ]:
571
571
  raise WorkflowException(
572
572
  f"Required Param on this workflow setting does not set: "
573
573
  f"{', '.join(check_key)}."
@@ -588,14 +588,14 @@ class Workflow(BaseModel):
588
588
 
589
589
  def release(
590
590
  self,
591
- release: datetime | Release,
591
+ release: Union[Release, datetime],
592
592
  params: DictData,
593
593
  *,
594
- run_id: str | None = None,
595
- parent_run_id: str | None = None,
594
+ run_id: Optional[str] = None,
595
+ parent_run_id: Optional[str] = None,
596
596
  audit: type[Audit] = None,
597
597
  queue: Optional[ReleaseQueue] = None,
598
- override_log_name: str | None = None,
598
+ override_log_name: Optional[str] = None,
599
599
  result: Optional[Result] = None,
600
600
  timeout: int = 600,
601
601
  ) -> Result:
@@ -745,12 +745,12 @@ class Workflow(BaseModel):
745
745
 
746
746
  def poke(
747
747
  self,
748
- params: DictData | None = None,
749
- start_date: datetime | None = None,
748
+ params: Optional[DictData] = None,
749
+ start_date: Optional[datetime] = None,
750
750
  *,
751
- run_id: str | None = None,
751
+ run_id: Optional[str] = None,
752
752
  periods: int = 1,
753
- audit: Audit | None = None,
753
+ audit: Optional[Audit] = None,
754
754
  force_run: bool = False,
755
755
  timeout: int = 1800,
756
756
  max_poking_pool_worker: int = 2,
@@ -907,8 +907,8 @@ class Workflow(BaseModel):
907
907
  job: Job,
908
908
  params: DictData,
909
909
  *,
910
- result: Result | None = None,
911
- event: Event | None = None,
910
+ result: Optional[Result] = None,
911
+ event: Optional[Event] = None,
912
912
  ) -> Result:
913
913
  """Job execution with passing dynamic parameters from the main workflow
914
914
  execution to the target job object via job's ID.
@@ -969,10 +969,10 @@ class Workflow(BaseModel):
969
969
  self,
970
970
  params: DictData,
971
971
  *,
972
- run_id: str | None = None,
973
- parent_run_id: str | None = None,
974
- result: Result | None = None,
975
- event: Event | None = None,
972
+ run_id: Optional[str] = None,
973
+ parent_run_id: Optional[str] = None,
974
+ result: Optional[Result] = None,
975
+ event: Optional[Event] = None,
976
976
  timeout: int = 3600,
977
977
  max_job_parallel: int = 2,
978
978
  ) -> Result:
@@ -999,8 +999,8 @@ class Workflow(BaseModel):
999
999
  at the result context.
1000
1000
 
1001
1001
  :param params: A parameter data that will parameterize before execution.
1002
- :param run_id: (str | None) A workflow running ID.
1003
- :param parent_run_id: (str | None) A parent workflow running ID.
1002
+ :param run_id: (Optional[str]) A workflow running ID.
1003
+ :param parent_run_id: (Optional[str]) A parent workflow running ID.
1004
1004
  :param result: (Result) A Result instance for return context and status.
1005
1005
  :param event: (Event) An Event manager instance that use to cancel this
1006
1006
  execution if it forces stopped by parent execution.
@@ -1022,7 +1022,14 @@ class Workflow(BaseModel):
1022
1022
  extras=self.extras,
1023
1023
  )
1024
1024
  context: DictData = self.parameterize(params)
1025
- result.trace.info(f"[WORKFLOW]: Execute: {self.name!r}")
1025
+ event: Event = event or Event()
1026
+ max_job_parallel: int = dynamic(
1027
+ "max_job_parallel", f=max_job_parallel, extras=self.extras
1028
+ )
1029
+ result.trace.info(
1030
+ f"[WORKFLOW]: Execute: {self.name!r} ("
1031
+ f"{'parallel' if max_job_parallel > 1 else 'sequential'} jobs)"
1032
+ )
1026
1033
  if not self.jobs:
1027
1034
  result.trace.warning(f"[WORKFLOW]: {self.name!r} does not set jobs")
1028
1035
  return result.catch(status=SUCCESS, context=context)
@@ -1035,16 +1042,9 @@ class Workflow(BaseModel):
1035
1042
  timeout: int = dynamic(
1036
1043
  "max_job_exec_timeout", f=timeout, extras=self.extras
1037
1044
  )
1038
- event: Event = event or Event()
1039
- result.trace.debug(
1040
- f"[WORKFLOW]: ... Run {self.name!r} with non-threading."
1041
- )
1042
- max_job_parallel: int = dynamic(
1043
- "max_job_parallel", f=max_job_parallel, extras=self.extras
1044
- )
1045
+
1045
1046
  with ThreadPoolExecutor(
1046
- max_workers=max_job_parallel,
1047
- thread_name_prefix="wf_exec_non_threading_",
1047
+ max_workers=max_job_parallel, thread_name_prefix="wf_exec_"
1048
1048
  ) as executor:
1049
1049
  futures: list[Future] = []
1050
1050
 
@@ -1165,10 +1165,10 @@ class WorkflowTask:
1165
1165
 
1166
1166
  def release(
1167
1167
  self,
1168
- release: datetime | Release | None = None,
1169
- run_id: str | None = None,
1168
+ release: Optional[Union[Release, datetime]] = None,
1169
+ run_id: Optional[str] = None,
1170
1170
  audit: type[Audit] = None,
1171
- queue: ReleaseQueue | None = None,
1171
+ queue: Optional[ReleaseQueue] = None,
1172
1172
  ) -> Result:
1173
1173
  """Release the workflow task that passing an override parameter to
1174
1174
  the parent release method with the `values` field.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ddeutil-workflow
3
- Version: 0.0.57
3
+ Version: 0.0.59
4
4
  Summary: Lightweight workflow orchestration
5
5
  Author-email: ddeutils <korawich.anu@gmail.com>
6
6
  License: MIT
@@ -23,17 +23,20 @@ Requires-Python: >=3.9.13
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
25
  Requires-Dist: ddeutil[checksum]>=0.4.8
26
- Requires-Dist: ddeutil-io[toml,yaml]>=0.2.12
27
- Requires-Dist: pydantic==2.11.1
26
+ Requires-Dist: ddeutil-io[toml,yaml]>=0.2.13
27
+ Requires-Dist: pydantic==2.11.4
28
28
  Requires-Dist: python-dotenv==1.1.0
29
29
  Requires-Dist: schedule<2.0.0,==1.2.2
30
30
  Provides-Extra: all
31
31
  Requires-Dist: fastapi<1.0.0,>=0.115.0; extra == "all"
32
+ Requires-Dist: uvicorn; extra == "all"
32
33
  Requires-Dist: httpx; extra == "all"
34
+ Requires-Dist: ujson; extra == "all"
33
35
  Requires-Dist: aiofiles; extra == "all"
34
36
  Requires-Dist: aiohttp; extra == "all"
35
37
  Provides-Extra: api
36
38
  Requires-Dist: fastapi<1.0.0,>=0.115.0; extra == "api"
39
+ Requires-Dist: uvicorn; extra == "api"
37
40
  Requires-Dist: httpx; extra == "api"
38
41
  Requires-Dist: ujson; extra == "api"
39
42
  Provides-Extra: async
@@ -0,0 +1,31 @@
1
+ ddeutil/workflow/__about__.py,sha256=pgt1UgXVQ5NH2bT0-9YyCLh7xzGOl3WFa4CWgM2rMyE,28
2
+ ddeutil/workflow/__cron.py,sha256=5DHQKejG-76L_oREW78RcwMzeyKddJxSMmBzYyMAeeY,28536
3
+ ddeutil/workflow/__init__.py,sha256=NXEhjzKFdIGa-jtIq9HXChLCjSXNPd8VJ8ltggxbBO8,1371
4
+ ddeutil/workflow/__main__.py,sha256=x-sYedl4T8p6054aySk-EQX6vhytvPR0HvaBNYxMzp0,364
5
+ ddeutil/workflow/__types.py,sha256=7xXy6ynpT6Do6U5A-XYSVuinE2g-4wlZGGJ1NACK1BE,4343
6
+ ddeutil/workflow/conf.py,sha256=NLvjZ8bpDsn4e0MG3m1vgMdAwtmii5hP1D0STKQyZeo,14907
7
+ ddeutil/workflow/event.py,sha256=I9CUFAsqUNguCPALVmqwKWaUHcSpwg2S-chGrTZRXFY,10410
8
+ ddeutil/workflow/exceptions.py,sha256=Phe5JK-nLDt1Yh-ilWnpLIJl1VRsAzK4TBZ1tTiv9OQ,2359
9
+ ddeutil/workflow/job.py,sha256=2GGW_sY3XhZGYJpXWi84k4uTRV9YMPOMagVtDeeDya8,35289
10
+ ddeutil/workflow/logs.py,sha256=BFdPKcIsoSPU-tZBMQvBipAdlBur8IjOk7MxyqrTC8Q,28537
11
+ ddeutil/workflow/params.py,sha256=tBjKe1_e0TlUrSrlMahDuAdNNBlGBAKMmMMQ9eV-YSs,11616
12
+ ddeutil/workflow/result.py,sha256=LJieCsaQJOgZKz68wao2XKXCFm3bXl2jNkeHniP_Y90,5888
13
+ ddeutil/workflow/reusables.py,sha256=mw_Fi763B5am0EmntcjLBF7MDEhKqud2BYHcYyno5Ec,17663
14
+ ddeutil/workflow/scheduler.py,sha256=OsEyj2zscQ-3bDMk2z7UtKlCWLlgoGjaRFt17o1B1ew,27263
15
+ ddeutil/workflow/stages.py,sha256=_GGrI4sayY1HArqV0aWUMwukONnZ_6-QVAiaomP4nbY,92239
16
+ ddeutil/workflow/utils.py,sha256=S4TN1qH6t8NiZfIapJed3ZS35aQc18HzDPQ4oLqct7M,8804
17
+ ddeutil/workflow/workflow.py,sha256=gq7zbBeJptqb9rmHcR29c8Gbh43N1-cW94NdHGb6Td4,44856
18
+ ddeutil/workflow/api/__init__.py,sha256=kY30dL8HPY8tY_GBmm7y_3OdoXzB1-EA2a96PLU0AQw,5278
19
+ ddeutil/workflow/api/logs.py,sha256=NMTnOnsBrDB5129329xF2myLdrb-z9k1MQrmrP7qXJw,1818
20
+ ddeutil/workflow/api/utils.py,sha256=uTtUFVLpiYYahXvCVx8sueRQ03K2Xw1id_gW3IMmX1U,5295
21
+ ddeutil/workflow/api/routes/__init__.py,sha256=qoGtOMyVgQ5nTUc8J8wH27A8isaxl3IFCX8qoyibeCY,484
22
+ ddeutil/workflow/api/routes/job.py,sha256=8X5VLDJH6PumyNIY6JGRNBsf2gWN0eG9DzxRPSh6n4I,2190
23
+ ddeutil/workflow/api/routes/logs.py,sha256=U6vOni3wd-ZTOwd3yVdSOpgyRmNdcgfngU5KlLM3Cww,5383
24
+ ddeutil/workflow/api/routes/schedules.py,sha256=14RnaJKEGMSJtncI1H_QQVZNBe_jDS40PPRO6qFc3i0,4805
25
+ ddeutil/workflow/api/routes/workflows.py,sha256=GJu5PiXEylswrXylEImpncySjeU9chrvrtjhiMCw2RQ,4529
26
+ ddeutil_workflow-0.0.59.dist-info/licenses/LICENSE,sha256=nGFZ1QEhhhWeMHf9n99_fdt4vQaXS29xWKxt-OcLywk,1085
27
+ ddeutil_workflow-0.0.59.dist-info/METADATA,sha256=JqwaP7hwfaNAlrObHxnHlzDyBDbb_cy186S92GRjXZ4,19343
28
+ ddeutil_workflow-0.0.59.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
29
+ ddeutil_workflow-0.0.59.dist-info/entry_points.txt,sha256=qDTpPSauL0ciO6T4iSVt8bJeYrVEkkoEEw_RlGx6Kgk,63
30
+ ddeutil_workflow-0.0.59.dist-info/top_level.txt,sha256=m9M6XeSWDwt_yMsmH6gcOjHZVK5O0-vgtNBuncHjzW4,8
31
+ ddeutil_workflow-0.0.59.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,31 +0,0 @@
1
- ddeutil/workflow/__about__.py,sha256=CDkPQWe1GLFFYrnuKrqTnoR8t6DWwXK2EjJrmuY9rfQ,28
2
- ddeutil/workflow/__cron.py,sha256=yLWN_1MtcN5Uc3Dinq5lpsjW1_0HmIM5tEm-o_q0Spw,28527
3
- ddeutil/workflow/__init__.py,sha256=NXEhjzKFdIGa-jtIq9HXChLCjSXNPd8VJ8ltggxbBO8,1371
4
- ddeutil/workflow/__main__.py,sha256=x-sYedl4T8p6054aySk-EQX6vhytvPR0HvaBNYxMzp0,364
5
- ddeutil/workflow/__types.py,sha256=7xXy6ynpT6Do6U5A-XYSVuinE2g-4wlZGGJ1NACK1BE,4343
6
- ddeutil/workflow/conf.py,sha256=AiIw89wZ8NtDFLkiiFOwI12z1toSbgMcSs5c23LY9OQ,14822
7
- ddeutil/workflow/event.py,sha256=vVM6vVVR0T68p5jysfmQNcGwT40D7-lAyoJJuxkpYkE,10342
8
- ddeutil/workflow/exceptions.py,sha256=HNXkZLaoWa6ejYG1NdwlUAyZiJWbsjjOJ9DjIPaM-aw,2343
9
- ddeutil/workflow/job.py,sha256=JoaghWkov4uYFX20gLee5w-MgpsFjeY36gA1WuIygY4,35070
10
- ddeutil/workflow/logs.py,sha256=aI0GWqUKjMSoGsbUzc4bw8m1lixUkr__MIV5KAoQj_Q,26944
11
- ddeutil/workflow/params.py,sha256=FKY4Oo1Ze4QZKRfAk7rqKsi44YaJQAbqAtXM6vlO2hI,11392
12
- ddeutil/workflow/result.py,sha256=yEV_IXtiC8x-4zx6DKal5swebjtOWdKakv-WuhNyiNQ,5891
13
- ddeutil/workflow/reusables.py,sha256=iXcS7Gg-71qVX4ln0ILTDx03cTtUnj_rNoXHTVdVrxc,17636
14
- ddeutil/workflow/scheduler.py,sha256=t8X6_NGKOfN5rYjGJpEZwekbcSoz9-qyB1BZBh84ZKg,27180
15
- ddeutil/workflow/stages.py,sha256=aQaXo1XSB69FBVI4wpq8PKA0A3EIvmUlmFeTmy3dDw4,90480
16
- ddeutil/workflow/utils.py,sha256=wrL9nAVPOFWEvgniELAHbB_NGVX5QeL9DkzHEE35LE8,8766
17
- ddeutil/workflow/workflow.py,sha256=5eUdM48DSWtZMY13yTWwThR-EgbUCLPW0Ze8iKZpp_A,44783
18
- ddeutil/workflow/api/__init__.py,sha256=kY30dL8HPY8tY_GBmm7y_3OdoXzB1-EA2a96PLU0AQw,5278
19
- ddeutil/workflow/api/logs.py,sha256=NMTnOnsBrDB5129329xF2myLdrb-z9k1MQrmrP7qXJw,1818
20
- ddeutil/workflow/api/utils.py,sha256=uTtUFVLpiYYahXvCVx8sueRQ03K2Xw1id_gW3IMmX1U,5295
21
- ddeutil/workflow/api/routes/__init__.py,sha256=qoGtOMyVgQ5nTUc8J8wH27A8isaxl3IFCX8qoyibeCY,484
22
- ddeutil/workflow/api/routes/job.py,sha256=8X5VLDJH6PumyNIY6JGRNBsf2gWN0eG9DzxRPSh6n4I,2190
23
- ddeutil/workflow/api/routes/logs.py,sha256=U6vOni3wd-ZTOwd3yVdSOpgyRmNdcgfngU5KlLM3Cww,5383
24
- ddeutil/workflow/api/routes/schedules.py,sha256=14RnaJKEGMSJtncI1H_QQVZNBe_jDS40PPRO6qFc3i0,4805
25
- ddeutil/workflow/api/routes/workflows.py,sha256=GJu5PiXEylswrXylEImpncySjeU9chrvrtjhiMCw2RQ,4529
26
- ddeutil_workflow-0.0.57.dist-info/licenses/LICENSE,sha256=nGFZ1QEhhhWeMHf9n99_fdt4vQaXS29xWKxt-OcLywk,1085
27
- ddeutil_workflow-0.0.57.dist-info/METADATA,sha256=Ogbx45vg0e4zSahdeSxv0P4EWQ0kT95rEMMR4FLXcPM,19228
28
- ddeutil_workflow-0.0.57.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
29
- ddeutil_workflow-0.0.57.dist-info/entry_points.txt,sha256=qDTpPSauL0ciO6T4iSVt8bJeYrVEkkoEEw_RlGx6Kgk,63
30
- ddeutil_workflow-0.0.57.dist-info/top_level.txt,sha256=m9M6XeSWDwt_yMsmH6gcOjHZVK5O0-vgtNBuncHjzW4,8
31
- ddeutil_workflow-0.0.57.dist-info/RECORD,,