omlish 0.0.0.dev327__py3-none-any.whl → 0.0.0.dev329__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.dev327'
2
- __revision__ = 'ce58b88c3e3c1e9bd7b09f89667cb4047b61684c'
1
+ __version__ = '0.0.0.dev329'
2
+ __revision__ = '7e2175a0f120aff13b483ddfb737fe5676cd9721'
3
3
 
4
4
 
5
5
  #
@@ -113,7 +113,7 @@ class Project(ProjectBase):
113
113
  ],
114
114
 
115
115
  'testing': [
116
- 'pytest ~= 8.3',
116
+ 'pytest ~= 8.4',
117
117
  ],
118
118
  }
119
119
 
@@ -59,7 +59,7 @@ from .hasheq import ( # noqa
59
59
  from .identity import ( # noqa
60
60
  IdentityKeyDict,
61
61
  IdentitySet,
62
- IdentityWrapper,
62
+ IdentityWeakKeyDictionary,
63
63
  IdentityWeakSet,
64
64
  )
65
65
 
@@ -13,29 +13,6 @@ V = ta.TypeVar('V')
13
13
  ##
14
14
 
15
15
 
16
- class IdentityWrapper(ta.Generic[T]):
17
- def __init__(self, value: T) -> None:
18
- super().__init__()
19
-
20
- self._value = value
21
-
22
- def __repr__(self) -> str:
23
- return lang.attr_repr(self, 'value')
24
-
25
- @property
26
- def value(self) -> T:
27
- return self._value
28
-
29
- def __eq__(self, other):
30
- return isinstance(other, IdentityWrapper) and other._value is self._value
31
-
32
- def __ne__(self, other):
33
- return not (self == other)
34
-
35
- def __hash__(self):
36
- return id(self._value)
37
-
38
-
39
16
  class IdentityKeyDict(ta.MutableMapping[K, V]):
40
17
  def __init__(self, *args, **kwargs) -> None:
41
18
  super().__init__()
@@ -115,31 +92,90 @@ class IdentitySet(ta.MutableSet[T]):
115
92
  return iter(self._dict.values())
116
93
 
117
94
 
95
+ ##
96
+
97
+
98
+ class IdentityWeakKeyDictionary(ta.MutableMapping[K, V]):
99
+ """
100
+ https://ideone.com/G4iIri
101
+ https://stackoverflow.com/questions/75314250/python-weakkeydictionary-for-unhashable-types#comment135919973_77100606
102
+
103
+ See also:
104
+ https://github.com/python-trio/trio/blob/efd785a20721707b52a6e2289a65e25722b30c96/src/trio/_core/_ki.py#L81
105
+ """
106
+
107
+ def __init__(self, *args: ta.Any, **kwargs: ta.Any) -> None:
108
+ super().__init__()
109
+
110
+ self._keys: ta.MutableMapping[IdentityWeakKeyDictionary._Id[K], K] = weakref.WeakValueDictionary()
111
+ self._values: ta.MutableMapping[IdentityWeakKeyDictionary._Id[K], V] = weakref.WeakKeyDictionary()
112
+
113
+ for k, v in lang.yield_dict_init(*args, **kwargs):
114
+ self[k] = v
115
+
116
+ def __len__(self) -> int:
117
+ return len(self._keys)
118
+
119
+ def __iter__(self) -> ta.Iterator[K]:
120
+ return iter(self._keys.values())
121
+
122
+ class _Id(ta.Generic[T]):
123
+ def __init__(self, key: T) -> None:
124
+ super().__init__()
125
+
126
+ self._id = id(key)
127
+ self._key_ref = weakref.ref(key)
128
+
129
+ def __repr__(self) -> str:
130
+ return f'{self.__class__.__name__}<id={self._id}>'
131
+
132
+ def __hash__(self) -> int:
133
+ return self._id
134
+
135
+ def __eq__(self, other: object) -> bool:
136
+ return (
137
+ type(other) is type(self) and
138
+ self._id == other._id and # type: ignore # noqa
139
+ self._key_ref() is other._key_ref() # type: ignore # noqa
140
+ )
141
+
142
+ def __ne__(self, other: object) -> bool:
143
+ return not (self == other)
144
+
145
+ def __getitem__(self, key: K) -> V:
146
+ return self._values.__getitem__(self._Id(key))
147
+
148
+ def __setitem__(self, key: K, value: V) -> None:
149
+ id_obj = self._Id(key)
150
+ self._keys.__setitem__(id_obj, key)
151
+ self._values.__setitem__(id_obj, value)
152
+
153
+ def __delitem__(self, key: K) -> None:
154
+ self._values.__delitem__(self._Id(key))
155
+ self._keys.__delitem__(self._Id(key))
156
+
157
+
118
158
  class IdentityWeakSet(ta.MutableSet[T]):
119
159
  def __init__(self, init: ta.Iterable[T] | None = None) -> None:
120
160
  super().__init__()
121
161
 
122
- self._dict: weakref.WeakValueDictionary[int, T] = weakref.WeakValueDictionary()
162
+ self._dict: IdentityWeakKeyDictionary[T, None] = IdentityWeakKeyDictionary()
163
+
164
+ if init is not None:
165
+ for e in init:
166
+ self._dict[e] = None
123
167
 
124
168
  def add(self, value):
125
- # FIXME: race with weakref callback?
126
- self._dict[id(value)] = value
169
+ self._dict[value] = None
127
170
 
128
171
  def discard(self, value):
129
- try:
130
- del self._dict[id(value)]
131
- except KeyError:
132
- pass
172
+ del self._dict[value]
133
173
 
134
174
  def __contains__(self, x):
135
- try:
136
- o = self._dict[id(x)]
137
- except KeyError:
138
- return False
139
- return x is o
175
+ return x in self._dict
140
176
 
141
177
  def __len__(self):
142
178
  return len(self._dict)
143
179
 
144
180
  def __iter__(self):
145
- return self._dict.values()
181
+ return self._dict.keys()
@@ -49,6 +49,7 @@ def dataclass(
49
49
  cache_hash: bool | None = None,
50
50
  generic_init: bool | None = None,
51
51
  override: bool | None = None,
52
+ allow_dynamic_dunder_attrs: bool | None = None,
52
53
 
53
54
  repr_id: bool | None = None,
54
55
  terse_repr: bool | None = None,
@@ -153,6 +154,7 @@ def dataclass(
153
154
  cache_hash=cache_hash,
154
155
  generic_init=generic_init,
155
156
  override=override,
157
+ allow_dynamic_dunder_attrs=allow_dynamic_dunder_attrs,
156
158
 
157
159
  repr_id=repr_id,
158
160
  terse_repr=terse_repr,
@@ -39,6 +39,7 @@ def make_dataclass( # noqa
39
39
  cache_hash: bool | None = None,
40
40
  generic_init: bool | None = None,
41
41
  override: bool | None = None,
42
+ allow_dynamic_dunder_attrs: bool | None = None,
42
43
 
43
44
  repr_id: bool | None = None,
44
45
  terse_repr: bool | None = None,
@@ -109,6 +110,7 @@ def make_dataclass( # noqa
109
110
  cache_hash=cache_hash,
110
111
  generic_init=generic_init,
111
112
  override=override,
113
+ allow_dynamic_dunder_attrs=allow_dynamic_dunder_attrs,
112
114
 
113
115
  repr_id=repr_id,
114
116
  terse_repr=terse_repr,
@@ -65,9 +65,10 @@ def check_frozen_bases(cls: type, frozen: bool) -> None:
65
65
  ##
66
66
 
67
67
 
68
- @dc.dataclass(frozen=True)
68
+ @dc.dataclass(frozen=True, kw_only=True)
69
69
  class FrozenPlan(Plan):
70
70
  fields: tuple[str, ...]
71
+ allow_dynamic_dunder_attrs: bool
71
72
 
72
73
 
73
74
  @register_generator_type(FrozenPlan)
@@ -78,7 +79,10 @@ class FrozenGenerator(Generator[FrozenPlan]):
78
79
  if not ctx.cs.frozen:
79
80
  return None
80
81
 
81
- return PlanResult(FrozenPlan(tuple(f.name for f in ctx.cs.fields)))
82
+ return PlanResult(FrozenPlan(
83
+ fields=tuple(f.name for f in ctx.cs.fields),
84
+ allow_dynamic_dunder_attrs=ctx.cs.allow_dynamic_dunder_attrs,
85
+ ))
82
86
 
83
87
  def _generate_one(
84
88
  self,
@@ -88,8 +92,20 @@ class FrozenGenerator(Generator[FrozenPlan]):
88
92
  exc_args: str,
89
93
  ) -> AddMethodOp:
90
94
  preamble = []
95
+ condition = []
96
+
91
97
  # https://github.com/python/cpython/commit/ee6f8413a99d0ee4828e1c81911e203d3fff85d5
92
- condition = f'type(self) is {CLS_IDENT}'
98
+ base_condition = f'type(self) is {CLS_IDENT}'
99
+
100
+ if plan.allow_dynamic_dunder_attrs:
101
+ condition.extend([
102
+ f'(',
103
+ f' {base_condition}',
104
+ f' and not (len(name) > 4 and name[:2] == name[-2:] == "__")',
105
+ f')',
106
+ ])
107
+ else:
108
+ condition.append(base_condition)
93
109
 
94
110
  if plan.fields:
95
111
  set_ident = f'{IDENT_PREFIX}_{mth}_frozen_fields'
@@ -102,14 +118,19 @@ class FrozenGenerator(Generator[FrozenPlan]):
102
118
  f'}}',
103
119
  f'',
104
120
  ])
105
- condition += f' or name in {set_ident}'
121
+ condition.append(f' or name in {set_ident}')
106
122
 
107
123
  return AddMethodOp(
108
124
  f'__{mth}__',
109
125
  '\n'.join([
110
126
  *preamble,
111
127
  f'def __{mth}__(self, {", ".join(params)}):',
112
- f' if {condition}:',
128
+ f' if (',
129
+ *[
130
+ f' {l}'
131
+ for l in condition
132
+ ],
133
+ f' ):',
113
134
  f' raise {FROZEN_INSTANCE_ERROR_GLOBAL.ident}{exc_args}',
114
135
  f' super({CLS_IDENT}, self).__{mth}__({", ".join(params)})',
115
136
  ]),
@@ -183,6 +183,7 @@ class ClassSpec(lang.Final):
183
183
  cache_hash: bool = False
184
184
  generic_init: bool = False
185
185
  override: bool = False
186
+ allow_dynamic_dunder_attrs: bool = False
186
187
 
187
188
  repr_id: bool = False
188
189
  terse_repr: bool = False
omlish/lang/objects.py CHANGED
@@ -250,3 +250,8 @@ class Identity(ta.Generic[T]):
250
250
  if type(other) is not type(self):
251
251
  return NotImplemented
252
252
  return self._obj is other._obj # noqa
253
+
254
+ def __ne__(self, other):
255
+ if type(other) is not type(self):
256
+ return NotImplemented
257
+ return self._obj is not other._obj # noqa
omlish/reflect/subst.py CHANGED
@@ -43,13 +43,14 @@ def replace_type_vars(
43
43
  args = tuple(rec(a) for a in cur.args)
44
44
  if update_aliases:
45
45
  obj = cur.obj
46
- if (ops := get_params(obj)):
47
- nargs = [to_annotation(rpl[p]) for p in ops]
48
- if ta.get_origin(obj) is ta.Generic:
49
- # FIXME: None? filter_typing_generic in get_generic_bases?
50
- pass
51
- else:
52
- obj = cur.obj[*nargs]
46
+ if (og := ta.get_origin(obj)) is ta.Generic:
47
+ # FIXME: None? filter_typing_generic in get_generic_bases?
48
+ pass
49
+ elif (ops := get_params(og)):
50
+ if len(ops) != len(args):
51
+ raise RuntimeError
52
+ nargs = [to_annotation(a) for a in args]
53
+ obj = og[*nargs]
53
54
  else:
54
55
  obj = None
55
56
  return dc.replace(cur, args=args, obj=obj)
@@ -89,6 +90,7 @@ class GenericSubstitution:
89
90
  if isinstance(bty, Generic) and isinstance(b, type):
90
91
  # FIXME: throws away relative types, but can't use original vars as they're class-contextual
91
92
  bty = type_(b[*((ta.Any,) * len(bty.params))]) # type: ignore
93
+ # rpl2 = {p: rpl[a] for p, a in zip(bty.params, bty.args)}
92
94
  rty = replace_type_vars(bty, rpl, update_aliases=self._update_aliases)
93
95
  ret.append(rty)
94
96
  return tuple(ret)
@@ -14,7 +14,7 @@ from .values import UniqueTypedValue # noqa
14
14
 
15
15
  T = ta.TypeVar('T')
16
16
 
17
- TypedValueT = ta.TypeVar('TypedValueT', bound='TypedValue')
17
+ TypedValueT0 = ta.TypeVar('TypedValueT0', bound='TypedValue')
18
18
  TypedValueU = ta.TypeVar('TypedValueU', bound='TypedValue')
19
19
 
20
20
  UniqueTypedValueU = ta.TypeVar('UniqueTypedValueU', bound='UniqueTypedValue')
@@ -27,7 +27,7 @@ class _NOT_SET(lang.Marker): # noqa
27
27
  pass
28
28
 
29
29
 
30
- class TypedValuesAccessor(lang.Abstract, ta.Generic[TypedValueT]):
30
+ class TypedValuesAccessor(lang.Abstract, ta.Sequence[TypedValueT0]):
31
31
  def __iter__(self):
32
32
  raise TypeError(
33
33
  'TypedValuesAccessor does not implement __iter__ - it is reserved for implementation by subclasses.',
@@ -36,7 +36,7 @@ class TypedValuesAccessor(lang.Abstract, ta.Generic[TypedValueT]):
36
36
  #
37
37
 
38
38
  @ta.final
39
- def __contains__(self, cls: type[TypedValueU]) -> bool:
39
+ def __contains__(self, cls: type[TypedValueU]) -> bool: # type: ignore[override]
40
40
  return self._typed_value_contains(cls)
41
41
 
42
42
  @abc.abstractmethod
@@ -45,8 +45,8 @@ class TypedValuesAccessor(lang.Abstract, ta.Generic[TypedValueT]):
45
45
 
46
46
  #
47
47
 
48
- @ta.overload
49
- def __getitem__(self, idx: int) -> TypedValueT:
48
+ @ta.overload # type: ignore[override]
49
+ def __getitem__(self, idx: int) -> TypedValueT0:
50
50
  ...
51
51
 
52
52
  @ta.overload
@@ -8,20 +8,20 @@ from .generic import TypedValueGeneric
8
8
  from .values import TypedValue
9
9
 
10
10
 
11
- TypedValueT = ta.TypeVar('TypedValueT', bound=TypedValue)
11
+ TypedValueT1 = ta.TypeVar('TypedValueT1', bound=TypedValue)
12
12
 
13
13
 
14
14
  ##
15
15
 
16
16
 
17
17
  class TypedValueHolder(
18
- TypedValuesAccessor[TypedValueT],
19
- TypedValueGeneric[TypedValueT],
18
+ TypedValuesAccessor[TypedValueT1],
19
+ TypedValueGeneric[TypedValueT1],
20
20
  lang.Abstract,
21
21
  ):
22
22
  @property
23
23
  @abc.abstractmethod
24
- def _typed_values(self) -> TypedValues[TypedValueT] | None:
24
+ def _typed_values(self) -> TypedValues[TypedValueT1] | None:
25
25
  raise NotImplementedError
26
26
 
27
27
  #
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev327
3
+ Version: 0.0.0.dev329
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -44,7 +44,7 @@ Requires-Dist: sqlean.py~=3.49; extra == "all"
44
44
  Requires-Dist: duckdb~=1.3; extra == "all"
45
45
  Requires-Dist: markupsafe~=3.0; extra == "all"
46
46
  Requires-Dist: jinja2~=3.1; extra == "all"
47
- Requires-Dist: pytest~=8.3; extra == "all"
47
+ Requires-Dist: pytest~=8.4; extra == "all"
48
48
  Requires-Dist: anyio~=4.9; extra == "all"
49
49
  Requires-Dist: sniffio~=1.3; extra == "all"
50
50
  Requires-Dist: asttokens~=3.0; extra == "all"
@@ -94,7 +94,7 @@ Provides-Extra: templates
94
94
  Requires-Dist: markupsafe~=3.0; extra == "templates"
95
95
  Requires-Dist: jinja2~=3.1; extra == "templates"
96
96
  Provides-Extra: testing
97
- Requires-Dist: pytest~=8.3; extra == "testing"
97
+ Requires-Dist: pytest~=8.4; extra == "testing"
98
98
  Provides-Extra: plus
99
99
  Requires-Dist: anyio~=4.9; extra == "plus"
100
100
  Requires-Dist: sniffio~=1.3; extra == "plus"
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=orgsRvtpHu8tdhaCvlP9v3P495OJopYYiHKjK68WtWg,8587
2
- omlish/__about__.py,sha256=d4Xjb6KLvYaunh9KWRpIDX2rC1dTJogXQi_w5nINTKg,3478
2
+ omlish/__about__.py,sha256=JwUnRBh_MVapCgN8U8iae56nu3Vx67AkLzhPkLM7640,3478
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
@@ -76,14 +76,14 @@ omlish/codecs/funcs.py,sha256=p4imNt7TobyZVXWC-WhntHVu9KfJrO4QwdtPRh-cVOk,850
76
76
  omlish/codecs/registry.py,sha256=2FnO5YP7ui1LzkguwESY0MP3WIdwgPTIJTM_4RyTOEg,3896
77
77
  omlish/codecs/standard.py,sha256=eiZ4u9ep0XrA4Z_D1zJI0vmWyuN8HLrX4Se_r_Cq_ZM,60
78
78
  omlish/codecs/text.py,sha256=JzrdwMpQPo2NBBg3K1EZszzQy5vEWmd82SIerJd4yeQ,5723
79
- omlish/collections/__init__.py,sha256=7r4qY9paGL-pC8ZNJn6taod9T2qAyMjIpcL7ptb8GaI,2394
79
+ omlish/collections/__init__.py,sha256=_7sct5tPAzV3BadIGYRdz6KzazntZIws9e8fEDlUwsU,2404
80
80
  omlish/collections/abc.py,sha256=ikTJlJ5dhXjU6tlNsI0Wm0_7GaIEpe3mftpvdGY_nc8,2620
81
81
  omlish/collections/bimap.py,sha256=3szDCscPJlFRtkpyVQNWneg4s50mr6Rd0jdTzVEIcnE,1661
82
82
  omlish/collections/coerce.py,sha256=tAls15v_7p5bUN33R7Zbko87KW5toWHl9fRialCqyNY,7030
83
83
  omlish/collections/errors.py,sha256=shcS-NCnEUudF8qC_SmO2TQyjivKlS4TDjaz_faqQ0c,44
84
84
  omlish/collections/frozen.py,sha256=LMbAHYDENIQk1hvjCTvpnx66m1TalrHa4CSn8n_tsXQ,4142
85
85
  omlish/collections/hasheq.py,sha256=uHypfZlHhicQPvx9OOlpT9MSLwfc_mFil-WaxF9dTOo,3732
86
- omlish/collections/identity.py,sha256=xtoczgBPYzr6r2lJS-eti2kEnN8rVDvNGDCG3TA6vRo,3405
86
+ omlish/collections/identity.py,sha256=S_W508EkU-AW0TZ7cv1wWUc6EG54vww4XbcfGjDFTgg,4793
87
87
  omlish/collections/mappings.py,sha256=iXb7oq1rCQak0KgzblgrzWCJLrkfJAYHFvl9lprOVUI,2804
88
88
  omlish/collections/ordered.py,sha256=7zTbrAt12rf6i33XHkQERKar258fJacaw_WbtGEBgWo,2338
89
89
  omlish/collections/ranked.py,sha256=McB8C2UQfUvrbmxGTpBz1-EZuyCLkBFtktzncMdt8_Y,2287
@@ -141,13 +141,13 @@ omlish/dataclasses/errors.py,sha256=tyv3WR6az66uGGiq9FIuCHvy1Ef-G7zeMY7mMG6hy2Y,
141
141
  omlish/dataclasses/inspect.py,sha256=BlpPghVCU3w_YDnONEqqE99YHzJM2q3eoqe39YX25Ko,4596
142
142
  omlish/dataclasses/internals.py,sha256=vIGCZnStgD3ef4drYRtVOrxhxmAPa0vJpo4pXcDcQvM,3073
143
143
  omlish/dataclasses/reflection.py,sha256=FSSTiS7pGTmDrYNkS6fZzaMSe8qtSvDv5Pgz0T55qXg,2404
144
- omlish/dataclasses/specs.py,sha256=r9hpIWy83ODiB1n7wTf7JL5fiCeeT8fWbMvxs7c4e3g,6148
144
+ omlish/dataclasses/specs.py,sha256=JFpMILJhxiWYmfTD4TDl03O13o1i0Rwgf14WpI7U9go,6193
145
145
  omlish/dataclasses/utils.py,sha256=gv6za6oJYBr1VaeGd7oXqq9lhBs_sxkpC27XYzJggno,1870
146
146
  omlish/dataclasses/api/__init__.py,sha256=k5iS9QOwf_f4iOfGffYhnqDOcmEIwEUUTp00u11kIPM,455
147
147
  omlish/dataclasses/api/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
148
  omlish/dataclasses/api/classes/conversion.py,sha256=U3g5S-HefJrg4to1BF8XnlEWqMxFeGEqVt8o5OTQK-U,902
149
- omlish/dataclasses/api/classes/decorator.py,sha256=q-m05j6VhJ9_00TmrXBvwmv0_TFPTD8OURi1KbKo9-4,3933
150
- omlish/dataclasses/api/classes/make.py,sha256=Q_8ZVjhhFEUstIZA3Ht_vlGptYjTcJqX48qT57W7SZw,2820
149
+ omlish/dataclasses/api/classes/decorator.py,sha256=swqe6wZ3nAb9kZaYvxXJNhr-KiOPkEERCCV4Zu2SlfA,4060
150
+ omlish/dataclasses/api/classes/make.py,sha256=qcsELy9tpwMLr0RJmvlSgR0deh40nvxgy7RaG3SJ_nw,2939
151
151
  omlish/dataclasses/api/classes/metadata.py,sha256=ocUu75VWOdZA8-R7K95yPhQtS0sFZB1NtqCdzXyDNeQ,2769
152
152
  omlish/dataclasses/api/classes/params.py,sha256=GmLJotHT4BuXcK9lAwP00boR0_mfM0xITWBFKrk0brY,1994
153
153
  omlish/dataclasses/api/fields/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -161,7 +161,7 @@ omlish/dataclasses/concerns/copy.py,sha256=U8kSHEvVupvXArS3OPB7GK_M7aPO9R3_Uk1nq
161
161
  omlish/dataclasses/concerns/doc.py,sha256=SL0hj4EzXrVOhaDzHVDGnzylkOU7mcXtr9Tm3wuZnQQ,1344
162
162
  omlish/dataclasses/concerns/eq.py,sha256=PI0KKzJyIziRLgcjl8efjapf8baaRCdcuyGW83bCpEo,1720
163
163
  omlish/dataclasses/concerns/fields.py,sha256=-VnI7al9sKRs0xTCy-IUhl3EgCKBX5vczDUZNu72_KY,3311
164
- omlish/dataclasses/concerns/frozen.py,sha256=IWfar9VIkMezE8Bh9duB5vVXy1qyABa1YEOwHVJOCqE,3872
164
+ omlish/dataclasses/concerns/frozen.py,sha256=_skp52Rknas_WaSm2UAzHPX44L2dtM1CMq1478GNz8M,4506
165
165
  omlish/dataclasses/concerns/hash.py,sha256=ouX8zyae_IUAMEd-0dvUAPO9bbp5AM1evumyUSr5inY,4815
166
166
  omlish/dataclasses/concerns/init.py,sha256=_Yv4g7paBtkxnm3CgglBSAOQnoRAULv9HwvZg_od3WM,14542
167
167
  omlish/dataclasses/concerns/matchargs.py,sha256=maHlfPCcHvAOGuXoLGu66ZizHdizU-UIrFCYbNMPR5g,748
@@ -418,7 +418,7 @@ omlish/lang/functions.py,sha256=qNqzWF6vI6PGTzKhgkhnNXP8e1gSerb8GsHG3_wVBP8,6386
418
418
  omlish/lang/generators.py,sha256=a4D5HU_mySs2T2z3xCmE_s3t4QJkj0YRrK4-hhpGd0A,5197
419
419
  omlish/lang/imports.py,sha256=y9W9Y-d_cQ35QCLuSIPoa6vnEqSErFCz8b-34IH128U,10552
420
420
  omlish/lang/iterables.py,sha256=StoGp9yaP3njdLKHoWYcEevO3eE8SHEPYl5_avZob24,2149
421
- omlish/lang/objects.py,sha256=nbxBHfQHVw0OG4qeSTP2GvIiFIcH2tbbitY8y-mYPPo,5959
421
+ omlish/lang/objects.py,sha256=ZsibJwNp1EXorbaObm9TlCNtuuM65snCmVb7H4_llqI,6116
422
422
  omlish/lang/outcomes.py,sha256=mpFy_VoM-b74L1aCFsjsZVUHx_icZ1AHMOKeVesjOp4,8628
423
423
  omlish/lang/overrides.py,sha256=IBzK6ljfLX6TLgIyKTSjhqTLcuKRkQNVtEOnBLS4nuA,2095
424
424
  omlish/lang/params.py,sha256=sfbNoGrKCsAtubFufj_uh_WKshIgA8fqJ4PmLH1PH00,6639
@@ -566,7 +566,7 @@ omlish/os/pidfiles/pinning.py,sha256=aQgCmvcAqN0lvI70GcSB2TKVX1G4vwbyN_AOHF3-eKE
566
566
  omlish/reflect/__init__.py,sha256=64eHbD6zL6Fhp7FfXb8n9ZHywlODjBN3rm1LMvZ081A,822
567
567
  omlish/reflect/inspect.py,sha256=WCo2YpBYauKw6k758FLlZ_H4Q05rgVPs96fEv9w6zHQ,1538
568
568
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
569
- omlish/reflect/subst.py,sha256=g3q7NmNWsmc67mcchmCE3WFPCMDSBq-FXn4ah-DWL_U,3622
569
+ omlish/reflect/subst.py,sha256=CeOxa2v9pMqPlL039C348CBl1iDKWir1xykFC3xFfO8,3744
570
570
  omlish/reflect/types.py,sha256=Cn9FYGoiCNt0FS0YLiTTAR12WKcesWMapCrVYcb8IDo,9225
571
571
  omlish/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
572
572
  omlish/secrets/all.py,sha256=gv_d9SfyMxso30HsrSz9XmIrSZOdl3rLA5MSH0ZXfgM,486
@@ -849,17 +849,17 @@ omlish/text/antlr/_runtime/xpath/__init__.py,sha256=lMd_BbXYdlDhZQN_q0TKN978XW5G
849
849
  omlish/text/go/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
850
850
  omlish/text/go/quoting.py,sha256=N9EYdnFdEX_A8fOviH-1w4jwV3XOQ7VU2WsoUNubYVY,9137
851
851
  omlish/typedvalues/__init__.py,sha256=nzpnoRW_wScMPit5Xz37ky3nKBdzzkgtnQA4SfVHN8E,684
852
- omlish/typedvalues/accessor.py,sha256=5q-JbIUjhzmW6Ui55YepHc1FDAlV13Whkz_TVNvtQ9Q,3064
852
+ omlish/typedvalues/accessor.py,sha256=_NEGBmQ84-h_rDfYeoq7DA20fhj3dogQuvzxXKhjx54,3121
853
853
  omlish/typedvalues/collection.py,sha256=a6Je_kmz2FlAV2dI92S7c_paXge0QExMynV-fD9oPrs,5823
854
854
  omlish/typedvalues/consumer.py,sha256=peDQAgriSyBx_Hc8QHAhEgYy0oSS52qQ_7Tqdssl2AE,4375
855
855
  omlish/typedvalues/generic.py,sha256=byWG_gMXhNelckUwdmOoJE9FKkL71Q4BSi4ZLyy0XZ0,788
856
- omlish/typedvalues/holder.py,sha256=ZTnHiw-K38ciOBLEdwgrltr7Xp8jjEs_0Lp69DH-G-o,1128
856
+ omlish/typedvalues/holder.py,sha256=vu-umn-h1nvUqmtV5T9ZfQ_OoOYsERu8PhI2N48Ryns,1133
857
857
  omlish/typedvalues/marshal.py,sha256=hWHRLcrGav7lvXJDtb9bNI0ickl4SKPQ6F4BbTpqw3A,4219
858
858
  omlish/typedvalues/reflect.py,sha256=Ih1YgU-srUjsvBn_P7C66f73_VCvcwqE3ffeBnZBgt4,674
859
859
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
860
- omlish-0.0.0.dev327.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
861
- omlish-0.0.0.dev327.dist-info/METADATA,sha256=mliaL7sX9zbiogrFKjPXwlZWP3vroB5tneucBGOSeHE,4416
862
- omlish-0.0.0.dev327.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
863
- omlish-0.0.0.dev327.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
864
- omlish-0.0.0.dev327.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
865
- omlish-0.0.0.dev327.dist-info/RECORD,,
860
+ omlish-0.0.0.dev329.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
861
+ omlish-0.0.0.dev329.dist-info/METADATA,sha256=RxxJstMcBeaIHqBd5QKW_CW1ljHT00laXL0A3DnX8b4,4416
862
+ omlish-0.0.0.dev329.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
863
+ omlish-0.0.0.dev329.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
864
+ omlish-0.0.0.dev329.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
865
+ omlish-0.0.0.dev329.dist-info/RECORD,,