omlish 0.0.0.dev283__py3-none-any.whl → 0.0.0.dev284__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.dev283'
2
- __revision__ = 'cb2339041915213e0f3c8ffacbb6339c5606f479'
1
+ __version__ = '0.0.0.dev284'
2
+ __revision__ = 'e10caaddb37a1fedcbe1bf3e711062e82a8cc7cb'
3
3
 
4
4
 
5
5
  #
@@ -35,7 +35,7 @@ class Project(ProjectBase):
35
35
  'anyio ~= 4.9',
36
36
  'sniffio ~= 1.3',
37
37
 
38
- 'greenlet ~= 3.1',
38
+ 'greenlet ~= 3.2',
39
39
 
40
40
  'trio ~= 0.29',
41
41
  'trio-asyncio ~= 0.15',
@@ -92,7 +92,7 @@ class Project(ProjectBase):
92
92
  # 'psycopg ~= 3.2',
93
93
 
94
94
  'pymysql ~= 1.1',
95
- # 'mysql-connector-python ~= 9.1',
95
+ # 'mysql-connector-python ~= 9.3',
96
96
  # 'mysqlclient ~= 2.2',
97
97
 
98
98
  'aiomysql ~= 0.2',
@@ -28,7 +28,7 @@ from .impl.api import ( # noqa
28
28
  dataclass as xdataclass,
29
29
  make_dataclass as xmake_dataclass,
30
30
 
31
- extra_params,
31
+ extra_class_params,
32
32
  )
33
33
 
34
34
  from .impl.as_ import ( # noqa
@@ -247,7 +247,7 @@ class _ExtraParamsKwargs:
247
247
  pass
248
248
 
249
249
 
250
- def extra_params( # noqa
250
+ def extra_class_params( # noqa
251
251
  *,
252
252
  reorder=MISSING,
253
253
  cache_hash=MISSING,
@@ -40,7 +40,17 @@ class OrderProcessor(Processor):
40
40
  ('__gt__', '>'),
41
41
  ('__ge__', '>='),
42
42
  ]:
43
- if set_new_attribute(self._cls, name, cmp_fn(name, op, self_tuple, other_tuple, globals=self._info.globals)): # noqa
43
+ if set_new_attribute(
44
+ self._cls, # noqa
45
+ name,
46
+ cmp_fn(
47
+ name,
48
+ op,
49
+ self_tuple,
50
+ other_tuple,
51
+ globals=self._info.globals,
52
+ ),
53
+ ):
44
54
  raise TypeError(
45
55
  f'Cannot overwrite attribute {name} in class {self._cls.__name__}. '
46
56
  f'Consider using functools.total_ordering',
omlish/inject/bindings.py CHANGED
@@ -12,7 +12,7 @@ from .types import Unscoped
12
12
 
13
13
 
14
14
  @dc.dataclass(frozen=True)
15
- @dc.extra_params(cache_hash=True)
15
+ @dc.extra_class_params(cache_hash=True)
16
16
  class Binding(Element, lang.Final):
17
17
  key: Key = dc.xfield(coerce=check.of_isinstance(Key))
18
18
  provider: Provider = dc.xfield(coerce=check.of_isinstance(Provider))
omlish/inject/eagers.py CHANGED
@@ -13,6 +13,6 @@ from .keys import Key
13
13
 
14
14
 
15
15
  @dc.dataclass(frozen=True)
16
- @dc.extra_params(cache_hash=True)
16
+ @dc.extra_class_params(cache_hash=True)
17
17
  class Eager(Element, lang.Final):
18
18
  key: Key = dc.xfield(coerce=check.of_isinstance(Key))
@@ -11,7 +11,7 @@ from .providers import ProviderImpl
11
11
 
12
12
 
13
13
  @dc.dataclass(frozen=True, eq=False)
14
- @dc.extra_params(cache_hash=True)
14
+ @dc.extra_class_params(cache_hash=True)
15
15
  class BindingImpl(lang.Final):
16
16
  key: Key
17
17
  provider: ProviderImpl
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_params(cache_hash=True)
17
+ @dc.extra_class_params(cache_hash=True)
18
18
  class Key(lang.Final, ta.Generic[T]):
19
19
  ty: rfl.Type = dc.xfield(coerce=rfl.type_)
20
20
 
@@ -20,7 +20,7 @@ ProvisionListener: ta.TypeAlias = ta.Callable[[
20
20
 
21
21
 
22
22
  @dc.dataclass(frozen=True)
23
- @dc.extra_params(cache_hash=True)
23
+ @dc.extra_class_params(cache_hash=True)
24
24
  class ProvisionListenerBinding(Element, lang.Final):
25
25
  listener: ProvisionListener
26
26
 
omlish/inject/multis.py CHANGED
@@ -30,14 +30,14 @@ def _check_set_multi_key(mk: Key) -> bool:
30
30
 
31
31
 
32
32
  @dc.dataclass(frozen=True)
33
- @dc.extra_params(cache_hash=True)
33
+ @dc.extra_class_params(cache_hash=True)
34
34
  class SetBinding(Element, lang.Final):
35
35
  multi_key: Key = dc.xfield(validate=_check_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
- @dc.extra_params(cache_hash=True)
40
+ @dc.extra_class_params(cache_hash=True)
41
41
  class SetProvider(Provider):
42
42
  multi_key: Key = dc.xfield(validate=_check_set_multi_key)
43
43
 
@@ -50,7 +50,7 @@ def _check_map_multi_key(mk: Key) -> bool:
50
50
 
51
51
 
52
52
  @dc.dataclass(frozen=True)
53
- @dc.extra_params(cache_hash=True)
53
+ @dc.extra_class_params(cache_hash=True)
54
54
  class MapBinding(Element, lang.Final):
55
55
  multi_key: Key = dc.xfield(validate=_check_map_multi_key)
56
56
  map_key: ta.Any = dc.xfield()
@@ -58,7 +58,7 @@ class MapBinding(Element, lang.Final):
58
58
 
59
59
 
60
60
  @dc.dataclass(frozen=True)
61
- @dc.extra_params(cache_hash=True)
61
+ @dc.extra_class_params(cache_hash=True)
62
62
  class MapProvider(Provider):
63
63
  multi_key: Key = dc.xfield(validate=_check_map_multi_key)
64
64
 
omlish/inject/origins.py CHANGED
@@ -12,13 +12,13 @@ T = ta.TypeVar('T')
12
12
 
13
13
 
14
14
  @dc.dataclass(frozen=True)
15
- @dc.extra_params(cache_hash=True)
15
+ @dc.extra_class_params(cache_hash=True)
16
16
  class Origin:
17
17
  lst: ta.Sequence[str]
18
18
 
19
19
 
20
20
  @dc.dataclass(frozen=True)
21
- @dc.extra_params(cache_hash=True)
21
+ @dc.extra_class_params(cache_hash=True)
22
22
  class Origins:
23
23
  lst: ta.Sequence[Origin]
24
24
 
@@ -12,7 +12,7 @@ from .elements import as_elements
12
12
 
13
13
 
14
14
  @dc.dataclass(frozen=True)
15
- @dc.extra_params(cache_hash=True)
15
+ @dc.extra_class_params(cache_hash=True)
16
16
  class Overrides(Element, lang.Final):
17
17
  ovr: Elements = dc.xfield(coerce=check.of_isinstance(Elements))
18
18
  src: Elements = dc.xfield(coerce=check.of_isinstance(Elements))
omlish/inject/privates.py CHANGED
@@ -13,13 +13,13 @@ from .keys import as_key
13
13
 
14
14
 
15
15
  @dc.dataclass(frozen=True)
16
- @dc.extra_params(cache_hash=True)
16
+ @dc.extra_class_params(cache_hash=True)
17
17
  class Expose(Element, lang.Final):
18
18
  key: Key = dc.xfield(coerce=as_key)
19
19
 
20
20
 
21
21
  @dc.dataclass(frozen=True)
22
- @dc.extra_params(cache_hash=True)
22
+ @dc.extra_class_params(cache_hash=True)
23
23
  class Private(Element, lang.Final):
24
24
  elements: Elements = dc.xfield(coerce=check.of_isinstance(Elements))
25
25
 
@@ -18,24 +18,24 @@ class Provider(lang.Abstract):
18
18
 
19
19
 
20
20
  @dc.dataclass(frozen=True)
21
- @dc.extra_params(cache_hash=True)
21
+ @dc.extra_class_params(cache_hash=True)
22
22
  class FnProvider(Provider):
23
23
  fn: ta.Any = dc.xfield(validate=callable)
24
24
 
25
25
 
26
26
  @dc.dataclass(frozen=True)
27
- @dc.extra_params(cache_hash=True)
27
+ @dc.extra_class_params(cache_hash=True)
28
28
  class CtorProvider(Provider):
29
29
  ty: type = dc.xfield(coerce=check.of_isinstance(type))
30
30
 
31
31
 
32
32
  @dc.dataclass(frozen=True)
33
- @dc.extra_params(cache_hash=True)
33
+ @dc.extra_class_params(cache_hash=True)
34
34
  class ConstProvider(Provider):
35
35
  v: ta.Any
36
36
 
37
37
 
38
38
  @dc.dataclass(frozen=True)
39
- @dc.extra_params(cache_hash=True)
39
+ @dc.extra_class_params(cache_hash=True)
40
40
  class LinkProvider(Provider):
41
41
  k: Key = dc.xfield(coerce=check.of_isinstance(Key))
omlish/inject/scopes.py CHANGED
@@ -27,7 +27,7 @@ SCOPE_ALIASES: dict[str, Scope] = {}
27
27
 
28
28
 
29
29
  @dc.dataclass(frozen=True)
30
- @dc.extra_params(cache_hash=True)
30
+ @dc.extra_class_params(cache_hash=True)
31
31
  class ScopeBinding(Element, lang.Final):
32
32
  scope: Scope = dc.xfield(coerce=check.of_isinstance(Scope))
33
33
 
@@ -60,7 +60,7 @@ SCOPE_ALIASES['thread'] = ThreadScope()
60
60
 
61
61
 
62
62
  @dc.dataclass(frozen=True)
63
- @dc.extra_params(cache_hash=True)
63
+ @dc.extra_class_params(cache_hash=True)
64
64
  class SeededScope(Scope, lang.Final):
65
65
  tag: ta.Any = dc.xfield(coerce=check.not_none)
66
66
 
@@ -71,7 +71,7 @@ class SeededScope(Scope, lang.Final):
71
71
 
72
72
 
73
73
  @dc.dataclass(frozen=True)
74
- @dc.extra_params(cache_hash=True)
74
+ @dc.extra_class_params(cache_hash=True)
75
75
  class ScopeSeededProvider(Provider):
76
76
  ss: SeededScope = dc.xfield(coerce=check.of_isinstance(SeededScope))
77
77
  key: Key = dc.xfield(coerce=check.of_isinstance(Key))
omlish/lang/__init__.py CHANGED
@@ -166,6 +166,7 @@ from .generators import ( # noqa
166
166
  )
167
167
 
168
168
  from .imports import ( # noqa
169
+ LazyGlobals,
169
170
  can_import,
170
171
  get_real_module_name,
171
172
  import_all,
@@ -201,11 +202,9 @@ from .maybes import ( # noqa
201
202
  )
202
203
 
203
204
  from .objects import ( # noqa
204
- AttrRepr,
205
205
  SimpleProxy,
206
206
  anon_object,
207
207
  arg_repr,
208
- attr_repr,
209
208
  can_weakref,
210
209
  deep_subclasses,
211
210
  dir_dict,
@@ -304,6 +303,11 @@ from ..lite.imports import ( # noqa
304
303
  import_module_attr,
305
304
  )
306
305
 
306
+ from ..lite.reprs import ( # noqa
307
+ AttrRepr,
308
+ attr_repr,
309
+ )
310
+
307
311
  from ..lite.timeouts import ( # noqa
308
312
  DeadlineTimeout,
309
313
  InfiniteTimeout,
@@ -1,6 +1,10 @@
1
1
  """
2
2
  TODO:
3
+ - !!! lighter weight bound methods
4
+ - keymaker overhead less important than not rebuilding a whole dc every __get__ on a new instance
3
5
  - !! specialize nullary, explicit kwarg
6
+ - !! use c-backed functools.cache if possible
7
+ - also just riic
4
8
  - !! reconcile A().f() with A.f(A())
5
9
  - unbound descriptor *should* still hit instance cache
6
10
  - integrate / expose with collections.cache
@@ -10,6 +14,7 @@ TODO:
10
14
  - 'staticmethod' or effective equiv - which must resolve to the shared instance
11
15
  - and must be transient?
12
16
  - use __transient_dict__ to support common state nuking
17
+ - use __set_name__ ?
13
18
  """
14
19
  import dataclasses as dc
15
20
  import functools
@@ -353,10 +358,14 @@ class _DescriptorCachedFunction(_CachedFunction[T]):
353
358
  def cached_function(fn=None, **kwargs): # noqa
354
359
  if fn is None:
355
360
  return functools.partial(cached_function, **kwargs)
361
+
356
362
  opts = _CachedFunction.Opts(**kwargs)
363
+
357
364
  if isinstance(fn, staticmethod):
358
365
  return _FreeCachedFunction(fn, opts=opts, value_fn=unwrap_func(fn))
366
+
359
367
  scope = classmethod if isinstance(fn, classmethod) else None
368
+
360
369
  return _DescriptorCachedFunction(fn, scope, opts=opts)
361
370
 
362
371
 
@@ -112,7 +112,9 @@ class _TransientCachedProperty(_CachedProperty):
112
112
  def cached_property(fn=None, *, transient=False, **kwargs): # noqa
113
113
  if fn is None:
114
114
  return functools.partial(cached_property, transient=transient, **kwargs)
115
- if transient:
115
+
116
+ elif transient:
116
117
  return _TransientCachedProperty(fn, **kwargs)
118
+
117
119
  else:
118
120
  return _DictCachedProperty(fn, **kwargs)
omlish/lang/imports.py CHANGED
@@ -3,6 +3,7 @@ TODO:
3
3
  - proxy_init 'as' alias support - attrs of (src, dst)
4
4
  """
5
5
  import contextlib
6
+ import functools
6
7
  import importlib.util
7
8
  import sys
8
9
  import types
@@ -254,6 +255,64 @@ def _trigger_conditional_imports(package: str) -> None:
254
255
  ##
255
256
 
256
257
 
258
+ class LazyGlobals:
259
+ def __init__(
260
+ self,
261
+ *,
262
+ globals: ta.MutableMapping[str, ta.Any] | None = None, # noqa
263
+ update_globals: bool = False,
264
+ ) -> None:
265
+ super().__init__()
266
+
267
+ self._globals = globals
268
+ self._update_globals = update_globals
269
+
270
+ self._attr_fns: dict[str, ta.Callable[[], ta.Any]] = {}
271
+
272
+ @classmethod
273
+ def install(cls, globals: ta.MutableMapping[str, ta.Any]) -> 'LazyGlobals': # noqa
274
+ try:
275
+ xga = globals['__getattr__']
276
+ except KeyError:
277
+ pass
278
+ else:
279
+ if not isinstance(xga, cls):
280
+ raise RuntimeError(f'Module already has __getattr__ hook: {xga}') # noqa
281
+ return xga
282
+
283
+ lm = cls(
284
+ globals=globals,
285
+ update_globals=True,
286
+ )
287
+
288
+ globals['__getattr__'] = lm
289
+
290
+ return lm
291
+
292
+ def set_fn(self, attr: str, fn: ta.Callable[[], ta.Any]) -> 'LazyGlobals':
293
+ self._attr_fns[attr] = fn
294
+ return self
295
+
296
+ def get(self, attr: str) -> ta.Any:
297
+ try:
298
+ fn = self._attr_fns[attr]
299
+ except KeyError:
300
+ raise AttributeError(attr) from None
301
+
302
+ val = fn()
303
+
304
+ if self._update_globals and self._globals is not None:
305
+ self._globals[attr] = val
306
+
307
+ return val
308
+
309
+ def __call__(self, attr: str) -> ta.Any:
310
+ return self.get(attr)
311
+
312
+
313
+ ##
314
+
315
+
257
316
  class NamePackage(ta.NamedTuple):
258
317
  name: str
259
318
  package: str
@@ -266,16 +325,13 @@ class _ProxyInit:
266
325
 
267
326
  def __init__(
268
327
  self,
328
+ lazy_globals: LazyGlobals,
269
329
  name_package: NamePackage,
270
- *,
271
- globals: ta.MutableMapping[str, ta.Any] | None = None, # noqa
272
- update_globals: bool = False,
273
330
  ) -> None:
274
331
  super().__init__()
275
332
 
333
+ self._lazy_globals = lazy_globals
276
334
  self._name_package = name_package
277
- self._globals = globals
278
- self._update_globals = update_globals
279
335
 
280
336
  self._imps_by_attr: dict[str, _ProxyInit._Import] = {}
281
337
  self._mods_by_pkgs: dict[str, ta.Any] = {}
@@ -287,13 +343,17 @@ class _ProxyInit:
287
343
  def add(self, package: str, attrs: ta.Iterable[str | tuple[str, str]]) -> None:
288
344
  if isinstance(attrs, str):
289
345
  raise TypeError(attrs)
346
+
290
347
  for attr in attrs:
291
348
  if isinstance(attr, tuple):
292
349
  imp_attr, attr = attr
293
350
  else:
294
351
  imp_attr = attr
352
+
295
353
  self._imps_by_attr[attr] = self._Import(package, imp_attr)
296
354
 
355
+ self._lazy_globals.set_fn(attr, functools.partial(self.get, attr))
356
+
297
357
  def get(self, attr: str) -> ta.Any:
298
358
  try:
299
359
  imp = self._imps_by_attr[attr]
@@ -307,9 +367,6 @@ class _ProxyInit:
307
367
 
308
368
  val = getattr(mod, imp.attr)
309
369
 
310
- if self._update_globals and self._globals is not None:
311
- self._globals[attr] = val
312
-
313
370
  return val
314
371
 
315
372
 
@@ -329,13 +386,14 @@ def proxy_init(
329
386
  pi: _ProxyInit
330
387
  try:
331
388
  pi = globals['__proxy_init__']
389
+
332
390
  except KeyError:
333
391
  pi = _ProxyInit(
392
+ LazyGlobals.install(globals),
334
393
  init_name_package,
335
- globals=globals,
336
394
  )
337
395
  globals['__proxy_init__'] = pi
338
- globals['__getattr__'] = pi.get
396
+
339
397
  else:
340
398
  if pi.name_package != init_name_package:
341
399
  raise Exception(f'Wrong init name: {pi.name_package=} != {init_name_package=}')
omlish/lang/objects.py CHANGED
@@ -1,8 +1,3 @@
1
- """
2
- TODO:
3
- - reprlib / recur guard (merge w/ defs.py)
4
- """
5
- import dataclasses as dc
6
1
  import types
7
2
  import typing as ta
8
3
  import weakref
@@ -16,47 +11,6 @@ T = ta.TypeVar('T')
16
11
  ##
17
12
 
18
13
 
19
- @dc.dataclass(frozen=True)
20
- class AttrRepr:
21
- attrs: ta.Sequence[str]
22
-
23
- _: dc.KW_ONLY
24
-
25
- with_module: bool = False
26
- use_qualname: bool = False
27
- with_id: bool = False
28
- value_filter: ta.Callable[[ta.Any], bool] | None = None
29
-
30
- @classmethod
31
- def of(cls, *attrs: str, **kwargs: ta.Any) -> 'AttrRepr':
32
- return cls(attrs, **kwargs)
33
-
34
- def __call__(self, obj: ta.Any) -> str:
35
- vs = ', '.join(
36
- f'{attr}={v!r}'
37
- for attr in self.attrs
38
- for v in [getattr(obj, attr)]
39
- if self.value_filter is None or self.value_filter(v)
40
- )
41
- return (
42
- f'{obj.__class__.__module__ + "." if self.with_module else ""}'
43
- f'{obj.__class__.__qualname__ if self.use_qualname else obj.__class__.__name__}'
44
- f'{("@" + hex(id(obj))[2:]) if self.with_id else ""}'
45
- f'({vs})'
46
- )
47
-
48
- def __get__(self, instance, owner):
49
- if instance is None:
50
- return self
51
- def __repr__(other): # noqa
52
- return self(other)
53
- return __repr__.__get__(instance, owner)
54
-
55
-
56
- def attr_repr(obj: ta.Any, *attrs: str, **kwargs: ta.Any) -> str:
57
- return AttrRepr(attrs, **kwargs)(obj)
58
-
59
-
60
14
  def arg_repr(*args: ta.Any, **kwargs: ta.Any) -> str:
61
15
  return ', '.join(*(
62
16
  list(map(repr, args)) +
omlish/lite/reprs.py ADDED
@@ -0,0 +1,84 @@
1
+ # ruff: noqa: UP007
2
+ import dataclasses as dc
3
+ import typing as ta
4
+
5
+
6
+ ##
7
+
8
+
9
+ @dc.dataclass(frozen=True)
10
+ class AttrRepr:
11
+ attrs: ta.Sequence[str]
12
+
13
+ # _: dc.KW_ONLY
14
+
15
+ with_module: bool = False
16
+ use_qualname: bool = False
17
+ with_id: bool = False
18
+ value_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = None
19
+ recursive: bool = False
20
+
21
+ @classmethod
22
+ def of(cls, *attrs: str, **kwargs: ta.Any) -> 'AttrRepr':
23
+ return cls(attrs, **kwargs)
24
+
25
+ #
26
+
27
+ def _build_(self, obj: ta.Any) -> str:
28
+ vs = ', '.join(
29
+ f'{attr}={v!r}'
30
+ for attr in self.attrs
31
+ for v in [getattr(obj, attr)]
32
+ if self.value_filter is None or self.value_filter(v)
33
+ )
34
+
35
+ return (
36
+ f'{obj.__class__.__module__ + "." if self.with_module else ""}'
37
+ f'{obj.__class__.__qualname__ if self.use_qualname else obj.__class__.__name__}'
38
+ f'{("@" + hex(id(obj))[2:]) if self.with_id else ""}'
39
+ f'({vs})'
40
+ )
41
+
42
+ _build: ta.ClassVar[ta.Callable[[ta.Any], str]]
43
+
44
+ def __call__(self, obj: ta.Any) -> str:
45
+ try:
46
+ build: ta.Any = self._build
47
+
48
+ except AttributeError:
49
+ build = self._build_
50
+ if self.recursive:
51
+ build = self._reprlib().recursive_repr()(build)
52
+ object.__setattr__(self, '_build', build)
53
+
54
+ return build(obj)
55
+
56
+ #
57
+
58
+ def __get__(self, instance, owner):
59
+ if instance is None:
60
+ return self
61
+
62
+ def __repr__(other): # noqa
63
+ return self(other)
64
+
65
+ return __repr__.__get__(instance, owner)
66
+
67
+ #
68
+
69
+ _reprlib_: ta.ClassVar[ta.Any]
70
+
71
+ @classmethod
72
+ def _reprlib(cls) -> ta.Any:
73
+ try:
74
+ return cls._reprlib_
75
+ except AttributeError:
76
+ pass
77
+
78
+ reprlib = __import__('reprlib')
79
+ cls._reprlib_ = reprlib
80
+ return reprlib
81
+
82
+
83
+ def attr_repr(obj: ta.Any, *attrs: str, **kwargs: ta.Any) -> str:
84
+ return AttrRepr(attrs, **kwargs)(obj)
@@ -50,7 +50,7 @@ def get_dataclass_field_infos(
50
50
 
51
51
  dc_md = get_dataclass_metadata(ty)
52
52
  dc_naming = dc_md.field_naming or opts.get(Naming)
53
- dc_rf = dc.reflect(ty)
53
+ dc_rfl = dc.reflect(ty)
54
54
 
55
55
  fi_defaults = {
56
56
  k: v
@@ -66,7 +66,7 @@ def get_dataclass_field_infos(
66
66
  type_hints = ta.get_type_hints(ty)
67
67
 
68
68
  ret: list[FieldInfo] = []
69
- for field in dc_rf.instance_fields:
69
+ for field in dc_rfl.instance_fields:
70
70
  if (f_naming := field.metadata.get(Naming, dc_naming)) is not None:
71
71
  um_name = translate_name(field.name, f_naming)
72
72
  else:
@@ -76,10 +76,10 @@ def get_dataclass_field_infos(
76
76
 
77
77
  f_ty: ta.Any
78
78
  if (
79
- ((cpx := dc_rf.cls_params_extras) is not None and cpx.generic_init) or
79
+ ((cpx := dc_rfl.cls_params_extras) is not None and cpx.generic_init) or
80
80
  (fmd is not None and fmd.options.generic_replace)
81
81
  ):
82
- f_ty = rfl.to_annotation(dc_rf.generic_replaced_field_type(field.name))
82
+ f_ty = rfl.to_annotation(dc_rfl.generic_replaced_field_type(field.name))
83
83
  else:
84
84
  f_ty = type_hints[field.name]
85
85
 
@@ -61,10 +61,10 @@ class Node(
61
61
  except KeyError:
62
62
  pass
63
63
 
64
- dc_info = dc.reflect(cls)
64
+ dc_rfl = dc.reflect(cls)
65
65
  fields = Node._Fields(
66
- cmp_fields=tuple(f.name for f in dc_info.instance_fields if f.compare),
67
- hash_fields=tuple(f.name for f in dc_info.instance_fields if (f.compare if f.hash is None else f.hash)),
66
+ cmp_fields=tuple(f.name for f in dc_rfl.instance_fields if f.compare),
67
+ hash_fields=tuple(f.name for f in dc_rfl.instance_fields if (f.compare if f.hash is None else f.hash)),
68
68
  )
69
69
 
70
70
  setattr(cls, '__node_fields__', fields)
omlish/text/mangle.py CHANGED
@@ -1,6 +1,7 @@
1
1
  # ruff: noqa: UP006 UP007
2
2
  # @omlish-lite
3
3
  import dataclasses as dc
4
+ import re
4
5
  import typing as ta
5
6
 
6
7
  from ..lite.cached import cached_nullary
@@ -26,16 +27,74 @@ class StringMangler:
26
27
  check.not_in(self.escape, self.escaped)
27
28
  check.arg(len(set(self.escaped)) == len(self.escaped))
28
29
 
30
+ #
31
+
32
+ @cached_nullary
33
+ def replaced(self) -> ta.Tuple[str, ...]:
34
+ return (self.escape, *self.escaped)
35
+
36
+ @cached_nullary
37
+ def replaced_set(self) -> ta.FrozenSet[str]:
38
+ return frozenset(self.replaced())
39
+
40
+ @cached_nullary
41
+ def replaced_indexes(self) -> ta.Mapping[str, int]:
42
+ return {s: i for i, s in enumerate(self.replaced())}
43
+
44
+ @cached_nullary
45
+ def replaced_pat(self) -> re.Pattern:
46
+ return re.compile('|'.join(re.escape(k) for k in self.replaced()))
47
+
48
+ #
49
+
50
+ @cached_nullary
51
+ def replacement_pad(self) -> int:
52
+ return len('%x' % (len(self.replaced()),)) # noqa
53
+
29
54
  @cached_nullary
30
55
  def replacements(self) -> ta.Sequence[ta.Tuple[str, str]]:
31
- return [(l, self.escape + str(i)) for i, l in enumerate([self.escape, *self.escaped])]
56
+ fmt = f'%0{self.replacement_pad()}x'
57
+ return [
58
+ (l, self.escape + fmt % (i,))
59
+ for i, l in enumerate(self.replaced())
60
+ ]
61
+
62
+ @cached_nullary
63
+ def replacements_dict(self) -> ta.Mapping[str, str]:
64
+ return dict(self.replacements())
65
+
66
+ @cached_nullary
67
+ def inverse_replacements_dict(self) -> ta.Mapping[str, str]:
68
+ return {v: k for k, v in self.replacements()}
69
+
70
+ @cached_nullary
71
+ def replacements_pat(self) -> re.Pattern:
72
+ return re.compile(''.join([re.escape(self.escape), '.' * self.replacement_pad()]))
73
+
74
+ #
75
+
76
+ # def mangle(self, s: str) -> str:
77
+ # ecs = sorted(
78
+ # frozenset(s) & self.replaced_set(),
79
+ # key=self.replaced_indexes().__getitem__,
80
+ # )
81
+ # rd = self.replacements_dict()
82
+ # for l in ecs:
83
+ # r = rd[l]
84
+ # s = s.replace(l, r)
85
+ # return s
32
86
 
33
87
  def mangle(self, s: str) -> str:
34
- for l, r in self.replacements():
35
- s = s.replace(l, r)
36
- return s
88
+ rd = self.replacements_dict()
89
+ return self.replaced_pat().sub(lambda m: rd[m.group(0)], s)
90
+
91
+ #
92
+
93
+ # def unmangle(self, s: str) -> str:
94
+ # for l, r in reversed(self.replacements()):
95
+ # s = s.replace(r, l)
96
+ # return s
37
97
 
38
98
  def unmangle(self, s: str) -> str:
39
- for l, r in reversed(self.replacements()):
40
- s = s.replace(r, l)
41
- return s
99
+ ird = self.inverse_replacements_dict()
100
+ return self.replacements_pat().sub(lambda m: ird[m.group(0)], s)
@@ -36,7 +36,7 @@ class UniqueTypedValue(TypedValue, lang.Abstract):
36
36
 
37
37
 
38
38
  @dc.dataclass(frozen=True)
39
- @dc.extra_params(generic_init=True)
39
+ @dc.extra_class_params(generic_init=True)
40
40
  class ScalarTypedValue(TypedValue, lang.Abstract, ta.Generic[T]):
41
41
  v: T
42
42
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev283
3
+ Version: 0.0.0.dev284
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -15,7 +15,7 @@ License-File: LICENSE
15
15
  Provides-Extra: all
16
16
  Requires-Dist: anyio~=4.9; extra == "all"
17
17
  Requires-Dist: sniffio~=1.3; extra == "all"
18
- Requires-Dist: greenlet~=3.1; extra == "all"
18
+ Requires-Dist: greenlet~=3.2; extra == "all"
19
19
  Requires-Dist: trio~=0.29; extra == "all"
20
20
  Requires-Dist: trio-asyncio~=0.15; extra == "all"
21
21
  Requires-Dist: lz4~=4.4; extra == "all"
@@ -53,7 +53,7 @@ Requires-Dist: wrapt~=1.17; extra == "all"
53
53
  Provides-Extra: async
54
54
  Requires-Dist: anyio~=4.9; extra == "async"
55
55
  Requires-Dist: sniffio~=1.3; extra == "async"
56
- Requires-Dist: greenlet~=3.1; extra == "async"
56
+ Requires-Dist: greenlet~=3.2; extra == "async"
57
57
  Requires-Dist: trio~=0.29; extra == "async"
58
58
  Requires-Dist: trio-asyncio~=0.15; extra == "async"
59
59
  Provides-Extra: compress
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=pjGUyLHaoWpPqRP3jz2u1fC1qoRc2lvrEcpU_Ax2tdg,8253
2
- omlish/__about__.py,sha256=kGtaWxdAPsKYT5u54Mbhf5a1ANaAyiX7TC9CA15-xmA,3380
2
+ omlish/__about__.py,sha256=dKiKmm0e4VLsAkPFstjb0fKd9_2ulpG5GqwUNof8Oas,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
@@ -202,12 +202,12 @@ omlish/daemons/services.py,sha256=YYp2SMkJ71WgzOcYSXjWHeAyKKxu3j1dfuJvWkl0Dgw,34
202
202
  omlish/daemons/spawning.py,sha256=psR73zOYjMKTqNpx1bMib8uU9wAZz62tw5TaWHrTdyY,5337
203
203
  omlish/daemons/targets.py,sha256=00KmtlknMhQ5PyyVAhWl3rpeTMPym0GxvHHq6mYPZ7c,3051
204
204
  omlish/daemons/waiting.py,sha256=RfgD1L33QQVbD2431dkKZGE4w6DUcGvYeRXXi8puAP4,1676
205
- omlish/dataclasses/__init__.py,sha256=jXxXgpwRkNBIDA8mWapOT_u3dOa8EU2tG6CAttbhlt4,1725
205
+ omlish/dataclasses/__init__.py,sha256=ESQFwRKhBVu9b8372Kc9IQL_VxbvYD70YpuvRMiVtvI,1731
206
206
  omlish/dataclasses/static.py,sha256=6pZG2iTR9NN8pKm-5ukDABnaVlTKFOzMwkg-rbxURoo,7691
207
207
  omlish/dataclasses/utils.py,sha256=BTXYyH0enSEP5kWxMnPTJ8_UPd7h4wF2RVPITNC8H4M,3872
208
208
  omlish/dataclasses/impl/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936
209
209
  omlish/dataclasses/impl/__init__.py,sha256=zqGBC5gSbjJxaqG_zS1LL1PX-zAfhIua8UqOE4IwO2k,789
210
- omlish/dataclasses/impl/api.py,sha256=BkwGQYBdl9D8sq9pNmraqOfr5F0fpYF_CbD_s0ESEU8,7007
210
+ omlish/dataclasses/impl/api.py,sha256=eIWSmgsjEnstK6jkyygpJwEY7x6VU8_pJ_XltpalqD0,7013
211
211
  omlish/dataclasses/impl/as_.py,sha256=CD-t7hkC1EP2F_jvZKIA_cVoDuwZ-Ln_xC4fJumPYX0,2598
212
212
  omlish/dataclasses/impl/copy.py,sha256=Tn8_n6Vohs-w4otbGdubBEvhd3TsSTaM3EfNGdS2LYo,591
213
213
  omlish/dataclasses/impl/errors.py,sha256=vL1VKqbjQXGPfvYUz7gQfhnWJKe7JJqUN4QK96pitPA,1280
@@ -219,7 +219,7 @@ omlish/dataclasses/impl/internals.py,sha256=UvZYjrLT1S8ntyxJ_vRPIkPOF00K8HatGAyg
219
219
  omlish/dataclasses/impl/main.py,sha256=bWnqEDOfITjEwkLokTvOegp88KaQXJFun3krgxt3aE0,2647
220
220
  omlish/dataclasses/impl/metaclass.py,sha256=rhcMHNJYISgMkC95Yq14aLEs48iK9Rzma5yb7-4mPIk,4965
221
221
  omlish/dataclasses/impl/metadata.py,sha256=4veWwTr-aA0KP-Y1cPEeOcXHup9EKJTYNJ0ozIxtzD4,1401
222
- omlish/dataclasses/impl/order.py,sha256=zWvWDkSTym8cc7vO1cLHqcBhhjOlucHOCUVJcdh4jt0,1369
222
+ omlish/dataclasses/impl/order.py,sha256=dPmSNDBQAAVu_UPMZODjlT5mSBJIbPCCJ8bwbxrmkJ8,1587
223
223
  omlish/dataclasses/impl/overrides.py,sha256=g9aCzaDDKyek8-yXRvtAcu1B1nCphWDYr4InHDlgbKk,1732
224
224
  omlish/dataclasses/impl/params.py,sha256=HMhvtsPup6WQOPLEVXTHgVvDWHk-kX-E2GAZxWXa6R0,3009
225
225
  omlish/dataclasses/impl/processing.py,sha256=DFxyFjL_h3awRyF_5eyTnB8QkuApx7Zc4QFnVoltlao,459
@@ -357,25 +357,25 @@ omlish/http/coro/simple.py,sha256=inWA_ss6Nz5Rqmy4dL9_SGah4anYoDecDTRQqVIGYeY,32
357
357
  omlish/http/coro/sockets.py,sha256=rtpZZ-XCOfC5tXr4Fmo1HSn-8f5nxfIOlJaPUkQeDyU,1654
358
358
  omlish/inject/__init__.py,sha256=RFq24cDesOTDPXIafMzVl_LprMGFGhSjXoQOIb9CKng,1887
359
359
  omlish/inject/binder.py,sha256=3-6KMOcSgFE5bvthy3YUrRzCX5w7YSGmdJ3Tv2yXZGw,4022
360
- omlish/inject/bindings.py,sha256=KTjm3aXcywnYhFyIL8aaW6ijSuiFMd3WjFSiCMU5Wrk,530
361
- omlish/inject/eagers.py,sha256=3kGf56-DWviFNTl5mnaeSptkdkBJuCrK-7JiQFIEU-4,334
360
+ omlish/inject/bindings.py,sha256=PlvOnUREjvc6F8nOJdzl1k9SAf80icRB4qWFqDop87M,536
361
+ omlish/inject/eagers.py,sha256=JBY7PcjXt-Rg9scQ1ol9xpcoTLXkXC_Ie9uwTWdzUkA,340
362
362
  omlish/inject/elements.py,sha256=Jq2SwWFRw2WFK9sFzyrlcE8iB6kfykNoxtyWv2yChk8,1417
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=BGcSiitwHa1mbbfYsd49H26zQJTgPf5ZEBaweMhiPAE,659
367
- omlish/inject/listeners.py,sha256=h15rSrRTjXEHhR6KbP1svYkxPVscT020drOBE4zfiUQ,586
366
+ omlish/inject/keys.py,sha256=bkpaE_hXFZ1pX8xPU_Km4jPJh8rkk07fs5aA_8bpC5M,665
367
+ omlish/inject/listeners.py,sha256=wyPsAJsl45fZHmrFwsVBxaCiT7r_Riw1I8Eowwg5NHE,592
368
368
  omlish/inject/managed.py,sha256=ASHaY57v9POUOpwgCiinTbE14U28ysl3D6RcFkLfcOQ,2114
369
- omlish/inject/multis.py,sha256=wbX1yTHDRYQ9Gyu0t-nwiHYqeuY8P1W77gE5pxGcwEg,3365
370
- omlish/inject/origins.py,sha256=h_nqvg-rGKEtLcqM50oDXJHAGcndg09Bq90cxLectNA,539
371
- omlish/inject/overrides.py,sha256=C0CJs-1qomN9WJje0y1H3KQNc9e2T6QAJkWMJg9NViI,540
372
- omlish/inject/privates.py,sha256=vsjvvNtpabUVPoVxHb5LpXbuNK_Jg9q_PG7-AAOb-nQ,646
373
- omlish/inject/providers.py,sha256=V6wOsjq8T2XJJAmjpzeBQfyWeswfAuLzyt1yLueEpPc,759
374
- omlish/inject/scopes.py,sha256=iQ8gD5V2z6ahkJhfy7zycMnUky-scfT_M-GjLjKN6Uw,1989
369
+ omlish/inject/multis.py,sha256=4K0iO5o1OLUnPScrTWmEQOoI34T1EXWm6-I4CIjIl6o,3389
370
+ omlish/inject/origins.py,sha256=-qXa18rIIkNwBdTrvASRDjgPYnoY6n6OPC222jJDrXg,551
371
+ omlish/inject/overrides.py,sha256=ybEcq9cDf6kvqu5mqnwi6Evj0MFjKNeE3r0oUlGw5E4,546
372
+ omlish/inject/privates.py,sha256=CyE-hvQ-F_uyCzcwfdiYVtfm9IF1WZvMDOYilFyZmWk,658
373
+ omlish/inject/providers.py,sha256=GDjSEN6iLsc-Tdu_OCPvFHWu4yP0Vn0pAyH_xjw1DPg,783
374
+ omlish/inject/scopes.py,sha256=oRBffhWC0I6jahJF3hKVL2cPP3oo7xDF_AK2SkVAHv0,2007
375
375
  omlish/inject/types.py,sha256=Z-ZEdgtCpHBNrbxxKaMVvfeD7hYXdL4rC7A9_VGxZ6g,256
376
376
  omlish/inject/utils.py,sha256=Gc2qq45KgkyqDt03WSvOEZBCiuqQ6ESwplx5ZRBcY5M,413
377
377
  omlish/inject/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
378
- omlish/inject/impl/bindings.py,sha256=8H586RCgmvwq53XBL9WMbb-1-Tdw_hh9zxIDCwcHA1c,414
378
+ omlish/inject/impl/bindings.py,sha256=xSvUcoDz8NH-aNHPwBPEZsFg73K2WcF_A63npVbGt_k,420
379
379
  omlish/inject/impl/elements.py,sha256=PM_055moROskSTQqmohEa6I0tt1OQ-VRNArXCMG6vyk,5947
380
380
  omlish/inject/impl/injector.py,sha256=LJGmK1g6fiLSE1AFc6lTzgmvA-IQ11dlsKkGcMR7uKQ,7557
381
381
  omlish/inject/impl/inspect.py,sha256=reXkNsjyvJXva5379tHTWklVK0vzqGLP0BgI_4VVPgQ,3116
@@ -419,7 +419,7 @@ omlish/iterators/iterators.py,sha256=iTQQwBE6Wzoy36dnbPIws17zbjE3zNN4KwVw4Fzh-gY
419
419
  omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
420
420
  omlish/iterators/tools.py,sha256=Pi4ybXytUXVZ3xwK89xpPImQfYYId9p1vIFQvVqVLqA,2551
421
421
  omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
422
- omlish/lang/__init__.py,sha256=L5CtSSwM3wQ5G5qK-DBIyMwhSMJlM6i5Yg_YJg9YJ8s,5183
422
+ omlish/lang/__init__.py,sha256=2lnwSSQ_AFbsi5OJLAAWRWJ5xY2kSLWdIzZMW6mfr4s,5238
423
423
  omlish/lang/attrs.py,sha256=fofCKN0X8TMu1yGqHpLpNLih9r9HWl3D3Vn3b6O791w,3891
424
424
  omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
425
425
  omlish/lang/collections.py,sha256=aGi0j6VzVe2nz4l357Y4RD5_XNl8OJbmM5qM6BclrrY,1895
@@ -430,10 +430,10 @@ omlish/lang/descriptors.py,sha256=zBtgO9LjdSTGHNUgiIqswh78WOVoGH6KzS0NbgB1Wls,65
430
430
  omlish/lang/enums.py,sha256=F9tflHfaAoV2MpyuhZzpfX9-H55M3zNa9hCszsngEo8,111
431
431
  omlish/lang/functions.py,sha256=kSdVUJZmRcncMdU43rcQLZ5E2NMcRz6X6pppwLNHiWk,5762
432
432
  omlish/lang/generators.py,sha256=5tbjVAywiZH6oAdj1sJLRMtIkC9y3rAkecLT7Z3m7_g,5251
433
- omlish/lang/imports.py,sha256=Gdl6xCF89xiMOE1yDmdvKWamLq8HX-XPianO58Jdpmw,9218
433
+ omlish/lang/imports.py,sha256=aC1u2eTrxHhhxShKbJvXswe3aJ7K76vT4YK8LrsvRWU,10476
434
434
  omlish/lang/iterables.py,sha256=HOjcxOwyI5bBApDLsxRAGGhTTmw7fdZl2kEckxRVl-0,1994
435
435
  omlish/lang/maybes.py,sha256=IPlfurHCebyDamB2scqP-JmUODN1TWr7ZL1T7qz6Jzo,3421
436
- omlish/lang/objects.py,sha256=LLN6N6a8toq1iw2FZVhlWod7frA_FVLVPbbb_n7P_3U,6704
436
+ omlish/lang/objects.py,sha256=q1T26cxLkejU5XMl5iEVC9IIhjib0VBpe7JCo2bz2Ws,5411
437
437
  omlish/lang/outcomes.py,sha256=mpFy_VoM-b74L1aCFsjsZVUHx_icZ1AHMOKeVesjOp4,8628
438
438
  omlish/lang/params.py,sha256=QmNVBfJsfxjDG5ilDPgHV7sK4UwRztkSQdLTo0umb8I,6648
439
439
  omlish/lang/resolving.py,sha256=ei9LDyJexsMMHB9z8diUkNmynWhd_da7h7TqrMYM6lA,1611
@@ -442,8 +442,8 @@ omlish/lang/strings.py,sha256=egdv8PxLNG40-5V93agP5j2rBUDIsahCx048zV7uEbU,4690
442
442
  omlish/lang/sys.py,sha256=b4qOPiJZQru_mbb04FNfOjYWUxlV2becZOoc-yya_rQ,411
443
443
  omlish/lang/typing.py,sha256=Zdad9Zv0sa-hIaUXPrzPidT7sDVpRcussAI7D-j-I1c,3296
444
444
  omlish/lang/cached/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
445
- omlish/lang/cached/function.py,sha256=CqxYhpl1JK7eBkha_xPQ17c946W1PgnfMNpRaIPgRGc,9229
446
- omlish/lang/cached/property.py,sha256=kzbao_35PlszdK_9oJBWrMmFFlVK_Xhx7YczHhTJ6cc,2764
445
+ omlish/lang/cached/function.py,sha256=s0GImf5JUfjQd1FERSsuM2-AQqdY2a05tozEcNIUk7w,9457
446
+ omlish/lang/cached/property.py,sha256=WHYyg4-6EA86TcNMfbXTjVhjEZPc0kngt9hfY3WN5w8,2768
447
447
  omlish/lang/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
448
448
  omlish/lang/classes/abstract.py,sha256=n4rDlDraUKxPF0GtOWEFZ6mEzEDmP7Z8LSI6Jww_thw,3715
449
449
  omlish/lang/classes/restrict.py,sha256=nCsQuSFsKTwLhYfmwZr9af00qdVA8TuPQXaSJQNKzBI,3543
@@ -471,6 +471,7 @@ omlish/lite/marshal.py,sha256=4DCbLoimLwJakihpvMjJ_kpc7v9aZQY8P3-gkoqEGUE,18471
471
471
  omlish/lite/maybes.py,sha256=7OlHJ8Q2r4wQ-aRbZSlJY7x0e8gDvufFdlohGEIJ3P4,833
472
472
  omlish/lite/pycharm.py,sha256=pUOJevrPClSqTCEOkQBO11LKX2003tfDcp18a03QFrc,1163
473
473
  omlish/lite/reflect.py,sha256=pzOY2PPuHH0omdtglkN6DheXDrGopdL3PtTJnejyLFU,2189
474
+ omlish/lite/reprs.py,sha256=QI5VBtvq_TW1TojWL25c04QfOABLi8Smt5jc5J-bArc,2008
474
475
  omlish/lite/resources.py,sha256=YNSmX1Ohck1aoWRs55a-o5ChVbFJIQhtbqE-XwF55Oc,326
475
476
  omlish/lite/runtime.py,sha256=XQo408zxTdJdppUZqOWHyeUR50VlCpNIExNGHz4U6O4,459
476
477
  omlish/lite/secrets.py,sha256=3Mz3V2jf__XU9qNHcH56sBSw95L3U2UPL24bjvobG0c,816
@@ -518,7 +519,7 @@ omlish/marshal/composite/newtypes.py,sha256=5-te247TiPYf84oFhf59tqIOOByXj8i9KaHT
518
519
  omlish/marshal/composite/optionals.py,sha256=MnecrmrJYjQvYJipIHNCDq78oH09dOjnw5pvaMKqoeU,1537
519
520
  omlish/marshal/composite/wrapped.py,sha256=jOsn3h1vLIqcoSTB-0KObnsdbV8jSVWJYbf7Kg9AUwg,750
520
521
  omlish/marshal/objects/__init__.py,sha256=F4wej8L_tedC8ETYxAnmKfdPR9TjsqIus9Z3nZofYuc,182
521
- omlish/marshal/objects/dataclasses.py,sha256=NcjXrZI8y7THULwUH75LQFVHAyP_-EBBzUi9cbhyPZ0,9046
522
+ omlish/marshal/objects/dataclasses.py,sha256=egC4dSInycPZuvPGW9-f4AyC1nw2gaN_tS8LvoRVAuM,9050
522
523
  omlish/marshal/objects/helpers.py,sha256=85GZp4h3Yo0GYGmnZpKgNxkWnSk8h2R21nfDLU2DtM0,1110
523
524
  omlish/marshal/objects/marshal.py,sha256=JarKGecMgaFYSUHUj-ZUYVP9HK6u2rjpBb3DWX9Uhh0,2648
524
525
  omlish/marshal/objects/metadata.py,sha256=2_rESnslP5fwtEW1xy9ECJg64uA4cQBuYcGkRfPElts,3342
@@ -701,7 +702,7 @@ omlish/sql/parsing/_antlr/MinisqlParser.py,sha256=y9SFjXdQlWYJa2PbPm30d5SfcYM_8M
701
702
  omlish/sql/parsing/_antlr/MinisqlVisitor.py,sha256=NCPorucLLOZ-Q99BtNbDOAfHytQl8wyroR8pI1uVovg,10030
702
703
  omlish/sql/parsing/_antlr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
703
704
  omlish/sql/queries/__init__.py,sha256=2Wb05RFCKYZR3wO5YM60txNgjiDLJMYXC4gKAIUSsmc,1415
704
- omlish/sql/queries/base.py,sha256=OFFM1iUWEtwpZOxuj8ylHUw0aOiHwtItapZ_bl1598Y,3234
705
+ omlish/sql/queries/base.py,sha256=eFYRjPXjXf0ntcDcMQ3x14BgQNp1MDPKKBNNF7oMe8E,3231
705
706
  omlish/sql/queries/binary.py,sha256=dcEzeEn104AMPuQ7QrJU2O-YCN3SUdxB5S4jaWKOUqY,2253
706
707
  omlish/sql/queries/exprs.py,sha256=dG9L218QtJM1HtDYIMWqHimK03N6AL1WONk3FvVRcXY,1480
707
708
  omlish/sql/queries/idents.py,sha256=w2RxO6SR3K-u30S259OtnAZaPv7YA70PzY9R7RtuCQ8,891
@@ -774,7 +775,7 @@ omlish/text/filecache.py,sha256=ls08QSqBlhVXvjDwJpUXiP-U9HLyCstGAxtBOuWJmVY,5414
774
775
  omlish/text/glyphsplit.py,sha256=HI8TWDUaF_tJG5RnIdIjtUH_lYnjYZ7KZBANSxOXGZc,3808
775
776
  omlish/text/indent.py,sha256=LOQgHskHMLVrRC6HLL9uIWay517dpvPEYQK0Igm-wm8,1341
776
777
  omlish/text/linecache.py,sha256=hRYlEhD63ZfA6_ZOTkQIcnON-3W56QMAhcG3vEJqj9M,1858
777
- omlish/text/mangle.py,sha256=yBSEWZfmcMBbGP8Ynb7JKldQMLG-8cNV5F-rBMGg6VE,1138
778
+ omlish/text/mangle.py,sha256=d7j2_HPxoxF5VrLD1TShOSfnhBLH_-lQe_OH2kl0yHg,2790
778
779
  omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
779
780
  omlish/text/parts.py,sha256=Q9NvoyEGQKIWgiPD4D_Qc66cWAuyEKE033dT9m7c3Wk,6662
780
781
  omlish/text/random.py,sha256=8feS5JE_tSjYlMl-lp0j93kCfzBae9AM2cXlRLebXMA,199
@@ -787,10 +788,10 @@ omlish/typedvalues/generic.py,sha256=byWG_gMXhNelckUwdmOoJE9FKkL71Q4BSi4ZLyy0XZ0
787
788
  omlish/typedvalues/holder.py,sha256=4SwRezsmuDDEO5gENGx8kTm30pblF5UktoEAu02i-Gk,1554
788
789
  omlish/typedvalues/marshal.py,sha256=eWMrmuzPk3pX5AlILc5YBvuJBUHRQA_vwkxRm5aHiGs,4209
789
790
  omlish/typedvalues/reflect.py,sha256=y_7IY8_4cLVRvD3ug-_-cDaO5RtzC1rLVFzkeAPALf8,683
790
- omlish/typedvalues/values.py,sha256=Acyf6xSdNHxrkRXLXrFqJouk35YOveso1VqTbyPwQW4,1223
791
- omlish-0.0.0.dev283.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
792
- omlish-0.0.0.dev283.dist-info/METADATA,sha256=WAhCPvqakVe4jVCoG1hK3V7rG55GZz9zefVlVObxqCo,4198
793
- omlish-0.0.0.dev283.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
794
- omlish-0.0.0.dev283.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
795
- omlish-0.0.0.dev283.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
796
- omlish-0.0.0.dev283.dist-info/RECORD,,
791
+ omlish/typedvalues/values.py,sha256=Q_5IiQM3Vka4wGVd-scaslb4-oCMjFcIOksIrKE-JIM,1229
792
+ omlish-0.0.0.dev284.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
793
+ omlish-0.0.0.dev284.dist-info/METADATA,sha256=bHeP3QMi-PvToEI46Ha5Gt_1dVI5uXLwIP1lrp8Rjms,4198
794
+ omlish-0.0.0.dev284.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
795
+ omlish-0.0.0.dev284.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
796
+ omlish-0.0.0.dev284.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
797
+ omlish-0.0.0.dev284.dist-info/RECORD,,