ddeutil-workflow 0.0.71__py3-none-any.whl → 0.0.72__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.
@@ -1 +1 @@
1
- __version__: str = "0.0.71"
1
+ __version__: str = "0.0.72"
ddeutil/workflow/cli.py CHANGED
@@ -1,3 +1,10 @@
1
+ # ------------------------------------------------------------------------------
2
+ # Copyright (c) 2022 Korawich Anuttra. All rights reserved.
3
+ # Licensed under the MIT License. See LICENSE in the project root for
4
+ # license information.
5
+ # ------------------------------------------------------------------------------
6
+ from __future__ import annotations
7
+
1
8
  import json
2
9
  from pathlib import Path
3
10
  from platform import python_version
@@ -8,7 +15,6 @@ from pydantic import Field, TypeAdapter
8
15
 
9
16
  from .__about__ import __version__
10
17
  from .__types import DictData
11
- from .api import app as fastapp
12
18
  from .errors import JobError
13
19
  from .event import Crontab
14
20
  from .job import Job
@@ -46,7 +52,7 @@ def execute_job(
46
52
  """Job execution on the local.
47
53
 
48
54
  Example:
49
- ... workflow-cli job --params "{\"test\": 1}"
55
+ ... workflow-cli job --params \"{\\\"test\\\": 1}\"
50
56
  """
51
57
  try:
52
58
  params_dict: dict[str, Any] = json.loads(params)
@@ -92,6 +98,7 @@ def api(
92
98
  """
93
99
  import uvicorn
94
100
 
101
+ from .api import app as fastapp
95
102
  from .api.log_conf import LOGGING_CONFIG
96
103
 
97
104
  # LOGGING_CONFIG = {}
@@ -121,7 +128,7 @@ def make(
121
128
 
122
129
 
123
130
  workflow_app = typer.Typer()
124
- app.add_typer(workflow_app, name="workflow", help="An Only Workflow CLI.")
131
+ app.add_typer(workflow_app, name="workflows", help="An Only Workflow CLI.")
125
132
 
126
133
 
127
134
  @workflow_app.callback()
@@ -180,5 +187,14 @@ def workflow_json_schema(
180
187
  json.dump(template_schema | json_schema, f, indent=2)
181
188
 
182
189
 
190
+ log_app = typer.Typer()
191
+ app.add_typer(log_app, name="logs", help="An Only Log CLI.")
192
+
193
+
194
+ @log_app.callback()
195
+ def log_callback():
196
+ """Manage Only Log CLI."""
197
+
198
+
183
199
  if __name__ == "__main__":
184
200
  app()
ddeutil/workflow/conf.py CHANGED
@@ -9,7 +9,6 @@ import copy
9
9
  import os
10
10
  from collections.abc import Iterator
11
11
  from functools import cached_property
12
- from inspect import isclass
13
12
  from pathlib import Path
14
13
  from typing import Final, Optional, TypeVar, Union
15
14
  from zoneinfo import ZoneInfo
@@ -20,6 +19,7 @@ from ddeutil.io.paths import glob_files, is_ignored, read_ignore
20
19
  from pydantic import SecretStr
21
20
 
22
21
  from .__types import DictData
22
+ from .utils import obj_name
23
23
 
24
24
  T = TypeVar("T")
25
25
  PREFIX: Final[str] = "WORKFLOW"
@@ -192,6 +192,7 @@ class YamlParser:
192
192
  path: Optional[Union[str, Path]] = None,
193
193
  externals: DictData | None = None,
194
194
  extras: DictData | None = None,
195
+ obj: Optional[Union[object, str]] = None,
195
196
  ) -> None:
196
197
  self.path: Path = Path(dynamic("conf_path", f=path, extras=extras))
197
198
  self.externals: DictData = externals or {}
@@ -201,6 +202,7 @@ class YamlParser:
201
202
  path=path,
202
203
  paths=self.extras.get("conf_paths"),
203
204
  extras=extras,
205
+ obj=obj,
204
206
  )
205
207
 
206
208
  # VALIDATE: check the data that reading should not empty.
@@ -218,6 +220,7 @@ class YamlParser:
218
220
  *,
219
221
  path: Optional[Path] = None,
220
222
  paths: Optional[list[Path]] = None,
223
+ obj: Optional[Union[object, str]] = None,
221
224
  extras: Optional[DictData] = None,
222
225
  ) -> DictData:
223
226
  """Find data with specific key and return the latest modify date data if
@@ -226,6 +229,7 @@ class YamlParser:
226
229
  :param name: (str) A name of data that want to find.
227
230
  :param path: (Path) A config path object.
228
231
  :param paths: (list[Path]) A list of config path object.
232
+ :param obj:
229
233
  :param extras: (DictData) An extra parameter that use to override core
230
234
  config values.
231
235
 
@@ -243,6 +247,8 @@ class YamlParser:
243
247
  paths.append(path)
244
248
 
245
249
  all_data: list[tuple[float, DictData]] = []
250
+ obj_type: Optional[str] = obj_name(obj)
251
+
246
252
  for path in paths:
247
253
  for file in glob_files(path):
248
254
 
@@ -250,14 +256,19 @@ class YamlParser:
250
256
  continue
251
257
 
252
258
  if data := cls.filter_yaml(file, name=name):
253
- all_data.append((file.lstat().st_mtime, data))
259
+ if not obj_type:
260
+ all_data.append((file.lstat().st_mtime, data))
261
+ elif data.get("type", "") == obj_type:
262
+ all_data.append((file.lstat().st_mtime, data))
263
+ else:
264
+ continue
254
265
 
255
266
  return {} if not all_data else max(all_data, key=lambda x: x[0])[1]
256
267
 
257
268
  @classmethod
258
269
  def finds(
259
270
  cls,
260
- obj: object,
271
+ obj: Union[object, str],
261
272
  *,
262
273
  path: Optional[Path] = None,
263
274
  paths: Optional[list[Path]] = None,
@@ -268,8 +279,8 @@ class YamlParser:
268
279
  method can use include and exclude list of identity name for filter and
269
280
  adds-on.
270
281
 
271
- :param obj: (object) An object that want to validate matching before
272
- return.
282
+ :param obj: (object | str) An object that want to validate matching
283
+ before return.
273
284
  :param path: (Path) A config path object.
274
285
  :param paths: (list[Path]) A list of config path object.
275
286
  :param excluded: An included list of data key that want to filter from
@@ -292,6 +303,8 @@ class YamlParser:
292
303
  paths.append(path)
293
304
 
294
305
  all_data: dict[str, list[tuple[float, DictData]]] = {}
306
+ obj_type: str = obj_name(obj)
307
+
295
308
  for path in paths:
296
309
  for file in glob_files(path):
297
310
 
@@ -303,10 +316,7 @@ class YamlParser:
303
316
  if key in excluded:
304
317
  continue
305
318
 
306
- if (
307
- data.get("type", "")
308
- == (obj if isclass(obj) else obj.__class__).__name__
309
- ):
319
+ if data.get("type", "") == obj_type:
310
320
  marking: tuple[float, DictData] = (
311
321
  file.lstat().st_mtime,
312
322
  data,
ddeutil/workflow/event.py CHANGED
@@ -139,7 +139,7 @@ class Crontab(BaseModel):
139
139
  :rtype: Self
140
140
  """
141
141
  extras: DictData = extras or {}
142
- loader: YamlParser = YamlParser(name, extras=extras)
142
+ loader: YamlParser = YamlParser(name, extras=extras, obj=cls)
143
143
 
144
144
  # NOTE: Validate the config type match with current connection model
145
145
  if loader.type != cls.__name__:
ddeutil/workflow/utils.py CHANGED
@@ -11,7 +11,7 @@ import time
11
11
  from collections.abc import Iterator
12
12
  from datetime import date, datetime, timedelta
13
13
  from hashlib import md5
14
- from inspect import isfunction
14
+ from inspect import isclass, isfunction
15
15
  from itertools import product
16
16
  from pathlib import Path
17
17
  from random import randrange
@@ -303,3 +303,15 @@ def dump_all(
303
303
  elif isinstance(value, BaseModel):
304
304
  return value.model_dump(by_alias=by_alias)
305
305
  return value
306
+
307
+
308
+ def obj_name(obj: Optional[Union[str, object]] = None) -> Optional[str]:
309
+ if not obj:
310
+ obj_type: Optional[str] = None
311
+ elif isinstance(obj, str):
312
+ obj_type: str = obj
313
+ elif isclass(obj):
314
+ obj_type: str = obj.__name__
315
+ else:
316
+ obj_type: str = obj.__class__.__name__
317
+ return obj_type
@@ -126,7 +126,7 @@ class Workflow(BaseModel):
126
126
 
127
127
  :rtype: Self
128
128
  """
129
- load: YamlParser = YamlParser(name, path=path, extras=extras)
129
+ load: YamlParser = YamlParser(name, path=path, extras=extras, obj=cls)
130
130
 
131
131
  # NOTE: Validate the config type match with current connection model
132
132
  if load.type != cls.__name__:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ddeutil-workflow
3
- Version: 0.0.71
3
+ Version: 0.0.72
4
4
  Summary: Lightweight workflow orchestration with YAML template
5
5
  Author-email: ddeutils <korawich.anu@gmail.com>
6
6
  License: MIT
@@ -24,9 +24,9 @@ Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
25
  Requires-Dist: ddeutil[checksum]>=0.4.8
26
26
  Requires-Dist: ddeutil-io[toml,yaml]>=0.2.14
27
- Requires-Dist: pydantic==2.11.5
28
- Requires-Dist: pydantic-extra-types==2.10.4
29
- Requires-Dist: python-dotenv==1.1.0
27
+ Requires-Dist: pydantic<3.0.0,==2.11.5
28
+ Requires-Dist: pydantic-extra-types<3.0.0,>=2.10.4
29
+ Requires-Dist: python-dotenv>=1.1.0
30
30
  Requires-Dist: typer>=0.16.0
31
31
  Provides-Extra: all
32
32
  Requires-Dist: fastapi<1.0.0,>=0.115.0; extra == "all"
@@ -1,30 +1,30 @@
1
- ddeutil/workflow/__about__.py,sha256=rGClYdU_G91zwBxZHz_ffWrmbiq8rrJJRS0kmAdKXPQ,28
1
+ ddeutil/workflow/__about__.py,sha256=VthLlJATFFZHEcP5syc1TRdzGF0zHfM2k5hzVK_WmRk,28
2
2
  ddeutil/workflow/__cron.py,sha256=BOKQcreiex0SAigrK1gnLxpvOeF3aca_rQwyz9Kfve4,28751
3
3
  ddeutil/workflow/__init__.py,sha256=HUy9XkBe7ttpUupJS4JDuj3aGp2QmJZfz8m2kHAIwdw,927
4
4
  ddeutil/workflow/__main__.py,sha256=Qd-f8z2Q2vpiEP2x6PBFsJrpACWDVxFKQk820MhFmHo,59
5
5
  ddeutil/workflow/__types.py,sha256=uNfoRbVmNK5O37UUMVnqcmoghD9oMS1q9fXC0APnjSI,4584
6
6
  ddeutil/workflow/audits.py,sha256=1pg4a5wdZCAKOqMr1Z_ofzRAFsDarN1BIJenWwn9xkg,11435
7
- ddeutil/workflow/cli.py,sha256=96IHeF18zrrnpMfSbJuoSJBt_21NfuDCcRvGw63IG0Y,5154
8
- ddeutil/workflow/conf.py,sha256=KcvOlU0zzS53iK44X_T64qHSX9nr4EHGjGX31dsRiUE,13609
7
+ ddeutil/workflow/cli.py,sha256=7cdn4f9KYOBK4CFs7sGmM2c0iYvzXiPtHnklSuD7ObU,5676
8
+ ddeutil/workflow/conf.py,sha256=ZkXNiiIljqNVoLo46Gbp37-NNMfDCz5g9JiyNeJNoXE,13973
9
9
  ddeutil/workflow/errors.py,sha256=O5rq80Sqj0QMeIsWXpRUhiFLTq0o8bwm5BQ4kuq6xmI,3013
10
- ddeutil/workflow/event.py,sha256=e3xcECfMvH6K8Tff9cjCXIItVJjOmlonAQ0l253l6T0,11110
10
+ ddeutil/workflow/event.py,sha256=0fGcous2vAF5DZ-aengk_vovgHoWNRoIiidSxk9ytkw,11119
11
11
  ddeutil/workflow/job.py,sha256=kviOQeSUsx0Z7CL0foblTulg2m_l6a3M3SMRxg9RWeg,39151
12
12
  ddeutil/workflow/params.py,sha256=Pco3DyjptC5Jkx53dhLL9xlIQdJvNAZs4FLzMUfXpbQ,12402
13
13
  ddeutil/workflow/result.py,sha256=ctxNSaY9tZPHEAUgvDkjWWu2APeTmlZCf1Hb0XVbbFo,8173
14
14
  ddeutil/workflow/reusables.py,sha256=LSn0XTkzGHf4ulOmWub29F0JZHt0NEyzrFd4ZFx_g_k,21622
15
15
  ddeutil/workflow/stages.py,sha256=kzMEMRTEuG52EOw51zyVO6LE-oiiqTIRUCk_OMcWZTM,106506
16
16
  ddeutil/workflow/traces.py,sha256=DrKzxgp9FJUJd_oWYHiMtR1z8R7HeweAL4_Y8q0_pz8,25048
17
- ddeutil/workflow/utils.py,sha256=65aMH2JKeeG7GLLoD0D5_0Cv55XV5EUd1Gn-Zz21hwo,9339
18
- ddeutil/workflow/workflow.py,sha256=nPjNbn0UUKlUwkh7lHFRb5BSLARBOTZ0iv0TU_SMOKc,36205
17
+ ddeutil/workflow/utils.py,sha256=-yWVShFGUJwUL5DU4xi-f2UGLXEuuv8sTf-GmVGjNt0,9674
18
+ ddeutil/workflow/workflow.py,sha256=sy-HEKLmGPE1tDNr_cpm3CQsMEDP6fkXDHC9UsVSVDE,36214
19
19
  ddeutil/workflow/api/__init__.py,sha256=W3fe6_NLHSUzr4Tsu79w3pmvrYjpLeP3zBk4mtpPyqg,2843
20
20
  ddeutil/workflow/api/log_conf.py,sha256=WfS3udDLSyrP-C80lWOvxxmhd_XWKvQPkwDqKblcH3E,1834
21
21
  ddeutil/workflow/api/routes/__init__.py,sha256=JRaJZB0D6mgR17MbZo8yLtdYDtD62AA8MdKlFqhG84M,420
22
22
  ddeutil/workflow/api/routes/job.py,sha256=x809G5gCbJS257txj9eLLTbCbFK8ercXWzPDLuv5gEM,2953
23
23
  ddeutil/workflow/api/routes/logs.py,sha256=HiXw93PeIiaK_xJjM8lbD2ED1Il-W1iM51085nc7qmg,5286
24
24
  ddeutil/workflow/api/routes/workflows.py,sha256=D76cdLb2_9Dkfe2_8xt06CvPhAyJMqxyYkUgAs8Qlnw,4402
25
- ddeutil_workflow-0.0.71.dist-info/licenses/LICENSE,sha256=nGFZ1QEhhhWeMHf9n99_fdt4vQaXS29xWKxt-OcLywk,1085
26
- ddeutil_workflow-0.0.71.dist-info/METADATA,sha256=F_JLg23VojSqmw0cBb_KvkEXOUrKNB_9HFE6lVIiYA0,15207
27
- ddeutil_workflow-0.0.71.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
28
- ddeutil_workflow-0.0.71.dist-info/entry_points.txt,sha256=qDTpPSauL0ciO6T4iSVt8bJeYrVEkkoEEw_RlGx6Kgk,63
29
- ddeutil_workflow-0.0.71.dist-info/top_level.txt,sha256=m9M6XeSWDwt_yMsmH6gcOjHZVK5O0-vgtNBuncHjzW4,8
30
- ddeutil_workflow-0.0.71.dist-info/RECORD,,
25
+ ddeutil_workflow-0.0.72.dist-info/licenses/LICENSE,sha256=nGFZ1QEhhhWeMHf9n99_fdt4vQaXS29xWKxt-OcLywk,1085
26
+ ddeutil_workflow-0.0.72.dist-info/METADATA,sha256=rXtrkQ-LS9dx4DIIWOAz44e0bXSGrm_zujUNvb-uujs,15221
27
+ ddeutil_workflow-0.0.72.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
28
+ ddeutil_workflow-0.0.72.dist-info/entry_points.txt,sha256=qDTpPSauL0ciO6T4iSVt8bJeYrVEkkoEEw_RlGx6Kgk,63
29
+ ddeutil_workflow-0.0.72.dist-info/top_level.txt,sha256=m9M6XeSWDwt_yMsmH6gcOjHZVK5O0-vgtNBuncHjzW4,8
30
+ ddeutil_workflow-0.0.72.dist-info/RECORD,,