omlish 0.0.0.dev393__py3-none-any.whl → 0.0.0.dev395__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.dev393'
2
- __revision__ = '7624d40b9a78e52aec03b012a4b4f7b060d4f2f0'
1
+ __version__ = '0.0.0.dev395'
2
+ __revision__ = 'be0f7f8395fdc987e285187f15f515e157142da5'
3
3
 
4
4
 
5
5
  #
omlish/codecs/base.py CHANGED
@@ -70,7 +70,7 @@ def check_codec_name(s: str) -> str:
70
70
  @dc.dataclass(frozen=True, kw_only=True)
71
71
  class Codec:
72
72
  name: str = dc.xfield(coerce=check_codec_name)
73
- aliases: ta.Collection[str] | None = dc.xfield(
73
+ aliases: ta.Sequence[str] | None = dc.xfield(
74
74
  default=None,
75
75
  coerce=lang.opt_fn(lambda s: [check_codec_name(a) for a in s]),
76
76
  )
@@ -90,7 +90,7 @@ class Codec:
90
90
  @dc.dataclass(frozen=True, kw_only=True)
91
91
  class LazyLoadedCodec(ModAttrManifest):
92
92
  name: str
93
- aliases: ta.Collection[str] | None = None
93
+ aliases: ta.Sequence[str] | None = None
94
94
 
95
95
  @classmethod
96
96
  def new(
omlish/codecs/bytes.py CHANGED
@@ -21,7 +21,7 @@ class BytesCodec(Codec):
21
21
 
22
22
  def make_bytes_encoding_codec(
23
23
  name: str,
24
- aliases: ta.Collection[str] | None,
24
+ aliases: ta.Sequence[str] | None,
25
25
  encode: ta.Callable[[bytes], bytes],
26
26
  decode: ta.Callable[[bytes], bytes],
27
27
  *,
omlish/codecs/registry.py CHANGED
@@ -11,9 +11,9 @@ from .standard import STANDARD_CODECS
11
11
 
12
12
 
13
13
  if ta.TYPE_CHECKING:
14
- from ..manifests import load as manifest_load
14
+ from ..manifests import globals as manifest_globals
15
15
  else:
16
- manifest_load = lang.proxy_import('..manifests.load', __package__)
16
+ manifest_globals = lang.proxy_import('..manifests.globals', __package__)
17
17
 
18
18
 
19
19
  ##
@@ -102,7 +102,7 @@ def _install_standard_codecs(registry: CodecRegistry) -> None:
102
102
 
103
103
  @cached.function
104
104
  def _build_manifest_lazy_loaded_codecs() -> ta.Sequence[LazyLoadedCodec]:
105
- ldr = manifest_load.MANIFEST_LOADER
105
+ ldr = manifest_globals.MANIFEST_LOADER
106
106
  pkgs = {__package__.split('.')[0], *ldr.discover_pkgs()}
107
107
  mns = ldr.load(*pkgs, only=[LazyLoadedCodec])
108
108
  return [m.value for m in mns]
omlish/codecs/text.py CHANGED
@@ -126,7 +126,7 @@ def normalize_text_encoding_name(s: str) -> str:
126
126
 
127
127
  def make_text_encoding_codec(
128
128
  name: str,
129
- aliases: ta.Collection[str] | None = None,
129
+ aliases: ta.Sequence[str] | None = None,
130
130
  *,
131
131
  append_to: ta.MutableSequence[Codec] | None = None,
132
132
  ) -> TextEncodingCodec:
omlish/diag/pydevd.py CHANGED
@@ -124,7 +124,7 @@ def is_present() -> bool:
124
124
 
125
125
  def get_setup() -> dict | None:
126
126
  if is_present():
127
- return _pydevd().SetupHolder.setup
127
+ return check.not_none(_pydevd()).SetupHolder.setup
128
128
  else:
129
129
  return None
130
130
 
@@ -160,7 +160,7 @@ ARGS_ENV_VAR = 'PYDEVD_ARGS'
160
160
  def get_args() -> list[str]:
161
161
  check.state(is_present())
162
162
  setup: ta.Mapping[ta.Any, ta.Any] = check.isinstance(get_setup(), dict)
163
- args = [_pydevd().__file__]
163
+ args = [check.not_none(check.not_none(_pydevd()).__file__)]
164
164
 
165
165
  for k in [
166
166
  'port',
omlish/diag/timers.py ADDED
@@ -0,0 +1,184 @@
1
+ import atexit
2
+ import contextlib
3
+ import functools
4
+ import sys
5
+ import threading
6
+ import time
7
+ import typing as ta
8
+
9
+ from .. import check
10
+ from .. import lang
11
+
12
+
13
+ T = ta.TypeVar('T')
14
+
15
+
16
+ ##
17
+
18
+
19
+ class _GlobalTimer:
20
+ def __init__(
21
+ self,
22
+ registry: '_GlobalTimerRegistry',
23
+ name: str,
24
+ *,
25
+ clock: ta.Callable[[], float] | None = None,
26
+ report_at_exit: bool = False,
27
+ report_out: ta.Any | None = None,
28
+ ) -> None:
29
+ super().__init__()
30
+
31
+ self._registry = registry
32
+ self._name = name
33
+
34
+ if clock is None:
35
+ clock = time.monotonic
36
+ self._clock = clock
37
+ self._report_out = report_out
38
+
39
+ self._lock = threading.Lock()
40
+
41
+ self._c = 0
42
+ self._t = 0.
43
+
44
+ if report_at_exit:
45
+ atexit.register(self.report)
46
+
47
+ def report(self) -> None:
48
+ msg = (
49
+ f'{self._registry.module_name}::{self._name}: '
50
+ f'{self._c} calls, '
51
+ f'{self._t:.3f}s total'
52
+ )
53
+
54
+ print(
55
+ msg,
56
+ file=self._report_out if self._report_out is not None else sys.stderr,
57
+ )
58
+
59
+ @contextlib.contextmanager
60
+ def __call__(self) -> ta.Iterator[None]:
61
+ start = self._clock()
62
+
63
+ try:
64
+ yield
65
+
66
+ finally:
67
+ end = self._clock()
68
+ took = end - start
69
+
70
+ with self._lock:
71
+ self._c += 1
72
+ self._t += took
73
+
74
+
75
+ #
76
+
77
+
78
+ class _GlobalTimerRegistry:
79
+ def __init__(
80
+ self,
81
+ module_name: str,
82
+ ) -> None:
83
+ super().__init__()
84
+
85
+ self._module_name = module_name
86
+
87
+ self._lock = threading.Lock()
88
+
89
+ self._timers: dict[str, _GlobalTimer] = {}
90
+
91
+ @property
92
+ def module_name(self) -> str:
93
+ return self._module_name
94
+
95
+ def get_timer(
96
+ self,
97
+ name: str,
98
+ **kwargs: ta.Any,
99
+ ) -> _GlobalTimer:
100
+ return lang.double_check_setdefault(
101
+ self._lock,
102
+ self._timers,
103
+ name,
104
+ lambda: _GlobalTimer(
105
+ self,
106
+ name,
107
+ **kwargs,
108
+ ),
109
+ )
110
+
111
+
112
+ _GLOBAL_LOCK = threading.Lock()
113
+ _GLOBAL_ATTR = '__global_timers_registry__'
114
+
115
+
116
+ def _get_global_registry(
117
+ globals: ta.MutableMapping[str, ta.Any], # noqa
118
+ ) -> _GlobalTimerRegistry:
119
+ reg = lang.double_check_setdefault(
120
+ _GLOBAL_LOCK,
121
+ globals,
122
+ _GLOBAL_ATTR,
123
+ lambda: _GlobalTimerRegistry(
124
+ globals['__name__'],
125
+ ),
126
+ )
127
+
128
+ return check.isinstance(reg, _GlobalTimerRegistry)
129
+
130
+
131
+ #
132
+
133
+
134
+ @contextlib.contextmanager
135
+ def global_timer_context(
136
+ globals: ta.MutableMapping[str, ta.Any], # noqa
137
+ name: str,
138
+ **kwargs: ta.Any,
139
+ ) -> ta.Iterator[None]:
140
+ reg = _get_global_registry(globals)
141
+ timer = reg.get_timer(name, **kwargs)
142
+ with timer():
143
+ yield
144
+
145
+
146
+ #
147
+
148
+
149
+ class _GlobalTimerContextWrapped:
150
+ def __init__(
151
+ self,
152
+ fn: ta.Any,
153
+ timer: _GlobalTimer,
154
+ ) -> None:
155
+ super().__init__()
156
+
157
+ self._fn = fn
158
+ self._timer = timer
159
+
160
+ functools.update_wrapper(self, fn)
161
+
162
+ def __get__(self, instance, owner=None):
163
+ return self.__class__(
164
+ self._fn.__get__(instance, owner),
165
+ self._timer,
166
+ )
167
+
168
+ def __call__(self, *args, **kwargs):
169
+ with self._timer():
170
+ return self._fn(*args, **kwargs)
171
+
172
+
173
+ def global_timer_wrap(
174
+ globals: ta.MutableMapping[str, ta.Any], # noqa
175
+ name: str,
176
+ **kwargs: ta.Any,
177
+ ) -> ta.Callable[[T], T]:
178
+ reg = _get_global_registry(globals)
179
+ timer = reg.get_timer(name, **kwargs)
180
+
181
+ def inner(fn):
182
+ return _GlobalTimerContextWrapped(fn, timer)
183
+
184
+ return inner
omlish/formats/codecs.py CHANGED
@@ -22,7 +22,7 @@ def make_object_codec(
22
22
  *,
23
23
  input: rfl.Type, # noqa
24
24
  output: rfl.Type = rfl.type_(ta.Any),
25
- aliases: ta.Collection[str] | None = None,
25
+ aliases: ta.Sequence[str] | None = None,
26
26
  ) -> ObjectCodecT:
27
27
  return cls(
28
28
  name=name,
@@ -69,7 +69,7 @@ class InjectorImpl(Injector, lang.Final):
69
69
  self._bim = ec.binding_impl_map()
70
70
  self._ekbs = ec.eager_keys_by_scope()
71
71
  self._pls: tuple[ProvisionListener, ...] = tuple(
72
- b.listener
72
+ b.listener # type: ignore[attr-defined]
73
73
  for b in itertools.chain(
74
74
  ec.elements_of_type(ProvisionListenerBinding),
75
75
  (p._pls if p is not None else ()), # noqa
@@ -14,7 +14,7 @@ from .keys import Key
14
14
  ProvisionListener: ta.TypeAlias = ta.Callable[[
15
15
  Injector,
16
16
  Key,
17
- Binding,
17
+ Binding | None,
18
18
  ta.Callable[[], ta.Any],
19
19
  ], ta.Callable[[], ta.Any]]
20
20
 
@@ -46,7 +46,7 @@ def make_compression_codec(
46
46
  name: str,
47
47
  cls: type[Compression],
48
48
  *,
49
- aliases: ta.Collection[str] | None = None,
49
+ aliases: ta.Sequence[str] | None = None,
50
50
  ) -> CompressionCodec:
51
51
  return CompressionCodec(
52
52
  name=name,
omlish/lang/__init__.py CHANGED
@@ -142,6 +142,7 @@ from .contextmanagers import ( # noqa
142
142
  context_wrapped,
143
143
  default_lock,
144
144
  disposing,
145
+ double_check_setdefault,
145
146
  maybe_managing,
146
147
  )
147
148
 
@@ -415,6 +415,16 @@ class _DescriptorCachedFunction(_CachedFunction[T]):
415
415
  #
416
416
 
417
417
 
418
+ @ta.overload
419
+ def cached_function(fn: None = None, **kwargs: ta.Any) -> ta.Callable[[CallableT], CallableT]:
420
+ ...
421
+
422
+
423
+ @ta.overload
424
+ def cached_function(fn: CallableT, **kwargs: ta.Any) -> CallableT:
425
+ ...
426
+
427
+
418
428
  def cached_function(fn=None, **kwargs): # noqa
419
429
  if fn is None:
420
430
  return functools.partial(cached_function, **kwargs)
@@ -13,6 +13,8 @@ import typing as ta
13
13
 
14
14
 
15
15
  T = ta.TypeVar('T')
16
+ K = ta.TypeVar('K')
17
+ V = ta.TypeVar('V')
16
18
 
17
19
 
18
20
  ##
@@ -286,3 +288,28 @@ class Timer:
286
288
 
287
289
  def __exit__(self, exc_type, exc_val, exc_tb):
288
290
  self._end = self._clock()
291
+
292
+
293
+ ##
294
+
295
+
296
+ def double_check_setdefault(
297
+ cm: ta.ContextManager,
298
+ dct: ta.MutableMapping[K, V],
299
+ k: K,
300
+ fn: ta.Callable[[], V],
301
+ ) -> V:
302
+ try:
303
+ return dct[k]
304
+ except KeyError:
305
+ pass
306
+
307
+ with cm:
308
+ try:
309
+ return dct[k]
310
+ except KeyError:
311
+ pass
312
+
313
+ v = fn()
314
+ dct[k] = v
315
+ return v
omlish/manifests/base.py CHANGED
@@ -27,7 +27,7 @@ class ModAttrManifest:
27
27
  @dc.dataclass(frozen=True)
28
28
  class NameAliasesManifest:
29
29
  name: str
30
- aliases: ta.Optional[ta.Collection[str]] = None
30
+ aliases: ta.Optional[ta.Sequence[str]] = None
31
31
 
32
32
  @classmethod
33
33
  def build_name_dict(cls, objs: ta.Iterable[NameAliasesManifestT]) -> ta.Dict[str, NameAliasesManifestT]:
@@ -0,0 +1,11 @@
1
+ # @omlish-lite
2
+ from ..lite.marshal import unmarshal_obj
3
+ from .loading import ManifestLoader
4
+
5
+
6
+ ##
7
+
8
+
9
+ MANIFEST_LOADER = ManifestLoader(
10
+ cls_instantiator=lambda cls, **kwargs: unmarshal_obj(kwargs, cls),
11
+ )
@@ -26,9 +26,12 @@ class ManifestLoader:
26
26
  self,
27
27
  *,
28
28
  module_remap: ta.Optional[ta.Mapping[str, str]] = None,
29
+ cls_instantiator: ta.Optional[ta.Callable[..., ta.Any]] = None,
29
30
  ) -> None:
30
31
  super().__init__()
31
32
 
33
+ self._cls_instantiator = cls_instantiator
34
+
32
35
  self._lock = threading.RLock()
33
36
 
34
37
  self._module_remap = module_remap or {}
@@ -172,6 +175,14 @@ class ManifestLoader:
172
175
 
173
176
  #
174
177
 
178
+ def instantiate_cls(self, cls: type, **kwargs: ta.Any) -> ta.Any:
179
+ if self._cls_instantiator is not None:
180
+ return self._cls_instantiator(cls, **kwargs)
181
+ else:
182
+ return cls(**kwargs)
183
+
184
+ #
185
+
175
186
  def _load(
176
187
  self,
177
188
  *pkg_names: str,
@@ -197,7 +208,7 @@ class ManifestLoader:
197
208
  continue
198
209
 
199
210
  cls = self._load_cls(key)
200
- value = cls(**value_dct)
211
+ value = self.instantiate_cls(cls, **value_dct)
201
212
 
202
213
  manifest = dc.replace(manifest, value=value)
203
214
  lst.append(manifest)
@@ -256,9 +267,3 @@ class ManifestLoader:
256
267
  pkgs.extend(self.scan_pkg_root(fallback_root))
257
268
 
258
269
  return pkgs
259
-
260
-
261
- ##
262
-
263
-
264
- MANIFEST_LOADER = ManifestLoader()
@@ -56,7 +56,7 @@ from .errors import ( # noqa
56
56
  UnhandledTypeError,
57
57
  )
58
58
 
59
- from .global_ import ( # noqa
59
+ from .globals import ( # noqa
60
60
  GLOBAL_REGISTRY,
61
61
 
62
62
  global_marshaler_factory,
omlish/reflect/subst.py CHANGED
@@ -1,3 +1,4 @@
1
+ import abc
1
2
  import dataclasses as dc
2
3
  import types
3
4
  import typing as ta
@@ -22,6 +23,9 @@ else:
22
23
  cache = lang.proxy_import('.collections.cache', __package__)
23
24
 
24
25
 
26
+ GenericBasesMap: ta.TypeAlias = ta.Mapping[Type, tuple[Type, ...]]
27
+
28
+
25
29
  ##
26
30
 
27
31
 
@@ -69,22 +73,35 @@ def replace_type_vars(
69
73
  return rec(ty)
70
74
 
71
75
 
76
+ ##
77
+
78
+
79
+ _DEFAULT_SIMPLE_GENERIC_BASES: dict[Type, tuple[Type, ...]] = {}
80
+ DEFAULT_SIMPLE_GENERIC_BASES: GenericBasesMap = _DEFAULT_SIMPLE_GENERIC_BASES
81
+
82
+
72
83
  class GenericSubstitution:
73
84
  def __init__(
74
85
  self,
75
86
  *,
76
87
  update_aliases: bool = False,
77
88
  cache_size: int = 0, # FIXME: ta.Generic isn't weakrefable..
89
+ simple_generic_bases: GenericBasesMap | None = None,
78
90
  ) -> None:
79
91
  super().__init__()
80
92
 
81
93
  self._update_aliases = update_aliases
94
+ self._simple_generic_bases = simple_generic_bases
82
95
 
83
96
  if cache_size > 0:
84
97
  self.get_generic_bases = cache.cache(weak_keys=True, max_size=cache_size)(self.get_generic_bases) # type: ignore # noqa
85
98
  self.generic_mro = cache.cache(weak_keys=True, max_size=cache_size)(self.generic_mro) # type: ignore
86
99
 
87
100
  def get_generic_bases(self, ty: Type) -> tuple[Type, ...]:
101
+ if (sgm := self._simple_generic_bases) is not None:
102
+ if (sgb := sgm.get(ty)) is not None:
103
+ return sgb
104
+
88
105
  if (cty := get_concrete_type(ty)) is not None:
89
106
  rpl = get_type_var_replacements(ty)
90
107
  ret: list[Type] = []
@@ -97,6 +114,7 @@ class GenericSubstitution:
97
114
  rty = replace_type_vars(bty, rpl, update_aliases=self._update_aliases)
98
115
  ret.append(rty)
99
116
  return tuple(ret)
117
+
100
118
  return ()
101
119
 
102
120
  def generic_mro(self, obj: ta.Any) -> list[Type]:
@@ -108,9 +126,32 @@ class GenericSubstitution:
108
126
  return [ty for ty in mro if get_concrete_type(ty) is not ta.Generic]
109
127
 
110
128
 
111
- DEFAULT_GENERIC_SUBSTITUTION = GenericSubstitution()
129
+ DEFAULT_GENERIC_SUBSTITUTION = GenericSubstitution(
130
+ simple_generic_bases=DEFAULT_SIMPLE_GENERIC_BASES,
131
+ )
112
132
 
113
133
  get_generic_bases = DEFAULT_GENERIC_SUBSTITUTION.get_generic_bases
114
134
  generic_mro = DEFAULT_GENERIC_SUBSTITUTION.generic_mro
115
135
 
116
- ALIAS_UPDATING_GENERIC_SUBSTITUTION = GenericSubstitution(update_aliases=True)
136
+ ALIAS_UPDATING_GENERIC_SUBSTITUTION = GenericSubstitution(
137
+ update_aliases=True,
138
+ simple_generic_bases=DEFAULT_SIMPLE_GENERIC_BASES,
139
+ )
140
+
141
+
142
+ ##
143
+
144
+
145
+ _DEFAULT_SIMPLE_GENERIC_BASE_LIST: ta.Sequence[Type] = [
146
+ object,
147
+ abc.ABC,
148
+ lang.Abstract,
149
+ lang.Sealed,
150
+ lang.PackageSealed,
151
+ lang.Final,
152
+ ]
153
+
154
+ _DEFAULT_SIMPLE_GENERIC_BASES.update({
155
+ b: get_generic_bases(b)
156
+ for b in _DEFAULT_SIMPLE_GENERIC_BASE_LIST
157
+ })
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev393
3
+ Version: 0.0.0.dev395
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=aT8yZ-Zh-9wfHl5Ym5ouiWC1i0cy7Q7RlhzavB6VLPI,8587
2
- omlish/__about__.py,sha256=Ecs9Y68M7tY4vQsy6795a2JDqG9iRNujk3WD8bB9QRY,3543
2
+ omlish/__about__.py,sha256=FuuxNeWOcrs5N-mVO5nyHgXH5qq9LTs3IR3eBUDgIFc,3543
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=rer-TPOFDU6fYq_AWio_AmA-ckZ8JDY5shIzQ_yXfzA,8414
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
@@ -69,13 +69,13 @@ omlish/bootstrap/main.py,sha256=RQAQVb_Cbk_Lnu-hSGMAo-aVQVIJ-E_TW7ZLsPO-ECk,5909
69
69
  omlish/bootstrap/marshal.py,sha256=aKLeiOyPW6DelVK78dmw0axQzOMHX-ALrSqOOzYh05w,486
70
70
  omlish/bootstrap/sys.py,sha256=r06ZroT2Rv0CBHiEweqDV6oWaMGNhFc4u0XBMBv3nnY,8793
71
71
  omlish/codecs/__init__.py,sha256=-FDwRJFGagg-fZyQ8wup4GPuR6gHpmaChzthlykn-kY,876
72
- omlish/codecs/base.py,sha256=9wNVEnbb6KmI06A-HpUdT4BAYXOtDoJVyctNcn5vRnY,2218
73
- omlish/codecs/bytes.py,sha256=jlZ87OmZ52HhQDNyL87R3OIviK2qV5iU2jZYOTOLWjk,2157
72
+ omlish/codecs/base.py,sha256=IVnJlduvhiH1imul4DPhl2gHBWS76774AV5h86dX0ls,2214
73
+ omlish/codecs/bytes.py,sha256=3DxyQQCvFcP3mQ5G93f_mygXEb-7I8buM8EyzUcx2Is,2155
74
74
  omlish/codecs/chain.py,sha256=nbkL2nz0ZqT2lxYwSXktHh1YFTQ4Iii1Hp-fWjis6rc,532
75
75
  omlish/codecs/funcs.py,sha256=or0Jogczuzk7csDTRl-HURMEjl8LXXqxxXYK45xcM5w,855
76
- omlish/codecs/registry.py,sha256=2FnO5YP7ui1LzkguwESY0MP3WIdwgPTIJTM_4RyTOEg,3896
76
+ omlish/codecs/registry.py,sha256=PIf7XdwVX7Q85-MnyURtX9SKAYolK_r7wls9Z-qAsnA,3911
77
77
  omlish/codecs/standard.py,sha256=eiZ4u9ep0XrA4Z_D1zJI0vmWyuN8HLrX4Se_r_Cq_ZM,60
78
- omlish/codecs/text.py,sha256=MgAzXapiHie-hhLBmcho67WXfWbmhlHz4tNPcHXnWUk,5711
78
+ omlish/codecs/text.py,sha256=uHhV8jBgH0iZgcrV0nl4-0a_9ofln4iFH4OXoVm2CW4,5709
79
79
  omlish/collections/__init__.py,sha256=-CcIq7e8OkQakexxpJOXf2q6LdVqzo7B-quPtwur_BQ,2634
80
80
  omlish/collections/abc.py,sha256=p9zhL5oNV5WPyWmMn34fWfkuxPQAjOtL7WQA-Xsyhwk,2628
81
81
  omlish/collections/bimap.py,sha256=3szDCscPJlFRtkpyVQNWneg4s50mr6Rd0jdTzVEIcnE,1661
@@ -212,8 +212,9 @@ omlish/diag/procfs.py,sha256=KaGTAA2Gj8eEEp7MjClRe4aimwzd-HDABThFzvq2cBQ,9684
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
215
- omlish/diag/pydevd.py,sha256=WlhrJ-KNa5miBBI3E9qqZ6N9n6pmGnchlrdbI16k7P8,7541
215
+ omlish/diag/pydevd.py,sha256=WPfDgsLe-zCOpnPMlAYEVliTQxk4jmcOKvI19nd-SAI,7589
216
216
  omlish/diag/threads.py,sha256=1-x02VCDZ407gfbtXm1pWK-ubqhqfePm9PMqkHCVoqk,3642
217
+ omlish/diag/timers.py,sha256=44zoMx5tulfoWcHfx65ga7_zM8P9fVzBYMka8Elup6w,3785
217
218
  omlish/diag/_pycharm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
218
219
  omlish/diag/_pycharm/runhack.py,sha256=f4R9SOH0nDfO2WqPh0xQ9-45qOLrtTVysS-hSwtbdOA,37864
219
220
  omlish/diag/replserver/__init__.py,sha256=uLo6V2aQ29v9z3IMELlPDSlG3_2iOT4-_X8VniF-EgE,235
@@ -245,7 +246,7 @@ omlish/dom/rendering.py,sha256=5cQK3A_uifh3Th5v3c0nx-tW8d1KyGL6C9tASPaNVNI,4336
245
246
  omlish/formats/__init__.py,sha256=T0AG1gFnqQ5JiHN0UPQjQ-7g5tnxMIG-mgOvMYExYAM,21
246
247
  omlish/formats/cbor.py,sha256=o_Hbe4kthO9CeXK-FySrw0dHVlrdyTo2Y8PpGRDfZ3c,514
247
248
  omlish/formats/cloudpickle.py,sha256=16si4yUp_pAdDWGECAWf6HLA2PwSANGGgDoMLGZUem8,579
248
- omlish/formats/codecs.py,sha256=ip4TLOyWAaUyEJmrIOzuLMtjRdgaMEsC6JeAlcCVi28,1657
249
+ omlish/formats/codecs.py,sha256=HBQzco_BT73xshv2l8FrDTaAKTH-A8Y4vXiabXPELGY,1655
249
250
  omlish/formats/dotenv.py,sha256=60RHhpNmLhqT7ISeA79MmSc7Sq8AxF5nKj7VPjdroZU,19320
250
251
  omlish/formats/pickle.py,sha256=jdp4E9WH9qVPBE3sSqbqDtUo18RbTSIiSpSzJ-IEVZw,529
251
252
  omlish/formats/props.py,sha256=rPycJ-_b76NSNc2b_dZ0F0zyKzuXK8v6K6fqcV8uCRQ,18933
@@ -364,7 +365,7 @@ omlish/inject/errors.py,sha256=_wkN2tF55gQzmMOMKJC_9jYHBZzaBiCDcyqI9Sf2UZs,626
364
365
  omlish/inject/injector.py,sha256=fyvaRoJXo_oibx1_IiGkncP9oXnZSKtDm7-ULNKRXHE,1071
365
366
  omlish/inject/inspect.py,sha256=Uq4KMloGWF_YS2mgZbrx-JXhZQnYHHKJSr68i9yoBVc,597
366
367
  omlish/inject/keys.py,sha256=7jnI2cw7cvLlzZAfe5SC50O3oPOpOB6iGZGTigyfQvs,682
367
- omlish/inject/listeners.py,sha256=wyPsAJsl45fZHmrFwsVBxaCiT7r_Riw1I8Eowwg5NHE,592
368
+ omlish/inject/listeners.py,sha256=Ffaun2fVWAgAwKgLdgziJynG_jhAWaaPEsy-2I2Cmpw,599
368
369
  omlish/inject/managed.py,sha256=-9aBm1vRPOjNz4kgOmpt8S2T55s727t9RiggFBH8maU,2096
369
370
  omlish/inject/multis.py,sha256=Dn63jE8P5ahSKc1IDBdzzx6ByBCgVOth5t4frG9m4UA,3336
370
371
  omlish/inject/origins.py,sha256=-qXa18rIIkNwBdTrvASRDjgPYnoY6n6OPC222jJDrXg,551
@@ -378,7 +379,7 @@ omlish/inject/utils.py,sha256=Gc2qq45KgkyqDt03WSvOEZBCiuqQ6ESwplx5ZRBcY5M,413
378
379
  omlish/inject/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
379
380
  omlish/inject/impl/bindings.py,sha256=xSvUcoDz8NH-aNHPwBPEZsFg73K2WcF_A63npVbGt_k,420
380
381
  omlish/inject/impl/elements.py,sha256=PM_055moROskSTQqmohEa6I0tt1OQ-VRNArXCMG6vyk,5947
381
- omlish/inject/impl/injector.py,sha256=Ch47a_RyABZX6_DwbY9N8u4eALqpKLO_7dfVRpVATvQ,7545
382
+ omlish/inject/impl/injector.py,sha256=QRhNM5m6Ua7VhFa6u5rgxR7Iu6PViJ6_h7d8CFSvPO4,7575
382
383
  omlish/inject/impl/inspect.py,sha256=reXkNsjyvJXva5379tHTWklVK0vzqGLP0BgI_4VVPgQ,3116
383
384
  omlish/inject/impl/multis.py,sha256=j2QHSpJp0jPv10yZEZJwi0w62kXFQ25gkHa026xv4-Q,2053
384
385
  omlish/inject/impl/origins.py,sha256=dgGdkoMN6I4DZrWjlpZYijeFsrF6Up1WPq_QSAgTtuQ,1676
@@ -398,7 +399,7 @@ omlish/io/compress/adapters.py,sha256=LJHhjwMHXstoLyX_q0QhGoBAcqyYGWfzhzQbGBXHzH
398
399
  omlish/io/compress/base.py,sha256=X-B9zC_JAJ84ozO4Vl_7mG3o6zkF6jZfcXO5JmDftGk,620
399
400
  omlish/io/compress/brotli.py,sha256=sNDX5HmEVqg9_xID5NTFPAWuvlNPw5ixfOnnIWwZf_o,1189
400
401
  omlish/io/compress/bz2.py,sha256=HtwBuBYHJ3MyWO9xJ0XhWpyIYTA3OszLrpu_J4kRRPA,1534
401
- omlish/io/compress/codecs.py,sha256=kpSJrCSnfFxAwReZTwdcXsaHe0iqoFbdZtZxjzuzxu0,1792
402
+ omlish/io/compress/codecs.py,sha256=dpJKoELXy_xF5nLnQYGNu19tmHEaUPyyk7fVsOlXsWk,1790
402
403
  omlish/io/compress/gzip.py,sha256=6nCWycCYo0_4cTMu4QMhu23MT1xbrwyf7E8sGGBkR_w,12199
403
404
  omlish/io/compress/lz4.py,sha256=qaze1yVXexjJyN18Adh8fbTm_5pEeyytx66KoMUNpCU,2759
404
405
  omlish/io/compress/lzma.py,sha256=qDyshBgBUSPcZpAyXiRXnqI7zx7x60UpPxn8K3nN8aM,2469
@@ -420,13 +421,13 @@ omlish/iterators/iterators.py,sha256=RxW35yQ5ed8vBQ22IqpDXFx-i5JiLQdp7-pkMZXhJJ8
420
421
  omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,472
421
422
  omlish/iterators/tools.py,sha256=M16LXrJhMdsz5ea2qH0vws30ZvhQuQSCVFSLpRf_gTg,2096
422
423
  omlish/iterators/unique.py,sha256=Nw0pSaNEcHAkve0ugfLPvJcirDOn9ECyC5wIL8JlJKI,1395
423
- omlish/lang/__init__.py,sha256=JAtUfF-W0qW4BdJz2hgXRBdjUGl43ZLUghbM_bffoIM,6814
424
+ omlish/lang/__init__.py,sha256=6BdwvNwV1p8O_bcnfa6Upjdb7Ah15VfxtliDo76fm4U,6843
424
425
  omlish/lang/attrs.py,sha256=zFiVuGVOq88x45464T_LxDa-ZEq_RD9zJLq2zeVEBDc,5105
425
426
  omlish/lang/casing.py,sha256=cFUlbDdXLhwnWwcYx4qnM5c4zGX7hIRUfcjiZbxUD28,4636
426
427
  omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
427
428
  omlish/lang/collections.py,sha256=XI76WcSi4SclWmEGirErg7EzQUfjtmiK2xSK7jJISzY,2528
428
429
  omlish/lang/comparison.py,sha256=MOwEG0Yny-jBPHO9kQto9FSRyeNpQW24UABsghkrHxY,1356
429
- omlish/lang/contextmanagers.py,sha256=7mbTG7yIwM2whQBuhja5Tt0C4kfefBUW4Y_AIn5j8iI,7214
430
+ omlish/lang/contextmanagers.py,sha256=7atRNgR13cgynKIgrDZNLq5qAV52xWy8ISeOVaL6HrQ,7627
430
431
  omlish/lang/datetimes.py,sha256=01tg21QOx-PWDlm-CSFTalym3vpqF0EKzeinmtcVNoU,379
431
432
  omlish/lang/descriptors.py,sha256=zBtgO9LjdSTGHNUgiIqswh78WOVoGH6KzS0NbgB1Wls,6572
432
433
  omlish/lang/enums.py,sha256=F9tflHfaAoV2MpyuhZzpfX9-H55M3zNa9hCszsngEo8,111
@@ -447,7 +448,7 @@ omlish/lang/strings.py,sha256=TY-v0iGu6BxEKb99YS-VmIJqc-sTAqMv7mCDJQALMnI,4550
447
448
  omlish/lang/sys.py,sha256=KPe1UOXk1VxlOYt_aLmhN0KqsA4wnP-4nm4WEwO49pw,411
448
449
  omlish/lang/typing.py,sha256=eWI3RKhVi-_SV2rN4SGq8IbFo5XbGapbiWeduF97uG8,3846
449
450
  omlish/lang/cached/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
450
- omlish/lang/cached/function.py,sha256=prLS_Zi581YCkJ-6sjurzZxSUng4Ls_2_ODdYo-oQq4,11522
451
+ omlish/lang/cached/function.py,sha256=epDPy9WyGc_VaKTrEQJ3dZun-NLsvdvbbNd7jbaUM2c,11730
451
452
  omlish/lang/cached/property.py,sha256=WHYyg4-6EA86TcNMfbXTjVhjEZPc0kngt9hfY3WN5w8,2768
452
453
  omlish/lang/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
453
454
  omlish/lang/classes/abstract.py,sha256=5G3TXelpy5PRWa2x8G_Im4SPymGKrOBK6sELRyOG9eg,3796
@@ -506,15 +507,16 @@ omlish/logs/standard.py,sha256=w0jS824YDvlzrGgAxKiPk9RoZ5V1b0ADiFsBEpKLuLY,3152
506
507
  omlish/logs/timing.py,sha256=qsQ3DB6swts1pxrFlmLWQzhH-3nzDrq1MUu7PxjjUyU,1519
507
508
  omlish/logs/utils.py,sha256=OkFWf1exmWImmT7BaSiIC7c0Fk9tAis-PRqo8H4ny3c,398
508
509
  omlish/manifests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
509
- omlish/manifests/base.py,sha256=5CmayiuzdXXv9hB5tDnWqfAosAoEQ26YG0B-emkiTXU,941
510
- omlish/manifests/load.py,sha256=baPBZJRSmFVH9lWlWXAredmJFFYc3X0W2C6Z8a4M05E,7734
510
+ omlish/manifests/base.py,sha256=YBK6jxMgY5G3hK0ZBlbU-tghzifkGhwRTyWa5XqOmno,939
511
+ omlish/manifests/globals.py,sha256=LZm4ueBjlC023uxL8zvivSyzMgx5O8kSbo9oNfhF_DE,206
512
+ omlish/manifests/loading.py,sha256=S-yEGsnBEu670ya6Bc09QqbRtA5rBp5rA4D3zuJUl9M,8070
511
513
  omlish/manifests/static.py,sha256=7YwOVh_Ek9_aTrWsWNO8kWS10_j4K7yv3TpXZSHsvDY,501
512
514
  omlish/manifests/types.py,sha256=5hQuY-WZ9VMqHZXr-9Dayg380JsnX2vJzXyw6vC6UDs,317
513
- omlish/marshal/__init__.py,sha256=QeWqXKb6_Jk8vpX9Z-apWlM3nUbJY3uCPOm0k8Lw8b8,3584
515
+ omlish/marshal/__init__.py,sha256=MtQkMih6iJO0S7tbzVWBUjDr9wQhiCm3poTyLslaPFo,3584
514
516
  omlish/marshal/base.py,sha256=3GMrhJBcnVrVtlQRQLOMgvV66MciAYpHKEQi5Ns3dIk,11853
515
517
  omlish/marshal/errors.py,sha256=g5XJyTHd__8lfwQ4KwgK-E5WR6MoNTMrqKP2U_QRQQQ,307
516
518
  omlish/marshal/factories.py,sha256=Q926jSVjaQLEmStnHLhm_c_vqEysN1LnDCwAsFLIzXw,2970
517
- omlish/marshal/global_.py,sha256=vNLpwQVt7Nn9sA5bBh7c_JYcUu9-1CLyENq1zBH-rcM,1510
519
+ omlish/marshal/globals.py,sha256=vNLpwQVt7Nn9sA5bBh7c_JYcUu9-1CLyENq1zBH-rcM,1510
518
520
  omlish/marshal/naming.py,sha256=ELs-NtWhw6RCSEF_y98cMyzr37pj0DV_bG9yQmto_NA,857
519
521
  omlish/marshal/proxy.py,sha256=i7xZQN6BSGz4nBM4CTj0S6RcSlDEgrZmX9fbtFpAPco,548
520
522
  omlish/marshal/registries.py,sha256=5YtvjYDw8Wu7uigCzlrVzC1pHajoNFZtN2dFNmKrbTI,2358
@@ -591,7 +593,7 @@ omlish/os/pidfiles/pinning.py,sha256=L1MZp7UiBg3uzeDgvt8ScWJHwuIHXZGhgl47hTiiMjY
591
593
  omlish/reflect/__init__.py,sha256=9pzXLXXNMHkLhhI79iUr-o0SMOtR6HMUmAEUplZkIdE,853
592
594
  omlish/reflect/inspect.py,sha256=WCo2YpBYauKw6k758FLlZ_H4Q05rgVPs96fEv9w6zHQ,1538
593
595
  omlish/reflect/ops.py,sha256=F77OTaw0Uw020cJCWX_Q4kL3wvxlJ8jV8wz7BctGL_k,2619
594
- omlish/reflect/subst.py,sha256=0bnbWPbSbabu47BVnZtCQAZFim4CNC6azEDCmJES32w,3696
596
+ omlish/reflect/subst.py,sha256=_lfNS2m2UiJgqARQtmGLTGo7CrSm9OMvVzt6GWOEX6M,4590
595
597
  omlish/reflect/types.py,sha256=uMcxUHVJWYYcmF9ODeJ9WfcQ0DejsqsEVIX5K0HjJSM,12018
596
598
  omlish/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
597
599
  omlish/secrets/all.py,sha256=gv_d9SfyMxso30HsrSz9XmIrSZOdl3rLA5MSH0ZXfgM,486
@@ -895,9 +897,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
895
897
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
896
898
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
897
899
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
898
- omlish-0.0.0.dev393.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
899
- omlish-0.0.0.dev393.dist-info/METADATA,sha256=siHQt0dS0bqBCCqnpqhdYepmt0xzBPGtMcJ3GNXPZAw,18825
900
- omlish-0.0.0.dev393.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
901
- omlish-0.0.0.dev393.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
902
- omlish-0.0.0.dev393.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
903
- omlish-0.0.0.dev393.dist-info/RECORD,,
900
+ omlish-0.0.0.dev395.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
901
+ omlish-0.0.0.dev395.dist-info/METADATA,sha256=ZqPTvTt208Mup_mKu_mh3_u3MV3tBDxdKuohtwmfK_o,18825
902
+ omlish-0.0.0.dev395.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
903
+ omlish-0.0.0.dev395.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
904
+ omlish-0.0.0.dev395.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
905
+ omlish-0.0.0.dev395.dist-info/RECORD,,
File without changes