ddeutil-workflow 0.0.72__tar.gz → 0.0.73__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.72/src/ddeutil_workflow.egg-info → ddeutil_workflow-0.0.73}/PKG-INFO +1 -1
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/pyproject.toml +1 -1
- ddeutil_workflow-0.0.73/src/ddeutil/workflow/__about__.py +1 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/conf.py +15 -8
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/stages.py +35 -9
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/traces.py +20 -9
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73/src/ddeutil_workflow.egg-info}/PKG-INFO +1 -1
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_traces.py +11 -6
- ddeutil_workflow-0.0.72/src/ddeutil/workflow/__about__.py +0 -1
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/LICENSE +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/README.md +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/setup.cfg +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/__cron.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/__init__.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/__main__.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/__types.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/api/__init__.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/api/log_conf.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/api/routes/__init__.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/api/routes/job.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/api/routes/logs.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/api/routes/workflows.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/audits.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/cli.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/errors.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/event.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/job.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/params.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/result.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/reusables.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/utils.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/workflow.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil_workflow.egg-info/SOURCES.txt +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil_workflow.egg-info/dependency_links.txt +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil_workflow.egg-info/entry_points.txt +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil_workflow.egg-info/requires.txt +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil_workflow.egg-info/top_level.txt +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test__cron.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test__regex.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_audits.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_cli.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_conf.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_errors.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_event.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_job.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_job_exec.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_job_exec_strategy.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_params.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_result.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_reusables_call_tag.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_reusables_func_model.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_reusables_template.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_reusables_template_filter.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_strategy.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_utils.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_workflow.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_workflow_exec.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_workflow_exec_job.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_workflow_release.py +0 -0
- {ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/tests/test_workflow_rerun.py +0 -0
@@ -116,7 +116,7 @@ filterwarnings = [
|
|
116
116
|
]
|
117
117
|
log_cli = true
|
118
118
|
log_cli_level = "DEBUG"
|
119
|
-
log_cli_format = "%(asctime)s [%(levelname)-7s] %(message)-120s (%(filename)s:%(lineno)s)"
|
119
|
+
log_cli_format = "%(asctime)s [%(levelname)-7s] (%(cut_id)s) %(message)-120s (%(filename)s:%(lineno)s)"
|
120
120
|
log_cli_date_format = "%Y%m%d %H:%M:%S"
|
121
121
|
|
122
122
|
[tool.black]
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__: str = "0.0.73"
|
@@ -109,7 +109,7 @@ class Config: # pragma: no cov
|
|
109
109
|
"LOG_FORMAT",
|
110
110
|
(
|
111
111
|
"%(asctime)s.%(msecs)03d (%(process)-5d, "
|
112
|
-
"%(thread)-5d) [%(levelname)-7s] %(message)-120s "
|
112
|
+
"%(thread)-5d) [%(levelname)-7s] (%(cut_id)s) %(message)-120s "
|
113
113
|
"(%(filename)s:%(lineno)s) (%(name)-10s)"
|
114
114
|
),
|
115
115
|
)
|
@@ -119,8 +119,8 @@ class Config: # pragma: no cov
|
|
119
119
|
return env(
|
120
120
|
"LOG_FORMAT_FILE",
|
121
121
|
(
|
122
|
-
"{datetime} ({process:5d}, {thread:5d}) {
|
123
|
-
"({filename}:{lineno})"
|
122
|
+
"{datetime} ({process:5d}, {thread:5d}) ({cut_id}) "
|
123
|
+
"{message:120s} ({filename}:{lineno})"
|
124
124
|
),
|
125
125
|
)
|
126
126
|
|
@@ -222,6 +222,7 @@ class YamlParser:
|
|
222
222
|
paths: Optional[list[Path]] = None,
|
223
223
|
obj: Optional[Union[object, str]] = None,
|
224
224
|
extras: Optional[DictData] = None,
|
225
|
+
ignore_filename: Optional[str] = None,
|
225
226
|
) -> DictData:
|
226
227
|
"""Find data with specific key and return the latest modify date data if
|
227
228
|
this key exists multiple files.
|
@@ -229,9 +230,12 @@ class YamlParser:
|
|
229
230
|
:param name: (str) A name of data that want to find.
|
230
231
|
:param path: (Path) A config path object.
|
231
232
|
:param paths: (list[Path]) A list of config path object.
|
232
|
-
:param obj:
|
233
|
+
:param obj: (object | str) An object that want to validate matching
|
234
|
+
before return.
|
233
235
|
:param extras: (DictData) An extra parameter that use to override core
|
234
236
|
config values.
|
237
|
+
:param ignore_filename: (str) An ignore filename. Default is
|
238
|
+
``.confignore`` filename.
|
235
239
|
|
236
240
|
:rtype: DictData
|
237
241
|
"""
|
@@ -252,13 +256,13 @@ class YamlParser:
|
|
252
256
|
for path in paths:
|
253
257
|
for file in glob_files(path):
|
254
258
|
|
255
|
-
if cls.is_ignore(file, path):
|
259
|
+
if cls.is_ignore(file, path, ignore_filename=ignore_filename):
|
256
260
|
continue
|
257
261
|
|
258
262
|
if data := cls.filter_yaml(file, name=name):
|
259
263
|
if not obj_type:
|
260
264
|
all_data.append((file.lstat().st_mtime, data))
|
261
|
-
elif data.get("type"
|
265
|
+
elif (t := data.get("type")) and t == obj_type:
|
262
266
|
all_data.append((file.lstat().st_mtime, data))
|
263
267
|
else:
|
264
268
|
continue
|
@@ -274,6 +278,7 @@ class YamlParser:
|
|
274
278
|
paths: Optional[list[Path]] = None,
|
275
279
|
excluded: Optional[list[str]] = None,
|
276
280
|
extras: Optional[DictData] = None,
|
281
|
+
ignore_filename: Optional[str] = None,
|
277
282
|
) -> Iterator[tuple[str, DictData]]:
|
278
283
|
"""Find all data that match with object type in config path. This class
|
279
284
|
method can use include and exclude list of identity name for filter and
|
@@ -287,6 +292,8 @@ class YamlParser:
|
|
287
292
|
data.
|
288
293
|
:param extras: (DictData) An extra parameter that use to override core
|
289
294
|
config values.
|
295
|
+
:param ignore_filename: (str) An ignore filename. Default is
|
296
|
+
``.confignore`` filename.
|
290
297
|
|
291
298
|
:rtype: Iterator[tuple[str, DictData]]
|
292
299
|
"""
|
@@ -308,7 +315,7 @@ class YamlParser:
|
|
308
315
|
for path in paths:
|
309
316
|
for file in glob_files(path):
|
310
317
|
|
311
|
-
if cls.is_ignore(file, path):
|
318
|
+
if cls.is_ignore(file, path, ignore_filename=ignore_filename):
|
312
319
|
continue
|
313
320
|
|
314
321
|
for key, data in cls.filter_yaml(file).items():
|
@@ -316,7 +323,7 @@ class YamlParser:
|
|
316
323
|
if key in excluded:
|
317
324
|
continue
|
318
325
|
|
319
|
-
if data.get("type"
|
326
|
+
if (t := data.get("type")) and t == obj_type:
|
320
327
|
marking: tuple[float, DictData] = (
|
321
328
|
file.lstat().st_mtime,
|
322
329
|
data,
|
@@ -1311,6 +1311,17 @@ class CallStage(BaseRetryStage):
|
|
1311
1311
|
alias="with",
|
1312
1312
|
)
|
1313
1313
|
|
1314
|
+
@field_validator("args", mode="before")
|
1315
|
+
def __validate_args_key(cls, value: Any) -> Any:
|
1316
|
+
if isinstance(value, dict):
|
1317
|
+
if any(k in value for k in ("result", "extras")):
|
1318
|
+
raise ValueError(
|
1319
|
+
"The argument on workflow template for the caller stage "
|
1320
|
+
"should not pass `result` and `extras`. They are special "
|
1321
|
+
"arguments."
|
1322
|
+
)
|
1323
|
+
return value
|
1324
|
+
|
1314
1325
|
def execute(
|
1315
1326
|
self,
|
1316
1327
|
params: DictData,
|
@@ -1348,9 +1359,10 @@ class CallStage(BaseRetryStage):
|
|
1348
1359
|
|
1349
1360
|
# VALIDATE: check input task caller parameters that exists before
|
1350
1361
|
# calling.
|
1351
|
-
args: DictData = {
|
1352
|
-
|
1353
|
-
|
1362
|
+
args: DictData = {
|
1363
|
+
"result": result,
|
1364
|
+
"extras": self.extras,
|
1365
|
+
} | param2template(self.args, params, extras=self.extras)
|
1354
1366
|
sig = inspect.signature(call_func)
|
1355
1367
|
necessary_params: list[str] = []
|
1356
1368
|
has_keyword: bool = False
|
@@ -1369,14 +1381,21 @@ class CallStage(BaseRetryStage):
|
|
1369
1381
|
(k.removeprefix("_") not in args and k not in args)
|
1370
1382
|
for k in necessary_params
|
1371
1383
|
):
|
1384
|
+
necessary_params.remove("result")
|
1385
|
+
necessary_params.remove("extras")
|
1386
|
+
args.pop("result")
|
1387
|
+
args.pop("extras")
|
1372
1388
|
raise ValueError(
|
1373
1389
|
f"Necessary params, ({', '.join(necessary_params)}, ), "
|
1374
|
-
f"does not set to args
|
1390
|
+
f"does not set to args. It already set {list(args.keys())}."
|
1375
1391
|
)
|
1376
1392
|
|
1377
1393
|
if "result" not in sig.parameters and not has_keyword:
|
1378
1394
|
args.pop("result")
|
1379
1395
|
|
1396
|
+
if "extras" not in sig.parameters and not has_keyword:
|
1397
|
+
args.pop("extras")
|
1398
|
+
|
1380
1399
|
if event and event.is_set():
|
1381
1400
|
raise StageCancelError(
|
1382
1401
|
"Execution was canceled from the event before start parallel."
|
@@ -1441,9 +1460,10 @@ class CallStage(BaseRetryStage):
|
|
1441
1460
|
|
1442
1461
|
# VALIDATE: check input task caller parameters that exists before
|
1443
1462
|
# calling.
|
1444
|
-
args: DictData = {
|
1445
|
-
|
1446
|
-
|
1463
|
+
args: DictData = {
|
1464
|
+
"result": result,
|
1465
|
+
"extras": self.extras,
|
1466
|
+
} | param2template(self.args, params, extras=self.extras)
|
1447
1467
|
sig = inspect.signature(call_func)
|
1448
1468
|
necessary_params: list[str] = []
|
1449
1469
|
has_keyword: bool = False
|
@@ -1462,14 +1482,20 @@ class CallStage(BaseRetryStage):
|
|
1462
1482
|
(k.removeprefix("_") not in args and k not in args)
|
1463
1483
|
for k in necessary_params
|
1464
1484
|
):
|
1485
|
+
necessary_params.remove("result")
|
1486
|
+
necessary_params.remove("extras")
|
1487
|
+
args.pop("result")
|
1488
|
+
args.pop("extras")
|
1465
1489
|
raise ValueError(
|
1466
1490
|
f"Necessary params, ({', '.join(necessary_params)}, ), "
|
1467
|
-
f"does not set to args
|
1491
|
+
f"does not set to args. It already set {list(args.keys())}."
|
1468
1492
|
)
|
1469
|
-
|
1470
1493
|
if "result" not in sig.parameters and not has_keyword:
|
1471
1494
|
args.pop("result")
|
1472
1495
|
|
1496
|
+
if "extras" not in sig.parameters and not has_keyword:
|
1497
|
+
args.pop("extras")
|
1498
|
+
|
1473
1499
|
args: DictData = self.validate_model_args(call_func, args, result)
|
1474
1500
|
if inspect.iscoroutinefunction(call_func):
|
1475
1501
|
rs: DictOrModel = await call_func(
|
@@ -76,7 +76,7 @@ PREFIX_LOGS_REGEX: re.Pattern[str] = re.compile(
|
|
76
76
|
) # pragma: no cov
|
77
77
|
|
78
78
|
|
79
|
-
class
|
79
|
+
class Message(BaseModel):
|
80
80
|
"""Prefix Message model for receive grouping dict from searching prefix data
|
81
81
|
from logging message.
|
82
82
|
"""
|
@@ -92,9 +92,9 @@ class PrefixMsg(BaseModel):
|
|
92
92
|
msg (str): A message that want to extract.
|
93
93
|
|
94
94
|
Returns:
|
95
|
-
|
95
|
+
Message: the validated model from a string message.
|
96
96
|
"""
|
97
|
-
return
|
97
|
+
return Message.model_validate(
|
98
98
|
obj=PREFIX_LOGS_REGEX.search(msg).groupdict()
|
99
99
|
)
|
100
100
|
|
@@ -126,6 +126,9 @@ class TraceMeta(BaseModel): # pragma: no cov
|
|
126
126
|
process: int = Field(description="A process ID.")
|
127
127
|
thread: int = Field(description="A thread ID.")
|
128
128
|
message: str = Field(description="A message log.")
|
129
|
+
cut_id: Optional[str] = Field(
|
130
|
+
default=None, description="A cutting of running ID."
|
131
|
+
)
|
129
132
|
filename: str = Field(description="A filename of this log.")
|
130
133
|
lineno: int = Field(description="A line number of this log.")
|
131
134
|
|
@@ -157,6 +160,7 @@ class TraceMeta(BaseModel): # pragma: no cov
|
|
157
160
|
mode: Literal["stdout", "stderr"],
|
158
161
|
message: str,
|
159
162
|
level: str,
|
163
|
+
cutting_id: str,
|
160
164
|
*,
|
161
165
|
extras: Optional[DictData] = None,
|
162
166
|
) -> Self:
|
@@ -166,6 +170,7 @@ class TraceMeta(BaseModel): # pragma: no cov
|
|
166
170
|
:param mode: (Literal["stdout", "stderr"]) A metadata mode.
|
167
171
|
:param message: (str) A message.
|
168
172
|
:param level: (str) A log level.
|
173
|
+
:param cutting_id: (str)
|
169
174
|
:param extras: (DictData) An extra parameter that want to override core
|
170
175
|
config values.
|
171
176
|
|
@@ -185,6 +190,7 @@ class TraceMeta(BaseModel): # pragma: no cov
|
|
185
190
|
process=os.getpid(),
|
186
191
|
thread=get_ident(),
|
187
192
|
message=message,
|
193
|
+
cut_id=cutting_id,
|
188
194
|
filename=frame_info.filename.split(os.path.sep)[-1],
|
189
195
|
lineno=frame_info.lineno,
|
190
196
|
)
|
@@ -529,10 +535,7 @@ class ConsoleTrace(BaseTrace): # pragma: no cov
|
|
529
535
|
|
530
536
|
:rtype: str
|
531
537
|
"""
|
532
|
-
return prepare_newline(
|
533
|
-
f"({self.cut_id}) "
|
534
|
-
f"{PrefixMsg.from_str(message).prepare(self.extras)}"
|
535
|
-
)
|
538
|
+
return prepare_newline(Message.from_str(message).prepare(self.extras))
|
536
539
|
|
537
540
|
def _logging(
|
538
541
|
self, message: str, mode: str, *, is_err: bool = False
|
@@ -655,7 +658,11 @@ class FileTrace(ConsoleTrace): # pragma: no cov
|
|
655
658
|
|
656
659
|
mode: Literal["stdout", "stderr"] = "stderr" if is_err else "stdout"
|
657
660
|
trace_meta: TraceMeta = TraceMeta.make(
|
658
|
-
mode=mode,
|
661
|
+
mode=mode,
|
662
|
+
level=level,
|
663
|
+
message=message,
|
664
|
+
cutting_id=self.cut_id,
|
665
|
+
extras=self.extras,
|
659
666
|
)
|
660
667
|
|
661
668
|
with (self.pointer / f"{mode}.txt").open(
|
@@ -684,7 +691,11 @@ class FileTrace(ConsoleTrace): # pragma: no cov
|
|
684
691
|
|
685
692
|
mode: Literal["stdout", "stderr"] = "stderr" if is_err else "stdout"
|
686
693
|
trace_meta: TraceMeta = TraceMeta.make(
|
687
|
-
mode=mode,
|
694
|
+
mode=mode,
|
695
|
+
level=level,
|
696
|
+
message=message,
|
697
|
+
cutting_id=self.cut_id,
|
698
|
+
extras=self.extras,
|
688
699
|
)
|
689
700
|
|
690
701
|
async with aiofiles.open(
|
@@ -4,7 +4,7 @@ import pytest
|
|
4
4
|
from ddeutil.workflow import Result
|
5
5
|
from ddeutil.workflow.traces import (
|
6
6
|
FileTrace,
|
7
|
-
|
7
|
+
Message,
|
8
8
|
TraceMeta,
|
9
9
|
)
|
10
10
|
|
@@ -25,7 +25,7 @@ def test_trace_regex_message():
|
|
25
25
|
"[STAGE]: Execute Empty-Stage: 'End trigger Priority Group': "
|
26
26
|
"( End trigger Priority Group: 2 )"
|
27
27
|
)
|
28
|
-
prefix:
|
28
|
+
prefix: Message = Message.from_str(msg)
|
29
29
|
assert prefix.name == "STAGE"
|
30
30
|
assert prefix.message == (
|
31
31
|
"Execute Empty-Stage: 'End trigger Priority Group': "
|
@@ -36,7 +36,7 @@ def test_trace_regex_message():
|
|
36
36
|
"[]: Execute Empty-Stage: 'End trigger Priority Group': "
|
37
37
|
"( End trigger Priority Group: 2 )"
|
38
38
|
)
|
39
|
-
prefix:
|
39
|
+
prefix: Message = Message.from_str(msg)
|
40
40
|
assert prefix.name is None
|
41
41
|
assert prefix.message == (
|
42
42
|
"[]: Execute Empty-Stage: 'End trigger Priority Group': "
|
@@ -44,7 +44,7 @@ def test_trace_regex_message():
|
|
44
44
|
)
|
45
45
|
|
46
46
|
msg: str = ""
|
47
|
-
prefix:
|
47
|
+
prefix: Message = Message.from_str(msg)
|
48
48
|
assert prefix.name is None
|
49
49
|
assert prefix.message == ""
|
50
50
|
|
@@ -52,7 +52,7 @@ def test_trace_regex_message():
|
|
52
52
|
"[WORKFLOW]: Execute Empty-Stage:\n'End trigger Priority Group':\n"
|
53
53
|
"( End trigger Priority Group: 2 )"
|
54
54
|
)
|
55
|
-
prefix:
|
55
|
+
prefix: Message = Message.from_str(msg)
|
56
56
|
assert prefix.name == "WORKFLOW"
|
57
57
|
assert prefix.message == (
|
58
58
|
"Execute Empty-Stage:\n'End trigger Priority Group':\n"
|
@@ -69,13 +69,16 @@ def test_trace_regex_message():
|
|
69
69
|
|
70
70
|
|
71
71
|
def test_trace_meta():
|
72
|
-
meta = TraceMeta.make(
|
72
|
+
meta = TraceMeta.make(
|
73
|
+
mode="stderr", message="Foo", level="info", cutting_id=""
|
74
|
+
)
|
73
75
|
assert meta.message == "Foo"
|
74
76
|
|
75
77
|
meta = TraceMeta.make(
|
76
78
|
mode="stderr",
|
77
79
|
message="Foo",
|
78
80
|
level="info",
|
81
|
+
cutting_id="",
|
79
82
|
extras={"logs_trace_frame_layer": 1},
|
80
83
|
)
|
81
84
|
assert meta.filename == "test_traces.py"
|
@@ -84,6 +87,7 @@ def test_trace_meta():
|
|
84
87
|
mode="stderr",
|
85
88
|
message="Foo",
|
86
89
|
level="info",
|
90
|
+
cutting_id="",
|
87
91
|
extras={"logs_trace_frame_layer": 2},
|
88
92
|
)
|
89
93
|
assert meta.filename == "python.py"
|
@@ -94,6 +98,7 @@ def test_trace_meta():
|
|
94
98
|
mode="stderr",
|
95
99
|
message="Foo",
|
96
100
|
level="info",
|
101
|
+
cutting_id="",
|
97
102
|
extras={"logs_trace_frame_layer": 100},
|
98
103
|
)
|
99
104
|
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__: str = "0.0.72"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/api/routes/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil/workflow/api/routes/workflows.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil_workflow.egg-info/SOURCES.txt
RENAMED
File without changes
|
File without changes
|
{ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil_workflow.egg-info/entry_points.txt
RENAMED
File without changes
|
{ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil_workflow.egg-info/requires.txt
RENAMED
File without changes
|
{ddeutil_workflow-0.0.72 → ddeutil_workflow-0.0.73}/src/ddeutil_workflow.egg-info/top_level.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|