omlish 0.0.0.dev431__py3-none-any.whl → 0.0.0.dev433__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.
- omlish/__about__.py +3 -3
- omlish/lang/__init__.py +11 -3
- omlish/lang/imports/capture.py +491 -0
- omlish/lang/imports/lazy.py +0 -25
- omlish/lang/imports/proxy.py +62 -0
- omlish/lang/imports/proxyinit.py +28 -518
- omlish/lang/resources.py +1 -1
- omlish/logs/all.py +8 -0
- omlish/logs/contexts.py +14 -3
- omlish/logs/formatters.py +13 -0
- omlish/logs/standard.py +10 -6
- omlish/logs/std/formatters.py +25 -0
- omlish/logs/std/records.py +82 -30
- omlish/logs/typed/bindings.py +84 -37
- omlish/logs/typed/types.py +16 -1
- omlish/marshal/__init__.py +1 -1
- omlish/typedvalues/__init__.py +1 -1
- {omlish-0.0.0.dev431.dist-info → omlish-0.0.0.dev433.dist-info}/METADATA +3 -3
- {omlish-0.0.0.dev431.dist-info → omlish-0.0.0.dev433.dist-info}/RECORD +23 -19
- {omlish-0.0.0.dev431.dist-info → omlish-0.0.0.dev433.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev431.dist-info → omlish-0.0.0.dev433.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev431.dist-info → omlish-0.0.0.dev433.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev431.dist-info → omlish-0.0.0.dev433.dist-info}/top_level.txt +0 -0
omlish/logs/standard.py
CHANGED
@@ -80,10 +80,14 @@ def _locking_logging_module_lock() -> ta.Iterator[None]:
|
|
80
80
|
def configure_standard_logging(
|
81
81
|
level: ta.Union[int, str] = logging.INFO,
|
82
82
|
*,
|
83
|
-
json: bool = False,
|
84
83
|
target: ta.Optional[logging.Logger] = None,
|
84
|
+
|
85
85
|
force: bool = False,
|
86
|
+
|
86
87
|
handler_factory: ta.Optional[ta.Callable[[], logging.Handler]] = None,
|
88
|
+
|
89
|
+
formatter: ta.Optional[logging.Formatter] = None, # noqa
|
90
|
+
json: bool = False,
|
87
91
|
) -> ta.Optional[StandardConfiguredLoggingHandler]:
|
88
92
|
with _locking_logging_module_lock():
|
89
93
|
if target is None:
|
@@ -104,11 +108,11 @@ def configure_standard_logging(
|
|
104
108
|
|
105
109
|
#
|
106
110
|
|
107
|
-
formatter:
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
111
|
+
if formatter is None:
|
112
|
+
if json:
|
113
|
+
formatter = JsonLoggingFormatter()
|
114
|
+
else:
|
115
|
+
formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS)) # noqa
|
112
116
|
handler.setFormatter(formatter)
|
113
117
|
|
114
118
|
#
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import logging
|
2
|
+
import typing as ta
|
3
|
+
|
4
|
+
from ..formatters import LoggingContextFormatter
|
5
|
+
from .records import LoggingContextLogRecord
|
6
|
+
from .records import LogRecordLoggingContext
|
7
|
+
|
8
|
+
|
9
|
+
##
|
10
|
+
|
11
|
+
|
12
|
+
@ta.final
|
13
|
+
class StdLoggingFormatter(logging.Formatter):
|
14
|
+
def __init__(self, ctx_formatter: LoggingContextFormatter) -> None:
|
15
|
+
super().__init__()
|
16
|
+
|
17
|
+
self._ctx_formatter = ctx_formatter
|
18
|
+
|
19
|
+
def format(self, rec: logging.LogRecord) -> str:
|
20
|
+
if isinstance(rec, LoggingContextLogRecord):
|
21
|
+
ctx = rec._logging_context # noqa
|
22
|
+
else:
|
23
|
+
ctx = LogRecordLoggingContext(rec)
|
24
|
+
|
25
|
+
return self._ctx_formatter.format(ctx)
|
omlish/logs/std/records.py
CHANGED
@@ -11,6 +11,7 @@ import typing as ta
|
|
11
11
|
|
12
12
|
from ...lite.abstract import Abstract
|
13
13
|
from ..contexts import LoggingContext
|
14
|
+
from ..contexts import LoggingContextInfoT
|
14
15
|
from ..infos import LoggingContextInfo
|
15
16
|
from ..infos import LoggingContextInfos
|
16
17
|
from ..infos import LoggingExcInfoTuple
|
@@ -235,22 +236,6 @@ class LoggingContextInfoRecordAdapters:
|
|
235
236
|
args=rec.args,
|
236
237
|
)
|
237
238
|
|
238
|
-
# FIXME: handled specially - all unknown attrs on LogRecord
|
239
|
-
# class Extra(Adapter[LoggingContextInfos.Extra]):
|
240
|
-
# _record_attrs: ta.ClassVar[ta.Mapping[str, ta.Union[ta.Any, ta.Tuple[ta.Any, ta.Any]]]] = dict()
|
241
|
-
#
|
242
|
-
# def info_to_record(self, info: ta.Optional[LoggingContextInfos.Extra]) -> ta.Mapping[str, ta.Any]:
|
243
|
-
# # FIXME:
|
244
|
-
# # if extra is not None:
|
245
|
-
# # for key in extra:
|
246
|
-
# # if (key in ["message", "asctime"]) or (key in rv.__dict__):
|
247
|
-
# # raise KeyError("Attempt to overwrite %r in LogRecord" % key)
|
248
|
-
# # rv.__dict__[key] = extra[key]
|
249
|
-
# return dict()
|
250
|
-
#
|
251
|
-
# def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.Extra]:
|
252
|
-
# return None
|
253
|
-
|
254
239
|
class Time(RequiredAdapter[LoggingContextInfos.Time]):
|
255
240
|
info_cls: ta.ClassVar[ta.Type[LoggingContextInfos.Time]] = LoggingContextInfos.Time
|
256
241
|
|
@@ -356,8 +341,23 @@ class LoggingContextInfoRecordAdapters:
|
|
356
341
|
|
357
342
|
def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.Caller]:
|
358
343
|
# FIXME: piecemeal?
|
359
|
-
|
360
|
-
|
344
|
+
if (
|
345
|
+
rec.pathname != self._UNKNOWN_PATH_NAME and
|
346
|
+
rec.lineno != 0 and
|
347
|
+
rec.funcName != self._UNKNOWN_FUNC_NAME
|
348
|
+
):
|
349
|
+
if (sinfo := rec.stack_info) is not None and sinfo.startswith(self._STACK_INFO_PREFIX):
|
350
|
+
sinfo = sinfo[len(self._STACK_INFO_PREFIX):]
|
351
|
+
return LoggingContextInfos.Caller(
|
352
|
+
file_path=rec.pathname,
|
353
|
+
|
354
|
+
line_no=rec.lineno,
|
355
|
+
func_name=rec.funcName,
|
356
|
+
|
357
|
+
stack_info=sinfo,
|
358
|
+
)
|
359
|
+
|
360
|
+
return None
|
361
361
|
|
362
362
|
class SourceFile(Adapter[LoggingContextInfos.SourceFile]):
|
363
363
|
info_cls: ta.ClassVar[ta.Type[LoggingContextInfos.SourceFile]] = LoggingContextInfos.SourceFile
|
@@ -393,9 +393,9 @@ class LoggingContextInfoRecordAdapters:
|
|
393
393
|
)
|
394
394
|
|
395
395
|
def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.SourceFile]:
|
396
|
-
if
|
397
|
-
rec.module is None
|
398
|
-
rec.module
|
396
|
+
if (
|
397
|
+
rec.module is not None and
|
398
|
+
rec.module != self._UNKNOWN_MODULE
|
399
399
|
):
|
400
400
|
return LoggingContextInfos.SourceFile(
|
401
401
|
file_name=rec.filename,
|
@@ -548,16 +548,11 @@ _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS: ta.Mapping[ta.Type[LoggingContextInfo], L
|
|
548
548
|
##
|
549
549
|
|
550
550
|
|
551
|
-
KNOWN_STD_LOGGING_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(
|
552
|
-
a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs
|
553
|
-
)
|
554
|
-
|
555
|
-
|
556
551
|
# Formatter:
|
557
552
|
# - https://github.com/python/cpython/blob/39b2f82717a69dde7212bc39b673b0f55c99e6a3/Lib/logging/__init__.py#L514 (3.8)
|
558
553
|
# - https://github.com/python/cpython/blob/f070f54c5f4a42c7c61d1d5d3b8f3b7203b4a0fb/Lib/logging/__init__.py#L554 (~3.14) # noqa
|
559
554
|
#
|
560
|
-
|
555
|
+
_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
|
561
556
|
# The logged message, computed as msg % args. Set to `record.getMessage()`.
|
562
557
|
message=str,
|
563
558
|
|
@@ -571,7 +566,15 @@ KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
|
|
571
566
|
exc_text=ta.Optional[str],
|
572
567
|
)
|
573
568
|
|
574
|
-
|
569
|
+
|
570
|
+
##
|
571
|
+
|
572
|
+
|
573
|
+
_KNOWN_STD_LOGGING_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(
|
574
|
+
a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs
|
575
|
+
)
|
576
|
+
|
577
|
+
_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS)
|
575
578
|
|
576
579
|
|
577
580
|
class UnknownStdLoggingRecordAttrsWarning(LoggingSetupWarning):
|
@@ -581,13 +584,13 @@ class UnknownStdLoggingRecordAttrsWarning(LoggingSetupWarning):
|
|
581
584
|
def _check_std_logging_record_attrs() -> None:
|
582
585
|
if (
|
583
586
|
len([a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs]) !=
|
584
|
-
len(
|
587
|
+
len(_KNOWN_STD_LOGGING_RECORD_ATTR_SET)
|
585
588
|
):
|
586
589
|
raise RuntimeError('Duplicate LoggingContextInfoRecordAdapter record attrs')
|
587
590
|
|
588
591
|
rec_dct = dict(logging.makeLogRecord({}).__dict__)
|
589
592
|
|
590
|
-
if (unk_rec_fields := frozenset(rec_dct) -
|
593
|
+
if (unk_rec_fields := frozenset(rec_dct) - _KNOWN_STD_LOGGING_RECORD_ATTR_SET):
|
591
594
|
import warnings # noqa
|
592
595
|
|
593
596
|
warnings.warn(
|
@@ -613,7 +616,56 @@ class LoggingContextLogRecord(logging.LogRecord):
|
|
613
616
|
# - exc_info: LoggingExcInfoTuple | None
|
614
617
|
# - func: str | None = None -> funcName
|
615
618
|
# - sinfo: str | None = None -> stack_info
|
619
|
+
#
|
616
620
|
|
617
621
|
def __init__(self, *, _logging_context: LoggingContext) -> None: # noqa
|
622
|
+
self.__dict__.update(_logging_context=_logging_context)
|
623
|
+
|
618
624
|
for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS_:
|
619
625
|
self.__dict__.update(ad.context_to_record(_logging_context))
|
626
|
+
|
627
|
+
_logging_context: LoggingContext
|
628
|
+
|
629
|
+
# FIXME: track extra
|
630
|
+
# def __setattr__(self, key, value):
|
631
|
+
# super().__setattr__(key, value)
|
632
|
+
|
633
|
+
|
634
|
+
##
|
635
|
+
|
636
|
+
|
637
|
+
@ta.final
|
638
|
+
class LogRecordLoggingContext(LoggingContext):
|
639
|
+
def __init__(self, rec: logging.LogRecord) -> None:
|
640
|
+
if isinstance(rec, LoggingContextLogRecord):
|
641
|
+
raise TypeError(rec)
|
642
|
+
|
643
|
+
self._rec = rec
|
644
|
+
|
645
|
+
infos: ta.List[LoggingContextInfo] = [
|
646
|
+
info
|
647
|
+
for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS_
|
648
|
+
if (info := ad.record_to_info(rec)) is not None
|
649
|
+
]
|
650
|
+
|
651
|
+
# FIXME:
|
652
|
+
# if extra is not None:
|
653
|
+
# for key in extra:
|
654
|
+
# if (key in ["message", "asctime"]) or (key in rv.__dict__):
|
655
|
+
# raise KeyError("Attempt to overwrite %r in LogRecord" % key)
|
656
|
+
# rv.__dict__[key] = extra[key]
|
657
|
+
|
658
|
+
if (extra := {
|
659
|
+
a: v
|
660
|
+
for a, v in rec.__dict__.items()
|
661
|
+
if a not in _KNOWN_STD_LOGGING_RECORD_ATTR_SET
|
662
|
+
}):
|
663
|
+
infos.append(LoggingContextInfos.Extra(extra))
|
664
|
+
|
665
|
+
self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {
|
666
|
+
type(info): info
|
667
|
+
for info in infos
|
668
|
+
}
|
669
|
+
|
670
|
+
def get_info(self, ty: ta.Type[LoggingContextInfoT]) -> ta.Optional[LoggingContextInfoT]:
|
671
|
+
return self._infos.get(ty)
|
omlish/logs/typed/bindings.py
CHANGED
@@ -16,6 +16,7 @@ from ...lite.abstract import Abstract
|
|
16
16
|
from .types import TYPED_LOGGER_VALUE_OR_PROVIDER_OR_ABSENT_TYPES
|
17
17
|
from .types import TYPED_LOGGER_VALUE_OR_PROVIDER_TYPES
|
18
18
|
from .types import DefaultTypedLoggerValue
|
19
|
+
from .types import MultiTypedLoggerValue
|
19
20
|
from .types import TypedLoggerConstFieldValue
|
20
21
|
from .types import TypedLoggerField
|
21
22
|
from .types import TypedLoggerFieldValue
|
@@ -92,6 +93,9 @@ class TypedLoggerBindings(Abstract):
|
|
92
93
|
accept_value: ta.Callable[[ta.Type[TypedLoggerValue], TypedLoggerValueOrProviderOrAbsent], None]
|
93
94
|
accept_values: ta.Callable[[ta.Iterable[ta.Tuple[ta.Type[TypedLoggerValue], TypedLoggerValueOrProviderOrAbsent]]], None] # noqa
|
94
95
|
|
96
|
+
accept_multi_value: ta.Callable[[ta.Type[MultiTypedLoggerValue], MultiTypedLoggerValue], None] # noqa
|
97
|
+
accept_multi_values: ta.Callable[[ta.Iterable[ta.Tuple[ta.Type[MultiTypedLoggerValue], MultiTypedLoggerValue]]], None] # noqa
|
98
|
+
|
95
99
|
accept_const_values: ta.Callable[[ta.Iterable[ta.Tuple[ta.Type[TypedLoggerValue], TypedLoggerValueOrAbsent]]], None] # noqa
|
96
100
|
|
97
101
|
accept_value_wrapping: ta.Callable[[ta.Union['TypedLoggerValueWrapper', 'FullTypedLoggerBindings._ValueWrappingState']], None] # noqa
|
@@ -110,19 +114,11 @@ class FullTypedLoggerBindings(TypedLoggerBindings):
|
|
110
114
|
self,
|
111
115
|
*items: TypedLoggerBindingItem,
|
112
116
|
override: bool = False,
|
117
|
+
override_multis: bool = False,
|
113
118
|
) -> None:
|
114
119
|
kd: ta.Dict[str, TypedLoggerFieldValue] = {}
|
115
120
|
dup_kd: ta.Dict[str, ta.List[TypedLoggerFieldValue]] = {}
|
116
121
|
|
117
|
-
vd: ta.Dict[ta.Type[TypedLoggerValue], TypedLoggerValueOrProviderOrAbsent] = {}
|
118
|
-
dup_vd: ta.Dict[ta.Type[TypedLoggerValue], ta.List[TypedLoggerValueOrProviderOrAbsent]] = {}
|
119
|
-
|
120
|
-
cvd: ta.Dict[ta.Type[TypedLoggerValue], TypedLoggerValueOrAbsent] = {}
|
121
|
-
|
122
|
-
vwl: ta.List[ta.Union[TypedLoggerValueWrapper, FullTypedLoggerBindings._ValueWrappingState]] = []
|
123
|
-
|
124
|
-
vst: TypedLoggerBindings._Visitor
|
125
|
-
|
126
122
|
if not override:
|
127
123
|
def add_kd(kd_k: str, kd_v: TypedLoggerFieldValue) -> None: # noqa
|
128
124
|
if kd_k in kd:
|
@@ -130,42 +126,71 @@ class FullTypedLoggerBindings(TypedLoggerBindings):
|
|
130
126
|
else:
|
131
127
|
kd[kd_k] = kd_v
|
132
128
|
|
129
|
+
def add_kds(it: 'ta.Iterable[ta.Tuple[str, TypedLoggerFieldValue]]') -> None: # noqa
|
130
|
+
collections.deque(itertools.starmap(add_kd, it), maxlen=0)
|
131
|
+
|
132
|
+
else:
|
133
|
+
add_kd = kd.__setitem__ # type: ignore[assignment]
|
134
|
+
add_kds = kd.update # type: ignore[assignment]
|
135
|
+
|
136
|
+
#
|
137
|
+
|
138
|
+
vd: ta.Dict[ta.Type[TypedLoggerValue], TypedLoggerValueOrProviderOrAbsent] = {}
|
139
|
+
dup_vd: ta.Dict[ta.Type[TypedLoggerValue], ta.List[TypedLoggerValueOrProviderOrAbsent]] = {}
|
140
|
+
|
141
|
+
if not override:
|
133
142
|
def add_vd(vd_k: 'ta.Type[TypedLoggerValue]', vd_v: TypedLoggerValueOrProviderOrAbsent) -> None: # noqa
|
134
143
|
if vd_k in vd:
|
135
144
|
dup_vd.setdefault(vd_k, []).append(vd_v)
|
136
145
|
else:
|
137
146
|
vd[vd_k] = vd_v
|
138
147
|
|
139
|
-
def add_kds(it: 'ta.Iterable[ta.Tuple[str, TypedLoggerFieldValue]]') -> None: # noqa
|
140
|
-
collections.deque(itertools.starmap(add_kd, it), maxlen=0)
|
141
|
-
|
142
148
|
def add_vds(it: 'ta.Iterable[ta.Tuple[ta.Type[TypedLoggerValue], TypedLoggerValueOrProviderOrAbsent]]') -> None: # noqa
|
143
149
|
collections.deque(itertools.starmap(add_vd, it), maxlen=0)
|
144
150
|
|
145
|
-
|
146
|
-
|
147
|
-
|
151
|
+
else:
|
152
|
+
add_vd = vd.__setitem__ # type: ignore[assignment]
|
153
|
+
add_vds = vd.update # type: ignore[assignment]
|
148
154
|
|
149
|
-
|
150
|
-
add_vds,
|
155
|
+
#
|
151
156
|
|
152
|
-
|
157
|
+
mvd: ta.Dict[ta.Type[MultiTypedLoggerValue], ta.List[MultiTypedLoggerValue]] = {}
|
153
158
|
|
154
|
-
|
155
|
-
)
|
159
|
+
if override_multis:
|
160
|
+
def add_mvd(mvd_k: 'ta.Type[MultiTypedLoggerValue]', mvd_v: MultiTypedLoggerValue) -> None: # noqa
|
161
|
+
try:
|
162
|
+
mvd_l = mvd[mvd_k]
|
163
|
+
except KeyError:
|
164
|
+
mvd_l = mvd[mvd_k] = []
|
165
|
+
mvd_l.append(mvd_v)
|
166
|
+
|
167
|
+
def add_mvds(it: 'ta.Iterable[ta.Tuple[ta.Type[MultiTypedLoggerValue], MultiTypedLoggerValue]]') -> None:
|
168
|
+
collections.deque(itertools.starmap(add_mvd, it), maxlen=0)
|
156
169
|
|
157
170
|
else:
|
158
|
-
|
159
|
-
|
160
|
-
|
171
|
+
add_mvd = mvd.__setitem__ # type: ignore[assignment]
|
172
|
+
add_mvds = mvd.update # type: ignore[assignment]
|
173
|
+
|
174
|
+
#
|
161
175
|
|
162
|
-
|
163
|
-
vd.update,
|
176
|
+
cvd: ta.Dict[ta.Type[TypedLoggerValue], TypedLoggerValueOrAbsent] = {}
|
164
177
|
|
165
|
-
|
178
|
+
vwl: ta.List[ta.Union[TypedLoggerValueWrapper, FullTypedLoggerBindings._ValueWrappingState]] = []
|
166
179
|
|
167
|
-
|
168
|
-
|
180
|
+
vst = TypedLoggerBindings._Visitor( # noqa
|
181
|
+
add_kd,
|
182
|
+
add_kds,
|
183
|
+
|
184
|
+
add_vd,
|
185
|
+
add_vds,
|
186
|
+
|
187
|
+
add_mvd,
|
188
|
+
add_mvds,
|
189
|
+
|
190
|
+
cvd.update,
|
191
|
+
|
192
|
+
vwl.append,
|
193
|
+
)
|
169
194
|
|
170
195
|
for o in items:
|
171
196
|
o._typed_logger_visit_bindings(vst) # noqa
|
@@ -288,18 +313,22 @@ class ChainTypedLoggerBindings(TypedLoggerBindings):
|
|
288
313
|
kd: ta.Dict[str, TypedLoggerFieldValue] = {}
|
289
314
|
dup_kd: ta.Dict[str, ta.List[TypedLoggerFieldValue]] = {}
|
290
315
|
|
291
|
-
vd: ta.Dict[ta.Type[TypedLoggerValue], TypedLoggerValueOrProviderOrAbsent] = {}
|
292
|
-
dup_vd: ta.Dict[ta.Type[TypedLoggerValue], ta.List[TypedLoggerValueOrProviderOrAbsent]] = {}
|
293
|
-
|
294
|
-
pcv = dict(parent.const_value_map)
|
295
|
-
cvd: ta.Dict[ta.Type[TypedLoggerValue], TypedLoggerValueOrAbsent] = {}
|
296
|
-
|
297
316
|
def add_kd(kd_k: str, kd_v: TypedLoggerFieldValue) -> None: # noqa
|
298
317
|
if kd_k in kd:
|
299
318
|
dup_kd.setdefault(kd_k, []).append(kd_v)
|
300
319
|
else:
|
301
320
|
kd[kd_k] = kd_v
|
302
321
|
|
322
|
+
def add_kds(it: 'ta.Iterable[ta.Tuple[str, TypedLoggerFieldValue]]') -> None: # noqa
|
323
|
+
collections.deque(itertools.starmap(add_kd, it), maxlen=0)
|
324
|
+
|
325
|
+
#
|
326
|
+
|
327
|
+
vd: ta.Dict[ta.Type[TypedLoggerValue], TypedLoggerValueOrProviderOrAbsent] = {}
|
328
|
+
dup_vd: ta.Dict[ta.Type[TypedLoggerValue], ta.List[TypedLoggerValueOrProviderOrAbsent]] = {}
|
329
|
+
|
330
|
+
pcv = dict(parent.const_value_map)
|
331
|
+
|
303
332
|
def add_vd(vd_k: 'ta.Type[TypedLoggerValue]', vd_v: TypedLoggerValueOrProviderOrAbsent) -> None: # noqa
|
304
333
|
if vd_k in vd:
|
305
334
|
dup_vd.setdefault(vd_k, []).append(vd_v)
|
@@ -307,12 +336,27 @@ class ChainTypedLoggerBindings(TypedLoggerBindings):
|
|
307
336
|
vd[vd_k] = vd_v
|
308
337
|
pcv.pop(vd_k, None)
|
309
338
|
|
310
|
-
def add_kds(it: 'ta.Iterable[ta.Tuple[str, TypedLoggerFieldValue]]') -> None: # noqa
|
311
|
-
collections.deque(itertools.starmap(add_kd, it), maxlen=0)
|
312
|
-
|
313
339
|
def add_vds(it: 'ta.Iterable[ta.Tuple[ta.Type[TypedLoggerValue], TypedLoggerValueOrProviderOrAbsent]]') -> None: # noqa
|
314
340
|
collections.deque(itertools.starmap(add_vd, it), maxlen=0)
|
315
341
|
|
342
|
+
#
|
343
|
+
|
344
|
+
mvd: ta.Dict[ta.Type[MultiTypedLoggerValue], ta.List[MultiTypedLoggerValue]] = {}
|
345
|
+
|
346
|
+
def add_mvd(mvd_k: 'ta.Type[MultiTypedLoggerValue]', mvd_v: MultiTypedLoggerValue) -> None: # noqa
|
347
|
+
try:
|
348
|
+
mvd_l = mvd[mvd_k]
|
349
|
+
except KeyError:
|
350
|
+
mvd_l = mvd[mvd_k] = []
|
351
|
+
mvd_l.append(mvd_v)
|
352
|
+
|
353
|
+
def add_mvds(it: 'ta.Iterable[ta.Tuple[ta.Type[MultiTypedLoggerValue], MultiTypedLoggerValue]]') -> None:
|
354
|
+
collections.deque(itertools.starmap(add_mvd, it), maxlen=0)
|
355
|
+
|
356
|
+
#
|
357
|
+
|
358
|
+
cvd: ta.Dict[ta.Type[TypedLoggerValue], TypedLoggerValueOrAbsent] = {}
|
359
|
+
|
316
360
|
def bad_type(*args, **kwargs): # noqa
|
317
361
|
raise ChainTypedLoggerBindingsUnhandledItemError
|
318
362
|
|
@@ -323,6 +367,9 @@ class ChainTypedLoggerBindings(TypedLoggerBindings):
|
|
323
367
|
add_vd,
|
324
368
|
add_vds,
|
325
369
|
|
370
|
+
add_mvd,
|
371
|
+
add_mvds,
|
372
|
+
|
326
373
|
cvd.update,
|
327
374
|
|
328
375
|
bad_type,
|
omlish/logs/typed/types.py
CHANGED
@@ -181,7 +181,6 @@ class TypedLoggerValue(Abstract, ta.Generic[T]):
|
|
181
181
|
def _typed_logger_unwrap_field_value(self, ctx: 'TypedLoggerContext') -> UnwrappedTypedLoggerFieldValue: # noqa
|
182
182
|
return self._v
|
183
183
|
|
184
|
-
@ta.final
|
185
184
|
def _typed_logger_visit_bindings(self, vst: 'TypedLoggerBindings._Visitor') -> None: # noqa
|
186
185
|
vst.accept_values(((type(self), self),))
|
187
186
|
vst.accept_const_values(((type(self), self),))
|
@@ -233,6 +232,22 @@ class DefaultTypedLoggerValue(TypedLoggerValue[T], Abstract):
|
|
233
232
|
return (cls.default_provider().provide_value(ctx),)
|
234
233
|
|
235
234
|
|
235
|
+
class MultiTypedLoggerValue(TypedLoggerValue[T], Abstract):
|
236
|
+
"""
|
237
|
+
Note: There is no DefaultMultiTypedLoggerValue.
|
238
|
+
"""
|
239
|
+
|
240
|
+
@classmethod
|
241
|
+
@abc.abstractmethod
|
242
|
+
def merge_values(cls, *values: T) -> T:
|
243
|
+
raise NotImplementedError
|
244
|
+
|
245
|
+
#
|
246
|
+
|
247
|
+
def _typed_logger_visit_bindings(self, vst: 'TypedLoggerBindings._Visitor') -> None: # noqa
|
248
|
+
vst.accept_multi_values(((type(self), self),))
|
249
|
+
|
250
|
+
|
236
251
|
##
|
237
252
|
|
238
253
|
|
omlish/marshal/__init__.py
CHANGED
omlish/typedvalues/__init__.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: omlish
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev433
|
4
4
|
Summary: omlish
|
5
5
|
Author: wrmsr
|
6
6
|
License-Expression: BSD-3-Clause
|
@@ -18,7 +18,7 @@ Provides-Extra: all
|
|
18
18
|
Requires-Dist: anyio~=4.10; extra == "all"
|
19
19
|
Requires-Dist: sniffio~=1.3; extra == "all"
|
20
20
|
Requires-Dist: greenlet~=3.2; extra == "all"
|
21
|
-
Requires-Dist: trio~=0.
|
21
|
+
Requires-Dist: trio~=0.31; extra == "all"
|
22
22
|
Requires-Dist: trio-asyncio~=0.15; extra == "all"
|
23
23
|
Requires-Dist: lz4~=4.4; extra == "all"
|
24
24
|
Requires-Dist: python-snappy~=0.7; extra == "all"
|
@@ -58,7 +58,7 @@ Provides-Extra: async
|
|
58
58
|
Requires-Dist: anyio~=4.10; extra == "async"
|
59
59
|
Requires-Dist: sniffio~=1.3; extra == "async"
|
60
60
|
Requires-Dist: greenlet~=3.2; extra == "async"
|
61
|
-
Requires-Dist: trio~=0.
|
61
|
+
Requires-Dist: trio~=0.31; extra == "async"
|
62
62
|
Requires-Dist: trio-asyncio~=0.15; extra == "async"
|
63
63
|
Provides-Extra: compress
|
64
64
|
Requires-Dist: lz4~=4.4; extra == "compress"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.omlish-manifests.json,sha256=FLw7xkPiSXuImZgqSP8BwrEib2R1doSzUPLUkc-QUIA,8410
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=Zv_1p0fhbJrF6QKOgRP0K5IQT7b_xpYlyQIa4fTot7w,3575
|
3
3
|
omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
|
4
4
|
omlish/c3.py,sha256=ZNIMl1kwg3qdei4DiUrJPQe5M81S1e76N-GuNSwLBAE,8683
|
5
5
|
omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
|
@@ -415,7 +415,7 @@ omlish/iterators/iterators.py,sha256=RxW35yQ5ed8vBQ22IqpDXFx-i5JiLQdp7-pkMZXhJJ8
|
|
415
415
|
omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,472
|
416
416
|
omlish/iterators/tools.py,sha256=M16LXrJhMdsz5ea2qH0vws30ZvhQuQSCVFSLpRf_gTg,2096
|
417
417
|
omlish/iterators/unique.py,sha256=BSE-eanva8byFCJi09Nt2zzTsVr8LnTqY1PIInGYRs0,1396
|
418
|
-
omlish/lang/__init__.py,sha256=
|
418
|
+
omlish/lang/__init__.py,sha256=lgRNRbIwj0FAU6PH4MMU9fqP5A1NI9wcHHWK8LjFyBg,10222
|
419
419
|
omlish/lang/asyncs.py,sha256=rfpLE2ZacVKGYB9DSFuMBurQzkPRjB1qljcS3sIuSsw,1767
|
420
420
|
omlish/lang/attrstorage.py,sha256=UUnoENCMQF3twBfxBcIKa5mpXsAxWnNYDayhU8xgmpU,5224
|
421
421
|
omlish/lang/casing.py,sha256=3_c7cxQOc4z_YezaU2B4NCTAsPh_kDL4wUTK5kZU6kg,4675
|
@@ -439,7 +439,7 @@ omlish/lang/overrides.py,sha256=IBzK6ljfLX6TLgIyKTSjhqTLcuKRkQNVtEOnBLS4nuA,2095
|
|
439
439
|
omlish/lang/params.py,sha256=sfbNoGrKCsAtubFufj_uh_WKshIgA8fqJ4PmLH1PH00,6639
|
440
440
|
omlish/lang/recursion.py,sha256=1VfSqzKO-8Is3t9LKw0W4jwPfE0aBS70EUlbUxAx4eE,1900
|
441
441
|
omlish/lang/resolving.py,sha256=nMosn-rcYjI8t6b35oICDyPw6t6-HvWj5jMdkfn1jfA,1612
|
442
|
-
omlish/lang/resources.py,sha256=
|
442
|
+
omlish/lang/resources.py,sha256=awfh33Uxkd9Ho-5Z3d9CPWQE3gjktV0XWM6XbdG0ejA,2845
|
443
443
|
omlish/lang/strings.py,sha256=TY-v0iGu6BxEKb99YS-VmIJqc-sTAqMv7mCDJQALMnI,4550
|
444
444
|
omlish/lang/sys.py,sha256=KPe1UOXk1VxlOYt_aLmhN0KqsA4wnP-4nm4WEwO49pw,411
|
445
445
|
omlish/lang/typing.py,sha256=ZN4t8oGSSknf_T1HbfqVQ7Y9OOZ1RkikYihNxdBlTFQ,3733
|
@@ -455,9 +455,11 @@ omlish/lang/classes/restrict.py,sha256=CUyvLpMYiQwTjpzo5sdG_lQxdeEIq2z2xSVNrsI9K
|
|
455
455
|
omlish/lang/classes/simple.py,sha256=3AJSs-plVg2flq4SC6I39LxP0nBaB241puv3D5YCP5I,2973
|
456
456
|
omlish/lang/classes/virtual.py,sha256=J4y-uiv1RaP2rfFeptXqQ1a4MRek0TMlAFFraO_lzhs,3397
|
457
457
|
omlish/lang/imports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
458
|
+
omlish/lang/imports/capture.py,sha256=hy9hgUmY1e9ElS6NfMuFdm-uY4hdnzQ7uBvuUVW4i-Y,15078
|
458
459
|
omlish/lang/imports/conditional.py,sha256=R-E47QD95mMonPImWlrde3rnJrFKCCkYz71c94W05sc,1006
|
459
|
-
omlish/lang/imports/lazy.py,sha256=
|
460
|
-
omlish/lang/imports/
|
460
|
+
omlish/lang/imports/lazy.py,sha256=Eefs9hkj5surMdwgxX_Q3BOqPcox10v0sKT5rKIQknc,808
|
461
|
+
omlish/lang/imports/proxy.py,sha256=6c4L-njdAOsGrhi-gdv_R3nHBEiPS7BWHaBU7-YOBfk,1553
|
462
|
+
omlish/lang/imports/proxyinit.py,sha256=W7_FxDxe4aAQLUxNF1U6-2JROwK75HgRGEGidDKB-t0,4400
|
461
463
|
omlish/lang/imports/resolving.py,sha256=DeRarn35Fryg5JhVhy8wbiC9lvr58AnllI9B_reswUE,2085
|
462
464
|
omlish/lang/imports/traversal.py,sha256=pbFQIa880NGjSfcLsno2vE_G41_CLwDHb-7gWg2J3BI,2855
|
463
465
|
omlish/lifecycles/__init__.py,sha256=zOuvV4pErPwxcKUSgshmME2Duw9GrjwckpNmW3FPKng,810
|
@@ -497,29 +499,31 @@ omlish/lite/types.py,sha256=QM9whf55r7TmmQBRApIWSlyVKsl1p_jcut_YheyZMFY,146
|
|
497
499
|
omlish/lite/typing.py,sha256=m2CyJTz2OVOCPRvp-0UuEx7oleZgXqs3rYXijE0bTsA,1280
|
498
500
|
omlish/lite/wrappers.py,sha256=d00Ls2kFHuogKd5wEBaU65VNCN10YXIZtiwu1mbMpmA,530
|
499
501
|
omlish/logs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
500
|
-
omlish/logs/all.py,sha256=
|
502
|
+
omlish/logs/all.py,sha256=GqST35bRnHgpGmQXvtHih7kLaw5DcFgB32uxPGAsgSI,1717
|
501
503
|
omlish/logs/base.py,sha256=Z1hfwYS2LgMJxFIyHiOvYa2meu2MH3kQDkhaWRNzt0M,5698
|
502
|
-
omlish/logs/contexts.py,sha256=
|
504
|
+
omlish/logs/contexts.py,sha256=qMX-BrOKmYIBOXIlSntKJT9mcsRryTqfcTFp9K1GJmE,4836
|
505
|
+
omlish/logs/formatters.py,sha256=g8oGfP_ok0nrW9opIIh5LqcQTmdufWFGO-9pRKX4m3Q,242
|
503
506
|
omlish/logs/infos.py,sha256=Nr2SbyI978vP5BTiVZsXUBdy2k0CUiwggcW-wewJHmo,11560
|
504
507
|
omlish/logs/levels.py,sha256=Eze-k_LPgFzbNMnG10F2bRKfL3veQpIxiegvN5rGeWM,2909
|
505
508
|
omlish/logs/modules.py,sha256=wZ_PNCYhAaEdnGE5k0JvChcqn9nhtEpmwuH74Bwn5gg,266
|
506
509
|
omlish/logs/protocols.py,sha256=e_zizD3pQdYlU6bg3xGB3_ARUTcoHUfar_uLjCo-SPw,961
|
507
|
-
omlish/logs/standard.py,sha256=
|
510
|
+
omlish/logs/standard.py,sha256=btp0YOUb3AsANG0D1rqGK-z25O4HN7p1PJj9ecJ80WI,3323
|
508
511
|
omlish/logs/utils.py,sha256=fKvP342qBmE8wwTgUQ8Tf0-ATVhCm90UYBQt2pk0044,1883
|
509
512
|
omlish/logs/warnings.py,sha256=xyhDgiPy1p8Kp5D9sb_NZiBnQ26SUppaHqC27dtQzok,67
|
510
513
|
omlish/logs/std/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
511
514
|
omlish/logs/std/configs.py,sha256=aDQahqBJXJpmQBaxXVK5S2xi_I_nrLLcCLTq6Q2K6EQ,1037
|
512
515
|
omlish/logs/std/filters.py,sha256=Z8tHOvBRiP-OYm2z5cwY-lYXRimNgferEARMwvwx5Pw,380
|
516
|
+
omlish/logs/std/formatters.py,sha256=mORjx6kPQ-nYvek0Lyg1PZh0vtSYr6Vk-UJtRNW9_8k,645
|
513
517
|
omlish/logs/std/handlers.py,sha256=uTWOT6oayBUEftKmJ8yo89ZP4plv5eQ8Lbcmt-IGl8c,469
|
514
518
|
omlish/logs/std/json.py,sha256=QJ5lywLsRsPyVno2nk2kOw-Z1z3bfrDiZzqcRUdWUMY,1382
|
515
519
|
omlish/logs/std/loggers.py,sha256=hJIEC5BGaDOxgikTYKJ_qA_moS4CcHLMDAVKFDDKdHo,1144
|
516
520
|
omlish/logs/std/noisy.py,sha256=hWpbseerZqlHdEPEajDTSmcRhx8LmmNAxz_7GBZAO9s,353
|
517
521
|
omlish/logs/std/proxy.py,sha256=9MVV5kbj9nwl3KZGtrYCIb5XTpv33f33zZ7P_B58fX0,2394
|
518
|
-
omlish/logs/std/records.py,sha256=
|
522
|
+
omlish/logs/std/records.py,sha256=oI3eVPzoCNPRiEh2hA8BDKp1vM3uetYecek1AB0B3UA,25426
|
519
523
|
omlish/logs/typed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
520
|
-
omlish/logs/typed/bindings.py,sha256=
|
524
|
+
omlish/logs/typed/bindings.py,sha256=7F6zPZKJ0cclg58xIMMrOG-vLv1KJ5dsXGwg9glSZFg,19919
|
521
525
|
omlish/logs/typed/contexts.py,sha256=MU1RqHtmYbnxoLfLhMZbTbRd-WfYEyeVo7_3VnG3rY0,4027
|
522
|
-
omlish/logs/typed/types.py,sha256=
|
526
|
+
omlish/logs/typed/types.py,sha256=VTxsDN7qN9-WnwxOBI7OFH1taOuLscTpm3t8edJpNik,14838
|
523
527
|
omlish/logs/typed/values.py,sha256=s8x-P6tYq-BrhoA98Z5tfi70Tl1hHhcxOd1qao_h6ps,3278
|
524
528
|
omlish/manifests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
525
529
|
omlish/manifests/base.py,sha256=wW-De-pU3cef-0vGsgo-ypftDwc3tCBxhRAzPtrdark,918
|
@@ -527,7 +531,7 @@ omlish/manifests/globals.py,sha256=kVqQ-fT4kc7xWzLHoI731GviitFPv2v2yqw-p7t7Exs,2
|
|
527
531
|
omlish/manifests/loading.py,sha256=s6KnhdFQCsI2i0Rus1sMU0so2v8dUBnk59BJkSnxGt8,17514
|
528
532
|
omlish/manifests/static.py,sha256=9BaPBLkuzxHmg5A-5k9BjjBFINCdmFOIu06dMFgCfz4,497
|
529
533
|
omlish/manifests/types.py,sha256=NeOGuIVrcbqjCDbQ3MnCxxHAgHnw0CkWJsBzo230PWE,453
|
530
|
-
omlish/marshal/__init__.py,sha256=
|
534
|
+
omlish/marshal/__init__.py,sha256=_QPYoxtmqfd2szwSuPtbIU8RwTIh_5gTJm--yvVWMcY,5969
|
531
535
|
omlish/marshal/globals.py,sha256=Q6G18hcUwUDDNnpyRPnR5Tn_XZpZCSIEXo09nYSOaNU,2236
|
532
536
|
omlish/marshal/naming.py,sha256=Mk5YrbES836_KflNNRoc5Ajd96iMYLQIMERKx1KpT4g,865
|
533
537
|
omlish/marshal/standard.py,sha256=6L4FK7QVgVFAf2jkTQlCvN-15DWK49VCNlNwCBea3-8,6674
|
@@ -880,7 +884,7 @@ omlish/text/antlr/_runtime/xpath/XPathLexer.py,sha256=WvGKQjQnu7pX5C4CFKtsCzba2B
|
|
880
884
|
omlish/text/antlr/_runtime/xpath/__init__.py,sha256=lMd_BbXYdlDhZQN_q0TKN978XW5G0pq618F0NaLkpFE,71
|
881
885
|
omlish/text/go/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
882
886
|
omlish/text/go/quoting.py,sha256=zbcPEDWsdj7GAemtu0x8nwMqpIu2C_5iInSwn6mMWlE,9142
|
883
|
-
omlish/typedvalues/__init__.py,sha256=
|
887
|
+
omlish/typedvalues/__init__.py,sha256=dQpM8VaON8S7dUv1LBwhyBDjUVo7EW475a9DpnDQz1E,936
|
884
888
|
omlish/typedvalues/accessor.py,sha256=2PQVoFrrCTOcZACAQ28GOvF9xhKyKz27GMSfS0xq5Pc,3184
|
885
889
|
omlish/typedvalues/collection.py,sha256=CK4Vk9kJqAt2V8o6I4zGyv2u9DKov12uSvsGdqEd2Ws,5793
|
886
890
|
omlish/typedvalues/consumer.py,sha256=lDOE-O_sgGbOvbcBg2g5ZRaV2WixnuEYxFsJBaj18oU,4690
|
@@ -890,9 +894,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
|
|
890
894
|
omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
|
891
895
|
omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
|
892
896
|
omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
|
893
|
-
omlish-0.0.0.
|
894
|
-
omlish-0.0.0.
|
895
|
-
omlish-0.0.0.
|
896
|
-
omlish-0.0.0.
|
897
|
-
omlish-0.0.0.
|
898
|
-
omlish-0.0.0.
|
897
|
+
omlish-0.0.0.dev433.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
898
|
+
omlish-0.0.0.dev433.dist-info/METADATA,sha256=a9lNv9FCJuo46oSrJsrL-E9-E4739mvReWcPY-T9BtM,19243
|
899
|
+
omlish-0.0.0.dev433.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
900
|
+
omlish-0.0.0.dev433.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
901
|
+
omlish-0.0.0.dev433.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
902
|
+
omlish-0.0.0.dev433.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|