omlish 0.0.0.dev124__py3-none-any.whl → 0.0.0.dev126__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev124'
2
- __revision__ = '25f7c36b35a9ecdd1e39499b47d408e602d102bb'
1
+ __version__ = '0.0.0.dev126'
2
+ __revision__ = '631da43a3ae4f71529271e291fc643834c85c462'
3
3
 
4
4
 
5
5
  #
@@ -31,13 +31,15 @@ _SIGNATURE_CACHE: ta.MutableMapping[ta.Any, inspect.Signature] = weakref.WeakKey
31
31
 
32
32
 
33
33
  def signature(obj: ta.Any) -> inspect.Signature:
34
+ def get() -> inspect.Signature:
35
+ return inspect.signature(obj, eval_str=True)
34
36
  try:
35
37
  return _SIGNATURE_CACHE[obj]
36
38
  except TypeError:
37
- return inspect.signature(obj)
39
+ return get()
38
40
  except KeyError:
39
41
  pass
40
- sig = inspect.signature(obj)
42
+ sig = get()
41
43
  _SIGNATURE_CACHE[obj] = sig
42
44
  return sig
43
45
 
omlish/lang/__init__.py CHANGED
@@ -1,3 +1,5 @@
1
+ # This module should import nothing but stdlib modules, and as few as possible. That *includes* lite - no using lite.
2
+
1
3
  from .cached import ( # noqa
2
4
  cached_function,
3
5
  cached_property,
@@ -217,6 +219,7 @@ from .timeouts import ( # noqa
217
219
  )
218
220
 
219
221
  from .typing import ( # noqa
222
+ AnyFunc,
220
223
  BytesLike,
221
224
  Func0,
222
225
  Func1,
omlish/lang/typing.py CHANGED
@@ -106,6 +106,14 @@ def typed_partial(obj, **kw): # noqa
106
106
  # A workaround for typing deficiencies (like `Argument 2 to NewType(...) must be subclassable`).
107
107
 
108
108
 
109
+ @dc.dataclass(frozen=True)
110
+ class AnyFunc(ta.Generic[T]):
111
+ fn: ta.Callable[..., T]
112
+
113
+ def __call__(self, *args: ta.Any, **kwargs: ta.Any) -> T:
114
+ return self.fn(*args, **kwargs)
115
+
116
+
109
117
  @dc.dataclass(frozen=True)
110
118
  class Func0(ta.Generic[T]):
111
119
  fn: ta.Callable[[], T]
omlish/lite/inject.py CHANGED
@@ -9,10 +9,12 @@ import weakref
9
9
 
10
10
  from .check import check_isinstance
11
11
  from .check import check_not_isinstance
12
+ from .check import check_not_none
12
13
  from .maybes import Maybe
13
14
  from .reflect import get_optional_alias_arg
14
15
  from .reflect import is_new_type
15
16
  from .reflect import is_optional_alias
17
+ from .typing import Func
16
18
 
17
19
 
18
20
  T = ta.TypeVar('T')
@@ -31,7 +33,13 @@ InjectorBindingOrBindings = ta.Union['InjectorBinding', 'InjectorBindings']
31
33
 
32
34
  @dc.dataclass(frozen=True)
33
35
  class InjectorKey(ta.Generic[T]):
34
- cls: InjectorKeyCls
36
+ # Before PEP-560 typing.Generic was a metaclass with a __new__ that takes a 'cls' arg, so instantiating a dataclass
37
+ # with kwargs (such as through dc.replace) causes `TypeError: __new__() got multiple values for argument 'cls'`.
38
+ # See:
39
+ # - https://github.com/python/cpython/commit/d911e40e788fb679723d78b6ea11cabf46caed5a
40
+ # - https://gist.github.com/wrmsr/4468b86efe9f373b6b114bfe85b98fd3
41
+ cls_: InjectorKeyCls
42
+
35
43
  tag: ta.Any = None
36
44
  array: bool = False
37
45
 
@@ -152,14 +160,14 @@ class FnInjectorProvider(InjectorProvider):
152
160
 
153
161
  @dc.dataclass(frozen=True)
154
162
  class CtorInjectorProvider(InjectorProvider):
155
- cls: type
163
+ cls_: type
156
164
 
157
165
  def __post_init__(self) -> None:
158
- check_isinstance(self.cls, type)
166
+ check_isinstance(self.cls_, type)
159
167
 
160
168
  def provider_fn(self) -> InjectorProviderFn:
161
169
  def pfn(i: Injector) -> ta.Any:
162
- return i.inject(self.cls)
170
+ return i.inject(self.cls_)
163
171
 
164
172
  return pfn
165
173
 
@@ -308,19 +316,42 @@ def build_injector_provider_map(bs: InjectorBindings) -> ta.Mapping[InjectorKey,
308
316
  # inspection
309
317
 
310
318
 
311
- _INJECTION_SIGNATURE_CACHE: ta.MutableMapping[ta.Any, inspect.Signature] = weakref.WeakKeyDictionary()
319
+ # inspect.signature(eval_str=True) was added in 3.10 and we have to support 3.8, so we have to get_type_hints to eval
320
+ # str annotations *in addition to* getting the signature for parameter information.
321
+ class _InjectionInspection(ta.NamedTuple):
322
+ signature: inspect.Signature
323
+ type_hints: ta.Mapping[str, ta.Any]
324
+
325
+
326
+ _INJECTION_INSPECTION_CACHE: ta.MutableMapping[ta.Any, _InjectionInspection] = weakref.WeakKeyDictionary()
312
327
 
313
328
 
314
- def _injection_signature(obj: ta.Any) -> inspect.Signature:
329
+ def _do_injection_inspect(obj: ta.Any) -> _InjectionInspection:
330
+ uw = obj
331
+ while True:
332
+ if isinstance(uw, functools.partial):
333
+ uw = uw.func
334
+ else:
335
+ if (uw2 := inspect.unwrap(uw)) is uw:
336
+ break
337
+ uw = uw2
338
+
339
+ return _InjectionInspection(
340
+ inspect.signature(obj),
341
+ ta.get_type_hints(uw),
342
+ )
343
+
344
+
345
+ def _injection_inspect(obj: ta.Any) -> _InjectionInspection:
315
346
  try:
316
- return _INJECTION_SIGNATURE_CACHE[obj]
347
+ return _INJECTION_INSPECTION_CACHE[obj]
317
348
  except TypeError:
318
- return inspect.signature(obj)
349
+ return _do_injection_inspect(obj)
319
350
  except KeyError:
320
351
  pass
321
- sig = inspect.signature(obj)
322
- _INJECTION_SIGNATURE_CACHE[obj] = sig
323
- return sig
352
+ insp = _do_injection_inspect(obj)
353
+ _INJECTION_INSPECTION_CACHE[obj] = insp
354
+ return insp
324
355
 
325
356
 
326
357
  class InjectionKwarg(ta.NamedTuple):
@@ -341,20 +372,20 @@ def build_injection_kwargs_target(
341
372
  skip_kwargs: ta.Optional[ta.Iterable[ta.Any]] = None,
342
373
  raw_optional: bool = False,
343
374
  ) -> InjectionKwargsTarget:
344
- sig = _injection_signature(obj)
375
+ insp = _injection_inspect(obj)
345
376
 
346
377
  seen: ta.Set[InjectorKey] = set(map(as_injector_key, skip_kwargs)) if skip_kwargs is not None else set()
347
378
  kws: ta.List[InjectionKwarg] = []
348
- for p in list(sig.parameters.values())[skip_args:]:
379
+ for p in list(insp.signature.parameters.values())[skip_args:]:
349
380
  if p.annotation is inspect.Signature.empty:
350
381
  if p.default is not inspect.Parameter.empty:
351
382
  raise KeyError(f'{obj}, {p.name}')
352
383
  continue
353
384
 
354
385
  if p.kind not in (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY):
355
- raise TypeError(sig)
386
+ raise TypeError(insp)
356
387
 
357
- ann = p.annotation
388
+ ann = insp.type_hints.get(p.name, p.annotation)
358
389
  if (
359
390
  not raw_optional and
360
391
  is_optional_alias(ann)
@@ -379,6 +410,66 @@ def build_injection_kwargs_target(
379
410
  )
380
411
 
381
412
 
413
+ ###
414
+ # injector
415
+
416
+
417
+ _INJECTOR_INJECTOR_KEY: InjectorKey[Injector] = InjectorKey(Injector)
418
+
419
+
420
+ class _Injector(Injector):
421
+ def __init__(self, bs: InjectorBindings, p: ta.Optional[Injector] = None) -> None:
422
+ super().__init__()
423
+
424
+ self._bs = check_isinstance(bs, InjectorBindings)
425
+ self._p: ta.Optional[Injector] = check_isinstance(p, (Injector, type(None)))
426
+
427
+ self._pfm = {k: v.provider_fn() for k, v in build_injector_provider_map(bs).items()}
428
+
429
+ if _INJECTOR_INJECTOR_KEY in self._pfm:
430
+ raise DuplicateInjectorKeyError(_INJECTOR_INJECTOR_KEY)
431
+
432
+ def try_provide(self, key: ta.Any) -> Maybe[ta.Any]:
433
+ key = as_injector_key(key)
434
+
435
+ if key == _INJECTOR_INJECTOR_KEY:
436
+ return Maybe.just(self)
437
+
438
+ fn = self._pfm.get(key)
439
+ if fn is not None:
440
+ return Maybe.just(fn(self))
441
+
442
+ if self._p is not None:
443
+ pv = self._p.try_provide(key)
444
+ if pv is not None:
445
+ return Maybe.empty()
446
+
447
+ return Maybe.empty()
448
+
449
+ def provide(self, key: ta.Any) -> ta.Any:
450
+ v = self.try_provide(key)
451
+ if v.present:
452
+ return v.must()
453
+ raise UnboundInjectorKeyError(key)
454
+
455
+ def provide_kwargs(self, obj: ta.Any) -> ta.Mapping[str, ta.Any]:
456
+ kt = build_injection_kwargs_target(obj)
457
+ ret: ta.Dict[str, ta.Any] = {}
458
+ for kw in kt.kwargs:
459
+ if kw.has_default:
460
+ if not (mv := self.try_provide(kw.key)).present:
461
+ continue
462
+ v = mv.must()
463
+ else:
464
+ v = self.provide(kw.key)
465
+ ret[kw.name] = v
466
+ return ret
467
+
468
+ def inject(self, obj: ta.Any) -> ta.Any:
469
+ kws = self.provide_kwargs(obj)
470
+ return obj(**kws)
471
+
472
+
382
473
  ###
383
474
  # binder
384
475
 
@@ -428,7 +519,7 @@ class InjectorBinder:
428
519
  to_key: ta.Any = None,
429
520
 
430
521
  singleton: bool = False,
431
- ) -> InjectorBinding:
522
+ ) -> InjectorBindingOrBindings:
432
523
  if obj is None or obj is inspect.Parameter.empty:
433
524
  raise TypeError(obj)
434
525
  if isinstance(obj, cls._BANNED_BIND_TYPES):
@@ -458,8 +549,8 @@ class InjectorBinder:
458
549
  elif cls._is_fn(obj) and not has_to:
459
550
  to_fn = obj
460
551
  if key is None:
461
- sig = _injection_signature(obj)
462
- key_cls = check_valid_injector_key_cls(sig.return_annotation)
552
+ insp = _injection_inspect(obj)
553
+ key_cls: ta.Any = check_valid_injector_key_cls(check_not_none(insp.type_hints.get('return')))
463
554
  key = InjectorKey(key_cls)
464
555
  else:
465
556
  if to_const is not None:
@@ -511,67 +602,21 @@ class InjectorBinder:
511
602
 
512
603
 
513
604
  ###
514
- # injector
515
-
516
-
517
- _INJECTOR_INJECTOR_KEY: InjectorKey[Injector] = InjectorKey(Injector)
518
-
519
-
520
- class _Injector(Injector):
521
- def __init__(self, bs: InjectorBindings, p: ta.Optional[Injector] = None) -> None:
522
- super().__init__()
523
-
524
- self._bs = check_isinstance(bs, InjectorBindings)
525
- self._p: ta.Optional[Injector] = check_isinstance(p, (Injector, type(None)))
526
-
527
- self._pfm = {k: v.provider_fn() for k, v in build_injector_provider_map(bs).items()}
528
-
529
- if _INJECTOR_INJECTOR_KEY in self._pfm:
530
- raise DuplicateInjectorKeyError(_INJECTOR_INJECTOR_KEY)
531
-
532
- def try_provide(self, key: ta.Any) -> Maybe[ta.Any]:
533
- key = as_injector_key(key)
534
-
535
- if key == _INJECTOR_INJECTOR_KEY:
536
- return Maybe.just(self)
537
-
538
- fn = self._pfm.get(key)
539
- if fn is not None:
540
- return Maybe.just(fn(self))
541
-
542
- if self._p is not None:
543
- pv = self._p.try_provide(key)
544
- if pv is not None:
545
- return Maybe.empty()
546
-
547
- return Maybe.empty()
548
-
549
- def provide(self, key: ta.Any) -> ta.Any:
550
- v = self.try_provide(key)
551
- if v.present:
552
- return v.must()
553
- raise UnboundInjectorKeyError(key)
605
+ # injection helpers
554
606
 
555
- def provide_kwargs(self, obj: ta.Any) -> ta.Mapping[str, ta.Any]:
556
- kt = build_injection_kwargs_target(obj)
557
- ret: ta.Dict[str, ta.Any] = {}
558
- for kw in kt.kwargs:
559
- if kw.has_default:
560
- if not (mv := self.try_provide(kw.key)).present:
561
- continue
562
- v = mv.must()
563
- else:
564
- v = self.provide(kw.key)
565
- ret[kw.name] = v
566
- return ret
567
607
 
568
- def inject(self, obj: ta.Any) -> ta.Any:
569
- kws = self.provide_kwargs(obj)
570
- return obj(**kws)
608
+ def make_injector_factory(
609
+ factory_cls: ta.Any,
610
+ factory_fn: ta.Callable[..., T],
611
+ ) -> ta.Callable[..., Func[T]]:
612
+ def outer(injector: Injector) -> factory_cls:
613
+ def inner(*args, **kwargs):
614
+ return injector.inject(functools.partial(factory_fn, *args, **kwargs))
615
+ return Func(inner)
616
+ return outer
571
617
 
572
618
 
573
- ###
574
- # injection helpers
619
+ ##
575
620
 
576
621
 
577
622
  class Injection:
@@ -602,6 +647,12 @@ class Injection:
602
647
  def override(cls, p: InjectorBindings, *args: InjectorBindingOrBindings) -> InjectorBindings:
603
648
  return injector_override(p, *args)
604
649
 
650
+ # injector
651
+
652
+ @classmethod
653
+ def create_injector(cls, *args: InjectorBindingOrBindings, p: ta.Optional[Injector] = None) -> Injector:
654
+ return _Injector(as_injector_bindings(*args), p)
655
+
605
656
  # binder
606
657
 
607
658
  @classmethod
@@ -619,7 +670,7 @@ class Injection:
619
670
  to_key: ta.Any = None,
620
671
 
621
672
  singleton: bool = False,
622
- ) -> InjectorBinding:
673
+ ) -> InjectorBindingOrBindings:
623
674
  return InjectorBinder.bind(
624
675
  obj,
625
676
 
@@ -635,11 +686,15 @@ class Injection:
635
686
  singleton=singleton,
636
687
  )
637
688
 
638
- # injector
689
+ # helpers
639
690
 
640
691
  @classmethod
641
- def create_injector(cls, *args: InjectorBindingOrBindings, p: ta.Optional[Injector] = None) -> Injector:
642
- return _Injector(as_injector_bindings(*args), p)
692
+ def bind_factory(
693
+ cls,
694
+ factory_cls: ta.Any,
695
+ factory_fn: ta.Callable[..., T],
696
+ ) -> InjectorBindingOrBindings:
697
+ return cls.bind(make_injector_factory(factory_cls, factory_fn))
643
698
 
644
699
 
645
700
  inj = Injection
omlish/lite/typing.py ADDED
@@ -0,0 +1,13 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+
5
+ T = ta.TypeVar('T')
6
+
7
+
8
+ @dc.dataclass(frozen=True)
9
+ class Func(ta.Generic[T]):
10
+ fn: ta.Callable[..., T]
11
+
12
+ def __call__(self, *args: ta.Any, **kwargs: ta.Any) -> T:
13
+ return self.fn(*args, **kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev124
3
+ Version: 0.0.0.dev126
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=CxGnj-UiRPlZgmgWoovDWrOnqpSEmBy_kqA7cdfSA3w,1431
2
- omlish/__about__.py,sha256=lzuXTyWNvcNFWHc5W17fh6nJTZFrP0QnTUw3qCS3G3k,3379
2
+ omlish/__about__.py,sha256=zO48N_--bB6Un4-OfQz5_MvQF-ggb0OnlqmEkL-klKM,3379
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/argparse.py,sha256=cqKGAqcxuxv_s62z0gq29L9KAvg_3-_rFvXKjVpRJjo,8126
5
5
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
@@ -255,7 +255,7 @@ omlish/inject/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
255
255
  omlish/inject/impl/bindings.py,sha256=8H586RCgmvwq53XBL9WMbb-1-Tdw_hh9zxIDCwcHA1c,414
256
256
  omlish/inject/impl/elements.py,sha256=bJBbHce_eZyIua2wbcejMwd9Uv-QeYcQ-c5N1qOXSmU,5950
257
257
  omlish/inject/impl/injector.py,sha256=WxIVOF6zvipb44302_j-xQZt8vnNCY0gdLX6UWzslXI,7550
258
- omlish/inject/impl/inspect.py,sha256=qtHAOo7MvM7atWgxApYXZ0Dmw5zoP45ErPH3mnx9Kvk,2947
258
+ omlish/inject/impl/inspect.py,sha256=yZzqx2R9Ddn1EDJuwsu2r8APvJ42jGQP11ewtbIKD_s,3002
259
259
  omlish/inject/impl/multis.py,sha256=rRIWNCiTGaSWQUz_jxEy8LUmzdJDAlG94sLHYDS-ncg,2048
260
260
  omlish/inject/impl/origins.py,sha256=-cdcwz3BWb5LuC9Yn5ynYOwyPsKH06-kCc-3U0PxZ5w,1640
261
261
  omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCFQ,2613
@@ -266,7 +266,7 @@ omlish/io/__init__.py,sha256=aaIEsXTSfytW-oEkUWczdUJ_ifFY7ihIpyidIbfjkwY,56
266
266
  omlish/io/_abc.py,sha256=Cxs8KB1B_69rxpUYxI-MTsilAmNooJJn3w07DKqYKkE,1255
267
267
  omlish/io/pyio.py,sha256=YB3g6yg64MzcFwbzKBo4adnbsbZ3FZMlOZfjNtWmYoc,95316
268
268
  omlish/io/trampoline.py,sha256=oUKTQg1F5xQS1431Kt7MbK-NZpX509ubcXU-s86xJr8,7171
269
- omlish/lang/__init__.py,sha256=1BTfyRGPq8ahztMT3xP34EcN2zV3bInCqc1XrUygZh8,3704
269
+ omlish/lang/__init__.py,sha256=91OtPj-DbKKX1VI-gMlPMlNYWgkj227cgNBxL7Rp8R0,3836
270
270
  omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
271
271
  omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
272
272
  omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
@@ -284,7 +284,7 @@ omlish/lang/resources.py,sha256=yywDWhh0tsgw24l7mHYv49ll4oZS8Kc8MSCa8f4UbbI,2280
284
284
  omlish/lang/strings.py,sha256=BsciSYnckD4vGtC6kmtnugR9IN6CIHdcjO4nZu-pSAw,3898
285
285
  omlish/lang/sys.py,sha256=UoZz_PJYVKLQAKqYxxn-LHz1okK_38I__maZgnXMcxU,406
286
286
  omlish/lang/timeouts.py,sha256=vECdWYhc_IZgcal1Ng1Y42wf2FV3KAx-i8As-MgGHIQ,1186
287
- omlish/lang/typing.py,sha256=lJ2NGe4Pmb61I0Tx4A_rOqXNFTws1XHOzafg2knRUio,4155
287
+ omlish/lang/typing.py,sha256=W4PpjAbCDmNefVIc3kOAXPGvUTUHlSxuzGicqGUeKJY,4345
288
288
  omlish/lang/classes/__init__.py,sha256=D3dn4FOQu5f50kW4_jLCI_zI0fTtADdYumirRdIqSuU,605
289
289
  omlish/lang/classes/abstract.py,sha256=19jsUEJUSTkQkXnMvjGbokfq-Z4jXFOd_tT76jSu5I0,3362
290
290
  omlish/lang/classes/restrict.py,sha256=pSK7ZT_kpwqS6lWRrxwuEe-tt07F0-uZVazgGh-HDco,3921
@@ -303,7 +303,7 @@ omlish/lite/cached.py,sha256=Fs-ljXVJmHBjAaHc-JuJXMEV4MNSX5c_KHZIM3AEaIw,694
303
303
  omlish/lite/check.py,sha256=1mo1GK78Ro5-IC_jUrmNabmt--hz_9v1y5h28K2cqUY,1102
304
304
  omlish/lite/contextmanagers.py,sha256=_jfNdpYvxkbKwyjQLbK-o69W89GoEuUfl_NrCosE9lU,1308
305
305
  omlish/lite/docker.py,sha256=3IVZZtIm7-UdB2SwArmN_MosTva1_KifyYp3YWjODbE,337
306
- omlish/lite/inject.py,sha256=8n9WXPNNMKyoMciNM4txugOM6Vf7g1muVVlrCNUPd7c,15535
306
+ omlish/lite/inject.py,sha256=A1rAqiHXF7hhol_ggHnvINnDxKc1zZkh62Ufb1o9x9Y,17422
307
307
  omlish/lite/io.py,sha256=lcpI1cS_Kn90tvYMg8ZWkSlYloS4RFqXCk-rKyclhdg,3148
308
308
  omlish/lite/journald.py,sha256=f5Y2Q6-6O3iK_7MoGiwZwoQEOcP7LfkxxQNUR9tMjJM,3882
309
309
  omlish/lite/json.py,sha256=7-02Ny4fq-6YAu5ynvqoijhuYXWpLmfCI19GUeZnb1c,740
@@ -318,6 +318,7 @@ omlish/lite/socket.py,sha256=7OYgkXTcQv0wq7TQuLnl9y6dJA1ZT6Vbc1JH59QlxgY,1792
318
318
  omlish/lite/socketserver.py,sha256=Esy9dAo9dPnNavNx5hW52YZi5hv504a8XQUudMrPs2A,1595
319
319
  omlish/lite/strings.py,sha256=QURcE4-1pKVW8eT_5VCJpXaHDWR2dW2pYOChTJnZDiQ,1504
320
320
  omlish/lite/subprocesses.py,sha256=_YwUpvfaC2pV5TMC9-Ivuw1Ao-YxteD3a1NQwGERft4,3380
321
+ omlish/lite/typing.py,sha256=WNayHqzE2yrpxBTt1roQDKm45Prk5d1Bb2JDZZraKuQ,254
321
322
  omlish/lite/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
322
323
  omlish/lite/http/coroserver.py,sha256=aBaYjP80yQHQxPxwi7PTYHub-fdRDKsMnB-tM8lBc2o,18095
323
324
  omlish/lite/http/handlers.py,sha256=Yu0P3nqz-frklwCM2PbiWvoJNE-NqeTFLBvpNpqcdtA,753
@@ -481,9 +482,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
481
482
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
482
483
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
483
484
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
484
- omlish-0.0.0.dev124.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
485
- omlish-0.0.0.dev124.dist-info/METADATA,sha256=ITYL_pqOs8UQY2eQTJ5As1D6p6WTvyvzUxc5fygt-ZA,4173
486
- omlish-0.0.0.dev124.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
487
- omlish-0.0.0.dev124.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
488
- omlish-0.0.0.dev124.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
489
- omlish-0.0.0.dev124.dist-info/RECORD,,
485
+ omlish-0.0.0.dev126.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
486
+ omlish-0.0.0.dev126.dist-info/METADATA,sha256=FKuQ1AMbnI2zzwtuJgbcVRYa8BZSt8SpEcCW6SYdT1o,4173
487
+ omlish-0.0.0.dev126.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
488
+ omlish-0.0.0.dev126.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
489
+ omlish-0.0.0.dev126.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
490
+ omlish-0.0.0.dev126.dist-info/RECORD,,