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 +4 -4
- omlish/dataclasses/__init__.py +1 -1
- omlish/dataclasses/impl/api.py +1 -1
- omlish/dataclasses/impl/order.py +11 -1
- omlish/inject/bindings.py +1 -1
- omlish/inject/eagers.py +1 -1
- omlish/inject/impl/bindings.py +1 -1
- omlish/inject/keys.py +1 -1
- omlish/inject/listeners.py +1 -1
- omlish/inject/multis.py +4 -4
- omlish/inject/origins.py +2 -2
- omlish/inject/overrides.py +1 -1
- omlish/inject/privates.py +2 -2
- omlish/inject/providers.py +4 -4
- omlish/inject/scopes.py +3 -3
- omlish/lang/__init__.py +6 -2
- omlish/lang/cached/function.py +9 -0
- omlish/lang/cached/property.py +3 -1
- omlish/lang/imports.py +68 -10
- omlish/lang/objects.py +0 -46
- omlish/lite/reprs.py +84 -0
- omlish/marshal/objects/dataclasses.py +4 -4
- omlish/sql/queries/base.py +3 -3
- omlish/text/mangle.py +66 -7
- omlish/typedvalues/values.py +1 -1
- {omlish-0.0.0.dev283.dist-info → omlish-0.0.0.dev284.dist-info}/METADATA +3 -3
- {omlish-0.0.0.dev283.dist-info → omlish-0.0.0.dev284.dist-info}/RECORD +31 -30
- {omlish-0.0.0.dev283.dist-info → omlish-0.0.0.dev284.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev283.dist-info → omlish-0.0.0.dev284.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev283.dist-info → omlish-0.0.0.dev284.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev283.dist-info → omlish-0.0.0.dev284.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
__version__ = '0.0.0.
|
2
|
-
__revision__ = '
|
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.
|
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.
|
95
|
+
# 'mysql-connector-python ~= 9.3',
|
96
96
|
# 'mysqlclient ~= 2.2',
|
97
97
|
|
98
98
|
'aiomysql ~= 0.2',
|
omlish/dataclasses/__init__.py
CHANGED
omlish/dataclasses/impl/api.py
CHANGED
omlish/dataclasses/impl/order.py
CHANGED
@@ -40,7 +40,17 @@ class OrderProcessor(Processor):
|
|
40
40
|
('__gt__', '>'),
|
41
41
|
('__ge__', '>='),
|
42
42
|
]:
|
43
|
-
if set_new_attribute(
|
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.
|
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
omlish/inject/impl/bindings.py
CHANGED
omlish/inject/keys.py
CHANGED
omlish/inject/listeners.py
CHANGED
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
21
|
+
@dc.extra_class_params(cache_hash=True)
|
22
22
|
class Origins:
|
23
23
|
lst: ta.Sequence[Origin]
|
24
24
|
|
omlish/inject/overrides.py
CHANGED
@@ -12,7 +12,7 @@ from .elements import as_elements
|
|
12
12
|
|
13
13
|
|
14
14
|
@dc.dataclass(frozen=True)
|
15
|
-
@dc.
|
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.
|
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.
|
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
|
|
omlish/inject/providers.py
CHANGED
@@ -18,24 +18,24 @@ class Provider(lang.Abstract):
|
|
18
18
|
|
19
19
|
|
20
20
|
@dc.dataclass(frozen=True)
|
21
|
-
@dc.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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,
|
omlish/lang/cached/function.py
CHANGED
@@ -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
|
|
omlish/lang/cached/property.py
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
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 :=
|
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(
|
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
|
|
omlish/sql/queries/base.py
CHANGED
@@ -61,10 +61,10 @@ class Node(
|
|
61
61
|
except KeyError:
|
62
62
|
pass
|
63
63
|
|
64
|
-
|
64
|
+
dc_rfl = dc.reflect(cls)
|
65
65
|
fields = Node._Fields(
|
66
|
-
cmp_fields=tuple(f.name for f in
|
67
|
-
hash_fields=tuple(f.name for f in
|
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
|
-
|
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
|
-
|
35
|
-
|
36
|
-
|
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
|
-
|
40
|
-
|
41
|
-
return s
|
99
|
+
ird = self.inverse_replacements_dict()
|
100
|
+
return self.replacements_pat().sub(lambda m: ird[m.group(0)], s)
|
omlish/typedvalues/values.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: omlish
|
3
|
-
Version: 0.0.0.
|
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.
|
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.
|
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=
|
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=
|
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=
|
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=
|
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=
|
361
|
-
omlish/inject/eagers.py,sha256=
|
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=
|
367
|
-
omlish/inject/listeners.py,sha256=
|
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=
|
370
|
-
omlish/inject/origins.py,sha256
|
371
|
-
omlish/inject/overrides.py,sha256=
|
372
|
-
omlish/inject/privates.py,sha256=
|
373
|
-
omlish/inject/providers.py,sha256=
|
374
|
-
omlish/inject/scopes.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
446
|
-
omlish/lang/cached/property.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
791
|
-
omlish-0.0.0.
|
792
|
-
omlish-0.0.0.
|
793
|
-
omlish-0.0.0.
|
794
|
-
omlish-0.0.0.
|
795
|
-
omlish-0.0.0.
|
796
|
-
omlish-0.0.0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|