omlish 0.0.0.dev402__py3-none-any.whl → 0.0.0.dev403__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/.manifests.json +1 -1
- omlish/__about__.py +3 -3
- omlish/argparse/cli.py +1 -0
- omlish/codecs/registry.py +5 -1
- omlish/dataclasses/_internals.py +12 -5
- omlish/dataclasses/impl/api/classes/make.py +67 -3
- omlish/dataclasses/impl/api/fields/constructor.py +7 -0
- omlish/dataclasses/impl/api/fields/conversion.py +14 -0
- omlish/dataclasses/impl/concerns/doc.py +19 -1
- omlish/dataclasses/impl/concerns/slots.py +37 -11
- omlish/dataclasses/metaclass/meta.py +22 -1
- omlish/dataclasses/specs.py +1 -1
- omlish/dataclasses/tools/static.py +1 -0
- omlish/dispatch/impls.py +1 -2
- omlish/dispatch/methods.py +0 -6
- omlish/inject/impl/proxy.py +2 -0
- omlish/inject/impl/scopes.py +4 -0
- omlish/io/compress/zstd.py +16 -8
- omlish/lang/__init__.py +2 -0
- omlish/lang/objects.py +1 -0
- omlish/lang/typing.py +32 -2
- omlish/lite/marshal.py +24 -24
- omlish/lite/reflect.py +22 -5
- omlish/lite/typing.py +11 -0
- omlish/reflect/__init__.py +1 -0
- omlish/reflect/inspect.py +10 -0
- omlish/testing/__init__.py +1 -0
- omlish/testing/testing.py +30 -0
- {omlish-0.0.0.dev402.dist-info → omlish-0.0.0.dev403.dist-info}/METADATA +3 -3
- {omlish-0.0.0.dev402.dist-info → omlish-0.0.0.dev403.dist-info}/RECORD +34 -34
- {omlish-0.0.0.dev402.dist-info → omlish-0.0.0.dev403.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev402.dist-info → omlish-0.0.0.dev403.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev402.dist-info → omlish-0.0.0.dev403.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev402.dist-info → omlish-0.0.0.dev403.dist-info}/top_level.txt +0 -0
omlish/.manifests.json
CHANGED
omlish/__about__.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
__version__ = '0.0.0.
|
2
|
-
__revision__ = '
|
1
|
+
__version__ = '0.0.0.dev403'
|
2
|
+
__revision__ = '5403fd726d8c05e6b9edf0c3b0c86c6600809211'
|
3
3
|
|
4
4
|
|
5
5
|
#
|
@@ -51,7 +51,7 @@ class Project(ProjectBase):
|
|
51
51
|
|
52
52
|
'python-snappy ~= 0.7',
|
53
53
|
|
54
|
-
'zstandard ~= 0.24',
|
54
|
+
'zstandard ~= 0.24; python_version < "3.14"',
|
55
55
|
|
56
56
|
'brotli ~= 1.1',
|
57
57
|
],
|
omlish/argparse/cli.py
CHANGED
@@ -140,6 +140,7 @@ def _get_argparse_arg_ann_kwargs(ann: ta.Any) -> ta.Mapping[str, ta.Any]:
|
|
140
140
|
class _ArgparseCliAnnotationBox:
|
141
141
|
def __init__(self, annotations: ta.Mapping[str, ta.Any]) -> None:
|
142
142
|
super().__init__()
|
143
|
+
|
143
144
|
self.__annotations__ = annotations # type: ignore
|
144
145
|
|
145
146
|
|
omlish/codecs/registry.py
CHANGED
@@ -27,6 +27,8 @@ class CodecRegistry:
|
|
27
27
|
) -> None:
|
28
28
|
super().__init__()
|
29
29
|
|
30
|
+
if late_load_callbacks is not None:
|
31
|
+
late_load_callbacks = list(late_load_callbacks)
|
30
32
|
self._late_load_callbacks = late_load_callbacks
|
31
33
|
|
32
34
|
self._lock = threading.RLock()
|
@@ -36,8 +38,10 @@ class CodecRegistry:
|
|
36
38
|
|
37
39
|
def _late_load(self) -> None:
|
38
40
|
if self._late_load_callbacks:
|
39
|
-
|
41
|
+
while self._late_load_callbacks:
|
42
|
+
cb = self._late_load_callbacks[0]
|
40
43
|
cb(self)
|
44
|
+
self._late_load_callbacks.pop(0)
|
41
45
|
self._late_load_callbacks = None
|
42
46
|
|
43
47
|
@contextlib.contextmanager
|
omlish/dataclasses/_internals.py
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
"""
|
2
|
+
For arcane import machinery compatibility with stdlib, this must be a direct child of the 'dataclasses' package - not
|
3
|
+
under 'impl'.
|
4
|
+
"""
|
1
5
|
import dataclasses as dc
|
2
6
|
import enum
|
3
7
|
import sys
|
@@ -101,7 +105,10 @@ def _self_module():
|
|
101
105
|
def std_is_classvar(cls: type, ty: ta.Any) -> bool:
|
102
106
|
return (
|
103
107
|
dc._is_classvar(ty, ta) # type: ignore # noqa
|
104
|
-
or (
|
108
|
+
or (
|
109
|
+
isinstance(ty, str) and
|
110
|
+
dc._is_type(ty, cls, ta, ta.ClassVar, dc._is_classvar) # type: ignore # noqa
|
111
|
+
)
|
105
112
|
)
|
106
113
|
|
107
114
|
|
@@ -109,8 +116,8 @@ def std_is_initvar(cls: type, ty: ta.Any) -> bool:
|
|
109
116
|
return (
|
110
117
|
dc._is_initvar(ty, dc) # type: ignore # noqa
|
111
118
|
or (
|
112
|
-
isinstance(ty, str)
|
113
|
-
|
119
|
+
isinstance(ty, str) and
|
120
|
+
any(
|
114
121
|
dc._is_type(ty, cls, mod, dc.InitVar, dc._is_initvar) # type: ignore # noqa
|
115
122
|
for mod in (dc, _self_module())
|
116
123
|
)
|
@@ -122,8 +129,8 @@ def std_is_kw_only(cls: type, ty: ta.Any) -> bool:
|
|
122
129
|
return (
|
123
130
|
dc._is_kw_only(ty, dc) # type: ignore # noqa
|
124
131
|
or (
|
125
|
-
isinstance(ty, str)
|
126
|
-
|
132
|
+
isinstance(ty, str) and
|
133
|
+
any(
|
127
134
|
dc._is_type(ty, cls, mod, dc.KW_ONLY, dc._is_kw_only) # type: ignore # noqa
|
128
135
|
for mod in (dc, _self_module())
|
129
136
|
)
|
@@ -10,6 +10,14 @@ from .decorator import dataclass
|
|
10
10
|
##
|
11
11
|
|
12
12
|
|
13
|
+
_IS_PY_3_14 = sys.version_info >= (3, 14)
|
14
|
+
|
15
|
+
if _IS_PY_3_14:
|
16
|
+
import annotationlib # noqa
|
17
|
+
|
18
|
+
_ANY_MARKER = object()
|
19
|
+
|
20
|
+
|
13
21
|
def make_dataclass( # noqa
|
14
22
|
cls_name,
|
15
23
|
fields,
|
@@ -31,6 +39,8 @@ def make_dataclass( # noqa
|
|
31
39
|
|
32
40
|
module=None,
|
33
41
|
|
42
|
+
decorator=dataclass,
|
43
|
+
|
34
44
|
#
|
35
45
|
|
36
46
|
metadata: ta.Sequence[ta.Any] | None = None,
|
@@ -46,6 +56,12 @@ def make_dataclass( # noqa
|
|
46
56
|
|
47
57
|
allow_redundant_decorator: bool | None = None,
|
48
58
|
):
|
59
|
+
if decorator is not dataclass:
|
60
|
+
raise TypeError(
|
61
|
+
f'The `decorator` kwarg, as added in https://github.com/python/cpython/pull/122723, is not supported. '
|
62
|
+
f'{decorator=}',
|
63
|
+
)
|
64
|
+
|
49
65
|
if namespace is None:
|
50
66
|
namespace = {}
|
51
67
|
|
@@ -55,7 +71,10 @@ def make_dataclass( # noqa
|
|
55
71
|
for item in fields:
|
56
72
|
if isinstance(item, str):
|
57
73
|
name = item
|
58
|
-
|
74
|
+
if _IS_PY_3_14:
|
75
|
+
tp = _ANY_MARKER
|
76
|
+
else:
|
77
|
+
tp = 'typing.Any'
|
59
78
|
elif len(item) == 2:
|
60
79
|
name, tp, = item
|
61
80
|
elif len(item) == 3:
|
@@ -73,13 +92,52 @@ def make_dataclass( # noqa
|
|
73
92
|
seen.add(name)
|
74
93
|
annotations[name] = tp
|
75
94
|
|
95
|
+
if _IS_PY_3_14:
|
96
|
+
# We initially block the VALUE format, because inside dataclass() we'll call get_annotations(), which will try
|
97
|
+
# the VALUE format first. If we don't block, that means we'd always end up eagerly importing typing here, which
|
98
|
+
# is what we're trying to avoid.
|
99
|
+
value_blocked = True
|
100
|
+
|
101
|
+
def annotate_method(format): # noqa
|
102
|
+
def get_any():
|
103
|
+
match format:
|
104
|
+
case annotationlib.Format.STRING:
|
105
|
+
return 'typing.Any'
|
106
|
+
case annotationlib.Format.FORWARDREF:
|
107
|
+
typing = sys.modules.get('typing')
|
108
|
+
if typing is None:
|
109
|
+
return annotationlib.ForwardRef('Any', module='typing')
|
110
|
+
else:
|
111
|
+
return typing.Any
|
112
|
+
case annotationlib.Format.VALUE:
|
113
|
+
if value_blocked:
|
114
|
+
raise NotImplementedError
|
115
|
+
from typing import Any
|
116
|
+
return Any
|
117
|
+
case _:
|
118
|
+
raise NotImplementedError
|
119
|
+
|
120
|
+
annos = {
|
121
|
+
ann: get_any() if t is _ANY_MARKER else t
|
122
|
+
for ann, t in annotations.items()
|
123
|
+
}
|
124
|
+
if format == annotationlib.Format.STRING:
|
125
|
+
return annotationlib.annotations_to_string(annos)
|
126
|
+
else:
|
127
|
+
return annos
|
128
|
+
|
76
129
|
def exec_body_callback(ns):
|
77
130
|
ns.update(namespace)
|
78
131
|
ns.update(defaults)
|
79
|
-
|
132
|
+
if not _IS_PY_3_14:
|
133
|
+
ns['__annotations__'] = annotations
|
80
134
|
|
81
135
|
cls = types.new_class(cls_name, bases, {}, exec_body_callback)
|
82
136
|
|
137
|
+
if _IS_PY_3_14:
|
138
|
+
# For now, set annotations including the _ANY_MARKER.
|
139
|
+
cls.__annotate__ = annotate_method # type: ignore
|
140
|
+
|
83
141
|
if module is None:
|
84
142
|
try:
|
85
143
|
module = sys._getframemodulename(1) or '__main__' # type: ignore # noqa
|
@@ -89,7 +147,7 @@ def make_dataclass( # noqa
|
|
89
147
|
if module is not None:
|
90
148
|
cls.__module__ = module
|
91
149
|
|
92
|
-
|
150
|
+
cls = decorator(
|
93
151
|
cls,
|
94
152
|
init=init,
|
95
153
|
repr=repr,
|
@@ -117,3 +175,9 @@ def make_dataclass( # noqa
|
|
117
175
|
|
118
176
|
allow_redundant_decorator=allow_redundant_decorator,
|
119
177
|
)
|
178
|
+
|
179
|
+
if _IS_PY_3_14:
|
180
|
+
# Now that the class is ready, allow the VALUE format.
|
181
|
+
value_blocked = False
|
182
|
+
|
183
|
+
return cls
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import collections
|
2
2
|
import dataclasses as dc
|
3
|
+
import sys
|
3
4
|
import typing as ta
|
4
5
|
|
5
6
|
from ..... import lang
|
@@ -13,6 +14,9 @@ from .metadata import extra_field_params
|
|
13
14
|
##
|
14
15
|
|
15
16
|
|
17
|
+
_IS_PY_3_14 = sys.version_info >= (3, 14)
|
18
|
+
|
19
|
+
|
16
20
|
def field(
|
17
21
|
default=dc.MISSING,
|
18
22
|
*,
|
@@ -23,6 +27,7 @@ def field(
|
|
23
27
|
compare=True,
|
24
28
|
metadata=None,
|
25
29
|
kw_only=dc.MISSING,
|
30
|
+
doc=None,
|
26
31
|
|
27
32
|
coerce: bool | CoerceFn | None = None,
|
28
33
|
validate: ValidateFn | None = None, # noqa
|
@@ -40,6 +45,7 @@ def field(
|
|
40
45
|
override=override,
|
41
46
|
repr_fn=repr_fn,
|
42
47
|
repr_priority=repr_priority,
|
48
|
+
doc=doc,
|
43
49
|
),
|
44
50
|
})
|
45
51
|
|
@@ -58,4 +64,5 @@ def field(
|
|
58
64
|
compare=compare,
|
59
65
|
metadata=md,
|
60
66
|
kw_only=kw_only,
|
67
|
+
**(dict(doc=doc) if _IS_PY_3_14 else {}),
|
61
68
|
)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import dataclasses as dc
|
2
|
+
import sys
|
2
3
|
import typing as ta
|
3
4
|
|
4
5
|
from ..... import check
|
@@ -16,6 +17,12 @@ from .metadata import set_field_spec_metadata
|
|
16
17
|
##
|
17
18
|
|
18
19
|
|
20
|
+
_IS_PY_3_14 = sys.version_info >= (3, 14)
|
21
|
+
|
22
|
+
|
23
|
+
##
|
24
|
+
|
25
|
+
|
19
26
|
STD_FIELD_TYPE_BY_SPEC_FIELD_TYPE: ta.Mapping[FieldType, StdFieldType] = {
|
20
27
|
FieldType.INSTANCE: StdFieldType.INSTANCE,
|
21
28
|
FieldType.CLASS_VAR: StdFieldType.CLASS_VAR,
|
@@ -99,6 +106,10 @@ def std_field_to_field_spec(
|
|
99
106
|
metadata=f.metadata,
|
100
107
|
kw_only=None if f.kw_only is dc.MISSING else (check.isinstance(f.kw_only, bool) if DEBUG else f.kw_only),
|
101
108
|
|
109
|
+
**lang.opt_kw(
|
110
|
+
doc=extra_params.get('doc', f.doc if _IS_PY_3_14 else None), # type: ignore[attr-defined] # noqa
|
111
|
+
),
|
112
|
+
|
102
113
|
**lang.opt_kw(
|
103
114
|
coerce=extra_params.get('coerce'),
|
104
115
|
validate=extra_params.get('validate'),
|
@@ -133,6 +144,7 @@ def field_spec_to_std_field(fs: FieldSpec) -> dc.Field:
|
|
133
144
|
compare=fs.compare,
|
134
145
|
**lang.opt_kw(metadata=fs.metadata),
|
135
146
|
kw_only=dc.MISSING if fs.kw_only is None else fs.kw_only, # type: ignore[arg-type]
|
147
|
+
**(dict(doc=fs.doc) if _IS_PY_3_14 else {}),
|
136
148
|
)
|
137
149
|
|
138
150
|
f.name = fs.name
|
@@ -162,6 +174,7 @@ def check_field_spec_against_field(f: dc.Field, fs: FieldSpec) -> None:
|
|
162
174
|
'compare': f.compare,
|
163
175
|
# f.metadata,
|
164
176
|
'kw_only': f.kw_only if f.kw_only is not dc.MISSING else None,
|
177
|
+
**({'doc': f.doc} if _IS_PY_3_14 else {}), # type: ignore[attr-defined] # noqa
|
165
178
|
|
166
179
|
'std_field_type': f._field_type, # type: ignore[attr-defined] # noqa
|
167
180
|
}
|
@@ -178,6 +191,7 @@ def check_field_spec_against_field(f: dc.Field, fs: FieldSpec) -> None:
|
|
178
191
|
'compare': fs.compare,
|
179
192
|
# fs.metadata,
|
180
193
|
'kw_only': fs.kw_only,
|
194
|
+
**({'doc': fs.doc} if _IS_PY_3_14 else {}),
|
181
195
|
|
182
196
|
'std_field_type': STD_FIELD_TYPE_BY_SPEC_FIELD_TYPE[fs.field_type].value,
|
183
197
|
}
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import inspect
|
2
|
+
import sys
|
2
3
|
|
3
4
|
from ..processing.base import ProcessingContext
|
4
5
|
from ..processing.base import Processor
|
@@ -9,14 +10,31 @@ from ..processing.registry import register_processor_type
|
|
9
10
|
##
|
10
11
|
|
11
12
|
|
13
|
+
if sys.version_info >= (3, 14):
|
14
|
+
import annotationlib # noqa
|
15
|
+
|
16
|
+
def _raw_build_cls_sig(cls: type) -> str:
|
17
|
+
return str(inspect.signature(
|
18
|
+
cls,
|
19
|
+
annotation_format=annotationlib.Format.FORWARDREF, # noqa
|
20
|
+
)).replace(' -> None', '')
|
21
|
+
|
22
|
+
else:
|
23
|
+
def _raw_build_cls_sig(cls: type) -> str:
|
24
|
+
return str(inspect.signature(cls)).replace(' -> None', '')
|
25
|
+
|
26
|
+
|
12
27
|
def _build_cls_doc(cls: type) -> str:
|
13
28
|
try:
|
14
|
-
text_sig =
|
29
|
+
text_sig = _raw_build_cls_sig(cls)
|
15
30
|
except (TypeError, ValueError):
|
16
31
|
text_sig = ''
|
17
32
|
return cls.__name__ + text_sig
|
18
33
|
|
19
34
|
|
35
|
+
##
|
36
|
+
|
37
|
+
|
20
38
|
class _LazyClsDocDescriptor:
|
21
39
|
def __get__(self, instance, owner):
|
22
40
|
if instance is not None:
|
@@ -2,6 +2,7 @@ import dataclasses as dc
|
|
2
2
|
import inspect
|
3
3
|
import itertools
|
4
4
|
import types
|
5
|
+
import typing as ta
|
5
6
|
|
6
7
|
from ..processing.base import Processor
|
7
8
|
from ..processing.priority import ProcessorPriority
|
@@ -63,11 +64,41 @@ def _update_func_cell_for__class__(f, oldcls, newcls):
|
|
63
64
|
return False
|
64
65
|
|
65
66
|
|
67
|
+
def _create_slots(
|
68
|
+
defined_fields,
|
69
|
+
inherited_slots,
|
70
|
+
field_names,
|
71
|
+
weakref_slot,
|
72
|
+
):
|
73
|
+
# The slots for our class. Remove slots from our base classes. Add '__weakref__' if weakref_slot was given, unless
|
74
|
+
# it is already present.
|
75
|
+
seen_docs = False
|
76
|
+
slots = {}
|
77
|
+
for slot in itertools.filterfalse(
|
78
|
+
inherited_slots.__contains__,
|
79
|
+
itertools.chain(
|
80
|
+
# gh-93521: '__weakref__' also needs to be filtered out if already present in inherited_slots
|
81
|
+
field_names, ('__weakref__',) if weakref_slot else (),
|
82
|
+
),
|
83
|
+
):
|
84
|
+
doc = getattr(defined_fields.get(slot), 'doc', None)
|
85
|
+
if doc is not None:
|
86
|
+
seen_docs = True
|
87
|
+
slots[slot] = doc
|
88
|
+
|
89
|
+
# We only return dict if there's at least one doc member, otherwise we return tuple, which is the old default
|
90
|
+
# format.
|
91
|
+
if seen_docs:
|
92
|
+
return slots
|
93
|
+
return tuple(slots)
|
94
|
+
|
95
|
+
|
66
96
|
def add_slots(
|
67
97
|
cls: type,
|
68
98
|
*,
|
69
99
|
is_frozen: bool,
|
70
100
|
weakref_slot: bool,
|
101
|
+
defined_fields: ta.Mapping[str, ta.Any],
|
71
102
|
) -> type:
|
72
103
|
# Need to create a new class, since we can't set __slots__ after a class has been created, and the @dataclass
|
73
104
|
# decorator is called after the class is created.
|
@@ -83,17 +114,11 @@ def add_slots(
|
|
83
114
|
# Make sure slots don't overlap with those in base classes.
|
84
115
|
inherited_slots = set(itertools.chain.from_iterable(map(_get_slots, cls.__mro__[1:-1])))
|
85
116
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
itertools.chain(
|
92
|
-
field_names,
|
93
|
-
# gh-93521: '__weakref__' also needs to be filtered out if already present in inherited_slots
|
94
|
-
('__weakref__',) if weakref_slot else (),
|
95
|
-
),
|
96
|
-
),
|
117
|
+
cls_dict['__slots__'] = _create_slots(
|
118
|
+
defined_fields,
|
119
|
+
inherited_slots,
|
120
|
+
field_names,
|
121
|
+
weakref_slot,
|
97
122
|
)
|
98
123
|
|
99
124
|
for field_name in field_names:
|
@@ -156,4 +181,5 @@ class SlotsProcessor(Processor):
|
|
156
181
|
cls,
|
157
182
|
is_frozen=self._ctx.cs.frozen,
|
158
183
|
weakref_slot=self._ctx.cs.weakref_slot,
|
184
|
+
defined_fields=self._ctx.cs.fields_by_name,
|
159
185
|
)
|
@@ -5,6 +5,7 @@ TODO:
|
|
5
5
|
"""
|
6
6
|
import abc
|
7
7
|
import dataclasses as dc
|
8
|
+
import sys
|
8
9
|
import typing as ta
|
9
10
|
|
10
11
|
from ... import lang
|
@@ -21,6 +22,26 @@ T = ta.TypeVar('T')
|
|
21
22
|
##
|
22
23
|
|
23
24
|
|
25
|
+
if sys.version_info >= (3, 14):
|
26
|
+
annotationlib = __import__('annotationlib') # noqa
|
27
|
+
|
28
|
+
# See:
|
29
|
+
# - https://github.com/python/cpython/pull/132345
|
30
|
+
# - https://github.com/python/cpython/pull/132490
|
31
|
+
def _get_ns_annotation_names(ns: ta.Mapping[str, ta.Any]) -> ta.Sequence[str]:
|
32
|
+
if (fn := annotationlib.get_annotate_from_class_namespace(ns)) is not None: # noqa
|
33
|
+
return list(annotationlib.call_annotate_function(fn, annotationlib.Format.FORWARDREF)) # noqa
|
34
|
+
else:
|
35
|
+
return []
|
36
|
+
|
37
|
+
else:
|
38
|
+
def _get_ns_annotation_names(ns: ta.Mapping[str, ta.Any]) -> ta.Sequence[str]:
|
39
|
+
return list(ns.get('__annotations__', []))
|
40
|
+
|
41
|
+
|
42
|
+
##
|
43
|
+
|
44
|
+
|
24
45
|
class DataMeta(abc.ABCMeta):
|
25
46
|
def __new__(
|
26
47
|
mcls,
|
@@ -88,7 +109,7 @@ class DataMeta(abc.ABCMeta):
|
|
88
109
|
|
89
110
|
ofs: set[str] = set()
|
90
111
|
if any(issubclass(b, lang.Abstract) for b in bases) and nkw.get('override'):
|
91
|
-
ofs.update(a for a in namespace
|
112
|
+
ofs.update(a for a in _get_ns_annotation_names(namespace) if a not in namespace)
|
92
113
|
namespace.update((a, dc.MISSING) for a in ofs)
|
93
114
|
|
94
115
|
#
|
omlish/dataclasses/specs.py
CHANGED
omlish/dispatch/impls.py
CHANGED
@@ -20,8 +20,7 @@ T = ta.TypeVar('T')
|
|
20
20
|
|
21
21
|
|
22
22
|
def get_impl_func_cls_set(func: ta.Callable, *, arg_offset: int = 0) -> frozenset[type]:
|
23
|
-
|
24
|
-
if not ann:
|
23
|
+
if not rfl.has_annotations(func):
|
25
24
|
raise TypeError(f'Invalid impl func: {func!r}')
|
26
25
|
|
27
26
|
def erase(a):
|
omlish/dispatch/methods.py
CHANGED
@@ -101,12 +101,6 @@ class Method(ta.Generic[P, R]):
|
|
101
101
|
return wrapper
|
102
102
|
|
103
103
|
def register(self, impl: T, cls_set: frozenset[type] | None = None) -> T:
|
104
|
-
# bpo-39679: in Python <= 3.9, classmethods and staticmethods don't inherit __annotations__ of the wrapped
|
105
|
-
# function (fixed in 3.10+ as a side-effect of bpo-43682) but we need that for annotation-derived
|
106
|
-
# singledispatches. So we add that just-in-time here.
|
107
|
-
if isinstance(impl, (staticmethod, classmethod)):
|
108
|
-
impl.__annotations__ = getattr(impl.__func__, '__annotations__', {})
|
109
|
-
|
110
104
|
check.callable(impl)
|
111
105
|
if impl not in self._impls:
|
112
106
|
self._impls[impl] = cls_set # type: ignore
|
omlish/inject/impl/proxy.py
CHANGED
@@ -15,6 +15,7 @@ def _cyclic_dependency_proxy() -> tuple[type, ta.Callable[[ta.Any, ta.Any], None
|
|
15
15
|
|
16
16
|
def __init__(self, cls: ta.Any) -> None:
|
17
17
|
super().__init__()
|
18
|
+
|
18
19
|
self.__cls = cls
|
19
20
|
|
20
21
|
def __repr__(self) -> str:
|
@@ -24,6 +25,7 @@ def _cyclic_dependency_proxy() -> tuple[type, ta.Callable[[ta.Any, ta.Any], None
|
|
24
25
|
|
25
26
|
def __init__(self, cls):
|
26
27
|
super().__init__(_CyclicDependencyPlaceholder(cls))
|
28
|
+
|
27
29
|
if isinstance(cls, type):
|
28
30
|
self._self__class__ = cls # noqa
|
29
31
|
|
omlish/inject/impl/scopes.py
CHANGED
@@ -67,6 +67,7 @@ class UnscopedScopeImpl(ScopeImpl, lang.Final):
|
|
67
67
|
class SingletonScopeImpl(ScopeImpl, lang.Final):
|
68
68
|
def __init__(self) -> None:
|
69
69
|
super().__init__()
|
70
|
+
|
70
71
|
self._dct: dict[BindingImpl, ta.Any] = {}
|
71
72
|
|
72
73
|
@property
|
@@ -86,6 +87,7 @@ class SingletonScopeImpl(ScopeImpl, lang.Final):
|
|
86
87
|
class ThreadScopeImpl(ScopeImpl, lang.Final):
|
87
88
|
def __init__(self) -> None:
|
88
89
|
super().__init__()
|
90
|
+
|
89
91
|
self._local = threading.local()
|
90
92
|
|
91
93
|
@property
|
@@ -135,6 +137,7 @@ class SeededScopeImpl(ScopeImpl):
|
|
135
137
|
|
136
138
|
def __init__(self, ss: SeededScope) -> None:
|
137
139
|
super().__init__()
|
140
|
+
|
138
141
|
self._ss = check.isinstance(ss, SeededScope)
|
139
142
|
self._st: SeededScopeImpl.State | None = None
|
140
143
|
|
@@ -150,6 +153,7 @@ class SeededScopeImpl(ScopeImpl):
|
|
150
153
|
class Manager(SeededScope.Manager, lang.Final):
|
151
154
|
def __init__(self, ss: SeededScope, i: Injector) -> None:
|
152
155
|
super().__init__()
|
156
|
+
|
153
157
|
self._ss = check.isinstance(ss, SeededScope)
|
154
158
|
self._ii = check.isinstance(i, injector_.InjectorImpl)
|
155
159
|
self._ssi = check.isinstance(self._ii.get_scope_impl(self._ss), SeededScopeImpl)
|
omlish/io/compress/zstd.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import dataclasses as dc
|
2
|
+
import sys
|
2
3
|
import typing as ta
|
3
4
|
|
4
5
|
from ... import lang
|
@@ -7,10 +8,17 @@ from .codecs import make_compression_codec
|
|
7
8
|
from .codecs import make_compression_lazy_loaded_codec
|
8
9
|
|
9
10
|
|
10
|
-
if
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
if sys.version_info >= (3, 14):
|
12
|
+
if ta.TYPE_CHECKING:
|
13
|
+
from compression import zstd # noqa
|
14
|
+
else:
|
15
|
+
zstd = lang.proxy_import('compression.zstd')
|
16
|
+
|
17
|
+
else: # noqa
|
18
|
+
if ta.TYPE_CHECKING:
|
19
|
+
import zstandard as zstd
|
20
|
+
else:
|
21
|
+
zstd = lang.proxy_import('zstandard')
|
14
22
|
|
15
23
|
|
16
24
|
##
|
@@ -20,18 +28,18 @@ else:
|
|
20
28
|
class ZstdCompression(Compression):
|
21
29
|
level: int | None = None
|
22
30
|
|
23
|
-
max_output_size: int = 0
|
31
|
+
# max_output_size: int = 0
|
24
32
|
|
25
33
|
def compress(self, d: bytes) -> bytes:
|
26
|
-
return
|
34
|
+
return zstd.compress(
|
27
35
|
d,
|
28
36
|
**(dict(level=self.level) if self.level is not None else {}),
|
29
37
|
)
|
30
38
|
|
31
39
|
def decompress(self, d: bytes) -> bytes:
|
32
|
-
return
|
40
|
+
return zstd.decompress(
|
33
41
|
d,
|
34
|
-
max_output_size=self.max_output_size,
|
42
|
+
# max_output_size=self.max_output_size,
|
35
43
|
)
|
36
44
|
|
37
45
|
|
omlish/lang/__init__.py
CHANGED
omlish/lang/objects.py
CHANGED
omlish/lang/typing.py
CHANGED
@@ -59,43 +59,68 @@ def protocol_check(proto: type) -> ta.Callable[[Ty], Ty]:
|
|
59
59
|
##
|
60
60
|
|
61
61
|
|
62
|
-
|
62
|
+
_ANN_ATTRS: frozenset[str] = frozenset([
|
63
|
+
'__annotations__',
|
64
|
+
|
65
|
+
'__annotate__',
|
66
|
+
'__annotate_func__',
|
67
|
+
|
68
|
+
'__annotations_cache__',
|
69
|
+
])
|
70
|
+
|
71
|
+
_UPDATE_WRAPPER_ASSIGNED_NO_ANNS = list(frozenset(functools.WRAPPER_ASSIGNMENTS) - _ANN_ATTRS)
|
63
72
|
|
64
73
|
|
65
74
|
def _update_wrapper_no_anns(wrapper, wrapped):
|
66
|
-
functools.update_wrapper(wrapper, wrapped, assigned=
|
75
|
+
functools.update_wrapper(wrapper, wrapped, assigned=_UPDATE_WRAPPER_ASSIGNED_NO_ANNS)
|
67
76
|
return wrapper
|
68
77
|
|
69
78
|
|
79
|
+
##
|
80
|
+
|
81
|
+
|
82
|
+
_MISSING = object()
|
83
|
+
|
84
|
+
|
70
85
|
def typed_lambda(ret=_MISSING, **kw): # noqa
|
71
86
|
def inner(fn):
|
72
87
|
ns = {}
|
73
88
|
ns['__fn'] = fn
|
89
|
+
|
74
90
|
proto = ['def __lam(']
|
75
91
|
call = ['return __fn(']
|
92
|
+
|
76
93
|
pkw = dict(kw)
|
77
94
|
for i, (n, t) in enumerate(pkw.items()):
|
78
95
|
if i:
|
79
96
|
call.append(', ')
|
80
97
|
else:
|
81
98
|
proto.append('*')
|
99
|
+
|
82
100
|
ns['__ann_' + n] = t
|
83
101
|
proto.append(f', {n}: __ann_{n}')
|
84
102
|
call.append(f'{n}={n}')
|
103
|
+
|
85
104
|
proto.append(')')
|
105
|
+
|
86
106
|
if ret is not _MISSING:
|
87
107
|
ns['__ann_return'] = ret
|
88
108
|
proto.append(f' -> __ann_return')
|
109
|
+
|
89
110
|
proto.append(':')
|
90
111
|
call.append(')')
|
112
|
+
|
91
113
|
src = f'{"".join(proto)} {"".join(call)}'
|
92
114
|
exec(src, ns)
|
115
|
+
|
93
116
|
lam = _update_wrapper_no_anns(ns['__lam'], fn)
|
94
117
|
lam.__signature__ = inspect.signature(lam, follow_wrapped=False)
|
95
118
|
return lam
|
119
|
+
|
96
120
|
for k in kw:
|
97
121
|
if k.startswith('__'):
|
98
122
|
raise NameError(k)
|
123
|
+
|
99
124
|
return inner
|
100
125
|
|
101
126
|
|
@@ -103,13 +128,17 @@ def typed_partial(obj, **kw): # noqa
|
|
103
128
|
for k in kw:
|
104
129
|
if k.startswith('__'):
|
105
130
|
raise NameError(k)
|
131
|
+
|
106
132
|
sig = inspect.signature(obj)
|
133
|
+
|
107
134
|
inner = _update_wrapper_no_anns(lambda **lkw: obj(**lkw, **kw), obj)
|
135
|
+
|
108
136
|
ret = (
|
109
137
|
obj if isinstance(obj, type) else
|
110
138
|
sig.return_annotation if sig.return_annotation is not inspect.Signature.empty else
|
111
139
|
_MISSING
|
112
140
|
)
|
141
|
+
|
113
142
|
lam = typed_lambda(
|
114
143
|
ret,
|
115
144
|
**{
|
@@ -119,6 +148,7 @@ def typed_partial(obj, **kw): # noqa
|
|
119
148
|
and p.annotation is not inspect.Signature.empty
|
120
149
|
},
|
121
150
|
)(inner)
|
151
|
+
|
122
152
|
return _update_wrapper_no_anns(lam, obj)
|
123
153
|
|
124
154
|
|
omlish/lite/marshal.py
CHANGED
@@ -545,32 +545,32 @@ class ObjMarshalerManager:
|
|
545
545
|
[e] = ta.get_args(ty)
|
546
546
|
return IterableObjMarshaler(st, rec(e))
|
547
547
|
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
548
|
+
if is_union_alias(ty):
|
549
|
+
uts = frozenset(ta.get_args(ty))
|
550
|
+
if None in uts or type(None) in uts:
|
551
|
+
is_opt = True
|
552
|
+
uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
|
553
|
+
else:
|
554
|
+
is_opt = False
|
555
555
|
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
556
|
+
um: ObjMarshaler
|
557
|
+
if not uts:
|
558
|
+
raise TypeError(ty)
|
559
|
+
elif len(uts) == 1:
|
560
|
+
um = rec(check.single(uts))
|
561
|
+
else:
|
562
|
+
pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
|
563
|
+
np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
|
564
|
+
if not np_uts:
|
565
|
+
um = PrimitiveUnionObjMarshaler(pt)
|
566
|
+
elif len(np_uts) == 1:
|
567
|
+
um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
|
561
568
|
else:
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
|
568
|
-
else:
|
569
|
-
raise TypeError(ty)
|
570
|
-
|
571
|
-
if is_opt:
|
572
|
-
um = OptionalObjMarshaler(um)
|
573
|
-
return um
|
569
|
+
raise TypeError(ty)
|
570
|
+
|
571
|
+
if is_opt:
|
572
|
+
um = OptionalObjMarshaler(um)
|
573
|
+
return um
|
574
574
|
|
575
575
|
raise TypeError(ty)
|
576
576
|
|
omlish/lite/reflect.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
# ruff: noqa: UP006
|
1
|
+
# ruff: noqa: UP006 UP036 UP045
|
2
2
|
import functools
|
3
|
+
import sys
|
3
4
|
import types
|
4
5
|
import typing as ta
|
5
6
|
|
@@ -16,24 +17,40 @@ _GENERIC_ALIAS_TYPES = (
|
|
16
17
|
)
|
17
18
|
|
18
19
|
|
19
|
-
def is_generic_alias(obj, *, origin: ta.Any = None) -> bool:
|
20
|
+
def is_generic_alias(obj: ta.Any, *, origin: ta.Any = None) -> bool:
|
20
21
|
return (
|
21
22
|
isinstance(obj, _GENERIC_ALIAS_TYPES) and
|
22
23
|
(origin is None or ta.get_origin(obj) is origin)
|
23
24
|
)
|
24
25
|
|
25
26
|
|
26
|
-
is_union_alias = functools.partial(is_generic_alias, origin=ta.Union)
|
27
27
|
is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
|
28
28
|
|
29
29
|
|
30
30
|
##
|
31
31
|
|
32
32
|
|
33
|
+
_UNION_ALIAS_ORIGINS = frozenset([
|
34
|
+
ta.get_origin(ta.Optional[int]),
|
35
|
+
*(
|
36
|
+
[
|
37
|
+
ta.get_origin(int | None),
|
38
|
+
ta.get_origin(getattr(ta, 'TypeVar')('_T') | None),
|
39
|
+
] if sys.version_info >= (3, 10) else ()
|
40
|
+
),
|
41
|
+
])
|
42
|
+
|
43
|
+
|
44
|
+
def is_union_alias(obj: ta.Any) -> bool:
|
45
|
+
return ta.get_origin(obj) in _UNION_ALIAS_ORIGINS
|
46
|
+
|
47
|
+
|
48
|
+
#
|
49
|
+
|
50
|
+
|
33
51
|
def is_optional_alias(spec: ta.Any) -> bool:
|
34
52
|
return (
|
35
|
-
|
36
|
-
ta.get_origin(spec) is ta.Union and
|
53
|
+
is_union_alias(spec) and
|
37
54
|
len(ta.get_args(spec)) == 2 and
|
38
55
|
any(a in (None, type(None)) for a in ta.get_args(spec))
|
39
56
|
)
|
omlish/lite/typing.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import dataclasses as dc
|
2
|
+
import sys
|
2
3
|
import typing as ta
|
3
4
|
|
4
5
|
|
@@ -51,3 +52,13 @@ class Func3(ta.Generic[A0, A1, A2, T]):
|
|
51
52
|
|
52
53
|
def __call__(self, a0: A0, a1: A1, a2: A2) -> T:
|
53
54
|
return self.fn(a0, a1, a2)
|
55
|
+
|
56
|
+
|
57
|
+
##
|
58
|
+
|
59
|
+
|
60
|
+
_TYPING_ANNOTATIONS_ATTR = '__annotate__' if sys.version_info >= (3, 14) else '__annotations__'
|
61
|
+
|
62
|
+
|
63
|
+
def typing_annotations_attr() -> str:
|
64
|
+
return _TYPING_ANNOTATIONS_ATTR
|
omlish/reflect/__init__.py
CHANGED
omlish/reflect/inspect.py
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
"""
|
2
2
|
TODO:
|
3
3
|
- vs ta.get_type_hints?
|
4
|
+
- eval (ta.get_type_hints) vs forwardref (inspect.get_annotations)?
|
5
|
+
- remove, or at least address, get_filtered_type_hints wrt 3.14
|
4
6
|
"""
|
5
7
|
import typing as ta
|
6
8
|
|
7
9
|
from .. import check
|
8
10
|
from .. import lang
|
11
|
+
from ..lite.typing import typing_annotations_attr
|
9
12
|
|
10
13
|
|
11
14
|
if ta.TYPE_CHECKING:
|
@@ -20,6 +23,13 @@ annotationlib = lang.lazy_import('annotationlib', optional=True, cache_failure=T
|
|
20
23
|
##
|
21
24
|
|
22
25
|
|
26
|
+
def has_annotations(obj: ta.Any) -> bool:
|
27
|
+
return hasattr(obj, typing_annotations_attr())
|
28
|
+
|
29
|
+
|
30
|
+
##
|
31
|
+
|
32
|
+
|
23
33
|
def get_annotations(obj: ta.Any) -> ta.Mapping[str, ta.Any]:
|
24
34
|
if (al := annotationlib()) is not None:
|
25
35
|
return al.get_annotations(obj, format=al.Format.FORWARDREF) # noqa
|
omlish/testing/__init__.py
CHANGED
omlish/testing/testing.py
CHANGED
@@ -117,3 +117,33 @@ def raise_in_thread(thr: threading.Thread, exc: ta.Union[BaseException, ta.Type[
|
|
117
117
|
# https://github.com/python/cpython/blob/37ba7531a59a0a2b240a86f7e2adfb1b1cd8ac0c/Lib/test/test_threading.py#L182
|
118
118
|
import ctypes as ct
|
119
119
|
ct.pythonapi.PyThreadState_SetAsyncExc(ct.c_ulong(thr.ident), ct.py_object(exc)) # type: ignore
|
120
|
+
|
121
|
+
|
122
|
+
##
|
123
|
+
|
124
|
+
|
125
|
+
def run_all_tests(
|
126
|
+
obj: ta.Any,
|
127
|
+
*,
|
128
|
+
filter: ta.Optional[ta.Callable[[str, ta.Any], bool]] = None, # noqa
|
129
|
+
out: ta.Optional[ta.Any] = None,
|
130
|
+
) -> None:
|
131
|
+
if out is None:
|
132
|
+
out = sys.stderr
|
133
|
+
|
134
|
+
if isinstance(obj, ta.Mapping):
|
135
|
+
items: ta.Any = obj.items()
|
136
|
+
else:
|
137
|
+
items = ((a, getattr(obj, a)) for a in dir(obj))
|
138
|
+
|
139
|
+
for k, v in items:
|
140
|
+
if not callable(v):
|
141
|
+
continue
|
142
|
+
|
143
|
+
if filter is not None:
|
144
|
+
if not filter(k, v):
|
145
|
+
continue
|
146
|
+
elif not k.startswith('test_'):
|
147
|
+
continue
|
148
|
+
|
149
|
+
print(f'Running {k}', file=out)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: omlish
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev403
|
4
4
|
Summary: omlish
|
5
5
|
Author: wrmsr
|
6
6
|
License-Expression: BSD-3-Clause
|
@@ -22,7 +22,7 @@ Requires-Dist: trio~=0.30; extra == "all"
|
|
22
22
|
Requires-Dist: trio-asyncio~=0.15; extra == "all"
|
23
23
|
Requires-Dist: lz4~=4.4; extra == "all"
|
24
24
|
Requires-Dist: python-snappy~=0.7; extra == "all"
|
25
|
-
Requires-Dist: zstandard~=0.24; extra == "all"
|
25
|
+
Requires-Dist: zstandard~=0.24; python_version < "3.14" and extra == "all"
|
26
26
|
Requires-Dist: brotli~=1.1; extra == "all"
|
27
27
|
Requires-Dist: asttokens~=3.0; extra == "all"
|
28
28
|
Requires-Dist: executing~=2.2; extra == "all"
|
@@ -63,7 +63,7 @@ Requires-Dist: trio-asyncio~=0.15; extra == "async"
|
|
63
63
|
Provides-Extra: compress
|
64
64
|
Requires-Dist: lz4~=4.4; extra == "compress"
|
65
65
|
Requires-Dist: python-snappy~=0.7; extra == "compress"
|
66
|
-
Requires-Dist: zstandard~=0.24; extra == "compress"
|
66
|
+
Requires-Dist: zstandard~=0.24; python_version < "3.14" and extra == "compress"
|
67
67
|
Requires-Dist: brotli~=1.1; extra == "compress"
|
68
68
|
Provides-Extra: diag
|
69
69
|
Requires-Dist: asttokens~=3.0; extra == "diag"
|
@@ -1,5 +1,5 @@
|
|
1
|
-
omlish/.manifests.json,sha256=
|
2
|
-
omlish/__about__.py,sha256=
|
1
|
+
omlish/.manifests.json,sha256=ftpXGlXqsqDmBh0eWXtndZBLj8Y6QVhS5g5lKgEAf3U,8587
|
2
|
+
omlish/__about__.py,sha256=sS7mjsxVPH8xRx_p0z5qBpHSL6REnABss-XCt5y8_Pk,3601
|
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
|
@@ -19,7 +19,7 @@ omlish/algorithm/toposort.py,sha256=5wog_7XTYtg5vq4tcKtn9DcXRsEMaVobzQ6ndMK4HhQ,
|
|
19
19
|
omlish/algorithm/unify.py,sha256=jADtgVQkcGKRV4WokG0ePYe9X6BT_8RAS-WSfbBbjUk,838
|
20
20
|
omlish/argparse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
21
|
omlish/argparse/all.py,sha256=NeeMM5MIebY7XDAHaCxUzeesEoUYwsf5i9PrBUcO1cI,1057
|
22
|
-
omlish/argparse/cli.py,sha256=
|
22
|
+
omlish/argparse/cli.py,sha256=60cfq_WFLwL3YsIQxGAQ7XDi-LzNjH33RavcKdRnhUU,8737
|
23
23
|
omlish/asyncs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
24
24
|
omlish/asyncs/all.py,sha256=MjW0P9K8XBrw6AaH2X_qD5Y7hEZOF0cktqFv5BDGH-k,649
|
25
25
|
omlish/asyncs/bridge.py,sha256=QonuN2KgT7sRsmJEgRvLqtubXma9RI2xOs27X5JSQcA,10153
|
@@ -73,7 +73,7 @@ omlish/codecs/base.py,sha256=IVnJlduvhiH1imul4DPhl2gHBWS76774AV5h86dX0ls,2214
|
|
73
73
|
omlish/codecs/bytes.py,sha256=3DxyQQCvFcP3mQ5G93f_mygXEb-7I8buM8EyzUcx2Is,2155
|
74
74
|
omlish/codecs/chain.py,sha256=nbkL2nz0ZqT2lxYwSXktHh1YFTQ4Iii1Hp-fWjis6rc,532
|
75
75
|
omlish/codecs/funcs.py,sha256=or0Jogczuzk7csDTRl-HURMEjl8LXXqxxXYK45xcM5w,855
|
76
|
-
omlish/codecs/registry.py,sha256=
|
76
|
+
omlish/codecs/registry.py,sha256=DxdfV1Ays5kPB-3fG_s3_ptNVbyUfY8BgjmvEmH2JSI,4132
|
77
77
|
omlish/codecs/standard.py,sha256=eiZ4u9ep0XrA4Z_D1zJI0vmWyuN8HLrX4Se_r_Cq_ZM,60
|
78
78
|
omlish/codecs/text.py,sha256=uHhV8jBgH0iZgcrV0nl4-0a_9ofln4iFH4OXoVm2CW4,5709
|
79
79
|
omlish/collections/__init__.py,sha256=BIc806ri5Eq-kR03Ya2YfYTRI0g1rn_0haQPUqxXqys,2816
|
@@ -137,12 +137,12 @@ omlish/daemons/spawning.py,sha256=psR73zOYjMKTqNpx1bMib8uU9wAZz62tw5TaWHrTdyY,53
|
|
137
137
|
omlish/daemons/targets.py,sha256=00KmtlknMhQ5PyyVAhWl3rpeTMPym0GxvHHq6mYPZ7c,3051
|
138
138
|
omlish/daemons/waiting.py,sha256=RfgD1L33QQVbD2431dkKZGE4w6DUcGvYeRXXi8puAP4,1676
|
139
139
|
omlish/dataclasses/__init__.py,sha256=Xkf8vRYt4C0_4H9DP2rjfzkByXNVUxL4EgoSB1p0eho,2162
|
140
|
-
omlish/dataclasses/_internals.py,sha256=
|
140
|
+
omlish/dataclasses/_internals.py,sha256=_THiziiIslUyYC98Y_tZd5aZgvEF3FAGkDSwzRfcDuo,3247
|
141
141
|
omlish/dataclasses/debug.py,sha256=giBiv6aXvX0IagwNCW64qBzNjfOFr3-VmgDy_KYlb-k,29
|
142
142
|
omlish/dataclasses/errors.py,sha256=tyv3WR6az66uGGiq9FIuCHvy1Ef-G7zeMY7mMG6hy2Y,2527
|
143
143
|
omlish/dataclasses/inspect.py,sha256=EpVb50CsEUWpn70gkjBa-hI1mr5_VubHTERsofgE-Lw,4600
|
144
144
|
omlish/dataclasses/reflection.py,sha256=6BD2FUiOEtpi_2JREWyVzemjbBJdBMUm8XxQ9SVIKGs,2799
|
145
|
-
omlish/dataclasses/specs.py,sha256=
|
145
|
+
omlish/dataclasses/specs.py,sha256=VOY2uCjxLhemBuLd1VXz5KJXmZ48NL3sMJxzOhXmau8,6191
|
146
146
|
omlish/dataclasses/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
147
147
|
omlish/dataclasses/impl/configs.py,sha256=n1MOPGTulIVLMR2e4hbtU1FbHJTAVrOFXOCPU-fujVw,1442
|
148
148
|
omlish/dataclasses/impl/utils.py,sha256=jAD6IIILo70aD_s60CaqRU2YvpZxBKy4K5EG-MTiqVo,1871
|
@@ -150,18 +150,18 @@ omlish/dataclasses/impl/api/__init__.py,sha256=k5iS9QOwf_f4iOfGffYhnqDOcmEIwEUUT
|
|
150
150
|
omlish/dataclasses/impl/api/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
151
151
|
omlish/dataclasses/impl/api/classes/conversion.py,sha256=T1I-aZKui2tv8rknuw9yCvGQLTrFnzTuHDFoezhE0ko,908
|
152
152
|
omlish/dataclasses/impl/api/classes/decorator.py,sha256=LqkAjNFpUeLThnnkzt1tIYKtIf8maDCkjrZzSbABZbg,4067
|
153
|
-
omlish/dataclasses/impl/api/classes/make.py,sha256=
|
153
|
+
omlish/dataclasses/impl/api/classes/make.py,sha256=gfYOSWBno3W_5w6YMN2El3EiXuKwN0bu0t5a5GV8Qlo,5165
|
154
154
|
omlish/dataclasses/impl/api/classes/metadata.py,sha256=sMZgtoZaybfCoBKOVj7hKc-xqfU2Lca9WFrqg8UAAsE,2773
|
155
155
|
omlish/dataclasses/impl/api/classes/params.py,sha256=cJAMxLHgW6xyKURlCnDQpA-TYfOgWpVBCavie-IZTOM,2000
|
156
156
|
omlish/dataclasses/impl/api/fields/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
157
157
|
omlish/dataclasses/impl/api/fields/building.py,sha256=8ruCNRY6ZHjWSmfUCH6jabh_LfiXkIOrR3fZ3WlHinY,3326
|
158
|
-
omlish/dataclasses/impl/api/fields/constructor.py,sha256=
|
159
|
-
omlish/dataclasses/impl/api/fields/conversion.py,sha256=
|
158
|
+
omlish/dataclasses/impl/api/fields/constructor.py,sha256=5PkSFFO09hWzLmDWUaZnQFGEBl5-yNLsigZ4cMhvAz0,1681
|
159
|
+
omlish/dataclasses/impl/api/fields/conversion.py,sha256=f-dswgrBMXIy6fQL6O9u8jkVGTOWA72AE78X2TqO5jk,5544
|
160
160
|
omlish/dataclasses/impl/api/fields/metadata.py,sha256=klwez7mFsIiIQ3hxvXx5zhC53FPXqlHVzcyrHikIsCE,1938
|
161
161
|
omlish/dataclasses/impl/concerns/__init__.py,sha256=4Goga5wAOAbK6KcoHWC8jDC8M9ywgH7PfmXXxgCYCC8,208
|
162
162
|
omlish/dataclasses/impl/concerns/abc.py,sha256=ok2qE9ltgZXdf34YtLElTr7A-IYErJvVfP1-G2t2Sbc,391
|
163
163
|
omlish/dataclasses/impl/concerns/copy.py,sha256=0QoQkNNptD0mJdc4TJlD7lpDUm3kJNOH_EsqMLx_HB4,1762
|
164
|
-
omlish/dataclasses/impl/concerns/doc.py,sha256=
|
164
|
+
omlish/dataclasses/impl/concerns/doc.py,sha256=VVVEEvO-YpKOqUnhIXVTLOifmJedaB1AOKmhxvD8L0c,1727
|
165
165
|
omlish/dataclasses/impl/concerns/eq.py,sha256=PI0KKzJyIziRLgcjl8efjapf8baaRCdcuyGW83bCpEo,1720
|
166
166
|
omlish/dataclasses/impl/concerns/fields.py,sha256=JTO13HKs-swKnM7Qtb6El7FAfdLwxVLqULXAwotjus0,3318
|
167
167
|
omlish/dataclasses/impl/concerns/frozen.py,sha256=DTYB6aIZEqzYvWd3n6VF4Z40apWVOYKFbiYlTiGzaYE,4511
|
@@ -174,7 +174,7 @@ omlish/dataclasses/impl/concerns/override.py,sha256=eegJ4KRs-p3Oj5ipY1eySwXJ3vFy
|
|
174
174
|
omlish/dataclasses/impl/concerns/params.py,sha256=O_1f83gH8l_PzvOndxC4vlw2-bp8PNhNQUqB-0mJrWw,407
|
175
175
|
omlish/dataclasses/impl/concerns/replace.py,sha256=2lZCmTpz4uxMsNw8a29OzSykDqWHaINzvk13qyMpVUA,1509
|
176
176
|
omlish/dataclasses/impl/concerns/repr.py,sha256=j26G7vC147z-GJc86DbY__b1C4QPdiWlxeNNIujbqzM,3461
|
177
|
-
omlish/dataclasses/impl/concerns/slots.py,sha256=
|
177
|
+
omlish/dataclasses/impl/concerns/slots.py,sha256=onEWZRPVhiCJOoyk3lNA_PTh0w49TDyqmTmcCY_oiHs,6604
|
178
178
|
omlish/dataclasses/impl/generation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
179
179
|
omlish/dataclasses/impl/generation/base.py,sha256=adi68lJogtjx1SoxGJ5hqC-f-CMX2gWi8iALmucIwKo,686
|
180
180
|
omlish/dataclasses/impl/generation/compilation.py,sha256=SQ3wuVQRDhrDRcWMZXsD4TibmkgMUlrTY295DbIPCy4,6996
|
@@ -196,7 +196,7 @@ omlish/dataclasses/impl/processing/registry.py,sha256=qTCVUOTYjDKGTxMXYUjvck3SsY
|
|
196
196
|
omlish/dataclasses/metaclass/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
197
197
|
omlish/dataclasses/metaclass/bases.py,sha256=dX8ctd6iZPZBedEI_Ty62qHzGtixUhda9eYF5lGsTtA,1404
|
198
198
|
omlish/dataclasses/metaclass/confer.py,sha256=y2qx9FiPmu2uNUi9Z8MLDL_pSGeiuDutVVAit145RuQ,1400
|
199
|
-
omlish/dataclasses/metaclass/meta.py,sha256=
|
199
|
+
omlish/dataclasses/metaclass/meta.py,sha256=eAlM0I3KOylnwDwz39wymAYE5qZlxMXnwJKdG5qqzTg,3330
|
200
200
|
omlish/dataclasses/metaclass/specs.py,sha256=ZFt7A5S2UQi5ecFGhd9ubnRD0maswQGERMCT0jrnuDM,794
|
201
201
|
omlish/dataclasses/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
202
202
|
omlish/dataclasses/tools/as_.py,sha256=KP9ZQ6yh24QmLULGrQO2TucmEdVLtBj5YUZuUXa5HEY,2895
|
@@ -205,7 +205,7 @@ omlish/dataclasses/tools/modifiers.py,sha256=VpE16fYDIQo7dpT0oUbCuqr9WohMohmFdKH
|
|
205
205
|
omlish/dataclasses/tools/only_.py,sha256=hPpqzr9YW09YmlX_QJNU2aePHYJEIrbGCPwmnvVS_to,849
|
206
206
|
omlish/dataclasses/tools/replace.py,sha256=izM9lPT6AhEtjqn22auqaofa0j69KO7iootF-2Uj4cY,396
|
207
207
|
omlish/dataclasses/tools/repr.py,sha256=KFvF6uv2YYIKq8O3ZNbEAS1tqRQALsJ-SUlBNPd5_GI,190
|
208
|
-
omlish/dataclasses/tools/static.py,sha256=
|
208
|
+
omlish/dataclasses/tools/static.py,sha256=xLOnTLVEpOvkgKqWDtHGCpER1UaBoiS43LjH_WBh0-M,8701
|
209
209
|
omlish/diag/__init__.py,sha256=c1q8vuapGH1YiYdU300FIJXMI1MOcnLNBZXr-zc8BXk,1181
|
210
210
|
omlish/diag/asts.py,sha256=MWh9XAG3m9L10FIJCyoNT2aU4Eft6tun_x9K0riq6Dk,3332
|
211
211
|
omlish/diag/debug.py,sha256=ClED7kKXeVMyKrjGIxcq14kXk9kvUJfytBQwK9y7c4Q,1637
|
@@ -229,8 +229,8 @@ omlish/dispatch/_dispatch2.py,sha256=70k1tKKvuhxtAu6v4skECfHKIKVWrmlt7G_JKLUsKEs
|
|
229
229
|
omlish/dispatch/_dispatch3.py,sha256=9Zjd7bINAC3keiaBdssc4v5dY0-8OI6XooV2DR9U7Z0,2818
|
230
230
|
omlish/dispatch/dispatch.py,sha256=TzWihCt9Zr8wfIwVpKHVOOrYFVKpDXRevxYomtEfqYc,3176
|
231
231
|
omlish/dispatch/functions.py,sha256=cwNzGIg2ZIalEgn9I03cnJVbMTHjWloyDTaowlO3UPs,1524
|
232
|
-
omlish/dispatch/impls.py,sha256=
|
233
|
-
omlish/dispatch/methods.py,sha256=
|
232
|
+
omlish/dispatch/impls.py,sha256=3kyLw5yiYXWCN1DiqQbD1czMVrM8v1mpQ8NyD0tUrnk,1870
|
233
|
+
omlish/dispatch/methods.py,sha256=RJ-gLF2UdCQKZFhiuV4R1N3lRB_dMH3ItiHwmm-s62o,9873
|
234
234
|
omlish/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
235
235
|
omlish/docker/all.py,sha256=t5jBNZAzqCoB05-nwCuSZ6C3PBEBD6T3wsIJvIXJaRg,576
|
236
236
|
omlish/docker/cli.py,sha256=ws3ypayxdnp3nWeLww45jHG0Vwr5e4bUbLTqkpejAhc,2570
|
@@ -389,8 +389,8 @@ omlish/inject/impl/multis.py,sha256=j2QHSpJp0jPv10yZEZJwi0w62kXFQ25gkHa026xv4-Q,
|
|
389
389
|
omlish/inject/impl/origins.py,sha256=dgGdkoMN6I4DZrWjlpZYijeFsrF6Up1WPq_QSAgTtuQ,1676
|
390
390
|
omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCFQ,2613
|
391
391
|
omlish/inject/impl/providers.py,sha256=QnwhsujJFIHC0JTgd2Wlo1kP53i3CWTrj1nKU2DNxwg,2375
|
392
|
-
omlish/inject/impl/proxy.py,sha256=
|
393
|
-
omlish/inject/impl/scopes.py,sha256=
|
392
|
+
omlish/inject/impl/proxy.py,sha256=dOAPh1DAmSWLg_oGDxivUpVgltec2mvKCvlvQJp8IRo,1643
|
393
|
+
omlish/inject/impl/scopes.py,sha256=sL250qM4-hCwwO28GdynM02OMb09FMmIvo_ifYhNhj0,5909
|
394
394
|
omlish/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
395
395
|
omlish/io/abc.py,sha256=M40QB2udYpCEqmlxCcHv6FlJYJY6ymmJQBlaklYv0U8,1256
|
396
396
|
omlish/io/buffers.py,sha256=2ZAAZn-fTAtPCgtwcH_UJrSr5ZS9VNRp7yynufv0Rmk,7291
|
@@ -409,7 +409,7 @@ omlish/io/compress/lz4.py,sha256=qaze1yVXexjJyN18Adh8fbTm_5pEeyytx66KoMUNpCU,275
|
|
409
409
|
omlish/io/compress/lzma.py,sha256=qDyshBgBUSPcZpAyXiRXnqI7zx7x60UpPxn8K3nN8aM,2469
|
410
410
|
omlish/io/compress/snappy.py,sha256=JFoH_9l0Tr9AGaQ0jHRiP4TsFnG071l27mprCBcqt4c,704
|
411
411
|
omlish/io/compress/zlib.py,sha256=dE38zBY4qNihUYtPjSpNRXweiw6mB6xsYqsBJklTDXM,2364
|
412
|
-
omlish/io/compress/zstd.py,sha256=
|
412
|
+
omlish/io/compress/zstd.py,sha256=FK3XJdMaCCCOrEcQMUyBcXwY5d8NEsO7I15Wyj_WwPI,1153
|
413
413
|
omlish/io/coro/__init__.py,sha256=Mr8-GoDzOlA2sKmaDxuov2vPmjX_IeB_49I8dTSvjvA,1080
|
414
414
|
omlish/io/coro/consts.py,sha256=4r6IMLBMic6MJHVn9UiORIkkPAuxsqtzFT3KV0fatC0,33
|
415
415
|
omlish/io/coro/direct.py,sha256=Y--rP3wvBAYMeYctokb5IGd8UyQGmEFChyKISmRg5k0,294
|
@@ -425,7 +425,7 @@ omlish/iterators/iterators.py,sha256=RxW35yQ5ed8vBQ22IqpDXFx-i5JiLQdp7-pkMZXhJJ8
|
|
425
425
|
omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,472
|
426
426
|
omlish/iterators/tools.py,sha256=M16LXrJhMdsz5ea2qH0vws30ZvhQuQSCVFSLpRf_gTg,2096
|
427
427
|
omlish/iterators/unique.py,sha256=Nw0pSaNEcHAkve0ugfLPvJcirDOn9ECyC5wIL8JlJKI,1395
|
428
|
-
omlish/lang/__init__.py,sha256=
|
428
|
+
omlish/lang/__init__.py,sha256=le8N_Hj6ahtWnG6-gGEo53CK270rDA9wuhh6rUDS9ws,7232
|
429
429
|
omlish/lang/attrs.py,sha256=zFiVuGVOq88x45464T_LxDa-ZEq_RD9zJLq2zeVEBDc,5105
|
430
430
|
omlish/lang/casing.py,sha256=cFUlbDdXLhwnWwcYx4qnM5c4zGX7hIRUfcjiZbxUD28,4636
|
431
431
|
omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
|
@@ -441,7 +441,7 @@ omlish/lang/generators.py,sha256=a4D5HU_mySs2T2z3xCmE_s3t4QJkj0YRrK4-hhpGd0A,519
|
|
441
441
|
omlish/lang/iterables.py,sha256=y1SX2Co3VsOeX2wlfFF7K3rwLvF7Dtre7VY6EpfwAwA,3338
|
442
442
|
omlish/lang/lazyglobals.py,sha256=G1hwpyIgM4PUkVJ_St3K-EdQkHQdWpFOcXao6I5LwyY,1435
|
443
443
|
omlish/lang/maysyncs.py,sha256=kULOW2M9PFhLd1TdtmGGQstPgrJpl--JUv9FOHWl4f8,894
|
444
|
-
omlish/lang/objects.py,sha256=
|
444
|
+
omlish/lang/objects.py,sha256=E-ApDJUnLWXJX9ZwWU2qVhYF0H2fg7w08wWYWxbkdNI,6117
|
445
445
|
omlish/lang/outcomes.py,sha256=0PqxoKaGbBXU9UYZ6AE2QSq94Z-gFDt6wYdp0KomNQw,8712
|
446
446
|
omlish/lang/overrides.py,sha256=IBzK6ljfLX6TLgIyKTSjhqTLcuKRkQNVtEOnBLS4nuA,2095
|
447
447
|
omlish/lang/params.py,sha256=sfbNoGrKCsAtubFufj_uh_WKshIgA8fqJ4PmLH1PH00,6639
|
@@ -450,7 +450,7 @@ omlish/lang/resolving.py,sha256=ei9LDyJexsMMHB9z8diUkNmynWhd_da7h7TqrMYM6lA,1611
|
|
450
450
|
omlish/lang/resources.py,sha256=QtuybNgdw5e2QL3jtKi-5ENH98JemsMRi21A40tYrzA,2844
|
451
451
|
omlish/lang/strings.py,sha256=TY-v0iGu6BxEKb99YS-VmIJqc-sTAqMv7mCDJQALMnI,4550
|
452
452
|
omlish/lang/sys.py,sha256=KPe1UOXk1VxlOYt_aLmhN0KqsA4wnP-4nm4WEwO49pw,411
|
453
|
-
omlish/lang/typing.py,sha256=
|
453
|
+
omlish/lang/typing.py,sha256=A4CCZ3U6cCDfUBqgTxGj8qnl-e-r6UJWjJ0Y6XYxT3c,4077
|
454
454
|
omlish/lang/cached/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
455
455
|
omlish/lang/cached/function.py,sha256=epDPy9WyGc_VaKTrEQJ3dZun-NLsvdvbbNd7jbaUM2c,11730
|
456
456
|
omlish/lang/cached/property.py,sha256=WHYyg4-6EA86TcNMfbXTjVhjEZPc0kngt9hfY3WN5w8,2768
|
@@ -487,11 +487,11 @@ omlish/lite/imports.py,sha256=GyEDKL-WuHtdOKIL-cc8aFd0-bHwZFDEjAB52ItabX0,1341
|
|
487
487
|
omlish/lite/inject.py,sha256=xvmLmtD3_2INnkurJQv76_Rkh9usbApEQrXJ4cvuVAk,29019
|
488
488
|
omlish/lite/json.py,sha256=m0Ce9eqUZG23-H7-oOp8n1sf4fzno5vtK4AK_4Vc-Mg,706
|
489
489
|
omlish/lite/logs.py,sha256=CWFG0NKGhqNeEgryF5atN2gkPYbUdTINEw_s1phbINM,51
|
490
|
-
omlish/lite/marshal.py,sha256=
|
490
|
+
omlish/lite/marshal.py,sha256=K_wnZwfC8cftGILyE3RlmzQEYuZOfzkMLKey41zuwtM,20296
|
491
491
|
omlish/lite/maybes.py,sha256=0p_fzb6yiOjEpvMKaQ53Q6CH1VPW1or7v7Lt1JIKcgM,4359
|
492
492
|
omlish/lite/maysyncs.py,sha256=MT3zF5kQ5rNlWU7db9Q_uXSM8K2C8LK85PIgdBsJyGE,7251
|
493
493
|
omlish/lite/pycharm.py,sha256=FRHGcCDo42UzZXqNwW_DkhI-6kb_CmJKPiQ8F6mYkLA,1174
|
494
|
-
omlish/lite/reflect.py,sha256=
|
494
|
+
omlish/lite/reflect.py,sha256=gI-Qlws9V-jND7kvCQFaIhBFrndVpDsikTQ7C6U2z3w,2434
|
495
495
|
omlish/lite/reprs.py,sha256=2Bc7ukhKvYNTKmxPIuv9glZIph13C37y_W4fg9pBnu8,2006
|
496
496
|
omlish/lite/resources.py,sha256=YNSmX1Ohck1aoWRs55a-o5ChVbFJIQhtbqE-XwF55Oc,326
|
497
497
|
omlish/lite/runtime.py,sha256=J59skBq9kwo1H2s36jAk-k87eKPUtua6CmuXh-3dgmE,464
|
@@ -500,7 +500,7 @@ omlish/lite/strings.py,sha256=QGxT1Yh4oI8ycsfeobxnjEhvDob_GiAKLeIhZwo1j24,1986
|
|
500
500
|
omlish/lite/timeouts.py,sha256=mCFOCkOu_nmSDrccsm-wYY7uhyLDzAMyvrAO07y2vBE,4975
|
501
501
|
omlish/lite/timing.py,sha256=aVu3hEDB_jyTF_ryZI7iU-xg4q8CNwqpp9Apfru_iwY,196
|
502
502
|
omlish/lite/types.py,sha256=QM9whf55r7TmmQBRApIWSlyVKsl1p_jcut_YheyZMFY,146
|
503
|
-
omlish/lite/typing.py,sha256=
|
503
|
+
omlish/lite/typing.py,sha256=m2CyJTz2OVOCPRvp-0UuEx7oleZgXqs3rYXijE0bTsA,1280
|
504
504
|
omlish/logs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
505
505
|
omlish/logs/abc.py,sha256=ho4ABKYMKX-V7g4sp1BByuOLzslYzLlQ0MESmjEpT-o,8005
|
506
506
|
omlish/logs/all.py,sha256=Er2NIcDvlMpuAcRr9b_uMHeoERU7I6lu5oLrDGRdV0U,728
|
@@ -601,8 +601,8 @@ omlish/os/pidfiles/cli.py,sha256=dAKukx4mrarH8t7KZM4n_XSfTk3ycShGAFqRrirK5dw,207
|
|
601
601
|
omlish/os/pidfiles/manager.py,sha256=oOnL90ttOG5ba_k9XPJ18reP7M5S-_30ln4OAfYV5W8,2357
|
602
602
|
omlish/os/pidfiles/pidfile.py,sha256=KlqrW7I-lYVDNJspFHE89i_A0HTTteT5B99b7vpTfNs,4400
|
603
603
|
omlish/os/pidfiles/pinning.py,sha256=u81LRe3-6Xd6K_dsVbbEPVdsUvY7zy3Xv7413-5NBLQ,6627
|
604
|
-
omlish/reflect/__init__.py,sha256=
|
605
|
-
omlish/reflect/inspect.py,sha256=
|
604
|
+
omlish/reflect/__init__.py,sha256=ZUqqboWj5jLMVP1ljE5D9CnmXuSnsaWkKT3N9BKO0Mo,874
|
605
|
+
omlish/reflect/inspect.py,sha256=dUrVz8VfAdLVFtFpW416DxzVC17D80cvFb_g2Odzgq8,1823
|
606
606
|
omlish/reflect/ops.py,sha256=F77OTaw0Uw020cJCWX_Q4kL3wvxlJ8jV8wz7BctGL_k,2619
|
607
607
|
omlish/reflect/subst.py,sha256=_lfNS2m2UiJgqARQtmGLTGo7CrSm9OMvVzt6GWOEX6M,4590
|
608
608
|
omlish/reflect/types.py,sha256=uMcxUHVJWYYcmF9ODeJ9WfcQ0DejsqsEVIX5K0HjJSM,12018
|
@@ -778,8 +778,8 @@ omlish/term/vt100/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
|
|
778
778
|
omlish/term/vt100/c.py,sha256=93HARU6Dd1rVF-n8cAyXqkEqleYLcofuLgSUNd6-GbU,3537
|
779
779
|
omlish/term/vt100/states.py,sha256=OxPUxfFTcfz56MhtDgIigEApChOtN6XO1g6R2H08mu4,8303
|
780
780
|
omlish/term/vt100/terminal.py,sha256=KUlg331ele7P6SHsBKdbpdQFDKsxSply1Ds27NkppTs,9359
|
781
|
-
omlish/testing/__init__.py,sha256=
|
782
|
-
omlish/testing/testing.py,sha256=
|
781
|
+
omlish/testing/__init__.py,sha256=h8GMv0PhVyMECsQoYuqoBzHjYO6UJyXBZvnozzUg9M8,171
|
782
|
+
omlish/testing/testing.py,sha256=tlBeqVmzGhjRbWygJt3mZljq662qR4nAaGNE2VoAey4,3617
|
783
783
|
omlish/testing/pytest/__init__.py,sha256=i4ti6Q2rVYJ-XBk9UYDfUUagCrEDTC5jOeSykBjYYZQ,234
|
784
784
|
omlish/testing/pytest/helpers.py,sha256=HxiKvpJQ4b6WCiQXOqQTqKbmr7CMAgCF6hViT6pfIuw,202
|
785
785
|
omlish/testing/pytest/marks.py,sha256=g0RgdvFAd3xog3kKYyb9QtiUVPrEG3JX_abhDNrHJy0,285
|
@@ -908,9 +908,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
|
|
908
908
|
omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
|
909
909
|
omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
|
910
910
|
omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
|
911
|
-
omlish-0.0.0.
|
912
|
-
omlish-0.0.0.
|
913
|
-
omlish-0.0.0.
|
914
|
-
omlish-0.0.0.
|
915
|
-
omlish-0.0.0.
|
916
|
-
omlish-0.0.0.
|
911
|
+
omlish-0.0.0.dev403.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
912
|
+
omlish-0.0.0.dev403.dist-info/METADATA,sha256=AFfMDWuU93a0pAwqEi7fa2ctw0_KONoRYd-MEI5u9NI,18881
|
913
|
+
omlish-0.0.0.dev403.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
914
|
+
omlish-0.0.0.dev403.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
915
|
+
omlish-0.0.0.dev403.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
916
|
+
omlish-0.0.0.dev403.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|