datatailr 0.1.30__py3-none-any.whl → 0.1.32__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.
- datatailr/logging.py +40 -9
- datatailr/sbin/datatailr_run.py +1 -1
- datatailr/scheduler/batch.py +9 -1
- {datatailr-0.1.30.dist-info → datatailr-0.1.32.dist-info}/METADATA +1 -1
- {datatailr-0.1.30.dist-info → datatailr-0.1.32.dist-info}/RECORD +9 -9
- {datatailr-0.1.30.dist-info → datatailr-0.1.32.dist-info}/WHEEL +0 -0
- {datatailr-0.1.30.dist-info → datatailr-0.1.32.dist-info}/entry_points.txt +0 -0
- {datatailr-0.1.30.dist-info → datatailr-0.1.32.dist-info}/licenses/LICENSE +0 -0
- {datatailr-0.1.30.dist-info → datatailr-0.1.32.dist-info}/top_level.txt +0 -0
datatailr/logging.py
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import logging
|
|
12
12
|
import os
|
|
13
|
-
|
|
13
|
+
import sys
|
|
14
14
|
from logging.handlers import RotatingFileHandler
|
|
15
15
|
from typing import Optional
|
|
16
16
|
from datatailr import User
|
|
@@ -33,6 +33,28 @@ def get_log_level() -> int:
|
|
|
33
33
|
return logging.INFO
|
|
34
34
|
|
|
35
35
|
|
|
36
|
+
class MaxLevelFilter(logging.Filter):
|
|
37
|
+
"""Allow only log records at or below a given level."""
|
|
38
|
+
|
|
39
|
+
def __init__(self, level):
|
|
40
|
+
super().__init__()
|
|
41
|
+
self.level = level
|
|
42
|
+
|
|
43
|
+
def filter(self, record: logging.LogRecord) -> bool:
|
|
44
|
+
return record.levelno <= self.level
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class MinLevelFilter(logging.Filter):
|
|
48
|
+
"""Allow only log records at or above a given level."""
|
|
49
|
+
|
|
50
|
+
def __init__(self, level):
|
|
51
|
+
super().__init__()
|
|
52
|
+
self.level = level
|
|
53
|
+
|
|
54
|
+
def filter(self, record: logging.LogRecord) -> bool:
|
|
55
|
+
return record.levelno >= self.level
|
|
56
|
+
|
|
57
|
+
|
|
36
58
|
tag = dt__Tag()
|
|
37
59
|
node_name = tag.get("node_name") or "local"
|
|
38
60
|
node_ip = tag.get("node_ip")
|
|
@@ -66,12 +88,21 @@ class DatatailrLogger:
|
|
|
66
88
|
self.logger = logging.getLogger(name)
|
|
67
89
|
self.logger.setLevel(log_level)
|
|
68
90
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
91
|
+
formatter = logging.Formatter(log_format)
|
|
92
|
+
|
|
93
|
+
# stdout handler (DEBUG/INFO only)
|
|
94
|
+
stdout_handler = logging.StreamHandler(sys.stdout)
|
|
95
|
+
stdout_handler.setLevel(logging.DEBUG)
|
|
96
|
+
stdout_handler.addFilter(MaxLevelFilter(logging.INFO))
|
|
97
|
+
stdout_handler.setFormatter(formatter)
|
|
98
|
+
self.logger.addHandler(stdout_handler)
|
|
99
|
+
|
|
100
|
+
# stderr handler (WARNING and above)
|
|
101
|
+
stderr_handler = logging.StreamHandler(sys.stderr)
|
|
102
|
+
stderr_handler.setLevel(logging.WARNING)
|
|
103
|
+
stderr_handler.addFilter(MinLevelFilter(logging.WARNING))
|
|
104
|
+
stderr_handler.setFormatter(formatter)
|
|
105
|
+
self.logger.addHandler(stderr_handler)
|
|
75
106
|
|
|
76
107
|
# Optional file handler
|
|
77
108
|
if log_file:
|
|
@@ -79,9 +110,9 @@ class DatatailrLogger:
|
|
|
79
110
|
log_file, maxBytes=10 * 1024 * 1024, backupCount=5
|
|
80
111
|
)
|
|
81
112
|
file_handler.setLevel(log_level)
|
|
82
|
-
|
|
83
|
-
file_handler.setFormatter(file_formatter)
|
|
113
|
+
file_handler.setFormatter(formatter)
|
|
84
114
|
self.logger.addHandler(file_handler)
|
|
115
|
+
|
|
85
116
|
self.enable_opentelemetry()
|
|
86
117
|
|
|
87
118
|
def get_logger(self):
|
datatailr/sbin/datatailr_run.py
CHANGED
|
@@ -43,7 +43,7 @@ logger = DatatailrLogger(os.path.abspath(__file__)).get_logger()
|
|
|
43
43
|
|
|
44
44
|
if not is_dt_installed():
|
|
45
45
|
logger.error("Datatailr is not installed.")
|
|
46
|
-
sys.exit(1)
|
|
46
|
+
# sys.exit(1) # TODO: Uncomment after testing
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
def get_env_var(name: str, default: str | None = None) -> str:
|
datatailr/scheduler/batch.py
CHANGED
|
@@ -459,7 +459,7 @@ class Batch(Job):
|
|
|
459
459
|
return args
|
|
460
460
|
return {}
|
|
461
461
|
|
|
462
|
-
def
|
|
462
|
+
def prepare_args(self) -> None:
|
|
463
463
|
def arg_name(arg: Union[BatchJob, str]) -> str:
|
|
464
464
|
return arg.name if isinstance(arg, BatchJob) else arg
|
|
465
465
|
|
|
@@ -481,6 +481,14 @@ class Batch(Job):
|
|
|
481
481
|
}
|
|
482
482
|
|
|
483
483
|
__ARGUMENTS_CACHE__.add_arguments(self.id, args)
|
|
484
|
+
|
|
485
|
+
def save(self) -> Tuple[bool, str]:
|
|
486
|
+
self.prepare_args()
|
|
487
|
+
return super().save()
|
|
488
|
+
|
|
489
|
+
def run(self) -> Tuple[bool, str]:
|
|
490
|
+
self.prepare_args()
|
|
491
|
+
|
|
484
492
|
if not self.__local_run and is_dt_installed():
|
|
485
493
|
return super().run()
|
|
486
494
|
else:
|
|
@@ -5,14 +5,14 @@ datatailr/dt_json.py,sha256=3xmTqDBk68oPl2UW8UVOYPaBw4lAsVg6nDLwcen5nuo,2252
|
|
|
5
5
|
datatailr/errors.py,sha256=p_e4ao3sFEfz1g4LvEDqw6bVzHJPJSINLjJ8H6_PqOo,751
|
|
6
6
|
datatailr/excel.py,sha256=7_13VFHrjHlIAEeTaGQIlq4ycJvzRo-TvkP_KRBELGs,425
|
|
7
7
|
datatailr/group.py,sha256=AC0nCA44eEWZCJCq2klPqkFg_995mS3C_wu5uSFFLtU,4426
|
|
8
|
-
datatailr/logging.py,sha256=
|
|
8
|
+
datatailr/logging.py,sha256=msr0vzIaOtXmKjxsPpMw0Zl7jX9C_W0IuUwNjmqhhcA,4146
|
|
9
9
|
datatailr/user.py,sha256=tjIMbQ-tb2yFhgLBl_eTb47kKiy-RoM3KtYS3zmJiwc,6736
|
|
10
10
|
datatailr/utils.py,sha256=mqnnERMyHNAuAgFY4Ry4O4yW0ZjCRtJbjfI5fXVqt2s,1524
|
|
11
11
|
datatailr/version.py,sha256=N9K8ZxlwFFSz8XSgbgaTWZY4k2J0JKfj698nZ_O2pIU,536
|
|
12
12
|
datatailr/wrapper.py,sha256=K9ZD76cWey_ikA6C5sKejwRaYBDln4QMg-RcoRGiuFc,7991
|
|
13
13
|
datatailr/build/__init__.py,sha256=_dA7b4L6wsaAFaSxUoYSJ1oaRqDHDMR20kqoCocSOss,487
|
|
14
14
|
datatailr/build/image.py,sha256=YC8ML-l-sj6TcIBY-DCx_vaeI_7SmL9fPFhHnuxzRh0,5509
|
|
15
|
-
datatailr/sbin/datatailr_run.py,sha256=
|
|
15
|
+
datatailr/sbin/datatailr_run.py,sha256=oUZVfaKrwIwYeGtQQnQSw0XwrofHZ6abW2k1FHrCkcQ,6863
|
|
16
16
|
datatailr/sbin/datatailr_run_app.py,sha256=AOkutzv4DeKfWZs-ZBciAMKnK4A05SfkVf1ZJnSSFwA,1231
|
|
17
17
|
datatailr/sbin/datatailr_run_batch.py,sha256=UWnp96j_G66R_Cape7Bb-rbK6UBLF7Y5_mTlWyGJAVQ,1818
|
|
18
18
|
datatailr/sbin/datatailr_run_excel.py,sha256=Gr_QZgqJrwgRVD9_o4v-2tbvU-QMvNHL7xUvFGhftFc,1163
|
|
@@ -20,14 +20,14 @@ datatailr/sbin/datatailr_run_service.py,sha256=R8eNLN2SGnMtyfLy3vq9isUHr3dRzeBqE
|
|
|
20
20
|
datatailr/scheduler/__init__.py,sha256=qydHYVtEP6SUWd2CQ6FRdTdRWNz3SbYPJy4FK_wOvMk,1772
|
|
21
21
|
datatailr/scheduler/arguments_cache.py,sha256=3sKXg4_baeZNo8jvSGTFK6zT5RM1TKMpH-UVS1CLn20,6014
|
|
22
22
|
datatailr/scheduler/base.py,sha256=cOTtXOloxjfJknWr3W1VEbpwGB5llrDreCot7Zv1Hkk,15015
|
|
23
|
-
datatailr/scheduler/batch.py,sha256=
|
|
23
|
+
datatailr/scheduler/batch.py,sha256=2bWcWwcoQjfoJCKIFgoc4L_aCq8nR2v34ri6EMsy0LE,16947
|
|
24
24
|
datatailr/scheduler/batch_decorator.py,sha256=LqL1bsupWLn-YEQUvFJYae7R3ogrL5-VodyiiScrkRw,5806
|
|
25
25
|
datatailr/scheduler/constants.py,sha256=5WWTsfwZ_BA8gVDOTa2AQX9DJ0NzfaWgtY3vrODS2-8,606
|
|
26
26
|
datatailr/scheduler/schedule.py,sha256=0XJJen2nL1xplRs0Xbjwgq3T-0bFCOrJzkSALdio998,3741
|
|
27
27
|
datatailr/scheduler/utils.py,sha256=up6oR2iwe6G52LkvgfO394xchXgCYNjOMGRQW3e8PQk,1082
|
|
28
|
-
datatailr-0.1.
|
|
29
|
-
datatailr-0.1.
|
|
30
|
-
datatailr-0.1.
|
|
31
|
-
datatailr-0.1.
|
|
32
|
-
datatailr-0.1.
|
|
33
|
-
datatailr-0.1.
|
|
28
|
+
datatailr-0.1.32.dist-info/licenses/LICENSE,sha256=ikKP4_O-UD_b8FuNdKmbzTb6odd0JX085ZW_FAPN3VI,1066
|
|
29
|
+
datatailr-0.1.32.dist-info/METADATA,sha256=-9GRX5ONXVKou7sORD4gt-W5pL-32Lo7sF9TW4gbcUw,5146
|
|
30
|
+
datatailr-0.1.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
31
|
+
datatailr-0.1.32.dist-info/entry_points.txt,sha256=YqXfk2At-olW4PUSRkqvy_O3Mbv7uTKCCPuAAiz3Qbg,312
|
|
32
|
+
datatailr-0.1.32.dist-info/top_level.txt,sha256=75gntW0X_SKpqxLL6hAPipvpk28GAhJBvoyqN_HohWU,10
|
|
33
|
+
datatailr-0.1.32.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|