omlish 0.0.0.dev274__py3-none-any.whl → 0.0.0.dev276__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.dev274'
2
- __revision__ = '198dbdd7a7fd13d7d9a6f0f3642a26adc79535ff'
1
+ __version__ = '0.0.0.dev276'
2
+ __revision__ = 'b59ea0791ca796acd261e3bd7d25125492a027e4'
3
3
 
4
4
 
5
5
  #
@@ -188,12 +188,25 @@ class AbstractDataclassFactory(lang.Abstract):
188
188
  ##
189
189
 
190
190
 
191
+ def _type_or_generic_base(rty: rfl.Type) -> type | None:
192
+ if isinstance(rty, rfl.Generic):
193
+ return rty.cls
194
+ elif isinstance(rty, type):
195
+ return rty
196
+ else:
197
+ return None
198
+
199
+
191
200
  class DataclassMarshalerFactory(AbstractDataclassFactory, SimpleMarshalerFactory):
192
201
  def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
193
- return isinstance(rty, type) and dc.is_dataclass(rty) and not lang.is_abstract_class(rty)
202
+ return (
203
+ (ty := _type_or_generic_base(rty)) is not None and
204
+ dc.is_dataclass(ty) and
205
+ not lang.is_abstract_class(ty)
206
+ )
194
207
 
195
208
  def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
196
- ty = check.isinstance(rty, type)
209
+ ty = check.isinstance(_type_or_generic_base(rty), type)
197
210
  check.state(dc.is_dataclass(ty))
198
211
  check.state(not lang.is_abstract_class(ty))
199
212
 
@@ -217,10 +230,14 @@ class DataclassMarshalerFactory(AbstractDataclassFactory, SimpleMarshalerFactory
217
230
 
218
231
  class DataclassUnmarshalerFactory(AbstractDataclassFactory, SimpleUnmarshalerFactory):
219
232
  def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
220
- return isinstance(rty, type) and dc.is_dataclass(rty) and not lang.is_abstract_class(rty)
233
+ return (
234
+ (ty := _type_or_generic_base(rty)) is not None and
235
+ dc.is_dataclass(ty) and
236
+ not lang.is_abstract_class(ty)
237
+ )
221
238
 
222
239
  def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
223
- ty = check.isinstance(rty, type)
240
+ ty = check.isinstance(_type_or_generic_base(rty), type)
224
241
  check.state(dc.is_dataclass(ty))
225
242
  check.state(not lang.is_abstract_class(ty))
226
243
 
@@ -40,6 +40,7 @@ from .types import ( # noqa
40
40
  get_orig_bases,
41
41
  get_orig_class,
42
42
  get_params,
43
+ get_type_var_bound,
43
44
  is_type,
44
45
  is_union_type,
45
46
  type_,
omlish/reflect/types.py CHANGED
@@ -115,6 +115,10 @@ def get_newtype_supertype(obj: ta.Any) -> ta.Any:
115
115
  return obj.__supertype__
116
116
 
117
117
 
118
+ def get_type_var_bound(obj: ta.Any) -> ta.Any:
119
+ return obj.__bound__
120
+
121
+
118
122
  ##
119
123
 
120
124
 
@@ -29,8 +29,10 @@ class TypedValues(
29
29
  ta.Generic[TypedValueT],
30
30
  ):
31
31
  def __init__(self, *tvs: TypedValueT, override: bool = False) -> None:
32
- if hasattr(self, '_lst'):
32
+ if hasattr(self, '_tup'):
33
33
  # When __new__ returns the empty singleton __init__ will still be called.
34
+ if self is not self._EMPTY:
35
+ raise RuntimeError
34
36
  return
35
37
 
36
38
  super().__init__()
@@ -69,10 +71,11 @@ class TypedValues(
69
71
  lst.append(tv)
70
72
  dct.setdefault(type(tv), []).append(tv)
71
73
 
72
- self._lst = lst
73
- self._dct = dct
74
-
75
- self._any_dct: dict[type, ta.Sequence[ta.Any]] = {}
74
+ self._tup: tuple[TypedValueT, ...] = tuple(lst)
75
+ self._dct: dict[type[TypedValueT], TypedValueT | tuple[TypedValueT, ...]] = {
76
+ k: tuple(v) if isinstance(v, list) else v
77
+ for k, v in dct.items()
78
+ }
76
79
 
77
80
  #
78
81
 
@@ -92,30 +95,69 @@ class TypedValues(
92
95
 
93
96
  #
94
97
 
95
- def with_(self, *tvs, override: bool = False) -> 'TypedValues':
96
- return TypedValues(*self._lst, *tvs, override=override)
97
-
98
98
  def without(self, *tys: type) -> ta.Iterator[TypedValueT]:
99
- for o in self._lst:
99
+ for o in self._tup:
100
100
  if isinstance(o, tys):
101
101
  continue
102
102
  yield o
103
103
 
104
104
  #
105
105
 
106
+ def update(self, *tvs, override: bool = False) -> 'TypedValues':
107
+ return TypedValues(*self._tup, *tvs, override=override)
108
+
109
+ def discard(self, *tys: type) -> 'TypedValues':
110
+ return TypedValues(*self.without(*tys))
111
+
112
+ #
113
+
106
114
  def __repr__(self) -> str:
107
- return f'{self.__class__.__name__}({", ".join(map(repr, self._lst))})'
115
+ return f'{self.__class__.__name__}({", ".join(map(repr, self._tup))})'
116
+
117
+ #
118
+
119
+ _set: frozenset[TypedValueT]
120
+
121
+ def to_set(self) -> frozenset[TypedValueT]:
122
+ try:
123
+ return self._set
124
+ except AttributeError:
125
+ pass
126
+ s = frozenset(self._tup)
127
+ self._set = s
128
+ return s
129
+
130
+ #
131
+
132
+ _hash: int
133
+
134
+ def __hash__(self) -> int:
135
+ try:
136
+ return self._hash
137
+ except AttributeError:
138
+ pass
139
+ h = hash(self._tup)
140
+ self._hash = h
141
+ return h
142
+
143
+ def __eq__(self, other):
144
+ if not isinstance(other, type(self)):
145
+ return NotImplemented
146
+ return (
147
+ other is self or
148
+ other._tup == self._tup
149
+ )
108
150
 
109
151
  #
110
152
 
111
153
  def __iter__(self) -> ta.Iterator[TypedValueT]:
112
- return iter(self._lst)
154
+ return iter(self._tup)
113
155
 
114
156
  def __len__(self) -> int:
115
- return len(self._lst)
157
+ return len(self._tup)
116
158
 
117
159
  def __bool__(self) -> bool:
118
- return bool(self._lst)
160
+ return bool(self._tup)
119
161
 
120
162
  #
121
163
 
@@ -124,7 +166,7 @@ class TypedValues(
124
166
 
125
167
  def _typed_value_getitem(self, key):
126
168
  if isinstance(key, int):
127
- return self._lst[key]
169
+ return self._tup[key]
128
170
  elif isinstance(key, type):
129
171
  return self._dct[check.issubclass(key, TypedValue)]
130
172
  else:
@@ -138,17 +180,24 @@ class TypedValues(
138
180
  if issubclass(key, UniqueTypedValue):
139
181
  return default
140
182
  elif default is not None:
141
- return list(default)
183
+ return tuple(default)
142
184
  else:
143
- return []
185
+ return ()
186
+
187
+ _any_dct: dict[type, tuple[TypedValueT, ...]]
144
188
 
145
189
  def _typed_value_get_any(self, cls):
146
190
  try:
147
- return self._any_dct[cls]
191
+ any_dct = self._any_dct
192
+ except AttributeError:
193
+ any_dct = {}
194
+ self._any_dct = any_dct
195
+ try:
196
+ return any_dct[cls]
148
197
  except KeyError:
149
198
  pass
150
- ret = [tv for tv in self if isinstance(tv, cls)]
151
- self._any_dct[cls] = ret
199
+ ret = tuple(tv for tv in self if isinstance(tv, cls))
200
+ any_dct[cls] = ret
152
201
  return ret
153
202
 
154
203
 
@@ -1,3 +1,5 @@
1
+ import typing as ta
2
+
1
3
  from omlish import check
2
4
  from omlish import dataclasses as dc
3
5
  from omlish import lang
@@ -93,6 +95,8 @@ def _build_typed_values_impls(rty: rfl.Type) -> msh.Impls:
93
95
 
94
96
  if isinstance(cur, rfl.Union):
95
97
  todo.extend(cur.args)
98
+ elif isinstance(cur, ta.TypeVar):
99
+ todo.append(rfl.get_type_var_bound(cur))
96
100
  else:
97
101
  opt_cls_set.add(check.issubclass(check.isinstance(cur, type), TypedValue))
98
102
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev274
3
+ Version: 0.0.0.dev276
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=pjGUyLHaoWpPqRP3jz2u1fC1qoRc2lvrEcpU_Ax2tdg,8253
2
- omlish/__about__.py,sha256=uaTsfptyouZtf01Rjtt8vRjFEZA-hjAx0C1JaK4Uxns,3380
2
+ omlish/__about__.py,sha256=FoTicGOCebKQ5tQVQjrcXhtN_4ZJBQMrDN3RO12ykvQ,3380
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
@@ -514,7 +514,7 @@ omlish/marshal/composite/newtypes.py,sha256=5-te247TiPYf84oFhf59tqIOOByXj8i9KaHT
514
514
  omlish/marshal/composite/optionals.py,sha256=MnecrmrJYjQvYJipIHNCDq78oH09dOjnw5pvaMKqoeU,1537
515
515
  omlish/marshal/composite/wrapped.py,sha256=jOsn3h1vLIqcoSTB-0KObnsdbV8jSVWJYbf7Kg9AUwg,750
516
516
  omlish/marshal/objects/__init__.py,sha256=F4wej8L_tedC8ETYxAnmKfdPR9TjsqIus9Z3nZofYuc,182
517
- omlish/marshal/objects/dataclasses.py,sha256=zs0yE0gi3tKHLiZGPf8FEMhPOc505vnHMjpp92MOX5k,8658
517
+ omlish/marshal/objects/dataclasses.py,sha256=NcjXrZI8y7THULwUH75LQFVHAyP_-EBBzUi9cbhyPZ0,9046
518
518
  omlish/marshal/objects/helpers.py,sha256=85GZp4h3Yo0GYGmnZpKgNxkWnSk8h2R21nfDLU2DtM0,1110
519
519
  omlish/marshal/objects/marshal.py,sha256=JarKGecMgaFYSUHUj-ZUYVP9HK6u2rjpBb3DWX9Uhh0,2648
520
520
  omlish/marshal/objects/metadata.py,sha256=2_rESnslP5fwtEW1xy9ECJg64uA4cQBuYcGkRfPElts,3342
@@ -567,11 +567,11 @@ omlish/os/pidfiles/cli.py,sha256=2SSsP4O3VdpsDIMAkWgWSjh_YNIPzCD9l5LNN2qrIjo,207
567
567
  omlish/os/pidfiles/manager.py,sha256=QphQxIENVVwvBWynLCNU31NwOfLkV43VoTVeYFn2Hac,2351
568
568
  omlish/os/pidfiles/pidfile.py,sha256=9tI5IMVwfPfnni0XMn4x5ptNQgm36n8tLeUNPf50UqU,4394
569
569
  omlish/os/pidfiles/pinning.py,sha256=v9RlJ4BnJZcaZZXiiRqbmzLluaSOkeeEb_WrbKEClBQ,6643
570
- omlish/reflect/__init__.py,sha256=Er2yBHibVO16hFNA1szQF2_f43Y3HRCBWtS-fjsOIYc,798
570
+ omlish/reflect/__init__.py,sha256=64eHbD6zL6Fhp7FfXb8n9ZHywlODjBN3rm1LMvZ081A,822
571
571
  omlish/reflect/inspect.py,sha256=WCo2YpBYauKw6k758FLlZ_H4Q05rgVPs96fEv9w6zHQ,1538
572
572
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
573
573
  omlish/reflect/subst.py,sha256=g3q7NmNWsmc67mcchmCE3WFPCMDSBq-FXn4ah-DWL_U,3622
574
- omlish/reflect/types.py,sha256=lYxK_hlC4kVDMKeDYJp0mymSth21quwuFAMAEFBznyE,9151
574
+ omlish/reflect/types.py,sha256=Cn9FYGoiCNt0FS0YLiTTAR12WKcesWMapCrVYcb8IDo,9225
575
575
  omlish/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
576
576
  omlish/secrets/all.py,sha256=SGB1KrlNrxlNpazEHYy95NTzteLi8ndoEgMhU7luBl8,420
577
577
  omlish/secrets/crypto.py,sha256=9D21lnvPhStwu8arD4ssT0ih0bDG-nlqIRdVgYL40xA,3708
@@ -778,14 +778,14 @@ omlish/text/go/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
778
778
  omlish/text/go/quoting.py,sha256=N9EYdnFdEX_A8fOviH-1w4jwV3XOQ7VU2WsoUNubYVY,9137
779
779
  omlish/typedvalues/__init__.py,sha256=YalNleXS2vQX_3dOIMwfb4n_uBkENTT4QXHnsHatGGM,496
780
780
  omlish/typedvalues/accessor.py,sha256=0k21N-CkjGaY6zCwugsRfOC_CDkqk7wNz4oxO1_6EEA,2919
781
- omlish/typedvalues/collection.py,sha256=lv0xO_ZDApg0v5FZCdeVDBiUf60YEaXRBDbRrjBwZSY,4129
781
+ omlish/typedvalues/collection.py,sha256=jsXSggmMMvGATcJgQkUXt5Guwq8aquw73_OIC-e6U0I,5300
782
782
  omlish/typedvalues/generic.py,sha256=byWG_gMXhNelckUwdmOoJE9FKkL71Q4BSi4ZLyy0XZ0,788
783
783
  omlish/typedvalues/holder.py,sha256=4SwRezsmuDDEO5gENGx8kTm30pblF5UktoEAu02i-Gk,1554
784
- omlish/typedvalues/marshal.py,sha256=BuFQMoaLSDbEm32nj_hkBSClPvC0euNFU7_EhsrfBck,4487
784
+ omlish/typedvalues/marshal.py,sha256=H1gQuFHHgFR5qTs0lM7VXK41BivSbOXC9I2XUpo5SXU,4603
785
785
  omlish/typedvalues/values.py,sha256=Acyf6xSdNHxrkRXLXrFqJouk35YOveso1VqTbyPwQW4,1223
786
- omlish-0.0.0.dev274.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
787
- omlish-0.0.0.dev274.dist-info/METADATA,sha256=IDyj3CVbK6H5psd69W58F70u__Va0Ix6doHB68Ja_q4,4198
788
- omlish-0.0.0.dev274.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
789
- omlish-0.0.0.dev274.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
790
- omlish-0.0.0.dev274.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
791
- omlish-0.0.0.dev274.dist-info/RECORD,,
786
+ omlish-0.0.0.dev276.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
787
+ omlish-0.0.0.dev276.dist-info/METADATA,sha256=_xEeojOHXbc_azzKB0NydBuLd1aMhKO1l65YCPUaqNE,4198
788
+ omlish-0.0.0.dev276.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
789
+ omlish-0.0.0.dev276.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
790
+ omlish-0.0.0.dev276.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
791
+ omlish-0.0.0.dev276.dist-info/RECORD,,