omlish 0.0.0.dev128__py3-none-any.whl → 0.0.0.dev129__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/lite/check.py +24 -0
- omlish/lite/inject.py +66 -13
- {omlish-0.0.0.dev128.dist-info → omlish-0.0.0.dev129.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev128.dist-info → omlish-0.0.0.dev129.dist-info}/RECORD +9 -9
- {omlish-0.0.0.dev128.dist-info → omlish-0.0.0.dev129.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev128.dist-info → omlish-0.0.0.dev129.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev128.dist-info → omlish-0.0.0.dev129.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev128.dist-info → omlish-0.0.0.dev129.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
omlish/lite/check.py
CHANGED
@@ -57,6 +57,30 @@ def check_not_equal(l: T, r: T) -> T:
|
|
57
57
|
return l
|
58
58
|
|
59
59
|
|
60
|
+
def check_is(l: T, r: T) -> T:
|
61
|
+
if l is not r:
|
62
|
+
raise ValueError(l, r)
|
63
|
+
return l
|
64
|
+
|
65
|
+
|
66
|
+
def check_is_not(l: T, r: ta.Any) -> T:
|
67
|
+
if l is r:
|
68
|
+
raise ValueError(l, r)
|
69
|
+
return l
|
70
|
+
|
71
|
+
|
72
|
+
def check_in(v: T, c: ta.Container[T]) -> T:
|
73
|
+
if v not in c:
|
74
|
+
raise ValueError(v, c)
|
75
|
+
return v
|
76
|
+
|
77
|
+
|
78
|
+
def check_not_in(v: T, c: ta.Container[T]) -> T:
|
79
|
+
if v in c:
|
80
|
+
raise ValueError(v, c)
|
81
|
+
return v
|
82
|
+
|
83
|
+
|
60
84
|
def check_single(vs: ta.Iterable[T]) -> T:
|
61
85
|
[v] = vs
|
62
86
|
return v
|
omlish/lite/inject.py
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# ruff: noqa: UP006 UP007
|
2
|
+
"""
|
3
|
+
TODO:
|
4
|
+
- recursion detection
|
5
|
+
- bind empty array
|
6
|
+
"""
|
2
7
|
import abc
|
8
|
+
import contextlib
|
3
9
|
import dataclasses as dc
|
4
10
|
import functools
|
5
11
|
import inspect
|
@@ -7,7 +13,9 @@ import types
|
|
7
13
|
import typing as ta
|
8
14
|
import weakref
|
9
15
|
|
16
|
+
from .check import check_in
|
10
17
|
from .check import check_isinstance
|
18
|
+
from .check import check_not_in
|
11
19
|
from .check import check_not_isinstance
|
12
20
|
from .check import check_not_none
|
13
21
|
from .maybes import Maybe
|
@@ -124,7 +132,7 @@ class InjectorError(Exception):
|
|
124
132
|
pass
|
125
133
|
|
126
134
|
|
127
|
-
@dc.dataclass(
|
135
|
+
@dc.dataclass()
|
128
136
|
class InjectorKeyError(InjectorError):
|
129
137
|
key: InjectorKey
|
130
138
|
|
@@ -132,16 +140,18 @@ class InjectorKeyError(InjectorError):
|
|
132
140
|
name: ta.Optional[str] = None
|
133
141
|
|
134
142
|
|
135
|
-
@dc.dataclass(frozen=True)
|
136
143
|
class UnboundInjectorKeyError(InjectorKeyError):
|
137
144
|
pass
|
138
145
|
|
139
146
|
|
140
|
-
@dc.dataclass(frozen=True)
|
141
147
|
class DuplicateInjectorKeyError(InjectorKeyError):
|
142
148
|
pass
|
143
149
|
|
144
150
|
|
151
|
+
class CyclicDependencyInjectorKeyError(InjectorKeyError):
|
152
|
+
pass
|
153
|
+
|
154
|
+
|
145
155
|
###
|
146
156
|
# keys
|
147
157
|
|
@@ -475,22 +485,65 @@ class _Injector(Injector):
|
|
475
485
|
if _INJECTOR_INJECTOR_KEY in self._pfm:
|
476
486
|
raise DuplicateInjectorKeyError(_INJECTOR_INJECTOR_KEY)
|
477
487
|
|
488
|
+
self.__cur_req: ta.Optional[_Injector._Request] = None
|
489
|
+
|
490
|
+
class _Request:
|
491
|
+
def __init__(self, injector: '_Injector') -> None:
|
492
|
+
super().__init__()
|
493
|
+
self._injector = injector
|
494
|
+
self._provisions: ta.Dict[InjectorKey, Maybe] = {}
|
495
|
+
self._seen_keys: ta.Set[InjectorKey] = set()
|
496
|
+
|
497
|
+
def handle_key(self, key: InjectorKey) -> Maybe[Maybe]:
|
498
|
+
try:
|
499
|
+
return Maybe.just(self._provisions[key])
|
500
|
+
except KeyError:
|
501
|
+
pass
|
502
|
+
if key in self._seen_keys:
|
503
|
+
raise CyclicDependencyInjectorKeyError(key)
|
504
|
+
self._seen_keys.add(key)
|
505
|
+
return Maybe.empty()
|
506
|
+
|
507
|
+
def handle_provision(self, key: InjectorKey, mv: Maybe) -> Maybe:
|
508
|
+
check_in(key, self._seen_keys)
|
509
|
+
check_not_in(key, self._provisions)
|
510
|
+
self._provisions[key] = mv
|
511
|
+
return mv
|
512
|
+
|
513
|
+
@contextlib.contextmanager
|
514
|
+
def _current_request(self) -> ta.Generator[_Request, None, None]:
|
515
|
+
if (cr := self.__cur_req) is not None:
|
516
|
+
yield cr
|
517
|
+
return
|
518
|
+
|
519
|
+
cr = self._Request(self)
|
520
|
+
try:
|
521
|
+
self.__cur_req = cr
|
522
|
+
yield cr
|
523
|
+
finally:
|
524
|
+
self.__cur_req = None
|
525
|
+
|
478
526
|
def try_provide(self, key: ta.Any) -> Maybe[ta.Any]:
|
479
527
|
key = as_injector_key(key)
|
480
528
|
|
481
|
-
|
482
|
-
|
529
|
+
cr: _Injector._Request
|
530
|
+
with self._current_request() as cr:
|
531
|
+
if (rv := cr.handle_key(key)).present:
|
532
|
+
return rv.must()
|
533
|
+
|
534
|
+
if key == _INJECTOR_INJECTOR_KEY:
|
535
|
+
return cr.handle_provision(key, Maybe.just(self))
|
483
536
|
|
484
|
-
|
485
|
-
|
486
|
-
|
537
|
+
fn = self._pfm.get(key)
|
538
|
+
if fn is not None:
|
539
|
+
return cr.handle_provision(key, Maybe.just(fn(self)))
|
487
540
|
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
541
|
+
if self._p is not None:
|
542
|
+
pv = self._p.try_provide(key)
|
543
|
+
if pv is not None:
|
544
|
+
return cr.handle_provision(key, Maybe.empty())
|
492
545
|
|
493
|
-
|
546
|
+
return cr.handle_provision(key, Maybe.empty())
|
494
547
|
|
495
548
|
def provide(self, key: ta.Any) -> ta.Any:
|
496
549
|
v = self.try_provide(key)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=CxGnj-UiRPlZgmgWoovDWrOnqpSEmBy_kqA7cdfSA3w,1431
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=I7cXPq7JaH6uExuC7ADYlMyuYjPdRhADj2biay0wUN8,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
|
@@ -300,10 +300,10 @@ omlish/lifecycles/states.py,sha256=zqMOU2ZU-MDNnWuwauM3_anIAiXM8LoBDElDEraptFg,1
|
|
300
300
|
omlish/lifecycles/transitions.py,sha256=qQtFby-h4VzbvgaUqT2NnbNumlcOx9FVVADP9t83xj4,1939
|
301
301
|
omlish/lite/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
302
302
|
omlish/lite/cached.py,sha256=Fs-ljXVJmHBjAaHc-JuJXMEV4MNSX5c_KHZIM3AEaIw,694
|
303
|
-
omlish/lite/check.py,sha256=
|
303
|
+
omlish/lite/check.py,sha256=VDCx-7OqtN7EBcAAHhlYoNyRdo8UMyUDu9K44shMkIo,1519
|
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=QXIEL920axG66kbt-fsLQDVy8kHcBT-2AHgc7qiCkKc,22108
|
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
|
@@ -482,9 +482,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
|
|
482
482
|
omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
|
483
483
|
omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
|
484
484
|
omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
|
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.
|
490
|
-
omlish-0.0.0.
|
485
|
+
omlish-0.0.0.dev129.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
486
|
+
omlish-0.0.0.dev129.dist-info/METADATA,sha256=lebYC_UeiQKZPCZWcsShqqR6HJUpAcDQ7U4Bk941WF8,4173
|
487
|
+
omlish-0.0.0.dev129.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
488
|
+
omlish-0.0.0.dev129.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
489
|
+
omlish-0.0.0.dev129.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
490
|
+
omlish-0.0.0.dev129.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|