omlish 0.0.0.dev427__py3-none-any.whl → 0.0.0.dev429__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 CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev427'
2
- __revision__ = '13723ced41ac43696831e7a640c46f91663c9a46'
1
+ __version__ = '0.0.0.dev429'
2
+ __revision__ = 'aec560601e4f8ecdc171e4341c2b17e996a0ef91'
3
3
 
4
4
 
5
5
  #
@@ -4,12 +4,12 @@ import asyncio.base_subprocess
4
4
  import asyncio.subprocess
5
5
  import contextlib
6
6
  import functools
7
- import logging
8
7
  import subprocess
9
8
  import typing as ta
10
9
 
11
10
  from ...lite.check import check
12
11
  from ...lite.timeouts import TimeoutLike
12
+ from ...logs.protocols import LoggerLike
13
13
  from ...subprocesses.asyncs import AbstractAsyncSubprocesses
14
14
  from ...subprocesses.run import SubprocessRun
15
15
  from ...subprocesses.run import SubprocessRunOutput
@@ -28,7 +28,7 @@ class AsyncioProcessCommunicator:
28
28
  proc: asyncio.subprocess.Process,
29
29
  loop: ta.Optional[ta.Any] = None,
30
30
  *,
31
- log: ta.Optional[logging.Logger] = None,
31
+ log: ta.Optional[LoggerLike] = None,
32
32
  ) -> None:
33
33
  super().__init__()
34
34
 
@@ -39,6 +39,7 @@ import types
39
39
  import typing as ta
40
40
  import weakref
41
41
 
42
+ from ...logs.protocols import LoggerLike
42
43
  from .core import BlueletCoro
43
44
  from .core import BlueletExcInfo
44
45
  from .core import CoreBlueletEvent
@@ -84,7 +85,7 @@ class BlueletCoroException(Exception): # noqa
84
85
  def _bluelet_event_select(
85
86
  events: ta.Iterable[BlueletEvent],
86
87
  *,
87
- log: ta.Optional[logging.Logger] = None,
88
+ log: ta.Optional[LoggerLike] = None,
88
89
  ) -> ta.Set[WaitableBlueletEvent]:
89
90
  """
90
91
  Perform a select() over all the Events provided, returning the ones ready to be fired. Only WaitableEvents
@@ -182,7 +183,7 @@ class _BlueletRunner:
182
183
  self,
183
184
  root_coro: BlueletCoro,
184
185
  *,
185
- log: ta.Optional[logging.Logger] = None,
186
+ log: ta.Optional[LoggerLike] = None,
186
187
  ) -> None:
187
188
  super().__init__()
188
189
 
@@ -10,12 +10,12 @@ TODO:
10
10
  import collections
11
11
  import contextlib
12
12
  import functools
13
- import logging
14
13
  import time
15
14
  import typing as ta
16
15
  import weakref
17
16
 
18
17
  from ... import lang
18
+ from ...logs import all as logs
19
19
  from .types import Cache
20
20
  from .types import Eviction
21
21
  from .types import OverweightError
@@ -27,7 +27,7 @@ V = ta.TypeVar('V')
27
27
  V2 = ta.TypeVar('V2')
28
28
 
29
29
 
30
- log = logging.getLogger(__name__)
30
+ log = logs.get_module_logger(globals())
31
31
 
32
32
 
33
33
  ##
omlish/daemons/daemon.py CHANGED
@@ -16,13 +16,13 @@ TODO:
16
16
  - pickle protocol, revision / venv check, multiprocessing manager support
17
17
  """
18
18
  import itertools
19
- import logging
20
19
  import os.path
21
20
  import time
22
21
 
23
22
  from .. import check
24
23
  from .. import dataclasses as dc
25
24
  from .. import lang
25
+ from ..logs import all as logs
26
26
  from ..os.pidfiles.pidfile import Pidfile
27
27
  from .launching import Launcher
28
28
  from .spawning import Spawning
@@ -31,7 +31,7 @@ from .waiting import Wait
31
31
  from .waiting import waiter_for
32
32
 
33
33
 
34
- log = logging.getLogger(__name__)
34
+ log = logs.get_module_logger(globals())
35
35
 
36
36
 
37
37
  ##
@@ -5,12 +5,12 @@ TODO:
5
5
  """
6
6
  import contextlib
7
7
  import functools
8
- import logging
9
8
  import threading
10
9
  import typing as ta
11
10
 
12
11
  from .. import check
13
12
  from .. import lang
13
+ from ..logs import all as logs
14
14
  from ..os.pidfiles.manager import open_inheritable_pidfile
15
15
  from ..os.pidfiles.pidfile import Pidfile
16
16
  from .reparent import reparent_process
@@ -23,7 +23,7 @@ from .targets import Target
23
23
  from .targets import target_runner_for
24
24
 
25
25
 
26
- log = logging.getLogger(__name__)
26
+ log = logs.get_module_logger(globals())
27
27
 
28
28
 
29
29
  ##
omlish/diag/procfs.py CHANGED
@@ -3,7 +3,6 @@ TODO:
3
3
  - dataclasses
4
4
  """
5
5
  import argparse
6
- import logging
7
6
  import os
8
7
  import re
9
8
  import resource
@@ -14,11 +13,12 @@ import typing as ta
14
13
  from .. import iterators as it
15
14
  from .. import lang
16
15
  from ..formats import json
16
+ from ..logs import all as logs
17
17
  from ..os.sizes import PAGE_SIZE
18
18
  from .procstats import ProcStats
19
19
 
20
20
 
21
- log = logging.getLogger(__name__)
21
+ log = logs.get_module_logger(globals())
22
22
 
23
23
 
24
24
  PidLike = int | str
@@ -17,7 +17,6 @@ def _attach(repl):
17
17
  import ast
18
18
  import codeop
19
19
  import errno
20
- import logging
21
20
  import socket as sock
22
21
  import sys
23
22
  import threading
@@ -26,9 +25,10 @@ import types
26
25
  import typing as ta
27
26
 
28
27
  from ... import check
28
+ from ...logs import all as logs
29
29
 
30
30
 
31
- log = logging.getLogger(__name__)
31
+ log = logs.get_module_logger(globals())
32
32
 
33
33
 
34
34
  ##
@@ -22,7 +22,6 @@ socat - UNIX-CONNECT:repl.sock
22
22
  """
23
23
  import contextlib
24
24
  import functools
25
- import logging
26
25
  import os
27
26
  import socket as sock
28
27
  import threading
@@ -31,10 +30,11 @@ import weakref
31
30
 
32
31
  from ... import check
33
32
  from ... import dataclasses as dc
33
+ from ...logs import all as logs
34
34
  from .console import InteractiveSocketConsole
35
35
 
36
36
 
37
- log = logging.getLogger(__name__)
37
+ log = logs.get_module_logger(globals())
38
38
 
39
39
 
40
40
  ##
omlish/formats/dotenv.py CHANGED
@@ -27,7 +27,6 @@ import abc
27
27
  import codecs
28
28
  import contextlib
29
29
  import io
30
- import logging
31
30
  import os
32
31
  import pathlib
33
32
  import re
@@ -36,6 +35,7 @@ import tempfile
36
35
  import typing as ta
37
36
 
38
37
  from ..lite.abstract import Abstract
38
+ from ..logs.protocols import LoggerLike
39
39
 
40
40
 
41
41
  ##
@@ -312,7 +312,7 @@ def parse_dotenv_stream(stream: ta.IO[str]) -> ta.Iterator[DotenvBinding]:
312
312
 
313
313
  def _dotenv_with_warn_for_invalid_lines(
314
314
  mappings: ta.Iterator[DotenvBinding],
315
- log: ta.Optional[logging.Logger] = None,
315
+ log: ta.Optional[LoggerLike] = None,
316
316
  ) -> ta.Iterator[DotenvBinding]:
317
317
  for mapping in mappings:
318
318
  if mapping.error:
@@ -337,7 +337,7 @@ class Dotenv:
337
337
  interpolate: bool = True,
338
338
  override: bool = True,
339
339
  env: ta.Optional[ta.Mapping[str, str]] = None,
340
- log: ta.Optional[logging.Logger] = None,
340
+ log: ta.Optional[LoggerLike] = None,
341
341
  ) -> None:
342
342
  super().__init__()
343
343
 
@@ -415,7 +415,7 @@ def dotenv_get_key(
415
415
  key_to_get: str,
416
416
  *,
417
417
  encoding: ta.Optional[str] = 'utf-8',
418
- log: ta.Optional[logging.Logger] = None,
418
+ log: ta.Optional[LoggerLike] = None,
419
419
  ) -> ta.Optional[str]:
420
420
  """
421
421
  Get the value of a given key from the given .env.
@@ -461,7 +461,7 @@ def dotenv_set_key(
461
461
  quote_mode: str = 'always',
462
462
  export: bool = False,
463
463
  encoding: ta.Optional[str] = 'utf-8',
464
- log: ta.Optional[logging.Logger] = None,
464
+ log: ta.Optional[LoggerLike] = None,
465
465
  ) -> ta.Tuple[ta.Optional[bool], str, str]:
466
466
  """
467
467
  Adds or Updates a key/value to the given .env
@@ -511,7 +511,7 @@ def dotenv_unset_key(
511
511
  *,
512
512
  quote_mode: str = 'always',
513
513
  encoding: ta.Optional[str] = 'utf-8',
514
- log: ta.Optional[logging.Logger] = None,
514
+ log: ta.Optional[LoggerLike] = None,
515
515
  ) -> ta.Tuple[ta.Optional[bool], str]:
516
516
  """
517
517
  Removes a given key from the given `.env` file.
@@ -575,7 +575,7 @@ def dotenv_values(
575
575
  interpolate: bool = True,
576
576
  encoding: ta.Optional[str] = 'utf-8',
577
577
  env: ta.Optional[ta.Mapping[str, str]] = None,
578
- log: ta.Optional[logging.Logger] = None,
578
+ log: ta.Optional[LoggerLike] = None,
579
579
  ) -> ta.Dict[str, ta.Optional[str]]:
580
580
  """
581
581
  Parse a .env file and return its content as a dict.
omlish/http/asgi.py CHANGED
@@ -1,14 +1,14 @@
1
1
  import abc
2
- import logging
3
2
  import typing as ta
4
3
  import urllib.parse
5
4
 
6
5
  from .. import check
7
6
  from .. import lang
7
+ from ..logs import all as logs
8
8
  from . import consts
9
9
 
10
10
 
11
- log = logging.getLogger(__name__)
11
+ log = logs.get_module_logger(globals())
12
12
 
13
13
 
14
14
  ##
omlish/http/handlers.py CHANGED
@@ -7,6 +7,7 @@ import logging
7
7
  import typing as ta
8
8
 
9
9
  from ..lite.abstract import Abstract
10
+ from ..logs.protocols import LoggerLike
10
11
  from ..sockets.addresses import SocketAddress
11
12
  from .parsing import HttpHeaders
12
13
 
@@ -70,7 +71,7 @@ class HttpHandler_(Abstract): # noqa
70
71
  @dc.dataclass(frozen=True)
71
72
  class LoggingHttpHandler(HttpHandler_):
72
73
  handler: HttpHandler
73
- log: logging.Logger
74
+ log: LoggerLike
74
75
  level: int = logging.DEBUG
75
76
 
76
77
  def __call__(self, req: HttpHandlerRequest) -> HttpHandlerResponse:
@@ -83,7 +84,7 @@ class LoggingHttpHandler(HttpHandler_):
83
84
  @dc.dataclass(frozen=True)
84
85
  class ExceptionLoggingHttpHandler(HttpHandler_):
85
86
  handler: HttpHandler
86
- log: logging.Logger
87
+ log: LoggerLike
87
88
  message: ta.Union[str, ta.Callable[[HttpHandlerRequest, BaseException], str]] = 'Error in http handler'
88
89
 
89
90
  def __call__(self, req: HttpHandlerRequest) -> HttpHandlerResponse:
@@ -16,12 +16,12 @@ TODO:
16
16
  import contextlib
17
17
  import functools
18
18
  import itertools
19
- import logging
20
19
  import typing as ta
21
20
  import weakref
22
21
 
23
22
  from ... import check
24
23
  from ... import lang
24
+ from ...logs import all as logs
25
25
  from ..elements import Elements
26
26
  from ..errors import CyclicDependencyError
27
27
  from ..errors import UnboundKeyError
@@ -42,7 +42,7 @@ from .scopes import ScopeImpl
42
42
  from .scopes import make_scope_impl
43
43
 
44
44
 
45
- log = logging.getLogger(__name__)
45
+ log = logs.get_module_logger(globals())
46
46
 
47
47
 
48
48
  ##
omlish/logs/base.py CHANGED
@@ -21,8 +21,9 @@ LoggingMsgFn = ta.Callable[[], ta.Union[str, tuple]] # ta.TypeAlias
21
21
 
22
22
 
23
23
  class AnyLogger(Abstract, ta.Generic[T]):
24
+ @ta.final
24
25
  def is_enabled_for(self, level: LogLevel) -> bool:
25
- return self.get_effective_level() >= level
26
+ return level >= self.get_effective_level()
26
27
 
27
28
  @abc.abstractmethod
28
29
  def get_effective_level(self) -> LogLevel:
omlish/logs/callers.py CHANGED
@@ -7,13 +7,15 @@ import traceback
7
7
  import types
8
8
  import typing as ta
9
9
 
10
- from .infos import LoggingContextInfo
10
+ from .infos import logging_context_info
11
11
 
12
12
 
13
13
  ##
14
14
 
15
15
 
16
- class LoggingCaller(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
16
+ @logging_context_info
17
+ @ta.final
18
+ class LoggingCaller(ta.NamedTuple):
17
19
  file_path: str
18
20
  line_no: int
19
21
  name: str
omlish/logs/contexts.py CHANGED
@@ -89,6 +89,12 @@ class LoggingContext(Abstract):
89
89
 
90
90
 
91
91
  class CaptureLoggingContext(LoggingContext, Abstract):
92
+ class AlreadyCapturedError(Exception):
93
+ pass
94
+
95
+ class NotCapturedError(Exception):
96
+ pass
97
+
92
98
  @abc.abstractmethod
93
99
  def capture(self) -> None:
94
100
  """Must be cooperatively called only from the expected locations."""
@@ -142,9 +148,6 @@ class CaptureLoggingContextImpl(CaptureLoggingContext):
142
148
  self._exc_info_tuple: ta.Optional[LoggingExcInfoTuple] = (type(exc_info), exc_info, exc_info.__traceback__) # noqa
143
149
  else:
144
150
  self._exc_info_tuple = exc_info
145
- else:
146
- self._exc_info = None
147
- self._exc_info_tuple = None
148
151
 
149
152
  #
150
153
 
@@ -154,14 +157,7 @@ class CaptureLoggingContextImpl(CaptureLoggingContext):
154
157
  self._stack_offset = stack_offset
155
158
  self._stack_info = stack_info
156
159
 
157
- #
158
-
159
- self._thread = LoggingThreadInfo.build()
160
- self._process = LoggingProcessInfo.build()
161
- self._multiprocessing = LoggingMultiprocessingInfo.build()
162
- self._asyncio_task = LoggingAsyncioTaskInfo.build()
163
-
164
- #
160
+ ##
165
161
 
166
162
  @property
167
163
  def level(self) -> NamedLogLevel:
@@ -185,6 +181,11 @@ class CaptureLoggingContextImpl(CaptureLoggingContext):
185
181
  times = self._times = LoggingTimeFields.build(self.time_ns)
186
182
  return times
187
183
 
184
+ #
185
+
186
+ _exc_info: ta.Optional[LoggingExcInfo] = None
187
+ _exc_info_tuple: ta.Optional[LoggingExcInfoTuple] = None
188
+
188
189
  @property
189
190
  def exc_info(self) -> ta.Optional[LoggingExcInfo]:
190
191
  return self._exc_info
@@ -193,58 +194,83 @@ class CaptureLoggingContextImpl(CaptureLoggingContext):
193
194
  def exc_info_tuple(self) -> ta.Optional[LoggingExcInfoTuple]:
194
195
  return self._exc_info_tuple
195
196
 
196
- #
197
+ ##
198
+
199
+ _stack_offset: int
200
+ _stack_info: bool
197
201
 
198
- def inc_stack_offset(self, ofs: int = 1) -> 'LoggingContext':
202
+ def inc_stack_offset(self, ofs: int = 1) -> 'CaptureLoggingContext':
199
203
  if hasattr(self, '_stack_offset'):
200
204
  self._stack_offset += ofs
201
205
  return self
202
206
 
207
+ _has_captured: bool = False
208
+
203
209
  _caller: ta.Optional[LoggingCaller]
210
+ _source_file: ta.Optional[LoggingSourceFileInfo]
211
+
212
+ _thread: ta.Optional[LoggingThreadInfo]
213
+ _process: ta.Optional[LoggingProcessInfo]
214
+ _multiprocessing: ta.Optional[LoggingMultiprocessingInfo]
215
+ _asyncio_task: ta.Optional[LoggingAsyncioTaskInfo]
204
216
 
205
217
  def capture(self) -> None:
206
- """Must be cooperatively called only from the exact configured _stack_offset."""
218
+ if self._has_captured:
219
+ raise CaptureLoggingContextImpl.AlreadyCapturedError
220
+ self._has_captured = True
221
+
222
+ if not hasattr(self, '_caller'):
223
+ self._caller = LoggingCaller.find(
224
+ self._stack_offset + 1,
225
+ stack_info=self._stack_info,
226
+ )
227
+
228
+ if (caller := self._caller) is not None:
229
+ self._source_file = LoggingSourceFileInfo.build(caller.file_path)
230
+ else:
231
+ self._source_file = None
207
232
 
208
- try:
209
- self._caller # noqa
210
- except AttributeError:
211
- pass
233
+ self._thread = LoggingThreadInfo.build()
234
+ self._process = LoggingProcessInfo.build()
235
+ self._multiprocessing = LoggingMultiprocessingInfo.build()
236
+ self._asyncio_task = LoggingAsyncioTaskInfo.build()
212
237
 
213
- self._caller = LoggingCaller.find(
214
- self._stack_offset + 1,
215
- stack_info=self._stack_info,
216
- )
238
+ #
217
239
 
218
240
  def caller(self) -> ta.Optional[LoggingCaller]:
219
241
  try:
220
242
  return self._caller
221
243
  except AttributeError:
222
- return None
223
-
224
- _source_file: ta.Optional[LoggingSourceFileInfo]
244
+ raise CaptureLoggingContext.NotCapturedError from None
225
245
 
226
246
  def source_file(self) -> ta.Optional[LoggingSourceFileInfo]:
227
247
  try:
228
248
  return self._source_file
229
249
  except AttributeError:
230
- pass
231
-
232
- if (caller := self.caller()) is None:
233
- return None
234
-
235
- src_file = self._source_file = LoggingSourceFileInfo.build(caller.file_path)
236
- return src_file
250
+ raise CaptureLoggingContext.NotCapturedError from None
237
251
 
238
252
  #
239
253
 
240
254
  def thread(self) -> ta.Optional[LoggingThreadInfo]:
241
- return self._thread
255
+ try:
256
+ return self._thread
257
+ except AttributeError:
258
+ raise CaptureLoggingContext.NotCapturedError from None
242
259
 
243
260
  def process(self) -> ta.Optional[LoggingProcessInfo]:
244
- return self._process
261
+ try:
262
+ return self._process
263
+ except AttributeError:
264
+ raise CaptureLoggingContext.NotCapturedError from None
245
265
 
246
266
  def multiprocessing(self) -> ta.Optional[LoggingMultiprocessingInfo]:
247
- return self._multiprocessing
267
+ try:
268
+ return self._multiprocessing
269
+ except AttributeError:
270
+ raise CaptureLoggingContext.NotCapturedError from None
248
271
 
249
272
  def asyncio_task(self) -> ta.Optional[LoggingAsyncioTaskInfo]:
250
- return self._asyncio_task
273
+ try:
274
+ return self._asyncio_task
275
+ except AttributeError:
276
+ raise CaptureLoggingContext.NotCapturedError from None
omlish/logs/infos.py CHANGED
@@ -9,19 +9,16 @@ import typing as ta
9
9
  ##
10
10
 
11
11
 
12
- class _LoggingContextInfo:
13
- def __mro_entries__(self, bases):
14
- return ()
15
-
16
-
17
- LoggingContextInfo: type = ta.cast(ta.Any, _LoggingContextInfo())
12
+ def logging_context_info(cls):
13
+ return cls
18
14
 
19
15
 
20
16
  ##
21
17
 
22
18
 
19
+ @logging_context_info
23
20
  @ta.final
24
- class LoggingSourceFileInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
21
+ class LoggingSourceFileInfo(ta.NamedTuple):
25
22
  file_name: str
26
23
  module: str
27
24
 
@@ -46,8 +43,9 @@ class LoggingSourceFileInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[
46
43
  ##
47
44
 
48
45
 
46
+ @logging_context_info
49
47
  @ta.final
50
- class LoggingThreadInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
48
+ class LoggingThreadInfo(ta.NamedTuple):
51
49
  ident: int
52
50
  native_id: ta.Optional[int]
53
51
  name: str
@@ -64,8 +62,9 @@ class LoggingThreadInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc
64
62
  ##
65
63
 
66
64
 
65
+ @logging_context_info
67
66
  @ta.final
68
- class LoggingProcessInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
67
+ class LoggingProcessInfo(ta.NamedTuple):
69
68
  pid: int
70
69
 
71
70
  @classmethod
@@ -78,8 +77,9 @@ class LoggingProcessInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[mis
78
77
  ##
79
78
 
80
79
 
80
+ @logging_context_info
81
81
  @ta.final
82
- class LoggingMultiprocessingInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
82
+ class LoggingMultiprocessingInfo(ta.NamedTuple):
83
83
  process_name: str
84
84
 
85
85
  @classmethod
@@ -96,8 +96,9 @@ class LoggingMultiprocessingInfo(LoggingContextInfo, ta.NamedTuple): # type: ig
96
96
  ##
97
97
 
98
98
 
99
+ @logging_context_info
99
100
  @ta.final
100
- class LoggingAsyncioTaskInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
101
+ class LoggingAsyncioTaskInfo(ta.NamedTuple):
101
102
  name: str
102
103
 
103
104
  @classmethod
@@ -111,6 +112,9 @@ class LoggingAsyncioTaskInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore
111
112
  except Exception: # noqa
112
113
  return None
113
114
 
115
+ if task is None:
116
+ return None
117
+
114
118
  return cls(
115
119
  task.get_name(), # Always non-None
116
120
  )
omlish/logs/modules.py CHANGED
@@ -2,9 +2,12 @@
2
2
  import logging
3
3
  import typing as ta
4
4
 
5
+ from .base import Logger
6
+ from .std.adapters import StdLogger
7
+
5
8
 
6
9
  ##
7
10
 
8
11
 
9
- def get_module_logger(mod_globals: ta.Mapping[str, ta.Any]) -> logging.Logger:
10
- return logging.getLogger(mod_globals.get('__name__'))
12
+ def get_module_logger(mod_globals: ta.Mapping[str, ta.Any]) -> Logger:
13
+ return StdLogger(logging.getLogger(mod_globals.get('__name__'))) # noqa
@@ -8,10 +8,12 @@ import typing as ta
8
8
 
9
9
 
10
10
  class ListLoggingHandler(logging.Handler):
11
- def __init__(self) -> None:
11
+ def __init__(self, record_list: ta.Optional[ta.List[logging.LogRecord]] = None) -> None:
12
12
  super().__init__()
13
13
 
14
- self.records: ta.List[logging.LogRecord] = []
14
+ if record_list is None:
15
+ record_list = []
16
+ self.records: ta.List[logging.LogRecord] = record_list
15
17
 
16
18
  def emit(self, record: logging.LogRecord) -> None:
17
19
  self.records.append(record)
omlish/logs/times.py CHANGED
@@ -4,14 +4,16 @@ import logging
4
4
  import time
5
5
  import typing as ta
6
6
 
7
- from .infos import LoggingContextInfo
7
+ from .infos import logging_context_info
8
8
  from .warnings import LoggingSetupWarning
9
9
 
10
10
 
11
11
  ##
12
12
 
13
13
 
14
- class LoggingTimeFields(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
14
+ @logging_context_info
15
+ @ta.final
16
+ class LoggingTimeFields(ta.NamedTuple):
15
17
  """Maps directly to stdlib `logging.LogRecord` fields, and must be kept in sync with it."""
16
18
 
17
19
  created: float
omlish/secrets/secrets.py CHANGED
@@ -11,7 +11,6 @@ TODO:
11
11
  """
12
12
  import abc
13
13
  import collections
14
- import logging
15
14
  import os
16
15
  import sys
17
16
  import time
@@ -21,12 +20,13 @@ import typing as ta
21
20
  from .. import dataclasses as dc
22
21
  from .. import lang
23
22
  from .. import marshal as msh
23
+ from ..logs import all as logs
24
24
 
25
25
 
26
26
  msh.register_global_module_import('.marshal', __package__)
27
27
 
28
28
 
29
- log = logging.getLogger(__name__)
29
+ log = logs.get_module_logger(globals())
30
30
 
31
31
 
32
32
  ##
@@ -269,7 +269,7 @@ class LoggingSecrets(Secrets):
269
269
  self,
270
270
  child: Secrets,
271
271
  *,
272
- log: logging.Logger | None = None, # noqa
272
+ log: logs.LoggerLike | None = None, # noqa
273
273
  ) -> None:
274
274
  super().__init__()
275
275
 
@@ -3,11 +3,11 @@
3
3
  import abc
4
4
  import concurrent.futures as cf
5
5
  import dataclasses as dc
6
- import logging
7
6
  import socket
8
7
  import typing as ta
9
8
 
10
9
  from ...lite.abstract import Abstract
10
+ from ...logs.protocols import LoggerLike
11
11
  from ..addresses import SocketAndAddress
12
12
  from ..handlers import SocketHandler
13
13
  from ..io import SocketIoPair
@@ -142,7 +142,7 @@ class ExecutorSocketServerHandler(SocketServerHandler_):
142
142
  @dc.dataclass(frozen=True)
143
143
  class ExceptionLoggingSocketServerHandler(SocketServerHandler_):
144
144
  handler: SocketServerHandler
145
- log: logging.Logger
145
+ log: LoggerLike
146
146
 
147
147
  ignored: ta.Optional[ta.Container[ta.Type[Exception]]] = None
148
148
 
@@ -11,6 +11,7 @@ import typing as ta
11
11
  from ...lite.abstract import Abstract
12
12
  from ...lite.contextmanagers import ExitStacked
13
13
  from ...lite.contextmanagers import defer
14
+ from ...logs.protocols import LoggerLike
14
15
  from ..addresses import SocketAndAddress
15
16
  from ..bind import SocketBinder
16
17
  from ..io import close_socket_immediately
@@ -21,7 +22,7 @@ from .handlers import SocketServerHandler
21
22
 
22
23
 
23
24
  class SocketServer:
24
- _DEFAULT_LOGGER = logging.getLogger('.'.join([__name__, 'SocketServer']))
25
+ _DEFAULT_LOGGER: LoggerLike = logging.getLogger('.'.join([__name__, 'SocketServer'])) # FIXME
25
26
 
26
27
  def __init__(
27
28
  self,
@@ -29,7 +30,7 @@ class SocketServer:
29
30
  handler: SocketServerHandler,
30
31
  *,
31
32
  on_error: ta.Optional[ta.Callable[[BaseException, ta.Optional[SocketAndAddress]], None]] = None,
32
- error_logger: ta.Optional[logging.Logger] = _DEFAULT_LOGGER,
33
+ error_logger: ta.Optional[LoggerLike] = _DEFAULT_LOGGER,
33
34
  poll_interval: float = .5,
34
35
  shutdown_timeout: ta.Optional[float] = None,
35
36
  ) -> None:
@@ -1,9 +1,9 @@
1
1
  # ruff: noqa: UP006 UP007 UP045
2
2
  # @omlish-lite
3
3
  import dataclasses as dc
4
- import logging
5
4
  import typing as ta
6
5
 
6
+ from ...logs.protocols import LoggerLike
7
7
  from ..addresses import SocketAndAddress
8
8
  from ..io import close_socket_immediately
9
9
  from .handlers import SocketServerHandler
@@ -17,7 +17,7 @@ from .handlers import SocketServerHandler_
17
17
  class SslErrorHandlingSocketServerHandler(SocketServerHandler_):
18
18
  handler: SocketServerHandler
19
19
 
20
- log: ta.Optional[logging.Logger] = None
20
+ log: ta.Optional[LoggerLike] = None
21
21
 
22
22
  #
23
23
 
@@ -9,6 +9,7 @@ import typing as ta
9
9
 
10
10
  from ..lite.abstract import Abstract
11
11
  from ..lite.timeouts import Timeout
12
+ from ..logs.protocols import LoggerLike
12
13
  from .wrap import subprocess_maybe_shell_wrap_exec
13
14
 
14
15
 
@@ -55,12 +56,12 @@ class VerboseCalledProcessError(subprocess.CalledProcessError):
55
56
 
56
57
 
57
58
  class BaseSubprocesses(Abstract):
58
- DEFAULT_LOGGER: ta.ClassVar[ta.Optional[logging.Logger]] = None
59
+ DEFAULT_LOGGER: ta.ClassVar[ta.Optional[LoggerLike]] = None
59
60
 
60
61
  def __init__(
61
62
  self,
62
63
  *,
63
- log: ta.Optional[logging.Logger] = None,
64
+ log: ta.Optional[LoggerLike] = None,
64
65
  try_exceptions: ta.Optional[ta.Tuple[ta.Type[Exception], ...]] = None,
65
66
  ) -> None:
66
67
  super().__init__()
@@ -68,7 +69,7 @@ class BaseSubprocesses(Abstract):
68
69
  self._log = log if log is not None else self.DEFAULT_LOGGER
69
70
  self._try_exceptions = try_exceptions if try_exceptions is not None else self.DEFAULT_TRY_EXCEPTIONS
70
71
 
71
- def set_logger(self, log: ta.Optional[logging.Logger]) -> None:
72
+ def set_logger(self, log: ta.Optional[LoggerLike]) -> None:
72
73
  self._log = log
73
74
 
74
75
  #
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev427
3
+ Version: 0.0.0.dev429
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.omlish-manifests.json,sha256=FLw7xkPiSXuImZgqSP8BwrEib2R1doSzUPLUkc-QUIA,8410
2
- omlish/__about__.py,sha256=QkXaBAuv7ZX9gYuayTSwd9nc5AxEetkjHMvq5rsSLtM,3575
2
+ omlish/__about__.py,sha256=J-C7WHTn5DQ8yi1VGtWDPKJ49OgPRH0xEYXXfxVvAPM,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
@@ -39,7 +39,7 @@ omlish/asyncs/asyncio/all.py,sha256=u2JpMEs-0AJ0Vd8yU10HvWD8rfKxdFfMiwBu2oDeuuQ,
39
39
  omlish/asyncs/asyncio/channels.py,sha256=oniTpmw_eeKK70APyEZLhRUChwLwebE4N0_uZiwSKgQ,1085
40
40
  omlish/asyncs/asyncio/sockets.py,sha256=i1a2DZ52IuvRQQQW8FJxEUFboqpKn_K08a_MsMaecqU,1264
41
41
  omlish/asyncs/asyncio/streams.py,sha256=Laa9BNwajZ7Wt_rJoYMbQtfSX4Q4i-dVHhtYSekCHXM,1015
42
- omlish/asyncs/asyncio/subprocesses.py,sha256=8o-uWNsJhSoM7Egbofc23CeJFRmb4isb9zVVh1Fxjfk,6285
42
+ omlish/asyncs/asyncio/subprocesses.py,sha256=FlnI23o2Rm-T-gXHWuHCaVeMoLKzgStk3CPO0OPIth4,6307
43
43
  omlish/asyncs/asyncio/timeouts.py,sha256=lJ4qmDqyxUeAQCXJGiLL8pxYwoR1F1lntZ18HVf40Wo,452
44
44
  omlish/asyncs/asyncio/utils.py,sha256=dCC4hXqCTKBpU5urAXsKUIIua2M9JXAtumwh7IUEu7E,2443
45
45
  omlish/asyncs/bluelet/LICENSE,sha256=q5Kpj4s30qpi8H66tXFlh5v8_fkaKMFIzqdGfnN0Hz0,555
@@ -49,7 +49,7 @@ omlish/asyncs/bluelet/api.py,sha256=RFOd95cVSQ7NQNlOVfcIiVtf9cHYx0sLq2ugbR_LIQk,
49
49
  omlish/asyncs/bluelet/core.py,sha256=ZxwdxfxhlYVLyh0Iwz6yvVKy3xgo_BwLm-gwqSlqPt4,5458
50
50
  omlish/asyncs/bluelet/events.py,sha256=YC-mAhIVQkfMtJ-MpMkYM8LF04UhDfWNs0abgFCCwk4,2440
51
51
  omlish/asyncs/bluelet/files.py,sha256=gY_hlPCGbDZR7twvuslDsv5yKSh9ciO6X7Lxu3ni_vs,2419
52
- omlish/asyncs/bluelet/runner.py,sha256=qJCid2ObvWW64VRAGNoFK3Cpl1HAsu7ZgDxy6TyebRE,15478
52
+ omlish/asyncs/bluelet/runner.py,sha256=vFh4Tt0J5fM0RYXrLieKcQ0oyLEVoEwkYC9Ml5wII9k,15511
53
53
  omlish/asyncs/bluelet/sockets.py,sha256=YJvbkX-oE7H-fNHzMJmTzCsLeBwEt46p4Fz9jF2FjLU,6776
54
54
  omlish/asyncs/ioproxy/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
55
55
  omlish/asyncs/ioproxy/all.py,sha256=_0mg0OjNKbnpGPSQZ-ftXYhKSpt-Po4Rlu2kam7v3XQ,1003
@@ -89,7 +89,7 @@ omlish/collections/unmodifiable.py,sha256=0ZkA_0paWlkgaU6OupFdSV0yFP--7XoI3lqhs3
89
89
  omlish/collections/utils.py,sha256=JYBYoConWxApqJLOjXR6GuQI76G0KQDjg6kkXrTofUw,4063
90
90
  omlish/collections/cache/__init__.py,sha256=D1gO71VcwxFTZP9gAc9isHfg_TEdalwhsJcgGLvS9hg,233
91
91
  omlish/collections/cache/descriptor.py,sha256=5SOsKNxnhisJY22l7tujMOI6MGGr6TERzgsfjvGXOyA,5013
92
- omlish/collections/cache/impl.py,sha256=Y18OcAsNL6dIWuk89UlZBpqq0iBU-P4VDio6eis43Us,14760
92
+ omlish/collections/cache/impl.py,sha256=6rOg7zgEn8I5GPjz1RdImB1TdbHZv6EKdv2QAUcUGug,14783
93
93
  omlish/collections/cache/types.py,sha256=uND_qOk8bVVmdhrOhjx9QHYqs2jq53NThEqQAl3Nepw,690
94
94
  omlish/collections/kv/__init__.py,sha256=qPuE8bmbyOkT_qVGH5owSp0SbC9xI_p_LS0tP7S7QSw,751
95
95
  omlish/collections/kv/base.py,sha256=lbE5kj2rNgee8dQOlD7v5oTAn5BcgE3IYRpA11N31Dw,1077
@@ -126,8 +126,8 @@ omlish/configs/processing/names.py,sha256=9nRVBhZ0uY-J4591QcgUHla4MZAEux0-TWxGO1
126
126
  omlish/configs/processing/rewriting.py,sha256=ofPYub5ftZ6A_bkAW71w2wDmSbZ5ULI3Ip190fzBl4Q,4252
127
127
  omlish/configs/processing/strings.py,sha256=Iw85H_AE2TG8vdpbgwhye-aqz5Hkn4J9mM32FdXEiGo,832
128
128
  omlish/daemons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
- omlish/daemons/daemon.py,sha256=pUwomapIrUwXLnov9jlA5EU1vp4qEYcIiUxKD3SQyVo,3479
130
- omlish/daemons/launching.py,sha256=OGr32q-g5fVHrIXfrXacCcwtpTEAKgO9EQtEQKmdf0s,3749
129
+ omlish/daemons/daemon.py,sha256=rgSozDUOEE56KyT2rCRxZJEt9zJ-wkKk6R_fwjm2D-4,3501
130
+ omlish/daemons/launching.py,sha256=uLRfuWpW19H_lP_QcqfHOZBaJDa1WvDNfJgVx4i4c9g,3771
131
131
  omlish/daemons/reparent.py,sha256=uEs7pjzQkL8zhM8xADJhedmXXA7eDsu28639F5HkmpU,590
132
132
  omlish/daemons/services.py,sha256=laoUeJU7eVHuWl1062FBjPSD7jchOjhpYDc5FT2B3dM,3462
133
133
  omlish/daemons/spawning.py,sha256=CsNhWDebyin_CYwWvLWNpY0djF010HjQTHATvw6dk-M,5349
@@ -208,7 +208,7 @@ omlish/diag/asts.py,sha256=MWh9XAG3m9L10FIJCyoNT2aU4Eft6tun_x9K0riq6Dk,3332
208
208
  omlish/diag/debug.py,sha256=ClED7kKXeVMyKrjGIxcq14kXk9kvUJfytBQwK9y7c4Q,1637
209
209
  omlish/diag/lslocks.py,sha256=VuA4MNNqXTcnHWsJvulGM6pNJRKmlXFXUZTfXpY0V6g,1750
210
210
  omlish/diag/lsof.py,sha256=5N5aZQ7UqEBgV-hj3_a8QcvALOeLlVb8otqF2hvucxY,9107
211
- omlish/diag/procfs.py,sha256=S9GVAw193vGr89X6g2xfB8Rvmm_0eVim-6umxWG6pBE,9678
211
+ omlish/diag/procfs.py,sha256=eeB3L9UpNBpAfsax3U6OczayYboPlFzOGplqlQ4gBNY,9700
212
212
  omlish/diag/procstats.py,sha256=EJEe2Zc58ykBoTfqMXro7H52aQa_pd6uC2hsIPFceso,825
213
213
  omlish/diag/ps.py,sha256=MEpMU6fbkh0bSWrOHh_okOa0JDTUSUQUVSYBdh1TGvE,1672
214
214
  omlish/diag/pycharm.py,sha256=9Mgn5T2ZdlEUL3VV-GzVmCBs_ZtIpLwaUzP6pgHEUEo,4712
@@ -219,8 +219,8 @@ omlish/diag/_pycharm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
219
219
  omlish/diag/_pycharm/runhack.py,sha256=IxawPyqrPfY1fpV1D_9dZXxny89fVSR3RlmqlbaRctw,37869
220
220
  omlish/diag/replserver/__init__.py,sha256=uLo6V2aQ29v9z3IMELlPDSlG3_2iOT4-_X8VniF-EgE,235
221
221
  omlish/diag/replserver/__main__.py,sha256=LmU41lQ58bm1h4Mx7S8zhE_uEBSC6kPcp9mn5JRpulA,32
222
- omlish/diag/replserver/console.py,sha256=6gBq6RtT2axXX18yNzSYjeFFbpSksmDyhXYKbOZkq-Y,7415
223
- omlish/diag/replserver/server.py,sha256=ukjk7yyceSG4LAJwxE-Een8b4tQ_2VJHArfKeTqKM0I,5379
222
+ omlish/diag/replserver/console.py,sha256=MxDLslAaYfC-l0rfGO-SnYAJ__8RWBJQ5FxGi29czYU,7438
223
+ omlish/diag/replserver/server.py,sha256=zTeyaARK22KwaqCOzG8H8Rk009en7gBxOBaJcRB1jbM,5402
224
224
  omlish/dispatch/__init__.py,sha256=UwVT6SSk5HKk9xF9vc_UJD8BDSIQWSw98Ldx-G-6PC0,166
225
225
  omlish/dispatch/dispatch.py,sha256=TzWihCt9Zr8wfIwVpKHVOOrYFVKpDXRevxYomtEfqYc,3176
226
226
  omlish/dispatch/functions.py,sha256=cwNzGIg2ZIalEgn9I03cnJVbMTHjWloyDTaowlO3UPs,1524
@@ -245,7 +245,7 @@ omlish/formats/__init__.py,sha256=T0AG1gFnqQ5JiHN0UPQjQ-7g5tnxMIG-mgOvMYExYAM,21
245
245
  omlish/formats/cbor.py,sha256=o_Hbe4kthO9CeXK-FySrw0dHVlrdyTo2Y8PpGRDfZ3c,514
246
246
  omlish/formats/cloudpickle.py,sha256=16si4yUp_pAdDWGECAWf6HLA2PwSANGGgDoMLGZUem8,579
247
247
  omlish/formats/codecs.py,sha256=n_02fv1Qk2ixG9vDkTZKdRHGWPKnvDBDdOMVKfnElOI,1641
248
- omlish/formats/dotenv.py,sha256=91_uoLKCntDqcqyyRMOCKvVkx9aC2nkLMuAH4rit8NI,19350
248
+ omlish/formats/dotenv.py,sha256=2BjwqsgLgXCmvyNeWq6_xigfH4OIcIoaJbYIuVmul5E,19351
249
249
  omlish/formats/logfmt.py,sha256=i_pKnzFFyNAcPiqC4FiTYPC6tJujlaGuw94V2YNVkf8,2639
250
250
  omlish/formats/pickle.py,sha256=jdp4E9WH9qVPBE3sSqbqDtUo18RbTSIiSpSzJ-IEVZw,529
251
251
  omlish/formats/props.py,sha256=orlqpFG88hL39apzaAOHmNooQv-kbnXX2WggZjdI-U8,18934
@@ -315,12 +315,12 @@ omlish/graphs/dot/rendering.py,sha256=IOCEEOqlsRctoIgnz1I9v0ycHHDAr5zYubTXT7v_Yw
315
315
  omlish/graphs/dot/utils.py,sha256=8cGKIdcM-w1q4ITUYyC0lnYwLqNWuH2OddmmbLxVgEo,806
316
316
  omlish/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
317
317
  omlish/http/all.py,sha256=4dSBbitsrQIadivSo2rBLg8dgdmC0efpboylGUZgKKo,829
318
- omlish/http/asgi.py,sha256=7EKmDuXmuqN4KWUDG3WoRiQlWu-LctCqT7W-wVaSCio,3221
318
+ omlish/http/asgi.py,sha256=4r2Gw1ojwp2OVpwonof1p4GFRcseIJqPhpkQpLhM9Jw,3243
319
319
  omlish/http/consts.py,sha256=7BJ4D1MdIvqBcepkgCfBFHolgTwbOlqsOEiee_IjxOA,2289
320
320
  omlish/http/cookies.py,sha256=uuOYlHR6e2SC3GM41V0aozK10nef9tYg83Scqpn5-HM,6351
321
321
  omlish/http/dates.py,sha256=wnVjmRm5KEBGaL9JnAbaAmb1XkAQ3LCCQAcxzMdwwCo,2880
322
322
  omlish/http/encodings.py,sha256=w2WoKajpaZnQH8j-IBvk5ZFL2O2pAU_iBvZnkocaTlw,164
323
- omlish/http/handlers.py,sha256=ewpYM0Kmea26s0ySbsaKsZdOlSaUy9iZt6DZAKxkDqw,3940
323
+ omlish/http/handlers.py,sha256=MOBXGg3F_G0rtCXtEBiGLY-Yb31f4ScjGtozII0bIDE,3972
324
324
  omlish/http/headers.py,sha256=Ft7jsjDegcpzkXk2rk3uw8bEFIB7vifIfLMMwATDo1A,5716
325
325
  omlish/http/json.py,sha256=9XwAsl4966Mxrv-1ytyCqhcE6lbBJw-0_tFZzGszgHE,7440
326
326
  omlish/http/jwt.py,sha256=F9-1syqS7qR6C_z06tmz9zM4CXbKrw6s7w3NIPGdyuU,4354
@@ -374,7 +374,7 @@ omlish/inject/utils.py,sha256=Gc2qq45KgkyqDt03WSvOEZBCiuqQ6ESwplx5ZRBcY5M,413
374
374
  omlish/inject/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
375
375
  omlish/inject/impl/bindings.py,sha256=xSvUcoDz8NH-aNHPwBPEZsFg73K2WcF_A63npVbGt_k,420
376
376
  omlish/inject/impl/elements.py,sha256=PM_055moROskSTQqmohEa6I0tt1OQ-VRNArXCMG6vyk,5947
377
- omlish/inject/impl/injector.py,sha256=jac-WggKeNJoZ-kY8-pFJsH_A3Siyv4Yng4BJk-9Itk,7577
377
+ omlish/inject/impl/injector.py,sha256=agM5NKugC9du_vBgawL9H_02A76GPQFjG-3cQVjz25s,7600
378
378
  omlish/inject/impl/inspect.py,sha256=reXkNsjyvJXva5379tHTWklVK0vzqGLP0BgI_4VVPgQ,3116
379
379
  omlish/inject/impl/multis.py,sha256=Y287xntr1wBNYpwQBc0f_Ca7UkXjkscKhgGHZK_zdbg,2053
380
380
  omlish/inject/impl/origins.py,sha256=dgGdkoMN6I4DZrWjlpZYijeFsrF6Up1WPq_QSAgTtuQ,1676
@@ -498,22 +498,22 @@ omlish/lite/typing.py,sha256=m2CyJTz2OVOCPRvp-0UuEx7oleZgXqs3rYXijE0bTsA,1280
498
498
  omlish/lite/wrappers.py,sha256=d00Ls2kFHuogKd5wEBaU65VNCN10YXIZtiwu1mbMpmA,530
499
499
  omlish/logs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
500
500
  omlish/logs/all.py,sha256=9VOobL0p3E_6QWsnBmlCPhxz5zqs-AiH4jvZR3--ZZA,1085
501
- omlish/logs/base.py,sha256=LxDnvCDzZr9AfjO_5NmoE9z1Mqw_7meQ7WGgGYissXk,6649
502
- omlish/logs/callers.py,sha256=tRj24LxlEimDGCplDVVJDvRSt_u72cgjnnvb0mdZgvU,2065
503
- omlish/logs/contexts.py,sha256=apXaLOk7LlXNdz_gpF5zHhTLpFFBmB2_SHX8UVxopks,6537
504
- omlish/logs/infos.py,sha256=VPx9VrcN1fCPnXjc8QCsMlww0fgEG3qdkzo2KhSxMwY,2716
501
+ omlish/logs/base.py,sha256=NyydcPUYPODiTCslCr--hlXSZSTvRgF_QNjdszpqfTc,6663
502
+ omlish/logs/callers.py,sha256=wpLHCfykqG5yAE4Wi1LAVcZiEMRULVsObFqn7-49o8g,2057
503
+ omlish/logs/contexts.py,sha256=dC84Wa__j0leSJw5SzP-ygsflfzIiqvmRnv9meD-Q_U,7523
504
+ omlish/logs/infos.py,sha256=OutGmqvKBmE1oHuiQk1afItnbBcBgAuPONMekwR0sco,2561
505
505
  omlish/logs/levels.py,sha256=b3i-70OcvNMcOQBzg1IUHBPESfHz0uu5mi5t_jbwv1Y,1966
506
- omlish/logs/modules.py,sha256=EFOqubbU5P0GW576OL6j9fmizNN2oyfpsp5YnKCoUgk,194
506
+ omlish/logs/modules.py,sha256=ImciecEfeLwh65vO3gWVpADRhOz9cBoAkBDJ9VyliXY,267
507
507
  omlish/logs/protocols.py,sha256=8l5TgNUNgfrqYPA6dVijPFGLxzWhvgS4Cca64XHT0jo,939
508
508
  omlish/logs/standard.py,sha256=ppho-wDecGxUiRXOdCIlblmrQhqXZ0oQOGayy8N53XY,3237
509
- omlish/logs/times.py,sha256=ro2TSD_Xwq_cNN8f_FrEGfdhD4PTbh0PLSG13PGx39E,2571
509
+ omlish/logs/times.py,sha256=MTgZDF89qXeXqhsXpELPSk8fv5_0MJKb3jMgYVl-J94,2563
510
510
  omlish/logs/utils.py,sha256=fKvP342qBmE8wwTgUQ8Tf0-ATVhCm90UYBQt2pk0044,1883
511
511
  omlish/logs/warnings.py,sha256=xyhDgiPy1p8Kp5D9sb_NZiBnQ26SUppaHqC27dtQzok,67
512
512
  omlish/logs/std/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
513
513
  omlish/logs/std/adapters.py,sha256=qRXusW8iGYF29C3cy1srb4pgJ0Fv5li8bUvnegxo9o8,1005
514
514
  omlish/logs/std/configs.py,sha256=aDQahqBJXJpmQBaxXVK5S2xi_I_nrLLcCLTq6Q2K6EQ,1037
515
515
  omlish/logs/std/filters.py,sha256=Z8tHOvBRiP-OYm2z5cwY-lYXRimNgferEARMwvwx5Pw,380
516
- omlish/logs/std/handlers.py,sha256=nYPKV6Kzz8Oeyw4-3ZdJKKEUfgubfmwzqr3RaCNcmS4,338
516
+ omlish/logs/std/handlers.py,sha256=uTWOT6oayBUEftKmJ8yo89ZP4plv5eQ8Lbcmt-IGl8c,469
517
517
  omlish/logs/std/json.py,sha256=QJ5lywLsRsPyVno2nk2kOw-Z1z3bfrDiZzqcRUdWUMY,1382
518
518
  omlish/logs/std/noisy.py,sha256=hWpbseerZqlHdEPEajDTSmcRhx8LmmNAxz_7GBZAO9s,353
519
519
  omlish/logs/std/proxy.py,sha256=9MVV5kbj9nwl3KZGtrYCIb5XTpv33f33zZ7P_B58fX0,2394
@@ -634,7 +634,7 @@ omlish/secrets/marshal.py,sha256=u90n1OfRfdpH1T2F0xK_pAPH1ENYL6acFt6XdVd3KvI,198
634
634
  omlish/secrets/openssl.py,sha256=4zp1KZ1EVRNaBS0VIokTqnamy3ZeeC1XN2wSXx4lEcM,6215
635
635
  omlish/secrets/pwgen.py,sha256=Z5i1qMKK4idOZvWai5dXkI59gX7pYzFFlFYAj7qEmqA,1706
636
636
  omlish/secrets/pwhash.py,sha256=Jctv3QzcMvVPXJsWA3w3LDUlzmyUDGEWG9sLiJz1xaw,4107
637
- omlish/secrets/secrets.py,sha256=YsOdiOZ4sYY4KT5ycoP7Au-xVKk-Odu9dG-BcdsCTH4,8030
637
+ omlish/secrets/secrets.py,sha256=wf_X7IA7HXSEcSPCSt97KuHgYCjDzVhKfDS17rrZUVk,8053
638
638
  omlish/secrets/ssl.py,sha256=HnH5MS31X9Uid7Iw1CWqviaVwMLF1Ha8RxZiiE-_iF8,158
639
639
  omlish/secrets/subprocesses.py,sha256=ZdShw4jrGDdyQW8mRMgl106-9qpCEq2J6w_x7ruz1wk,1217
640
640
  omlish/secrets/tempssl.py,sha256=KbNKGwiKw95Ly2b1OtNL2jhPa25aO0t_tvyNB5trUcU,1885
@@ -646,9 +646,9 @@ omlish/sockets/io.py,sha256=YdrtrpqXAUJgQRqeAdTxH3m06DE5xRt08tqdRaRn5bY,1414
646
646
  omlish/sockets/ports.py,sha256=WofuoMTQNUhbEreL0lrMQyVEZm6awuLLpFvn6jnFKrw,1778
647
647
  omlish/sockets/wait.py,sha256=GQIRABh_NWHePuNVz5bBeg7iVln-YHc3945ZA0qr-mA,1565
648
648
  omlish/sockets/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
649
- omlish/sockets/server/handlers.py,sha256=T--CSns9810f25--0Blv5bspAXhMjULtKEcXSGUpxOo,3912
650
- omlish/sockets/server/server.py,sha256=Il1y0LHRa_eB6FLLcuVXbfu9tLOpOttLBCffh3wWSBA,6289
651
- omlish/sockets/server/ssl.py,sha256=QLiPcng1f1RFDhw4aS-Fy57fm0R7CXm76STpHmT55z0,1067
649
+ omlish/sockets/server/handlers.py,sha256=GEG3zWb3-DyjZaVWtggq1aKFtvAoyqOJEw2Aq-7S1xs,3934
650
+ omlish/sockets/server/server.py,sha256=sKDz_AE44opgE4mb_Km5stGRR4mRFjhXcjFrXfJ5-bk,6347
651
+ omlish/sockets/server/ssl.py,sha256=sTtM8eYmou37aViJG-a32bEoEg1DA-psAu8v8NP2ECs,1089
652
652
  omlish/sockets/server/threading.py,sha256=CPr_290vpN3o4p2ehQBIwk-d8Ciasylp9v2zUQSB5xk,2862
653
653
  omlish/specs/__init__.py,sha256=fxpcfXEWESH2kiPStKhl2dAdfLkZVTt_cssZKyqBLiQ,87
654
654
  omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
@@ -746,7 +746,7 @@ omlish/sql/tabledefs/lower.py,sha256=i4_QkVlVH5U99O6pqokrB661AudNVJ9Q-OwtkKOBleU
746
746
  omlish/sql/tabledefs/tabledefs.py,sha256=lIhvlt0pk6G7RZAtDFsFXm5j0l9BvRfnP7vNGeydHtE,816
747
747
  omlish/subprocesses/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
748
748
  omlish/subprocesses/asyncs.py,sha256=G0KeH53yRsLJrLjYCrtQgDS3RKA0QRaSgdGDMiNGXI8,2710
749
- omlish/subprocesses/base.py,sha256=TEufkIaA-eyRLmdmxHSbu8ffPtIansu6YVoxi0wZf2c,6158
749
+ omlish/subprocesses/base.py,sha256=wFewm8m5D6Qln6N9WjsIHxF5nqmQ8xGaBYfG1BSNdFk,6186
750
750
  omlish/subprocesses/editor.py,sha256=xBrd7gY0akhRfDIBK5YIBrYMHECtl_8r499iKViyfpQ,2634
751
751
  omlish/subprocesses/maysync.py,sha256=UqpidDPw-w2GDLRJn03mQm-s98wtN348olwSh2ceTig,1424
752
752
  omlish/subprocesses/run.py,sha256=mV38F_hmyVCXbpDxl5xNmzz5al_LqZ3FOrfcPcjSqy8,4416
@@ -892,9 +892,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
892
892
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
893
893
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
894
894
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
895
- omlish-0.0.0.dev427.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
896
- omlish-0.0.0.dev427.dist-info/METADATA,sha256=XcyPFrnqymcaHcY3ycLj3wJn1_l-E-qdd3MilxfuI8o,19243
897
- omlish-0.0.0.dev427.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
898
- omlish-0.0.0.dev427.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
899
- omlish-0.0.0.dev427.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
900
- omlish-0.0.0.dev427.dist-info/RECORD,,
895
+ omlish-0.0.0.dev429.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
896
+ omlish-0.0.0.dev429.dist-info/METADATA,sha256=J2Jsv1U4suYQj3spIX7Tqi6R0iatqB_2mTMxagh8fOM,19243
897
+ omlish-0.0.0.dev429.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
898
+ omlish-0.0.0.dev429.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
899
+ omlish-0.0.0.dev429.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
900
+ omlish-0.0.0.dev429.dist-info/RECORD,,