omlish 0.0.0.dev394__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.dev394'
2
- __revision__ = 'b3c8aa9fb0aa4cb4683cea8843b22615547cbf03'
1
+ __version__ = '0.0.0.dev395'
2
+ __revision__ = 'be0f7f8395fdc987e285187f15f515e157142da5'
3
3
 
4
4
 
5
5
  #
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
@@ -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
 
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/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.dev394
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=ko042tDygoOn3kM1lHN4zPIzbXv_lgAASIV2V4gSqDk,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
@@ -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
@@ -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
@@ -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
@@ -592,7 +593,7 @@ omlish/os/pidfiles/pinning.py,sha256=L1MZp7UiBg3uzeDgvt8ScWJHwuIHXZGhgl47hTiiMjY
592
593
  omlish/reflect/__init__.py,sha256=9pzXLXXNMHkLhhI79iUr-o0SMOtR6HMUmAEUplZkIdE,853
593
594
  omlish/reflect/inspect.py,sha256=WCo2YpBYauKw6k758FLlZ_H4Q05rgVPs96fEv9w6zHQ,1538
594
595
  omlish/reflect/ops.py,sha256=F77OTaw0Uw020cJCWX_Q4kL3wvxlJ8jV8wz7BctGL_k,2619
595
- omlish/reflect/subst.py,sha256=0bnbWPbSbabu47BVnZtCQAZFim4CNC6azEDCmJES32w,3696
596
+ omlish/reflect/subst.py,sha256=_lfNS2m2UiJgqARQtmGLTGo7CrSm9OMvVzt6GWOEX6M,4590
596
597
  omlish/reflect/types.py,sha256=uMcxUHVJWYYcmF9ODeJ9WfcQ0DejsqsEVIX5K0HjJSM,12018
597
598
  omlish/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
598
599
  omlish/secrets/all.py,sha256=gv_d9SfyMxso30HsrSz9XmIrSZOdl3rLA5MSH0ZXfgM,486
@@ -896,9 +897,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
896
897
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
897
898
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
898
899
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
899
- omlish-0.0.0.dev394.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
900
- omlish-0.0.0.dev394.dist-info/METADATA,sha256=-8kg1tH7Gm7abGeeTIeCo69covgUeUmIKxmo7RTaUsk,18825
901
- omlish-0.0.0.dev394.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
902
- omlish-0.0.0.dev394.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
903
- omlish-0.0.0.dev394.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
904
- omlish-0.0.0.dev394.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,,