omlish 0.0.0.dev382__py3-none-any.whl → 0.0.0.dev384__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.dev382'
2
- __revision__ = 'a0b130f7b364be52667bb3c7e3fd94132933b066'
1
+ __version__ = '0.0.0.dev384'
2
+ __revision__ = '13eb429134387bdc2ec6e494bd89553b650b23e3'
3
3
 
4
4
 
5
5
  #
@@ -22,6 +22,9 @@ class ProjectBase:
22
22
 
23
23
  'Operating System :: OS Independent',
24
24
  'Operating System :: POSIX',
25
+
26
+ 'Programming Language :: Python :: 3',
27
+ 'Programming Language :: Python :: 3.13',
25
28
  ]
26
29
 
27
30
 
omlish/inject/__init__.py CHANGED
@@ -4,6 +4,8 @@
4
4
  from .binder import ( # noqa
5
5
  bind,
6
6
  bind_as_fn,
7
+ bind_map_entry_const,
8
+ bind_set_entry_const,
7
9
  )
8
10
 
9
11
  from .bindings import ( # noqa
@@ -112,6 +114,10 @@ from .scopes import ( # noqa
112
114
  enter_seeded_scope,
113
115
  )
114
116
 
117
+ from .tags import ( # noqa
118
+ Id,
119
+ )
120
+
115
121
  from .types import ( # noqa
116
122
  Scope,
117
123
  Tag,
@@ -120,5 +126,4 @@ from .types import ( # noqa
120
126
 
121
127
  from .utils import ( # noqa
122
128
  ConstFn,
123
- Id,
124
129
  )
omlish/inject/binder.py CHANGED
@@ -11,8 +11,13 @@ from .bindings import Binding
11
11
  from .eagers import Eager
12
12
  from .elements import Element
13
13
  from .elements import Elements
14
+ from .elements import as_elements
14
15
  from .keys import Key
15
16
  from .keys import as_key
17
+ from .multis import MapBinding
18
+ from .multis import SetBinding
19
+ from .multis import is_map_multi_key
20
+ from .multis import is_set_multi_key
16
21
  from .privates import Expose
17
22
  from .providers import ConstProvider
18
23
  from .providers import CtorProvider
@@ -21,6 +26,7 @@ from .providers import LinkProvider
21
26
  from .providers import Provider
22
27
  from .scopes import SCOPE_ALIASES
23
28
  from .scopes import Singleton
29
+ from .tags import Id
24
30
  from .types import Scope
25
31
  from .types import Unscoped
26
32
 
@@ -180,3 +186,45 @@ def bind(
180
186
  return elements[0]
181
187
  else:
182
188
  return Elements(frozenset(elements))
189
+
190
+
191
+ ##
192
+
193
+
194
+ def bind_set_entry_const(
195
+ multi_key: ta.Any,
196
+ obj: ta.Any,
197
+ *,
198
+ tag: ta.Any | None = None,
199
+ ) -> Elements:
200
+ multi_key = as_key(multi_key)
201
+ check.arg(is_set_multi_key(multi_key))
202
+
203
+ if tag is None:
204
+ tag = Id(id(obj), tag=multi_key.tag)
205
+ obj_key: Key = Key(type(obj), tag=tag)
206
+
207
+ return as_elements(
208
+ bind(obj_key, to_const=obj),
209
+ SetBinding(multi_key, obj_key),
210
+ )
211
+
212
+
213
+ def bind_map_entry_const(
214
+ multi_key: ta.Any,
215
+ map_key: ta.Any,
216
+ obj: ta.Any,
217
+ *,
218
+ tag: ta.Any | None = None,
219
+ ) -> Elements:
220
+ multi_key = as_key(multi_key)
221
+ check.arg(is_map_multi_key(multi_key))
222
+
223
+ if tag is None:
224
+ tag = Id(id(obj), tag=multi_key.tag)
225
+ obj_key: Key = Key(type(obj), tag=tag)
226
+
227
+ return as_elements(
228
+ bind(obj_key, to_const=obj),
229
+ MapBinding(multi_key, map_key, obj_key),
230
+ )
omlish/inject/keys.py CHANGED
@@ -14,7 +14,7 @@ T = ta.TypeVar('T')
14
14
 
15
15
 
16
16
  @dc.dataclass(frozen=True)
17
- @dc.extra_class_params(cache_hash=True)
17
+ @dc.extra_class_params(cache_hash=True, terse_repr=True)
18
18
  class Key(lang.Final, ta.Generic[T]):
19
19
  ty: rfl.Type = dc.xfield(coerce=rfl.type_)
20
20
 
omlish/inject/multis.py CHANGED
@@ -25,34 +25,34 @@ V = ta.TypeVar('V')
25
25
  ##
26
26
 
27
27
 
28
- def _check_set_multi_key(mk: Key) -> bool:
28
+ def is_set_multi_key(mk: Key) -> bool:
29
29
  return rfl.get_concrete_type(mk.ty) is collections.abc.Set
30
30
 
31
31
 
32
32
  @dc.dataclass(frozen=True)
33
33
  @dc.extra_class_params(cache_hash=True)
34
34
  class SetBinding(Element, lang.Final):
35
- multi_key: Key = dc.xfield(validate=_check_set_multi_key)
35
+ multi_key: Key = dc.xfield(validate=is_set_multi_key)
36
36
  dst: Key = dc.xfield(coerce=check.of_isinstance(Key))
37
37
 
38
38
 
39
39
  @dc.dataclass(frozen=True)
40
40
  @dc.extra_class_params(cache_hash=True)
41
41
  class SetProvider(Provider):
42
- multi_key: Key = dc.xfield(validate=_check_set_multi_key)
42
+ multi_key: Key = dc.xfield(validate=is_set_multi_key)
43
43
 
44
44
 
45
- ##
45
+ #
46
46
 
47
47
 
48
- def _check_map_multi_key(mk: Key) -> bool:
48
+ def is_map_multi_key(mk: Key) -> bool:
49
49
  return rfl.get_concrete_type(mk.ty) is collections.abc.Mapping
50
50
 
51
51
 
52
52
  @dc.dataclass(frozen=True)
53
53
  @dc.extra_class_params(cache_hash=True)
54
54
  class MapBinding(Element, lang.Final):
55
- multi_key: Key = dc.xfield(validate=_check_map_multi_key)
55
+ multi_key: Key = dc.xfield(validate=is_map_multi_key)
56
56
  map_key: ta.Any = dc.xfield()
57
57
  dst: Key = dc.xfield(coerce=check.of_isinstance(Key))
58
58
 
@@ -60,7 +60,7 @@ class MapBinding(Element, lang.Final):
60
60
  @dc.dataclass(frozen=True)
61
61
  @dc.extra_class_params(cache_hash=True)
62
62
  class MapProvider(Provider):
63
- multi_key: Key = dc.xfield(validate=_check_map_multi_key)
63
+ multi_key: Key = dc.xfield(validate=is_map_multi_key)
64
64
 
65
65
 
66
66
  ##
@@ -94,6 +94,9 @@ class SetBinder(ElementGenerator, ta.Generic[T]):
94
94
  yield from self._sbs
95
95
 
96
96
 
97
+ #
98
+
99
+
97
100
  class MapBinder(ElementGenerator, ta.Generic[K, V]):
98
101
  def __init__(self, *, tag: ta.Any = None) -> None:
99
102
  super().__init__()
omlish/inject/tags.py ADDED
@@ -0,0 +1,22 @@
1
+ import typing as ta
2
+
3
+ from .. import dataclasses as dc
4
+ from .types import Tag
5
+
6
+
7
+ ##
8
+
9
+
10
+ @dc.dataclass(frozen=True)
11
+ @dc.extra_class_params(cache_hash=True, terse_repr=True)
12
+ class Id:
13
+ """A utility dataclass intended to be used as a key tag for disambiguation."""
14
+
15
+ v: int
16
+
17
+ tag: ta.Any = dc.xfield(
18
+ default=None,
19
+ kw_only=True,
20
+ validate=lambda o: not isinstance(o, Tag),
21
+ repr_fn=dc.opt_repr,
22
+ )
omlish/inject/utils.py CHANGED
@@ -19,14 +19,3 @@ class ConstFn(HasOriginsImpl, lang.Final, ta.Generic[T]):
19
19
 
20
20
  def __call__(self) -> T:
21
21
  return self.v
22
-
23
-
24
- ##
25
-
26
-
27
- @dc.dataclass(frozen=True)
28
- @dc.extra_class_params(terse_repr=True)
29
- class Id:
30
- """A utility dataclass intended to be used as a key tag for disambiguation."""
31
-
32
- v: int
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev382
3
+ Version: 0.0.0.dev384
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -9,6 +9,8 @@ Classifier: Development Status :: 2 - Pre-Alpha
9
9
  Classifier: Intended Audience :: Developers
10
10
  Classifier: Operating System :: OS Independent
11
11
  Classifier: Operating System :: POSIX
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.13
12
14
  Requires-Python: >=3.13
13
15
  Description-Content-Type: text/markdown
14
16
  License-File: LICENSE
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=aT8yZ-Zh-9wfHl5Ym5ouiWC1i0cy7Q7RlhzavB6VLPI,8587
2
- omlish/__about__.py,sha256=lkQADEaVOdLymPabc9nqxBnnoUh2IftMJDVmxDHhHiU,3445
2
+ omlish/__about__.py,sha256=YCcIz5KJ2sBcOE5C5j7gQV_BFCDb-uuGb0eoIWjBUc0,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
@@ -355,25 +355,26 @@ omlish/http/coro/server/fdio.py,sha256=qZE4g5y4XESsTObSKyVggI-yzig57gSGJb4Z0rcHv
355
355
  omlish/http/coro/server/server.py,sha256=5gvueSCUzqBqQRf0GJ6wGroD9DiWxQNi6N17MlEtBLU,18660
356
356
  omlish/http/coro/server/simple.py,sha256=j1RZ3niKrgGM2qFnjdYWn_eniZzay5j49Ca4L3u8vO4,3296
357
357
  omlish/http/coro/server/sockets.py,sha256=24gU6wpIZuzYWKQD8UsHyYfTZlbcUFvkqXq5KVgWpQo,2261
358
- omlish/inject/__init__.py,sha256=pY-A8Q4v08-Xa4a-XdZ3lSFC3OwCO2T9HhesB67Q4tQ,1895
359
- omlish/inject/binder.py,sha256=3-6KMOcSgFE5bvthy3YUrRzCX5w7YSGmdJ3Tv2yXZGw,4022
358
+ omlish/inject/__init__.py,sha256=Ou6_wAovmxOpbdhGKsV8GbYRH0_S_h0XQSBDPeYpP0g,1978
359
+ omlish/inject/binder.py,sha256=woOK7I5fk4K4kDF684Ia003jE_lviGQXacNKAmXqx5M,5114
360
360
  omlish/inject/bindings.py,sha256=PlvOnUREjvc6F8nOJdzl1k9SAf80icRB4qWFqDop87M,536
361
361
  omlish/inject/eagers.py,sha256=JBY7PcjXt-Rg9scQ1ol9xpcoTLXkXC_Ie9uwTWdzUkA,340
362
362
  omlish/inject/elements.py,sha256=y4luEO_-eOlVnLcUDiNGSyMXee4pusl46ZGr0JFhbcY,1405
363
363
  omlish/inject/errors.py,sha256=_wkN2tF55gQzmMOMKJC_9jYHBZzaBiCDcyqI9Sf2UZs,626
364
364
  omlish/inject/injector.py,sha256=fyvaRoJXo_oibx1_IiGkncP9oXnZSKtDm7-ULNKRXHE,1071
365
365
  omlish/inject/inspect.py,sha256=Uq4KMloGWF_YS2mgZbrx-JXhZQnYHHKJSr68i9yoBVc,597
366
- omlish/inject/keys.py,sha256=bkpaE_hXFZ1pX8xPU_Km4jPJh8rkk07fs5aA_8bpC5M,665
366
+ omlish/inject/keys.py,sha256=7jnI2cw7cvLlzZAfe5SC50O3oPOpOB6iGZGTigyfQvs,682
367
367
  omlish/inject/listeners.py,sha256=wyPsAJsl45fZHmrFwsVBxaCiT7r_Riw1I8Eowwg5NHE,592
368
368
  omlish/inject/managed.py,sha256=-9aBm1vRPOjNz4kgOmpt8S2T55s727t9RiggFBH8maU,2096
369
- omlish/inject/multis.py,sha256=JzHTBr9LTy7hRTSax9GOo0Lxw7fk401uRgeHm8Mv4d8,3357
369
+ omlish/inject/multis.py,sha256=Dn63jE8P5ahSKc1IDBdzzx6ByBCgVOth5t4frG9m4UA,3336
370
370
  omlish/inject/origins.py,sha256=-qXa18rIIkNwBdTrvASRDjgPYnoY6n6OPC222jJDrXg,551
371
371
  omlish/inject/overrides.py,sha256=ybEcq9cDf6kvqu5mqnwi6Evj0MFjKNeE3r0oUlGw5E4,546
372
372
  omlish/inject/privates.py,sha256=CyE-hvQ-F_uyCzcwfdiYVtfm9IF1WZvMDOYilFyZmWk,658
373
373
  omlish/inject/providers.py,sha256=GDjSEN6iLsc-Tdu_OCPvFHWu4yP0Vn0pAyH_xjw1DPg,783
374
374
  omlish/inject/scopes.py,sha256=MqGus6vCogQVRJlZUnoXFwEeHuGMSYv2NF23_OFxWHE,1995
375
+ omlish/inject/tags.py,sha256=gRDLa-WdZc9DC7KwwmoIPAi8g_qdGpRWuMT7HCd7CL0,433
375
376
  omlish/inject/types.py,sha256=Z-ZEdgtCpHBNrbxxKaMVvfeD7hYXdL4rC7A9_VGxZ6g,256
376
- omlish/inject/utils.py,sha256=5Xm6LEelY7QujhMK7oD5vqEtY7Ymg_oG1Y-ZdEGD3bc,592
377
+ omlish/inject/utils.py,sha256=Gc2qq45KgkyqDt03WSvOEZBCiuqQ6ESwplx5ZRBcY5M,413
377
378
  omlish/inject/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
378
379
  omlish/inject/impl/bindings.py,sha256=xSvUcoDz8NH-aNHPwBPEZsFg73K2WcF_A63npVbGt_k,420
379
380
  omlish/inject/impl/elements.py,sha256=PM_055moROskSTQqmohEa6I0tt1OQ-VRNArXCMG6vyk,5947
@@ -890,9 +891,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
890
891
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
891
892
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
892
893
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
893
- omlish-0.0.0.dev382.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
894
- omlish-0.0.0.dev382.dist-info/METADATA,sha256=yCksZcosieu0N1Nq0ANs_GGJn0Dekpz4CsWFPh117As,18726
895
- omlish-0.0.0.dev382.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
896
- omlish-0.0.0.dev382.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
897
- omlish-0.0.0.dev382.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
898
- omlish-0.0.0.dev382.dist-info/RECORD,,
894
+ omlish-0.0.0.dev384.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
895
+ omlish-0.0.0.dev384.dist-info/METADATA,sha256=PhVWxPb5TWMJN2-RnlTcRyIb2zPG8BQIz4F01yyIiqI,18825
896
+ omlish-0.0.0.dev384.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
897
+ omlish-0.0.0.dev384.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
898
+ omlish-0.0.0.dev384.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
899
+ omlish-0.0.0.dev384.dist-info/RECORD,,