omlish 0.0.0.dev124__py3-none-any.whl → 0.0.0.dev125__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.dev124'
2
- __revision__ = '25f7c36b35a9ecdd1e39499b47d408e602d102bb'
1
+ __version__ = '0.0.0.dev125'
2
+ __revision__ = 'ab4e58c3eaba25f0520ed6cb0df32e2322ca439a'
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.dev125
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=SWJwc0o-cpX9D5wFq4rc6fXlMlp5cEH0HzGp0bzSaz0,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.dev125.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
486
+ omlish-0.0.0.dev125.dist-info/METADATA,sha256=900XEjgqBIT7HPfW6FoBSJ_fVfktmmDf_y922Ooem4A,4173
487
+ omlish-0.0.0.dev125.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
488
+ omlish-0.0.0.dev125.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
489
+ omlish-0.0.0.dev125.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
490
+ omlish-0.0.0.dev125.dist-info/RECORD,,