omlish 0.0.0.dev266__py3-none-any.whl → 0.0.0.dev268__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.dev266'
2
- __revision__ = '965387f5aa0862e8b1e30cbd03e24adb0a3e87bc'
1
+ __version__ = '0.0.0.dev268'
2
+ __revision__ = 'df220a5709fb4c2f78ea78342856d9ac56123aa2'
3
3
 
4
4
 
5
5
  #
@@ -9,114 +9,117 @@ from .wrappers import WrapperKv
9
9
  K = ta.TypeVar('K')
10
10
  V = ta.TypeVar('V')
11
11
 
12
- KF = ta.TypeVar('KF')
13
- KT = ta.TypeVar('KT')
14
- VF = ta.TypeVar('VF')
15
- VT = ta.TypeVar('VT')
12
+ # 'Above' the wrapper
13
+ KA = ta.TypeVar('KA')
14
+ VA = ta.TypeVar('VA')
15
+
16
+ # 'Below' the wrapper
17
+ KB = ta.TypeVar('KB')
18
+ VB = ta.TypeVar('VB')
16
19
 
17
20
 
18
21
  ##
19
22
 
20
23
 
21
- class KeyTransformedKv(WrapperKv[KT, V], ta.Generic[KT, KF, V]):
24
+ class KeyTransformedKv(WrapperKv[KA, V], ta.Generic[KA, KB, V]):
22
25
  def __init__(
23
26
  self,
24
- u: Kv[KF, V],
27
+ u: Kv[KB, V],
25
28
  *,
26
- t_to_f: ta.Callable[[KT], KF] | None = None,
27
- f_to_t: ta.Callable[[KF], KT] | None = None,
29
+ a_to_b: ta.Callable[[KA], KB] | None = None,
30
+ b_to_a: ta.Callable[[KB], KA] | None = None,
28
31
  ) -> None:
29
32
  super().__init__()
30
33
 
31
34
  self._u = u
32
- self._t_to_f = t_to_f
33
- self._f_to_t = f_to_t
35
+ self._a_to_b = a_to_b
36
+ self._b_to_a = b_to_a
34
37
 
35
38
  def underlying(self) -> ta.Sequence[Kv]:
36
39
  return [self._u]
37
40
 
38
- def __getitem__(self, k: KT, /) -> V:
39
- fn = check.not_none(self._t_to_f)
41
+ def __getitem__(self, k: KA, /) -> V:
42
+ fn = check.not_none(self._a_to_b)
40
43
  return self._u[fn(k)]
41
44
 
42
45
  def __len__(self) -> int:
43
46
  return len(self._u)
44
47
 
45
- def items(self) -> ta.Iterator[tuple[KT, V]]:
46
- fn = check.not_none(self._f_to_t)
48
+ def items(self) -> ta.Iterator[tuple[KA, V]]:
49
+ fn = check.not_none(self._b_to_a)
47
50
  return ((fn(k), v) for k, v in self._u.items())
48
51
 
49
52
 
50
- class KeyTransformedMutableKey(KeyTransformedKv[KT, KF, V], MutableKv[KT, V], ta.Generic[KT, KF, V]):
53
+ class KeyTransformedMutableKey(KeyTransformedKv[KA, KB, V], MutableKv[KA, V], ta.Generic[KA, KB, V]):
51
54
  def __init__(
52
55
  self,
53
- u: MutableKv[KF, V],
56
+ u: MutableKv[KB, V],
54
57
  *,
55
- t_to_f: ta.Callable[[KT], KF] | None = None,
56
- f_to_t: ta.Callable[[KF], KT] | None = None,
58
+ a_to_b: ta.Callable[[KA], KB] | None = None,
59
+ b_to_a: ta.Callable[[KB], KA] | None = None,
57
60
  ) -> None:
58
61
  super().__init__(
59
62
  u,
60
- t_to_f=t_to_f,
61
- f_to_t=f_to_t,
63
+ a_to_b=a_to_b,
64
+ b_to_a=b_to_a,
62
65
  )
63
66
 
64
- _u: MutableKv[KF, V]
67
+ _u: MutableKv[KB, V]
65
68
 
66
- def __setitem__(self, k: KT, v: V, /) -> None:
67
- fn = check.not_none(self._t_to_f)
69
+ def __setitem__(self, k: KA, v: V, /) -> None:
70
+ fn = check.not_none(self._a_to_b)
68
71
  self._u[fn(k)] = v
69
72
 
70
- def __delitem__(self, k: KT, /) -> None:
71
- fn = check.not_none(self._t_to_f)
73
+ def __delitem__(self, k: KA, /) -> None:
74
+ fn = check.not_none(self._a_to_b)
72
75
  del self._u[fn(k)]
73
76
 
74
77
 
75
78
  ##
76
79
 
77
80
 
78
- class ValueTransformedKv(WrapperKv[K, VT], ta.Generic[K, VT, VF]):
81
+ class ValueTransformedKv(WrapperKv[K, VA], ta.Generic[K, VA, VB]):
79
82
  def __init__(
80
83
  self,
81
- u: Kv[K, VF],
82
- f_to_t: ta.Callable[[VF], VT] | None = None,
84
+ u: Kv[K, VB],
85
+ b_to_a: ta.Callable[[VB], VA] | None = None,
83
86
  ) -> None:
84
87
  super().__init__()
85
88
 
86
89
  self._u = u
87
- self._f_to_t = f_to_t
90
+ self._b_to_a = b_to_a
88
91
 
89
92
  def underlying(self) -> ta.Sequence[Kv]:
90
93
  return [self._u]
91
94
 
92
- def __getitem__(self, k: K, /) -> VT:
93
- fn = check.not_none(self._f_to_t)
95
+ def __getitem__(self, k: K, /) -> VA:
96
+ fn = check.not_none(self._b_to_a)
94
97
  return fn(self._u[k])
95
98
 
96
99
  def __len__(self) -> int:
97
100
  return len(self._u)
98
101
 
99
- def items(self) -> ta.Iterator[tuple[K, VT]]:
100
- fn = check.not_none(self._f_to_t)
102
+ def items(self) -> ta.Iterator[tuple[K, VA]]:
103
+ fn = check.not_none(self._b_to_a)
101
104
  return ((k, fn(v)) for k, v in self._u.items())
102
105
 
103
106
 
104
- class ValueTransformedMutableKv(ValueTransformedKv[K, VT, VF], MutableKv[K, VT], ta.Generic[K, VT, VF]):
107
+ class ValueTransformedMutableKv(ValueTransformedKv[K, VA, VB], MutableKv[K, VA], ta.Generic[K, VA, VB]):
105
108
  def __init__(
106
109
  self,
107
- u: MutableKv[K, VF],
110
+ u: MutableKv[K, VB],
108
111
  *,
109
- f_to_t: ta.Callable[[VF], VT] | None = None,
110
- t_to_f: ta.Callable[[VT], VF] | None = None,
112
+ b_to_a: ta.Callable[[VB], VA] | None = None,
113
+ a_to_b: ta.Callable[[VA], VB] | None = None,
111
114
  ) -> None:
112
- super().__init__(u, f_to_t)
115
+ super().__init__(u, b_to_a)
113
116
 
114
- self._t_to_f = t_to_f
117
+ self._a_to_b = a_to_b
115
118
 
116
- _u: MutableKv[K, VF]
119
+ _u: MutableKv[K, VB]
117
120
 
118
- def __setitem__(self, k: K, v: VT, /) -> None:
119
- fn = check.not_none(self._t_to_f)
121
+ def __setitem__(self, k: K, v: VA, /) -> None:
122
+ fn = check.not_none(self._a_to_b)
120
123
  self._u[k] = fn(v)
121
124
 
122
125
  def __delitem__(self, k: K, /) -> None:
@@ -147,7 +147,7 @@ class InitBuilder:
147
147
  body_lines.append(f'if not {cn}({cas}): __dataclass_raise_validation_error__({self._self_name}, {cn})')
148
148
 
149
149
  inits = self._info.merged_metadata.get(Init, [])
150
- mro_dct = lang.build_mro_dict(self._info.cls)
150
+ mro_dct = lang.mro_dict(self._info.cls)
151
151
  mro_v_ids = set(map(id, mro_dct.values()))
152
152
  props_by_fget_id = {id(v.fget): v for v in mro_dct.values() if isinstance(v, property) and v.fget is not None}
153
153
  for i, obj in enumerate(inits):
@@ -78,7 +78,7 @@ class Method:
78
78
  def build_attr_dispatcher(self, instance_cls: type, owner_cls: type | None = None) -> Dispatcher[str]:
79
79
  disp: Dispatcher[str] = Dispatcher()
80
80
 
81
- mro_dct = lang.build_mro_dict(instance_cls, owner_cls)
81
+ mro_dct = lang.mro_dict(instance_cls, owner_cls)
82
82
  seen: ta.Mapping[ta.Any, str] = {}
83
83
  for nam, att in mro_dct.items():
84
84
  try:
omlish/lang/__init__.py CHANGED
@@ -140,6 +140,8 @@ from .functions import ( # noqa
140
140
  isinstance_of,
141
141
  issubclass_of,
142
142
  maybe_call,
143
+ new_function,
144
+ new_function_kwargs,
143
145
  opt_coalesce,
144
146
  opt_fn,
145
147
  opt_kw,
@@ -203,10 +205,11 @@ from .objects import ( # noqa
203
205
  anon_object,
204
206
  arg_repr,
205
207
  attr_repr,
206
- build_mro_dict,
207
208
  can_weakref,
208
209
  deep_subclasses,
209
210
  dir_dict,
211
+ mro_dict,
212
+ mro_owner_dict,
210
213
  new_type,
211
214
  opt_repr,
212
215
  super_meta,
@@ -3,7 +3,6 @@ import functools
3
3
  import typing as ta
4
4
 
5
5
  from .abstract import Abstract
6
- from .abstract import is_abstract
7
6
 
8
7
 
9
8
  ##
@@ -25,7 +24,6 @@ class Final(Abstract):
25
24
  def __init_subclass__(cls, **kwargs: ta.Any) -> None:
26
25
  super().__init_subclass__(**kwargs)
27
26
 
28
- abstracts: set[ta.Any] = set()
29
27
  for base in cls.__bases__:
30
28
  if base is Abstract:
31
29
  raise FinalTypeError(base)
@@ -33,16 +31,6 @@ class Final(Abstract):
33
31
  continue
34
32
  elif Final in base.__mro__:
35
33
  raise FinalTypeError(base)
36
- else:
37
- abstracts.update(getattr(base, '__abstractmethods__', []))
38
-
39
- for a in abstracts:
40
- try:
41
- v = cls.__dict__[a]
42
- except KeyError:
43
- raise FinalTypeError(a) from None
44
- if is_abstract(v):
45
- raise FinalTypeError(a)
46
34
 
47
35
 
48
36
  ##
omlish/lang/functions.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import dataclasses as dc
2
2
  import functools
3
3
  import time
4
+ import types
4
5
  import typing as ta
5
6
 
6
7
 
@@ -239,3 +240,46 @@ def opt_coalesce(*vs: T | None) -> T | None:
239
240
 
240
241
  def opt_kw(**kwargs: ta.Any) -> dict[str, ta.Any]:
241
242
  return {k: v for k, v in kwargs.items() if v is not None}
243
+
244
+
245
+ ##
246
+
247
+
248
+ def new_function(
249
+ # a code object
250
+ code: types.CodeType,
251
+
252
+ # the globals dictionary
253
+ globals: dict, # noqa
254
+
255
+ # a string that overrides the name from the code object
256
+ name: str | None = None,
257
+
258
+ # a tuple that specifies the default argument values
259
+ argdefs: tuple | None = None,
260
+
261
+ # a tuple that supplies the bindings for free variables
262
+ closure: tuple | None = None,
263
+
264
+ # # a dictionary that specifies the default keyword argument values
265
+ # kwdefaults: dict | None = None,
266
+ ) -> types.FunctionType:
267
+ return types.FunctionType(
268
+ code=code,
269
+ globals=globals,
270
+ name=name,
271
+ argdefs=argdefs,
272
+ closure=closure,
273
+ # kwdefaults=kwdefaults,
274
+ )
275
+
276
+
277
+ def new_function_kwargs(f: types.FunctionType) -> dict[str, ta.Any]:
278
+ return dict(
279
+ code=f.__code__,
280
+ globals=f.__globals__, # noqa
281
+ name=f.__name__,
282
+ argdefs=f.__defaults__,
283
+ closure=f.__closure__,
284
+ # kwdefaults=f.__kwdefaults__,
285
+ )
omlish/lang/objects.py CHANGED
@@ -117,12 +117,13 @@ def deep_subclasses(
117
117
  todo.extend(reversed(cur.__subclasses__()))
118
118
 
119
119
 
120
- def build_mro_dict(
120
+ def mro_owner_dict(
121
121
  instance_cls: type,
122
122
  owner_cls: type | None = None,
123
123
  *,
124
124
  bottom_up_key_order: bool = False,
125
- ) -> ta.Mapping[str, ta.Any]:
125
+ sort_keys: bool = False,
126
+ ) -> ta.Mapping[str, tuple[type, ta.Any]]:
126
127
  if owner_cls is None:
127
128
  owner_cls = instance_cls
128
129
 
@@ -132,20 +133,41 @@ def build_mro_dict(
132
133
  except ValueError:
133
134
  raise TypeError(f'Owner class {owner_cls} not in mro of instance class {instance_cls}') from None
134
135
 
135
- dct: dict[str, ta.Any] = {}
136
+ dct: dict[str, tuple[type, ta.Any]] = {}
136
137
  if not bottom_up_key_order:
137
138
  for cur_cls in mro[:pos + 1][::-1]:
138
139
  for k, v in cur_cls.__dict__.items():
139
140
  if k not in dct:
140
- dct[k] = v
141
+ dct[k] = (cur_cls, v)
141
142
 
142
143
  else:
143
144
  for cur_cls in mro[:pos + 1]:
144
- dct.update(cur_cls.__dict__)
145
+ dct.update({k: (cur_cls, v) for k, v in cur_cls.__dict__.items()})
146
+
147
+ if sort_keys:
148
+ dct = dict(sorted(dct.items(), key=lambda t: t[0]))
145
149
 
146
150
  return dct
147
151
 
148
152
 
153
+ def mro_dict(
154
+ instance_cls: type,
155
+ owner_cls: type | None = None,
156
+ *,
157
+ bottom_up_key_order: bool = False,
158
+ sort_keys: bool = False,
159
+ ) -> ta.Mapping[str, ta.Any]:
160
+ return {
161
+ k: v
162
+ for k, (o, v) in mro_owner_dict(
163
+ instance_cls,
164
+ owner_cls,
165
+ bottom_up_key_order=bottom_up_key_order,
166
+ sort_keys=sort_keys,
167
+ ).items()
168
+ }
169
+
170
+
149
171
  def dir_dict(o: ta.Any) -> dict[str, ta.Any]:
150
172
  return {
151
173
  a: getattr(o, a)
omlish/testing/testing.py CHANGED
@@ -40,7 +40,6 @@ def call_many_with_timeout(
40
40
 
41
41
  def inner(fn, idx):
42
42
  try:
43
- nonlocal rets
44
43
  rets[idx] = fn()
45
44
  except Exception as e:
46
45
  nonlocal thread_exception
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev266
3
+ Version: 0.0.0.dev268
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=x26AIwDzScUvnX-p4xlq6Zc5QYrAo0Vmgf1qHc1KL_M,8253
2
- omlish/__about__.py,sha256=66KDLgGcqah6d5uVeBHruqwCEJq1zWZyc7Pj3aoae5w,3380
2
+ omlish/__about__.py,sha256=iGlt4eEvflJE95_AXx1s09UWQCEobWPtTJo3j9jo9mQ,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
@@ -164,7 +164,7 @@ omlish/collections/kv/base.py,sha256=QDAwnWQFnyfWoZB0rlSTvfO-m-YED9MBi5nojDt8n-g
164
164
  omlish/collections/kv/capabilities.py,sha256=ZINohQKPuUGJNbUnwm6CExMoCKrOcftrUWzFF0xlSww,752
165
165
  omlish/collections/kv/filtered.py,sha256=EJS885-skKEilRy9noblTUU_4RY04jIYet9OMDQwQPo,2266
166
166
  omlish/collections/kv/mappings.py,sha256=Y67h6mY4MpBfOUXZCyW_Gi7xuiAzTq7KzB4qIldqG10,1615
167
- omlish/collections/kv/transformed.py,sha256=Wtzqz08f4w1RtR51rNtkU45ZCpYEKeQAqhzIpDWONHs,3001
167
+ omlish/collections/kv/transformed.py,sha256=2ge9RTqTCA6ftWn4twgFjHokg4zNzHnKCh9cclblHE0,3046
168
168
  omlish/collections/kv/wrappers.py,sha256=nUtoiArK1Fu2TgxFrqZU69bEoAxKJ_nA7qMeeihIz3U,1985
169
169
  omlish/collections/persistent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
170
170
  omlish/collections/persistent/persistent.py,sha256=6CuzeZjZMqBLflU-CuWu32SrtZXFrJOV-H_UUuYoTkg,880
@@ -214,7 +214,7 @@ omlish/dataclasses/impl/exceptions.py,sha256=-vqxZmfXVflymVuiM553XTlJProse5HEMkt
214
214
  omlish/dataclasses/impl/fields.py,sha256=jM2Rvu6DQOfRUrZBMOeJMda-CT5JKXQvJKzoIU_LFxc,6897
215
215
  omlish/dataclasses/impl/frozen.py,sha256=x87DSM8FIMZ3c_BIUE8NooCkExFjPsabeqIueEP5qKs,2988
216
216
  omlish/dataclasses/impl/hashing.py,sha256=0Gr6XIRkKy4pr-mdHblIlQCy3mBxycjMqJk3oZDw43s,3215
217
- omlish/dataclasses/impl/init.py,sha256=drt_-697uw2xp0FGj9AYlMbiuSfYRNV3-8JxTPzkP_w,6415
217
+ omlish/dataclasses/impl/init.py,sha256=CUM8Gnx171D3NO6FN4mlrIBoTcYiDqj_tqE9_NKKicg,6409
218
218
  omlish/dataclasses/impl/internals.py,sha256=UvZYjrLT1S8ntyxJ_vRPIkPOF00K8HatGAygErgoXTU,2990
219
219
  omlish/dataclasses/impl/main.py,sha256=LyWr8IBfoL-bBfweR4OqJgi842REDw20WRYcGSYNfMg,2577
220
220
  omlish/dataclasses/impl/metaclass.py,sha256=Mfr_6_TR_inpH2GIkOtQDKSEwF4mhY-cnUiNBYpO25s,5252
@@ -252,7 +252,7 @@ omlish/dispatch/_dispatch3.py,sha256=9Zjd7bINAC3keiaBdssc4v5dY0-8OI6XooV2DR9U7Z0
252
252
  omlish/dispatch/dispatch.py,sha256=KA5l49AiGLRjp4J7RDJW9RiDp9WUD1ewR1AOPEF8g38,3062
253
253
  omlish/dispatch/functions.py,sha256=8Qvj62XKn9SKfiqoVQdBD3wVRE4JUWpZDqs0oouuDIw,1519
254
254
  omlish/dispatch/impls.py,sha256=JP67zSvDWG4XFOmKPrhWHxRV9WnyAPAsjQHvbmEJh4c,2136
255
- omlish/dispatch/methods.py,sha256=dr8xQo-zVRckIo_V2Wp8Reqor3NE6APuzomUfsSBGdk,5498
255
+ omlish/dispatch/methods.py,sha256=oFtKljPnTMG0DVUBdEkf81-0RzEbgHhS4J_63HYJfKU,5492
256
256
  omlish/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
257
257
  omlish/docker/all.py,sha256=xXRgJgLGPwAtr7bDMJ_Dp9jTfOwfGvohNhc6LsoELJc,514
258
258
  omlish/docker/cli.py,sha256=gtb9kitVfGnd4cr587NsVVk8D5Ok5y5SAsqD_SwGrSA,2565
@@ -415,7 +415,7 @@ omlish/iterators/iterators.py,sha256=iTQQwBE6Wzoy36dnbPIws17zbjE3zNN4KwVw4Fzh-gY
415
415
  omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
416
416
  omlish/iterators/tools.py,sha256=Pi4ybXytUXVZ3xwK89xpPImQfYYId9p1vIFQvVqVLqA,2551
417
417
  omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
418
- omlish/lang/__init__.py,sha256=-fPR8lvFU1f2Sk8CGMkF0HQs1mrwKhp0ufM4zla2jz8,5114
418
+ omlish/lang/__init__.py,sha256=ZRoUfTeSvMWFvXPeHwhncOkopoIDQ8Rml1zM4hp07Fc,5171
419
419
  omlish/lang/attrs.py,sha256=fofCKN0X8TMu1yGqHpLpNLih9r9HWl3D3Vn3b6O791w,3891
420
420
  omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
421
421
  omlish/lang/collections.py,sha256=aGi0j6VzVe2nz4l357Y4RD5_XNl8OJbmM5qM6BclrrY,1895
@@ -424,12 +424,12 @@ omlish/lang/contextmanagers.py,sha256=UPH6daYwSP9cH5AfSVsJyEHk1UURMGhVPM5ZRhp_Hv
424
424
  omlish/lang/datetimes.py,sha256=ehI_DhQRM-bDxAavnp470XcekbbXc4Gdw9y1KpHDJT0,223
425
425
  omlish/lang/descriptors.py,sha256=zBtgO9LjdSTGHNUgiIqswh78WOVoGH6KzS0NbgB1Wls,6572
426
426
  omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
427
- omlish/lang/functions.py,sha256=AzU0yseBdR-J-o4plpfCnWh-MZAZn271xQZVRo4cBFg,4692
427
+ omlish/lang/functions.py,sha256=kSdVUJZmRcncMdU43rcQLZ5E2NMcRz6X6pppwLNHiWk,5762
428
428
  omlish/lang/generators.py,sha256=5LX17j-Ej3QXhwBgZvRTm_dq3n9veC4IOUcVmvSu2vU,5243
429
429
  omlish/lang/imports.py,sha256=Gdl6xCF89xiMOE1yDmdvKWamLq8HX-XPianO58Jdpmw,9218
430
430
  omlish/lang/iterables.py,sha256=HOjcxOwyI5bBApDLsxRAGGhTTmw7fdZl2kEckxRVl-0,1994
431
431
  omlish/lang/maybes.py,sha256=dAgrUoAhCgyrHRqa73CkaGnpXwGc-o9n-NIThrNXnbU,3416
432
- omlish/lang/objects.py,sha256=WlpOJv7kN7GiIquzcd4VEKjRlHmGAKt7yYnHaQL-2QQ,5297
432
+ omlish/lang/objects.py,sha256=5SFF6bf7QQpp1Hju01ITWRsM9q2J3hlePqprPDmfXdI,5910
433
433
  omlish/lang/outcomes.py,sha256=mpFy_VoM-b74L1aCFsjsZVUHx_icZ1AHMOKeVesjOp4,8628
434
434
  omlish/lang/params.py,sha256=QmNVBfJsfxjDG5ilDPgHV7sK4UwRztkSQdLTo0umb8I,6648
435
435
  omlish/lang/resolving.py,sha256=OuN2mDTPNyBUbcrswtvFKtj4xgH4H4WglgqSKv3MTy0,1606
@@ -442,7 +442,7 @@ omlish/lang/cached/function.py,sha256=3AeTVfpzovMMWbnjFuT5mM7kT1dBuk7fa66FOJKikY
442
442
  omlish/lang/cached/property.py,sha256=kzbao_35PlszdK_9oJBWrMmFFlVK_Xhx7YczHhTJ6cc,2764
443
443
  omlish/lang/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
444
444
  omlish/lang/classes/abstract.py,sha256=bIcuAetV_aChhpSURypmjjcqP07xi20uVYPKh1kvQNU,3710
445
- omlish/lang/classes/restrict.py,sha256=QvM-GqXvO8vpCONkcr0QpgVPfzZmgDo7o8d9kUwOzlo,3941
445
+ omlish/lang/classes/restrict.py,sha256=nCsQuSFsKTwLhYfmwZr9af00qdVA8TuPQXaSJQNKzBI,3543
446
446
  omlish/lang/classes/simple.py,sha256=XQ8b86WvQA0qtSYqlbMOJS7tHgE8sv9onda33uQmbkM,3294
447
447
  omlish/lang/classes/virtual.py,sha256=z0MYQD9Q5MkX8DzF325wDB4J9XoYbsB09jZ1omC62To,3366
448
448
  omlish/lifecycles/__init__.py,sha256=1FjYceXs-4fc-S-C9zFYmc2axHs4znnQHcJVHdY7a6E,578
@@ -734,7 +734,7 @@ omlish/term/vt100/c.py,sha256=cAhDKXI81PZRtFmTotfad3HZGREP1QnOlWYoAw6v-Fw,3532
734
734
  omlish/term/vt100/states.py,sha256=OxPUxfFTcfz56MhtDgIigEApChOtN6XO1g6R2H08mu4,8303
735
735
  omlish/term/vt100/terminal.py,sha256=KUlg331ele7P6SHsBKdbpdQFDKsxSply1Ds27NkppTs,9359
736
736
  omlish/testing/__init__.py,sha256=M_BQrcCHkoL-ZvE-UpQ8XxXNYRRawhjUz4rCJnAqM2A,152
737
- omlish/testing/testing.py,sha256=rA5jyo-3q2RLRq1whkoGylWKQ-AYlBwWz6z5s2XtFzo,2911
737
+ omlish/testing/testing.py,sha256=zmBHw5gw1ZUUcDYC0uonSThjhRn0HNuorjpo0jLvju8,2885
738
738
  omlish/testing/pytest/__init__.py,sha256=rOpQYgp7jYjEIMjInzl-a_uIMqmOtVwGzDgJyCDpvxg,206
739
739
  omlish/testing/pytest/helpers.py,sha256=HxiKvpJQ4b6WCiQXOqQTqKbmr7CMAgCF6hViT6pfIuw,202
740
740
  omlish/testing/pytest/skip.py,sha256=imDrBhQKQkEmStaSn0Js-zsfyKMPmNod-mW1ANdIhak,989
@@ -775,9 +775,9 @@ omlish/text/parts.py,sha256=Q9NvoyEGQKIWgiPD4D_Qc66cWAuyEKE033dT9m7c3Wk,6662
775
775
  omlish/text/random.py,sha256=8feS5JE_tSjYlMl-lp0j93kCfzBae9AM2cXlRLebXMA,199
776
776
  omlish/text/go/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
777
777
  omlish/text/go/quoting.py,sha256=N9EYdnFdEX_A8fOviH-1w4jwV3XOQ7VU2WsoUNubYVY,9137
778
- omlish-0.0.0.dev266.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
779
- omlish-0.0.0.dev266.dist-info/METADATA,sha256=k1zJGhmaDUCC8eluYhSrRZm5BGeRFiA5MZgsdCoG39k,4198
780
- omlish-0.0.0.dev266.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
781
- omlish-0.0.0.dev266.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
782
- omlish-0.0.0.dev266.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
783
- omlish-0.0.0.dev266.dist-info/RECORD,,
778
+ omlish-0.0.0.dev268.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
779
+ omlish-0.0.0.dev268.dist-info/METADATA,sha256=L7rJ8O3W6fyxJalOvUhNZSBkBSPuQmIF2e3nyMf7aBg,4198
780
+ omlish-0.0.0.dev268.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
781
+ omlish-0.0.0.dev268.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
782
+ omlish-0.0.0.dev268.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
783
+ omlish-0.0.0.dev268.dist-info/RECORD,,