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/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: logging.Formatter
108
- if json:
109
- formatter = JsonLoggingFormatter()
110
- else:
111
- formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS))
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)
@@ -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
- # FIXME: strip _STACK_INFO_PREFIX
360
- raise NotImplementedError
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 not (
397
- rec.module is None or
398
- rec.module == self._UNKNOWN_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
- KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
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
- KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS)
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(KNOWN_STD_LOGGING_RECORD_ATTR_SET)
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) - KNOWN_STD_LOGGING_RECORD_ATTR_SET):
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)
@@ -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
- vst = TypedLoggerBindings._Visitor( # noqa
146
- add_kd,
147
- add_kds,
151
+ else:
152
+ add_vd = vd.__setitem__ # type: ignore[assignment]
153
+ add_vds = vd.update # type: ignore[assignment]
148
154
 
149
- add_vd,
150
- add_vds,
155
+ #
151
156
 
152
- cvd.update,
157
+ mvd: ta.Dict[ta.Type[MultiTypedLoggerValue], ta.List[MultiTypedLoggerValue]] = {}
153
158
 
154
- vwl.append,
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
- vst = TypedLoggerBindings._Visitor( # noqa
159
- kd.__setitem__,
160
- kd.update,
171
+ add_mvd = mvd.__setitem__ # type: ignore[assignment]
172
+ add_mvds = mvd.update # type: ignore[assignment]
173
+
174
+ #
161
175
 
162
- vd.__setitem__,
163
- vd.update,
176
+ cvd: ta.Dict[ta.Type[TypedLoggerValue], TypedLoggerValueOrAbsent] = {}
164
177
 
165
- cvd.update,
178
+ vwl: ta.List[ta.Union[TypedLoggerValueWrapper, FullTypedLoggerBindings._ValueWrappingState]] = []
166
179
 
167
- vwl.append,
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,
@@ -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
 
@@ -32,7 +32,7 @@ _dc.init_package(
32
32
  from .. import lang as _lang # noqa
33
33
 
34
34
 
35
- with _lang.auto_proxy_init(globals()) as _api_cap:
35
+ with _lang.auto_proxy_init(globals()):
36
36
  ##
37
37
 
38
38
  from .base.configs import ( # noqa
@@ -1,7 +1,7 @@
1
1
  from .. import lang as _lang
2
2
 
3
3
 
4
- with _lang.auto_proxy_init(globals()) as _api_cap:
4
+ with _lang.auto_proxy_init(globals()):
5
5
  ##
6
6
 
7
7
  from .accessor import ( # noqa
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev431
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.30; extra == "all"
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.30; extra == "async"
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=97GWFEknID3F3E0pQg-motu-qzosiRJoPv7G2fgbbpI,3575
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=Ty5DkVFyGztlpYVEcEP1yTvLbflRFTo6IThN8dPMnbI,10096
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=QtuybNgdw5e2QL3jtKi-5ENH98JemsMRi21A40tYrzA,2844
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=Fhtb5tSAttff6G2pZdF8bh__GZlqJWHaMKtA8KubuX4,1479
460
- omlish/lang/imports/proxyinit.py,sha256=VrCnc4XNfwiJU18GNc3tFGxHSx5QxgyAfqyuJiCH66Y,19721
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=l_MrBOWT2WGEfCq6uD44N-dJJmoRrdtk3A_fmsRh3SE,1561
502
+ omlish/logs/all.py,sha256=GqST35bRnHgpGmQXvtHih7kLaw5DcFgB32uxPGAsgSI,1717
501
503
  omlish/logs/base.py,sha256=Z1hfwYS2LgMJxFIyHiOvYa2meu2MH3kQDkhaWRNzt0M,5698
502
- omlish/logs/contexts.py,sha256=w4f_Ok_TmnaARIm-JSzwvHTbXriMLi13l62YKf2lbeE,4442
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=ppho-wDecGxUiRXOdCIlblmrQhqXZ0oQOGayy8N53XY,3237
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=dgTc46fnYNckjJ8J0KLdInAc56BW45xN85Rr-0LFxCE,24224
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=H_B-3LTGFlBIWYDJ8rei1VMfInE8KrBwRo3bJ_BgFj8,18184
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=DQKDT2v4bG1Cgv_LrhvTIHWBAIODs9b8E5jNI4jTRpU,14442
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=cdRll_tPZaTBIY0yLejCXZdZB3fUVkIoDMb8aESLkl8,5981
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=F3cUtl4Cm1StZxRBkFIRjuw3wPjEch8HdQZVG3a9AyU,948
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.dev431.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
894
- omlish-0.0.0.dev431.dist-info/METADATA,sha256=aD7Uh6H4jnPflXmcY4m60rgjHwCO4L4QARCK8oMQDgQ,19243
895
- omlish-0.0.0.dev431.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
896
- omlish-0.0.0.dev431.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
897
- omlish-0.0.0.dev431.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
898
- omlish-0.0.0.dev431.dist-info/RECORD,,
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,,