omlish 0.0.0.dev428__py3-none-any.whl → 0.0.0.dev430__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.dev428'
2
- __revision__ = '302f3506177c6fb44a3b8786e8125ee75d322b0e'
1
+ __version__ = '0.0.0.dev430'
2
+ __revision__ = '36144d896de4a99623dc872d90d16dfe60a47934'
3
3
 
4
4
 
5
5
  #
@@ -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/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
  ##
@@ -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/lang/asyncs.py CHANGED
@@ -19,9 +19,7 @@ def as_async(fn: ta.Callable[P, T], *, wrap: bool = False) -> ta.Callable[P, ta.
19
19
  ##
20
20
 
21
21
 
22
- async def async_list(
23
- ai: ta.AsyncIterable[T],
24
- ) -> list[T]:
22
+ async def async_list(ai: ta.AsyncIterable[T]) -> list[T]:
25
23
  """Simply eagerly reads the full contents of a function call returning an async iterator."""
26
24
 
27
25
  return [v async for v in ai]
@@ -30,9 +28,7 @@ async def async_list(
30
28
  ##
31
29
 
32
30
 
33
- def sync_await(
34
- aw: ta.Awaitable[T],
35
- ) -> T:
31
+ def sync_await(aw: ta.Awaitable[T]) -> T:
36
32
  """
37
33
  Allows for the synchronous execution of async functions which will never actually *externally* await anything. These
38
34
  functions are allowed to await any number of other functions - including contextmanagers and generators - so long as
omlish/lite/attrops.py CHANGED
@@ -285,8 +285,6 @@ class AttrOps(ta.Generic[T]):
285
285
  self._eq = _eq
286
286
  return _eq
287
287
 
288
- #
289
-
290
288
  @property
291
289
  def hash_eq(self) -> ta.Tuple[
292
290
  ta.Callable[[T], int],
@@ -294,6 +292,8 @@ class AttrOps(ta.Generic[T]):
294
292
  ]:
295
293
  return (self.hash, self.eq)
296
294
 
295
+ #
296
+
297
297
  @property
298
298
  def repr_hash_eq(self) -> ta.Tuple[
299
299
  ta.Callable[[T], str],
@@ -304,20 +304,25 @@ class AttrOps(ta.Generic[T]):
304
304
 
305
305
  #
306
306
 
307
+ class NOT_SET: # noqa
308
+ def __new__(cls, *args, **kwargs): # noqa
309
+ raise TypeError
310
+
307
311
  def install(
308
312
  self,
309
313
  locals_dct: ta.MutableMapping[str, ta.Any],
310
314
  *,
311
- all: bool = False, # noqa
312
- repr: bool = False, # noqa
313
- hash: bool = False, # noqa
314
- eq: bool = False,
315
+ repr: ta.Union[bool, ta.Type[NOT_SET]] = NOT_SET, # noqa
316
+ hash: ta.Union[bool, ta.Type[NOT_SET]] = NOT_SET, # noqa
317
+ eq: ta.Union[bool, ta.Type[NOT_SET]] = NOT_SET,
315
318
  ) -> 'AttrOps[T]':
316
- if repr or all:
319
+ if all(a is self.NOT_SET for a in (repr, hash, eq)):
320
+ repr = hash = eq = True # noqa
321
+ if repr:
317
322
  locals_dct.update(__repr__=self.repr)
318
- if hash or all:
323
+ if hash:
319
324
  locals_dct.update(__hash__=self.hash)
320
- if eq or all:
325
+ if eq:
321
326
  locals_dct.update(__eq__=self.eq)
322
327
  return self
323
328
 
omlish/logs/all.py CHANGED
@@ -17,6 +17,10 @@ with _lang.auto_proxy_init(globals()):
17
17
  JsonLoggingFormatter,
18
18
  )
19
19
 
20
+ from .std.loggers import ( # noqa
21
+ StdLogger,
22
+ )
23
+
20
24
  from .std.noisy import ( # noqa
21
25
  silence_noisy_loggers,
22
26
  )
@@ -26,10 +30,39 @@ with _lang.auto_proxy_init(globals()):
26
30
  ProxyLoggingHandler,
27
31
  )
28
32
 
33
+ from .std.records import ( # noqa
34
+ LoggingContextLogRecord,
35
+ )
36
+
37
+ from .base import ( # noqa
38
+ AnyLogger,
39
+ Logger,
40
+ AsyncLogger,
41
+
42
+ AnyNopLogger,
43
+ NopLogger,
44
+ AsyncNopLogger,
45
+ )
46
+
29
47
  from .callers import ( # noqa
30
48
  LoggingCaller,
31
49
  )
32
50
 
51
+ from .contexts import ( # noqa
52
+ LoggingExcInfoTuple,
53
+ LoggingExcInfo,
54
+
55
+ LoggingContext,
56
+ )
57
+
58
+ from .infos import ( # noqa
59
+ LoggingSourceFileInfo,
60
+ LoggingThreadInfo,
61
+ LoggingProcessInfo,
62
+ LoggingMultiprocessingInfo,
63
+ LoggingAsyncioTaskInfo,
64
+ )
65
+
33
66
  from .levels import ( # noqa
34
67
  LogLevel,
35
68
 
@@ -59,3 +92,7 @@ with _lang.auto_proxy_init(globals()):
59
92
 
60
93
  error_logging,
61
94
  )
95
+
96
+ from .warnings import ( # noqa
97
+ LoggingSetupWarning,
98
+ )
omlish/logs/base.py CHANGED
@@ -22,7 +22,7 @@ LoggingMsgFn = ta.Callable[[], ta.Union[str, tuple]] # ta.TypeAlias
22
22
 
23
23
  class AnyLogger(Abstract, ta.Generic[T]):
24
24
  def is_enabled_for(self, level: LogLevel) -> bool:
25
- return self.get_effective_level() >= level
25
+ return level >= self.get_effective_level()
26
26
 
27
27
  @abc.abstractmethod
28
28
  def get_effective_level(self) -> LogLevel:
@@ -219,7 +219,7 @@ class AsyncLogger(AnyLogger[ta.Awaitable[None]], Abstract):
219
219
  class AnyNopLogger(AnyLogger[T], Abstract):
220
220
  @ta.final
221
221
  def get_effective_level(self) -> LogLevel:
222
- return 999
222
+ return -999
223
223
 
224
224
 
225
225
  @ta.final
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
@@ -66,8 +68,8 @@ class LoggingCaller(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
66
68
  sinfo = sinfo[:-1]
67
69
 
68
70
  return cls(
69
- f.f_code.co_filename,
70
- f.f_lineno or 0,
71
- f.f_code.co_name,
72
- sinfo,
71
+ file_path=f.f_code.co_filename,
72
+ line_no=f.f_lineno or 0,
73
+ name=f.f_code.co_name,
74
+ stack_info=sinfo,
73
75
  )
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
 
@@ -38,16 +35,17 @@ class LoggingSourceFileInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[
38
35
  return None
39
36
 
40
37
  return cls(
41
- file_name,
42
- module,
38
+ file_name=file_name,
39
+ module=module,
43
40
  )
44
41
 
45
42
 
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
@@ -55,31 +53,33 @@ class LoggingThreadInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc
55
53
  @classmethod
56
54
  def build(cls) -> 'LoggingThreadInfo':
57
55
  return cls(
58
- threading.get_ident(),
59
- threading.get_native_id() if hasattr(threading, 'get_native_id') else None,
60
- threading.current_thread().name,
56
+ ident=threading.get_ident(),
57
+ native_id=threading.get_native_id() if hasattr(threading, 'get_native_id') else None,
58
+ name=threading.current_thread().name,
61
59
  )
62
60
 
63
61
 
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
72
71
  def build(cls) -> 'LoggingProcessInfo':
73
72
  return cls(
74
- os.getpid(),
73
+ pid=os.getpid(),
75
74
  )
76
75
 
77
76
 
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
@@ -89,15 +89,16 @@ class LoggingMultiprocessingInfo(LoggingContextInfo, ta.NamedTuple): # type: ig
89
89
  return None
90
90
 
91
91
  return cls(
92
- mp.current_process().name,
92
+ process_name=mp.current_process().name,
93
93
  )
94
94
 
95
95
 
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
@@ -115,5 +116,5 @@ class LoggingAsyncioTaskInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore
115
116
  return None
116
117
 
117
118
  return cls(
118
- task.get_name(), # Always non-None
119
+ name=task.get_name(), # Always non-None
119
120
  )
omlish/logs/levels.py CHANGED
@@ -22,36 +22,66 @@ class NamedLogLevel(int):
22
22
 
23
23
  #
24
24
 
25
- @property
26
- def exact_name(self) -> ta.Optional[str]:
27
- return self._NAMES_BY_INT.get(self)
25
+ _CACHE: ta.ClassVar[ta.MutableMapping[int, 'NamedLogLevel']] = {}
26
+
27
+ @ta.overload
28
+ def __new__(cls, name: str, offset: int = 0, /) -> 'NamedLogLevel':
29
+ ...
28
30
 
29
- _effective_name: ta.Optional[str]
31
+ @ta.overload
32
+ def __new__(cls, i: int, /) -> 'NamedLogLevel':
33
+ ...
34
+
35
+ def __new__(cls, x, offset=0, /):
36
+ if isinstance(x, str):
37
+ return cls(cls._INTS_BY_NAME[x.upper()] + offset)
38
+ elif not offset and (c := cls._CACHE.get(x)) is not None:
39
+ return c
40
+ else:
41
+ return super().__new__(cls, x + offset)
42
+
43
+ #
44
+
45
+ _name_and_offset: ta.Tuple[str, int]
30
46
 
31
47
  @property
32
- def effective_name(self) -> ta.Optional[str]:
48
+ def name_and_offset(self) -> ta.Tuple[str, int]:
33
49
  try:
34
- return self._effective_name
50
+ return self._name_and_offset
35
51
  except AttributeError:
36
52
  pass
37
53
 
38
- if (n := self.exact_name) is None:
54
+ if (n := self._NAMES_BY_INT.get(self)) is not None:
55
+ t = (n, 0)
56
+ else:
39
57
  for n, i in self._NAME_INT_PAIRS: # noqa
40
58
  if self >= i:
59
+ t = (n, (self - i))
41
60
  break
42
61
  else:
43
- n = None
62
+ t = ('NOTSET', int(self))
63
+
64
+ self._name_and_offset = t
65
+ return t
66
+
67
+ @property
68
+ def exact_name(self) -> ta.Optional[str]:
69
+ n, o = self.name_and_offset
70
+ return n if not o else None
44
71
 
45
- self._effective_name = n
72
+ @property
73
+ def effective_name(self) -> str:
74
+ n, _ = self.name_and_offset
46
75
  return n
47
76
 
48
77
  #
49
78
 
50
- def __repr__(self) -> str:
51
- return f'{self.__class__.__name__}({int(self)})'
52
-
53
79
  def __str__(self) -> str:
54
- return self.exact_name or f'{self.effective_name or "INVALID"}:{int(self)}'
80
+ return self.exact_name or f'{self.effective_name}{int(self):+}'
81
+
82
+ def __repr__(self) -> str:
83
+ n, o = self.name_and_offset
84
+ return f'{self.__class__.__name__}({n!r}{f", {int(o)}" if o else ""})'
55
85
 
56
86
  #
57
87
 
@@ -69,3 +99,6 @@ NamedLogLevel.WARNING = NamedLogLevel(logging.WARNING)
69
99
  NamedLogLevel.INFO = NamedLogLevel(logging.INFO)
70
100
  NamedLogLevel.DEBUG = NamedLogLevel(logging.DEBUG)
71
101
  NamedLogLevel.NOTSET = NamedLogLevel(logging.NOTSET)
102
+
103
+
104
+ NamedLogLevel._CACHE.update({i: NamedLogLevel(i) for i in NamedLogLevel._NAMES_BY_INT}) # noqa
omlish/logs/modules.py CHANGED
@@ -3,7 +3,7 @@ import logging
3
3
  import typing as ta
4
4
 
5
5
  from .base import Logger
6
- from .std.adapters import StdLogger
6
+ from .std.loggers import StdLogger
7
7
 
8
8
 
9
9
  ##
omlish/logs/protocols.py CHANGED
@@ -7,6 +7,7 @@ from .levels import LogLevel
7
7
  ##
8
8
 
9
9
 
10
+ @ta.runtime_checkable
10
11
  class LoggerLike(ta.Protocol):
11
12
  """Satisfied by both our Logger and stdlib logging.Logger."""
12
13
 
@@ -23,6 +23,9 @@ class StdLogger(Logger):
23
23
  def std(self) -> logging.Logger:
24
24
  return self._std
25
25
 
26
+ def is_enabled_for(self, level: LogLevel) -> bool:
27
+ return self._std.isEnabledFor(level)
28
+
26
29
  def get_effective_level(self) -> LogLevel:
27
30
  return self._std.getEffectiveLevel()
28
31
 
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
@@ -59,9 +61,9 @@ class LoggingTimeFields(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc
59
61
  relative_created = (time_ns - start_time_ns) / 1e6
60
62
 
61
63
  return cls(
62
- created,
63
- msecs,
64
- relative_created,
64
+ created=created,
65
+ msecs=msecs,
66
+ relative_created=relative_created,
65
67
  )
66
68
 
67
69
 
@@ -86,6 +86,7 @@ class TypedLoggerValue(Abstract, ta.Generic[T]):
86
86
  def of(cls: ta.Type[TypedLoggerValueT], v: ta.Any) -> ta.Union[TypedLoggerValueT, AbsentTypedLoggerValue]:
87
87
  return cls(v) if v is not ABSENT_TYPED_LOGGER_VALUE else ABSENT_TYPED_LOGGER_VALUE
88
88
 
89
+ @ta.final
89
90
  @property
90
91
  def v(self) -> T:
91
92
  return self._v
@@ -22,7 +22,7 @@ from .handlers import SocketServerHandler
22
22
 
23
23
 
24
24
  class SocketServer:
25
- _DEFAULT_LOGGER = logging.getLogger('.'.join([__name__, 'SocketServer']))
25
+ _DEFAULT_LOGGER: LoggerLike = logging.getLogger('.'.join([__name__, 'SocketServer'])) # FIXME
26
26
 
27
27
  def __init__(
28
28
  self,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev428
3
+ Version: 0.0.0.dev430
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=Hpb2Yne7crg_ww7XqcFbR5Q0NE38iJPTfXPQEaCwgic,3575
2
+ omlish/__about__.py,sha256=hWUhAjMnMNft0GDUanNG2JIkoAwrhNLC_ZTd5BzHw0A,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
@@ -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
@@ -315,7 +315,7 @@ 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
@@ -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
@@ -416,7 +416,7 @@ omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,4
416
416
  omlish/iterators/tools.py,sha256=M16LXrJhMdsz5ea2qH0vws30ZvhQuQSCVFSLpRf_gTg,2096
417
417
  omlish/iterators/unique.py,sha256=BSE-eanva8byFCJi09Nt2zzTsVr8LnTqY1PIInGYRs0,1396
418
418
  omlish/lang/__init__.py,sha256=Ty5DkVFyGztlpYVEcEP1yTvLbflRFTo6IThN8dPMnbI,10096
419
- omlish/lang/asyncs.py,sha256=g47VwMk3LwCcOhZ_uJqXVKmAi85Z0m9l2m37ipuy50s,1789
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
422
422
  omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
@@ -472,7 +472,7 @@ omlish/lite/__init__.py,sha256=cyZEpGob7XjU8DohyNxVe5CQRk4CQ5vrHL42OdhQb8w,148
472
472
  omlish/lite/abstract.py,sha256=Z3kLviPNGLkmA8m8BZILzWxez_sP18OyzgMP3-c2-RI,4068
473
473
  omlish/lite/args.py,sha256=ILJXAiN3KjIoJwY42aKpYPngUdxHIy9ssVIExFVz3fE,978
474
474
  omlish/lite/asyncs.py,sha256=MMRbC38mbsgBPovGLjq4iBdn74DjMVzGc4nVZxN_DUY,441
475
- omlish/lite/attrops.py,sha256=ZtF-qeiqT0zw3q7h2UXHSqlF9Db2bQ9IgZj1p-kOiPI,8522
475
+ omlish/lite/attrops.py,sha256=bUa2ILC4Z89-B1IWSac9XV_VvjKDnQXKDR0mZ6e9SMk,8764
476
476
  omlish/lite/cached.py,sha256=ocQcppTwGdSnKPYMz75VoH526UUT8YtDJeRczBX0-wI,1306
477
477
  omlish/lite/check.py,sha256=ytCkwZoKfOlJqylL-AGm8C2WfsWJd2q3kFbnZCzX3_M,13844
478
478
  omlish/lite/configs.py,sha256=4-1uVxo-aNV7vMKa7PVNhM610eejG1WepB42-Dw2xQI,914
@@ -497,31 +497,31 @@ omlish/lite/types.py,sha256=QM9whf55r7TmmQBRApIWSlyVKsl1p_jcut_YheyZMFY,146
497
497
  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
- 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
500
+ omlish/logs/all.py,sha256=_sU_2waB8FR9GuVrdxGLI145nGepd8c2LAHf2J4dbz4,1777
501
+ omlish/logs/base.py,sha256=VHPjSJjQzIRCe5nqgkmNORYclDJZayGucMy_WhITO1c,6650
502
+ omlish/logs/callers.py,sha256=F3VbeQJniw6RyfbeGBcxMGL3aeO5mgPizmJ8pa2RW88,2091
503
503
  omlish/logs/contexts.py,sha256=dC84Wa__j0leSJw5SzP-ygsflfzIiqvmRnv9meD-Q_U,7523
504
- omlish/logs/infos.py,sha256=Drf9BnDOs3vMPb5G-9pAFUoubjXvzlzPMDiKSjgF1XQ,2766
505
- omlish/logs/levels.py,sha256=b3i-70OcvNMcOQBzg1IUHBPESfHz0uu5mi5t_jbwv1Y,1966
506
- omlish/logs/modules.py,sha256=ImciecEfeLwh65vO3gWVpADRhOz9cBoAkBDJ9VyliXY,267
507
- omlish/logs/protocols.py,sha256=8l5TgNUNgfrqYPA6dVijPFGLxzWhvgS4Cca64XHT0jo,939
504
+ omlish/logs/infos.py,sha256=38bPi7v7vHawNlLp7Q7X6JS-q5s-JrwlDi08FY4xoy4,2621
505
+ omlish/logs/levels.py,sha256=Eze-k_LPgFzbNMnG10F2bRKfL3veQpIxiegvN5rGeWM,2909
506
+ omlish/logs/modules.py,sha256=wZ_PNCYhAaEdnGE5k0JvChcqn9nhtEpmwuH74Bwn5gg,266
507
+ omlish/logs/protocols.py,sha256=e_zizD3pQdYlU6bg3xGB3_ARUTcoHUfar_uLjCo-SPw,961
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=WUy92cUxMtttnj0PZryIxbLqEdWiiAVDUboRxqe2pYw,2594
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
- omlish/logs/std/adapters.py,sha256=qRXusW8iGYF29C3cy1srb4pgJ0Fv5li8bUvnegxo9o8,1005
514
513
  omlish/logs/std/configs.py,sha256=aDQahqBJXJpmQBaxXVK5S2xi_I_nrLLcCLTq6Q2K6EQ,1037
515
514
  omlish/logs/std/filters.py,sha256=Z8tHOvBRiP-OYm2z5cwY-lYXRimNgferEARMwvwx5Pw,380
516
515
  omlish/logs/std/handlers.py,sha256=uTWOT6oayBUEftKmJ8yo89ZP4plv5eQ8Lbcmt-IGl8c,469
517
516
  omlish/logs/std/json.py,sha256=QJ5lywLsRsPyVno2nk2kOw-Z1z3bfrDiZzqcRUdWUMY,1382
517
+ omlish/logs/std/loggers.py,sha256=nJieUZ2iPO8iVYc72QDUBKLPhGw7yPd_RzR18zKUSck,1106
518
518
  omlish/logs/std/noisy.py,sha256=hWpbseerZqlHdEPEajDTSmcRhx8LmmNAxz_7GBZAO9s,353
519
519
  omlish/logs/std/proxy.py,sha256=9MVV5kbj9nwl3KZGtrYCIb5XTpv33f33zZ7P_B58fX0,2394
520
520
  omlish/logs/std/records.py,sha256=muJA3KKjGm5mgsHXtOyrpaEZu553M-UviNgNvXdISXY,10718
521
521
  omlish/logs/typed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
522
522
  omlish/logs/typed/bindings.py,sha256=H_B-3LTGFlBIWYDJ8rei1VMfInE8KrBwRo3bJ_BgFj8,18184
523
523
  omlish/logs/typed/contexts.py,sha256=MU1RqHtmYbnxoLfLhMZbTbRd-WfYEyeVo7_3VnG3rY0,4027
524
- omlish/logs/typed/types.py,sha256=TgoT2jBGUD9rIWE6u9Yj-WW5wWusMjNcCf4FGh3RHJ4,14428
524
+ omlish/logs/typed/types.py,sha256=DQKDT2v4bG1Cgv_LrhvTIHWBAIODs9b8E5jNI4jTRpU,14442
525
525
  omlish/logs/typed/values.py,sha256=w8ukpJZ3lx_st7Mj7riP2squzGmMaz7OuUxw_NZCZsY,3261
526
526
  omlish/manifests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
527
527
  omlish/manifests/base.py,sha256=wW-De-pU3cef-0vGsgo-ypftDwc3tCBxhRAzPtrdark,918
@@ -647,7 +647,7 @@ 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
649
  omlish/sockets/server/handlers.py,sha256=GEG3zWb3-DyjZaVWtggq1aKFtvAoyqOJEw2Aq-7S1xs,3934
650
- omlish/sockets/server/server.py,sha256=tYWDRwlXdX5m_sd2mgdOMs7DrZFjHH3zHKa2KzpZb5k,6326
650
+ omlish/sockets/server/server.py,sha256=sKDz_AE44opgE4mb_Km5stGRR4mRFjhXcjFrXfJ5-bk,6347
651
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
@@ -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.dev428.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
896
- omlish-0.0.0.dev428.dist-info/METADATA,sha256=DR__EMO_09RXhsC47ctuSZNq5nRcStmhoJnLkPhs8DQ,19243
897
- omlish-0.0.0.dev428.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
898
- omlish-0.0.0.dev428.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
899
- omlish-0.0.0.dev428.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
900
- omlish-0.0.0.dev428.dist-info/RECORD,,
895
+ omlish-0.0.0.dev430.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
896
+ omlish-0.0.0.dev430.dist-info/METADATA,sha256=iD6ksXPqkEoUuKrQg-U2gFrrtB3eCj9jzyhlaHtfGgs,19243
897
+ omlish-0.0.0.dev430.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
898
+ omlish-0.0.0.dev430.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
899
+ omlish-0.0.0.dev430.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
900
+ omlish-0.0.0.dev430.dist-info/RECORD,,