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 +2 -2
- omlish/inject/impl/inspect.py +4 -2
- omlish/lang/__init__.py +3 -0
- omlish/lang/typing.py +8 -0
- omlish/lite/inject.py +134 -79
- omlish/lite/typing.py +13 -0
- {omlish-0.0.0.dev124.dist-info → omlish-0.0.0.dev125.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev124.dist-info → omlish-0.0.0.dev125.dist-info}/RECORD +12 -11
- {omlish-0.0.0.dev124.dist-info → omlish-0.0.0.dev125.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev124.dist-info → omlish-0.0.0.dev125.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev124.dist-info → omlish-0.0.0.dev125.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev124.dist-info → omlish-0.0.0.dev125.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
omlish/inject/impl/inspect.py
CHANGED
@@ -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
|
39
|
+
return get()
|
38
40
|
except KeyError:
|
39
41
|
pass
|
40
|
-
sig =
|
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
|
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
|
-
|
163
|
+
cls_: type
|
156
164
|
|
157
165
|
def __post_init__(self) -> None:
|
158
|
-
check_isinstance(self.
|
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.
|
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
|
-
|
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
|
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
|
347
|
+
return _INJECTION_INSPECTION_CACHE[obj]
|
317
348
|
except TypeError:
|
318
|
-
return
|
349
|
+
return _do_injection_inspect(obj)
|
319
350
|
except KeyError:
|
320
351
|
pass
|
321
|
-
|
322
|
-
|
323
|
-
return
|
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
|
-
|
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(
|
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(
|
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
|
-
) ->
|
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
|
-
|
462
|
-
key_cls = check_valid_injector_key_cls(
|
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
|
-
#
|
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
|
-
|
569
|
-
|
570
|
-
|
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
|
-
) ->
|
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
|
-
#
|
689
|
+
# helpers
|
639
690
|
|
640
691
|
@classmethod
|
641
|
-
def
|
642
|
-
|
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,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=CxGnj-UiRPlZgmgWoovDWrOnqpSEmBy_kqA7cdfSA3w,1431
|
2
|
-
omlish/__about__.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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.
|
485
|
-
omlish-0.0.0.
|
486
|
-
omlish-0.0.0.
|
487
|
-
omlish-0.0.0.
|
488
|
-
omlish-0.0.0.
|
489
|
-
omlish-0.0.0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|