omlish 0.0.0.dev291__py3-none-any.whl → 0.0.0.dev293__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 +2 -2
- omlish/configs/all.py +4 -0
- omlish/configs/classes.py +3 -0
- omlish/dataclasses/api/classes/decorator.py +35 -1
- omlish/dataclasses/api/classes/make.py +8 -0
- omlish/dataclasses/api/classes/params.py +20 -0
- omlish/dataclasses/concerns/repr.py +42 -22
- omlish/dataclasses/metaclass/bases.py +15 -0
- omlish/dataclasses/metaclass/confer.py +5 -0
- omlish/dataclasses/specs.py +4 -0
- omlish/dataclasses/utils.py +1 -1
- omlish/formats/json5/parsing.py +1 -2
- omlish/lang/__init__.py +3 -3
- omlish/lang/contextmanagers.py +0 -16
- omlish/lite/contextmanagers.py +6 -3
- omlish/secrets/all.py +2 -0
- omlish/secrets/secrets.py +1 -0
- omlish/subprocesses/editor.py +97 -0
- omlish/text/filecache.py +3 -3
- omlish/typedvalues/__init__.py +2 -0
- omlish/typedvalues/accessor.py +1 -1
- omlish/typedvalues/collection.py +18 -4
- omlish/typedvalues/marshal.py +6 -7
- omlish/typedvalues/reflect.py +2 -3
- omlish/typedvalues/values.py +26 -10
- {omlish-0.0.0.dev291.dist-info → omlish-0.0.0.dev293.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev291.dist-info → omlish-0.0.0.dev293.dist-info}/RECORD +31 -30
- {omlish-0.0.0.dev291.dist-info → omlish-0.0.0.dev293.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev291.dist-info → omlish-0.0.0.dev293.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev291.dist-info → omlish-0.0.0.dev293.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev291.dist-info → omlish-0.0.0.dev293.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
omlish/configs/all.py
CHANGED
omlish/configs/classes.py
CHANGED
@@ -15,7 +15,9 @@ from ...utils import class_decorator
|
|
15
15
|
from ..fields.building import build_cls_std_fields
|
16
16
|
from ..fields.conversion import std_field_to_field_spec
|
17
17
|
from .metadata import extract_cls_metadata
|
18
|
+
from .params import STD_PARAM_DEFAULTS
|
18
19
|
from .params import build_spec_std_params
|
20
|
+
from .params import get_class_spec
|
19
21
|
|
20
22
|
|
21
23
|
##
|
@@ -47,11 +49,19 @@ def dataclass(
|
|
47
49
|
cache_hash: bool | None = None,
|
48
50
|
generic_init: bool | None = None,
|
49
51
|
override: bool | None = None,
|
52
|
+
|
50
53
|
repr_id: bool | None = None,
|
54
|
+
terse_repr: bool | None = None,
|
55
|
+
|
56
|
+
allow_redundant_decorator: bool | None = None,
|
51
57
|
|
52
58
|
#
|
53
59
|
|
54
60
|
_plan_only: bool = False,
|
61
|
+
|
62
|
+
#
|
63
|
+
|
64
|
+
_kwargs: ta.Mapping[str, ta.Any] | None = None,
|
55
65
|
):
|
56
66
|
if isinstance(metadata, ta.Mapping):
|
57
67
|
raise TypeError(metadata)
|
@@ -60,6 +70,27 @@ def dataclass(
|
|
60
70
|
|
61
71
|
cls = check.not_none(cls)
|
62
72
|
|
73
|
+
if STD_PARAMS_ATTR in cls.__dict__:
|
74
|
+
if (xcs := get_class_spec(cls)) is not None and xcs.allow_redundant_decorator:
|
75
|
+
xpd = {
|
76
|
+
a: getattr(xcs, a)
|
77
|
+
for a in STD_PARAM_DEFAULTS
|
78
|
+
}
|
79
|
+
|
80
|
+
dpd = {
|
81
|
+
**STD_PARAM_DEFAULTS,
|
82
|
+
**{k: v for k, v in (_kwargs or {}).items() if k in STD_PARAM_DEFAULTS},
|
83
|
+
}
|
84
|
+
|
85
|
+
if xpd == dpd:
|
86
|
+
check.in_(STD_FIELDS_ATTR, cls.__dict__)
|
87
|
+
return cls
|
88
|
+
|
89
|
+
raise TypeError(cls)
|
90
|
+
|
91
|
+
check.not_in(STD_PARAMS_ATTR, cls.__dict__)
|
92
|
+
check.not_in(STD_FIELDS_ATTR, cls.__dict__)
|
93
|
+
|
63
94
|
#
|
64
95
|
|
65
96
|
fields = build_cls_std_fields(
|
@@ -122,7 +153,11 @@ def dataclass(
|
|
122
153
|
cache_hash=cache_hash,
|
123
154
|
generic_init=generic_init,
|
124
155
|
override=override,
|
156
|
+
|
125
157
|
repr_id=repr_id,
|
158
|
+
terse_repr=terse_repr,
|
159
|
+
|
160
|
+
allow_redundant_decorator=allow_redundant_decorator,
|
126
161
|
),
|
127
162
|
},
|
128
163
|
|
@@ -133,7 +168,6 @@ def dataclass(
|
|
133
168
|
#
|
134
169
|
|
135
170
|
std_params = build_spec_std_params(cs)
|
136
|
-
check.not_in(STD_PARAMS_ATTR, cls.__dict__)
|
137
171
|
setattr(cls, STD_PARAMS_ATTR, std_params)
|
138
172
|
|
139
173
|
#
|
@@ -39,7 +39,11 @@ def make_dataclass( # noqa
|
|
39
39
|
cache_hash: bool | None = None,
|
40
40
|
generic_init: bool | None = None,
|
41
41
|
override: bool | None = None,
|
42
|
+
|
42
43
|
repr_id: bool | None = None,
|
44
|
+
terse_repr: bool | None = None,
|
45
|
+
|
46
|
+
allow_redundant_decorator: bool | None = None,
|
43
47
|
):
|
44
48
|
if namespace is None:
|
45
49
|
namespace = {}
|
@@ -105,5 +109,9 @@ def make_dataclass( # noqa
|
|
105
109
|
cache_hash=cache_hash,
|
106
110
|
generic_init=generic_init,
|
107
111
|
override=override,
|
112
|
+
|
108
113
|
repr_id=repr_id,
|
114
|
+
terse_repr=terse_repr,
|
115
|
+
|
116
|
+
allow_redundant_decorator=allow_redundant_decorator,
|
109
117
|
)
|
@@ -9,6 +9,26 @@ from ...specs import ClassSpec
|
|
9
9
|
##
|
10
10
|
|
11
11
|
|
12
|
+
STD_PARAM_DEFAULTS: ta.Mapping[str, ta.Any] = dict(
|
13
|
+
init=True,
|
14
|
+
repr=True, # noqa
|
15
|
+
eq=True,
|
16
|
+
order=False,
|
17
|
+
unsafe_hash=False,
|
18
|
+
frozen=False,
|
19
|
+
|
20
|
+
match_args=True,
|
21
|
+
kw_only=False,
|
22
|
+
slots=False,
|
23
|
+
weakref_slot=False,
|
24
|
+
)
|
25
|
+
|
26
|
+
STD_PARAM_ATTRS: tuple[str, ...] = tuple(STD_PARAM_DEFAULTS)
|
27
|
+
|
28
|
+
|
29
|
+
##
|
30
|
+
|
31
|
+
|
12
32
|
class SpecDataclassParams(StdParams):
|
13
33
|
__slots__ = (*StdParams.__slots__, '_spec')
|
14
34
|
|
@@ -11,25 +11,27 @@ from ..generation.ops import OpRef
|
|
11
11
|
from ..generation.ops import Ref
|
12
12
|
from ..generation.registry import register_generator_type
|
13
13
|
from ..processing.base import ProcessingContext
|
14
|
+
from ..specs import FieldSpec
|
14
15
|
from ..specs import FieldType
|
15
16
|
from ..specs import ReprFn
|
17
|
+
from .fields import InitFields
|
16
18
|
|
17
19
|
|
18
20
|
##
|
19
21
|
|
20
22
|
|
21
|
-
@dc.dataclass(frozen=True)
|
23
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
22
24
|
class ReprPlan(Plan):
|
23
|
-
|
25
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
26
|
+
class Field:
|
27
|
+
name: str
|
28
|
+
kw_only: bool = False
|
29
|
+
fn: OpRef[ReprFn] | None = None
|
24
30
|
|
25
|
-
|
26
|
-
class Fn:
|
27
|
-
field: str
|
28
|
-
fn: OpRef[ReprFn]
|
29
|
-
|
30
|
-
fns: tuple[Fn, ...] = ()
|
31
|
+
fields: tuple[Field, ...]
|
31
32
|
|
32
33
|
id: bool = False
|
34
|
+
terse: bool = False
|
33
35
|
|
34
36
|
|
35
37
|
@register_generator_type(ReprPlan)
|
@@ -38,22 +40,37 @@ class ReprGenerator(Generator[ReprPlan]):
|
|
38
40
|
if not ctx.cs.repr or '__repr__' in ctx.cls.__dict__:
|
39
41
|
return None
|
40
42
|
|
41
|
-
|
43
|
+
ifs = ctx[InitFields]
|
44
|
+
fs: ta.Sequence[FieldSpec]
|
45
|
+
if ctx.cs.terse_repr:
|
46
|
+
# If terse repr will match init param order
|
47
|
+
fs = ifs.all
|
48
|
+
else:
|
49
|
+
# Otherwise default to dc.fields() order
|
50
|
+
fs = sorted(ctx.cs.fields, key=lambda f: f.repr_priority or 0)
|
42
51
|
|
43
52
|
orm = {}
|
44
|
-
rfs: list[ReprPlan.
|
53
|
+
rfs: list[ReprPlan.Field] = []
|
45
54
|
for i, f in enumerate(fs):
|
46
|
-
if f.
|
55
|
+
if not (f.field_type is FieldType.INSTANCE and f.repr):
|
47
56
|
continue
|
48
|
-
|
49
|
-
|
50
|
-
|
57
|
+
|
58
|
+
fnr: OpRef | None = None
|
59
|
+
if f.repr_fn is not None:
|
60
|
+
fnr = OpRef(f'repr.fns.{i}.fn')
|
61
|
+
orm[fnr] = f.repr_fn
|
62
|
+
|
63
|
+
rfs.append(ReprPlan.Field(
|
64
|
+
name=f.name,
|
65
|
+
kw_only=f in ifs.kw_only,
|
66
|
+
fn=fnr,
|
67
|
+
))
|
51
68
|
|
52
69
|
return PlanResult(
|
53
70
|
ReprPlan(
|
54
|
-
fields=tuple(
|
55
|
-
fns=tuple(rfs),
|
71
|
+
fields=tuple(rfs),
|
56
72
|
id=ctx.cs.repr_id,
|
73
|
+
terse=ctx.cs.terse_repr,
|
57
74
|
),
|
58
75
|
orm,
|
59
76
|
)
|
@@ -63,17 +80,20 @@ class ReprGenerator(Generator[ReprPlan]):
|
|
63
80
|
|
64
81
|
part_lines: list[str] = []
|
65
82
|
|
66
|
-
rfd = {rf.field: rf.fn for rf in pl.fns}
|
67
83
|
for f in pl.fields:
|
68
|
-
|
69
|
-
|
84
|
+
pfx = ''
|
85
|
+
if not (pl.terse and not f.kw_only):
|
86
|
+
pfx = f'{f.name}='
|
87
|
+
|
88
|
+
if f.fn is not None:
|
89
|
+
ors.add(f.fn)
|
70
90
|
part_lines.extend([
|
71
|
-
f' if (s := {
|
72
|
-
f' parts.append(f"{
|
91
|
+
f' if (s := {f.fn.ident()}(self.{f.name})) is not None:',
|
92
|
+
f' parts.append(f"{pfx}{{s}}")',
|
73
93
|
])
|
74
94
|
else:
|
75
95
|
part_lines.append(
|
76
|
-
f' parts.append(f"{
|
96
|
+
f' parts.append(f"{pfx}{{self.{f.name}!r}}")',
|
77
97
|
)
|
78
98
|
|
79
99
|
return [
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import typing as ta
|
2
2
|
|
3
|
+
from ..api.classes.decorator import dataclass
|
3
4
|
from ..concerns.frozen import unchecked_frozen_base
|
4
5
|
from .meta import DataMeta
|
5
6
|
from .specs import get_metaclass_spec
|
@@ -16,9 +17,11 @@ T = ta.TypeVar('T')
|
|
16
17
|
class Data(
|
17
18
|
eq=False,
|
18
19
|
order=False,
|
20
|
+
allow_redundant_decorator=True,
|
19
21
|
confer=frozenset([
|
20
22
|
'confer',
|
21
23
|
'final_subclasses',
|
24
|
+
'allow_redundant_decorator',
|
22
25
|
]),
|
23
26
|
metaclass=DataMeta,
|
24
27
|
):
|
@@ -31,6 +34,9 @@ class Data(
|
|
31
34
|
super().__init_subclass__(**kwargs)
|
32
35
|
|
33
36
|
|
37
|
+
#
|
38
|
+
|
39
|
+
|
34
40
|
class Frozen(
|
35
41
|
Data,
|
36
42
|
frozen=True,
|
@@ -47,6 +53,9 @@ class Frozen(
|
|
47
53
|
pass
|
48
54
|
|
49
55
|
|
56
|
+
#
|
57
|
+
|
58
|
+
|
50
59
|
class Case(
|
51
60
|
Frozen,
|
52
61
|
abstract=True,
|
@@ -57,13 +66,19 @@ class Case(
|
|
57
66
|
pass
|
58
67
|
|
59
68
|
|
69
|
+
#
|
70
|
+
|
71
|
+
|
72
|
+
@dataclass(frozen=True)
|
60
73
|
class Box(
|
61
74
|
Frozen,
|
62
75
|
ta.Generic[T],
|
63
76
|
generic_init=True,
|
77
|
+
terse_repr=True,
|
64
78
|
confer=frozenset([
|
65
79
|
*get_metaclass_spec(Frozen).confer,
|
66
80
|
'generic_init',
|
81
|
+
'terse_repr',
|
67
82
|
]),
|
68
83
|
):
|
69
84
|
v: T
|
omlish/dataclasses/specs.py
CHANGED
@@ -183,7 +183,11 @@ class ClassSpec(lang.Final):
|
|
183
183
|
cache_hash: bool = False
|
184
184
|
generic_init: bool = False
|
185
185
|
override: bool = False
|
186
|
+
|
186
187
|
repr_id: bool = False
|
188
|
+
terse_repr: bool = False
|
189
|
+
|
190
|
+
allow_redundant_decorator: bool = False
|
187
191
|
|
188
192
|
##
|
189
193
|
# callbacks
|
omlish/dataclasses/utils.py
CHANGED
@@ -75,7 +75,7 @@ def class_decorator(fn):
|
|
75
75
|
@functools.wraps(fn)
|
76
76
|
def inner(cls=None, *args, **kwargs):
|
77
77
|
if cls is None:
|
78
|
-
return lambda cls: fn(cls, *args, **kwargs) # noqa
|
78
|
+
return lambda cls: fn(cls, *args, _kwargs=kwargs, **kwargs) # noqa
|
79
79
|
return fn(cls, *args, **kwargs)
|
80
80
|
return inner
|
81
81
|
|
omlish/formats/json5/parsing.py
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# ruff: noqa: N802 N803
|
2
2
|
import typing as ta
|
3
3
|
|
4
|
-
from
|
5
|
-
|
4
|
+
from ... import antlr
|
6
5
|
from ._antlr.Json5Lexer import Json5Lexer # type: ignore
|
7
6
|
from ._antlr.Json5Parser import Json5Parser # type: ignore
|
8
7
|
from ._antlr.Json5Visitor import Json5Visitor # type: ignore
|
omlish/lang/__init__.py
CHANGED
@@ -96,12 +96,10 @@ from .contextmanagers import ( # noqa
|
|
96
96
|
NOP_CONTEXT_MANAGER,
|
97
97
|
NopContextManager,
|
98
98
|
Timer,
|
99
|
-
a_defer,
|
100
99
|
breakpoint_on_exception,
|
101
100
|
context_var_setting,
|
102
101
|
context_wrapped,
|
103
102
|
default_lock,
|
104
|
-
defer,
|
105
103
|
disposing,
|
106
104
|
maybe_managing,
|
107
105
|
)
|
@@ -296,9 +294,11 @@ from .typing import ( # noqa
|
|
296
294
|
##
|
297
295
|
|
298
296
|
from ..lite.contextmanagers import ( # noqa
|
299
|
-
attr_setting,
|
300
297
|
AsyncExitStacked,
|
301
298
|
ExitStacked,
|
299
|
+
adefer,
|
300
|
+
attr_setting,
|
301
|
+
defer,
|
302
302
|
)
|
303
303
|
|
304
304
|
from ..lite.imports import ( # noqa
|
omlish/lang/contextmanagers.py
CHANGED
@@ -119,22 +119,6 @@ class AsyncContextManager(abc.ABC, ta.Generic[T]):
|
|
119
119
|
##
|
120
120
|
|
121
121
|
|
122
|
-
@contextlib.contextmanager
|
123
|
-
def defer(fn: ta.Callable) -> ta.Generator[ta.Callable, None, None]:
|
124
|
-
try:
|
125
|
-
yield fn
|
126
|
-
finally:
|
127
|
-
fn()
|
128
|
-
|
129
|
-
|
130
|
-
@contextlib.asynccontextmanager
|
131
|
-
async def a_defer(fn: ta.Awaitable) -> ta.AsyncGenerator[ta.Awaitable, None]:
|
132
|
-
try:
|
133
|
-
yield fn
|
134
|
-
finally:
|
135
|
-
await fn
|
136
|
-
|
137
|
-
|
138
122
|
@contextlib.contextmanager
|
139
123
|
def maybe_managing(obj: T) -> ta.Iterator[T]:
|
140
124
|
if isinstance(obj, ta.ContextManager):
|
omlish/lite/contextmanagers.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# ruff: noqa: UP007
|
2
2
|
import contextlib
|
3
|
+
import functools
|
3
4
|
import sys
|
4
5
|
import typing as ta
|
5
6
|
|
@@ -146,7 +147,9 @@ class AsyncExitStacked:
|
|
146
147
|
|
147
148
|
|
148
149
|
@contextlib.contextmanager
|
149
|
-
def defer(fn: ta.Callable) -> ta.Generator[ta.Callable, None, None]:
|
150
|
+
def defer(fn: ta.Callable, *args: ta.Any, **kwargs: ta.Any) -> ta.Generator[ta.Callable, None, None]:
|
151
|
+
if args or kwargs:
|
152
|
+
fn = functools.partial(fn, *args, **kwargs)
|
150
153
|
try:
|
151
154
|
yield fn
|
152
155
|
finally:
|
@@ -154,11 +157,11 @@ def defer(fn: ta.Callable) -> ta.Generator[ta.Callable, None, None]:
|
|
154
157
|
|
155
158
|
|
156
159
|
@contextlib.asynccontextmanager
|
157
|
-
async def adefer(fn: ta.
|
160
|
+
async def adefer(fn: ta.Awaitable) -> ta.AsyncGenerator[ta.Awaitable, None]:
|
158
161
|
try:
|
159
162
|
yield fn
|
160
163
|
finally:
|
161
|
-
await fn
|
164
|
+
await fn
|
162
165
|
|
163
166
|
|
164
167
|
##
|
omlish/secrets/all.py
CHANGED
omlish/secrets/secrets.py
CHANGED
@@ -0,0 +1,97 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
# @omlish-lite
|
3
|
+
import dataclasses as dc
|
4
|
+
import os
|
5
|
+
import tempfile
|
6
|
+
import typing as ta
|
7
|
+
|
8
|
+
from ..lite.cached import cached_nullary
|
9
|
+
from ..lite.contextmanagers import ExitStacked
|
10
|
+
from ..lite.contextmanagers import defer
|
11
|
+
from .run import SubprocessRun
|
12
|
+
from .run import SubprocessRunnable
|
13
|
+
from .run import SubprocessRunOutput
|
14
|
+
|
15
|
+
|
16
|
+
##
|
17
|
+
|
18
|
+
|
19
|
+
class EditTextWithUserEditor(SubprocessRunnable, ExitStacked):
|
20
|
+
def __init__(self, initial_text: str = '') -> None:
|
21
|
+
super().__init__()
|
22
|
+
|
23
|
+
self._initial_text = initial_text
|
24
|
+
|
25
|
+
@dc.dataclass(frozen=True)
|
26
|
+
class _TempFile:
|
27
|
+
path: str
|
28
|
+
before_mtime: float
|
29
|
+
|
30
|
+
@cached_nullary
|
31
|
+
def _temp_file(self) -> _TempFile:
|
32
|
+
with tempfile.NamedTemporaryFile(
|
33
|
+
mode='r+',
|
34
|
+
delete=False,
|
35
|
+
) as ntf:
|
36
|
+
ntf.write(self._initial_text)
|
37
|
+
ntf.flush()
|
38
|
+
before_mtime = os.stat(ntf.name).st_mtime
|
39
|
+
|
40
|
+
self._enter_context(defer(os.unlink, ntf.name)) # noqa
|
41
|
+
|
42
|
+
return EditTextWithUserEditor._TempFile(
|
43
|
+
ntf.name,
|
44
|
+
before_mtime,
|
45
|
+
)
|
46
|
+
|
47
|
+
def make_run(self) -> SubprocessRun:
|
48
|
+
tf = self._temp_file()
|
49
|
+
|
50
|
+
editor = os.environ.get('EDITOR', 'vi')
|
51
|
+
|
52
|
+
return SubprocessRun.of(
|
53
|
+
editor,
|
54
|
+
tf.path,
|
55
|
+
)
|
56
|
+
|
57
|
+
def handle_run_output(self, output: SubprocessRunOutput) -> ta.Optional[str]:
|
58
|
+
tf = self._temp_file()
|
59
|
+
|
60
|
+
if output.returncode != 0:
|
61
|
+
return None
|
62
|
+
|
63
|
+
after_mtime = os.stat(tf.path).st_mtime
|
64
|
+
|
65
|
+
if after_mtime == tf.before_mtime:
|
66
|
+
# No changes made; assuming cancel.
|
67
|
+
return None
|
68
|
+
|
69
|
+
with open(tf.path) as f:
|
70
|
+
content = f.read().strip()
|
71
|
+
if not content:
|
72
|
+
# Empty file; assuming cancel.
|
73
|
+
return None
|
74
|
+
|
75
|
+
return content
|
76
|
+
|
77
|
+
|
78
|
+
def edit_text_with_user_editor(
|
79
|
+
initial_text: str = '',
|
80
|
+
subprocesses: ta.Optional[ta.Any] = None, # AbstractSubprocesses
|
81
|
+
) -> ta.Optional[str]:
|
82
|
+
with EditTextWithUserEditor(initial_text) as cmd:
|
83
|
+
return cmd.run(subprocesses)
|
84
|
+
|
85
|
+
|
86
|
+
##
|
87
|
+
|
88
|
+
|
89
|
+
if __name__ == '__main__':
|
90
|
+
def _main() -> None:
|
91
|
+
text = edit_text_with_user_editor('# Write your message here.\n')
|
92
|
+
if text is not None:
|
93
|
+
print('User submitted:\n', text)
|
94
|
+
else:
|
95
|
+
print('Operation canceled.')
|
96
|
+
|
97
|
+
_main()
|
omlish/text/filecache.py
CHANGED
@@ -131,7 +131,7 @@ class TextFileCache:
|
|
131
131
|
|
132
132
|
#
|
133
133
|
|
134
|
-
def
|
134
|
+
def normalize_path(self, path: str) -> str:
|
135
135
|
return abs_real_path(path)
|
136
136
|
|
137
137
|
#
|
@@ -217,7 +217,7 @@ class TextFileCache:
|
|
217
217
|
check_stat: bool = False,
|
218
218
|
or_raise: bool = False,
|
219
219
|
) -> Entry:
|
220
|
-
path = self.
|
220
|
+
path = self.normalize_path(path)
|
221
221
|
|
222
222
|
with self._lock:
|
223
223
|
return self._get_entry(
|
@@ -229,7 +229,7 @@ class TextFileCache:
|
|
229
229
|
#
|
230
230
|
|
231
231
|
def invalidate(self, path: str) -> bool:
|
232
|
-
path = self.
|
232
|
+
path = self.normalize_path(path)
|
233
233
|
|
234
234
|
with self._lock:
|
235
235
|
return self._dct.pop(path, None) is not None
|
omlish/typedvalues/__init__.py
CHANGED
omlish/typedvalues/accessor.py
CHANGED
@@ -32,7 +32,7 @@ class TypedValuesAccessor(lang.Abstract, ta.Generic[TypedValueT]):
|
|
32
32
|
|
33
33
|
@ta.final
|
34
34
|
def __contains__(self, cls: type[TypedValueU]) -> bool:
|
35
|
-
|
35
|
+
return self._typed_value_contains(cls)
|
36
36
|
|
37
37
|
@abc.abstractmethod
|
38
38
|
def _typed_value_contains(self, cls):
|
omlish/typedvalues/collection.py
CHANGED
@@ -65,7 +65,6 @@ class TypedValues(
|
|
65
65
|
if idx == len(ulst):
|
66
66
|
lst.append(tv)
|
67
67
|
dct[utvc] = tv
|
68
|
-
dct[type(tv)] = tv
|
69
68
|
else:
|
70
69
|
tv = obj
|
71
70
|
lst.append(tv)
|
@@ -76,6 +75,10 @@ class TypedValues(
|
|
76
75
|
k: tuple(v) if isinstance(v, list) else v
|
77
76
|
for k, v in dct.items()
|
78
77
|
}
|
78
|
+
self._dct2: dict[type[TypedValueT], TypedValueT | tuple[TypedValueT, ...]] = {
|
79
|
+
**self._dct,
|
80
|
+
**{type(v): v for v in self._dct.values() if isinstance(v, UniqueTypedValue)}, # type: ignore[misc]
|
81
|
+
}
|
79
82
|
|
80
83
|
#
|
81
84
|
|
@@ -161,21 +164,32 @@ class TypedValues(
|
|
161
164
|
|
162
165
|
#
|
163
166
|
|
167
|
+
def keys(self) -> ta.KeysView[type[TypedValueT]]:
|
168
|
+
return self._dct.keys()
|
169
|
+
|
170
|
+
def values(self) -> ta.ValuesView[TypedValueT | tuple[TypedValueT, ...]]:
|
171
|
+
return self._dct.values()
|
172
|
+
|
173
|
+
def items(self) -> ta.ItemsView[type[TypedValueT], TypedValueT | tuple[TypedValueT, ...]]:
|
174
|
+
return self._dct.items()
|
175
|
+
|
176
|
+
#
|
177
|
+
|
164
178
|
def _typed_value_contains(self, cls):
|
165
|
-
return cls in self.
|
179
|
+
return cls in self._dct2
|
166
180
|
|
167
181
|
def _typed_value_getitem(self, key):
|
168
182
|
if isinstance(key, int):
|
169
183
|
return self._tup[key]
|
170
184
|
elif isinstance(key, type):
|
171
|
-
return self.
|
185
|
+
return self._dct2[check.issubclass(key, TypedValue)]
|
172
186
|
else:
|
173
187
|
raise TypeError(key)
|
174
188
|
|
175
189
|
def _typed_value_get(self, key, /, default=None):
|
176
190
|
check.issubclass(key, TypedValue)
|
177
191
|
try:
|
178
|
-
return self.
|
192
|
+
return self._dct2[key]
|
179
193
|
except KeyError:
|
180
194
|
if issubclass(key, UniqueTypedValue):
|
181
195
|
return default
|
omlish/typedvalues/marshal.py
CHANGED
@@ -1,10 +1,9 @@
|
|
1
|
-
from
|
2
|
-
from
|
3
|
-
from
|
4
|
-
from
|
5
|
-
from
|
6
|
-
from
|
7
|
-
|
1
|
+
from .. import check
|
2
|
+
from .. import dataclasses as dc
|
3
|
+
from .. import lang
|
4
|
+
from .. import marshal as msh
|
5
|
+
from .. import reflect as rfl
|
6
|
+
from ..funcs import match as mfs
|
8
7
|
from .collection import TypedValues
|
9
8
|
from .reflect import reflect_typed_values_impls
|
10
9
|
from .values import ScalarTypedValue
|
omlish/typedvalues/reflect.py
CHANGED
omlish/typedvalues/values.py
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- dc.Box, or some other kind of meta
|
4
|
+
"""
|
1
5
|
import typing as ta
|
2
6
|
|
3
7
|
from .. import dataclasses as dc
|
@@ -17,13 +21,16 @@ class TypedValue(lang.Abstract):
|
|
17
21
|
##
|
18
22
|
|
19
23
|
|
24
|
+
_UNIQUE_BASES: set[type[TypedValue]] = set()
|
25
|
+
|
26
|
+
|
20
27
|
class UniqueTypedValue(TypedValue, lang.Abstract):
|
21
28
|
_unique_typed_value_cls: ta.ClassVar[type[TypedValue]]
|
22
29
|
|
23
30
|
def __init_subclass__(cls, **kwargs: ta.Any) -> None:
|
24
31
|
super().__init_subclass__(**kwargs)
|
25
32
|
|
26
|
-
if
|
33
|
+
if any(ur in cls.__bases__ for ur in _UNIQUE_BASES):
|
27
34
|
try:
|
28
35
|
cls._unique_typed_value_cls # noqa
|
29
36
|
except AttributeError:
|
@@ -35,16 +42,25 @@ class UniqueTypedValue(TypedValue, lang.Abstract):
|
|
35
42
|
##
|
36
43
|
|
37
44
|
|
38
|
-
|
39
|
-
@dc.extra_class_params(generic_init=True)
|
40
|
-
class ScalarTypedValue(TypedValue, lang.Abstract, ta.Generic[T]):
|
41
|
-
v: T
|
42
|
-
|
43
|
-
def __repr__(self) -> str:
|
44
|
-
return f'{self.__class__.__name__}({self.v!r})'
|
45
|
-
|
45
|
+
class ScalarTypedValue(TypedValue, dc.Box[T], abstract=True):
|
46
46
|
def __init_subclass__(cls, **kwargs: ta.Any) -> None:
|
47
47
|
super().__init_subclass__(**kwargs)
|
48
48
|
|
49
49
|
if UniqueTypedValue in (mro := cls.__mro__) and mro.index(ScalarTypedValue) > mro.index(UniqueTypedValue):
|
50
|
-
raise TypeError(f'Class {cls} must have UniqueTypedValue before ScalarTypedValue in mro')
|
50
|
+
raise TypeError(f'Class {cls} must not have UniqueTypedValue before ScalarTypedValue in mro')
|
51
|
+
|
52
|
+
|
53
|
+
##
|
54
|
+
|
55
|
+
|
56
|
+
class UniqueScalarTypedValue(ScalarTypedValue[T], UniqueTypedValue, abstract=True):
|
57
|
+
pass
|
58
|
+
|
59
|
+
|
60
|
+
##
|
61
|
+
|
62
|
+
|
63
|
+
_UNIQUE_BASES.update([
|
64
|
+
UniqueTypedValue,
|
65
|
+
UniqueScalarTypedValue,
|
66
|
+
])
|
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=pjGUyLHaoWpPqRP3jz2u1fC1qoRc2lvrEcpU_Ax2tdg,8253
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=y6FOK7bieQR8UYCmv5o1Qd1PcE1UydQsZmqYPy5X0dQ,3444
|
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
|
@@ -179,8 +179,8 @@ omlish/concurrent/executors.py,sha256=mF-rjJWzNFxwB1-_H7rHuwoImpl4FtNM6W3wcqM3NE
|
|
179
179
|
omlish/concurrent/futures.py,sha256=870tx8ELI8THvMnTrQoYIlEFKO9hM4KUrlehckJqKBU,4238
|
180
180
|
omlish/concurrent/threadlets.py,sha256=JfirbTDJgy9Ouokz_VmHeAAPS7cih8qMUJrN-owwXD4,2423
|
181
181
|
omlish/configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
182
|
-
omlish/configs/all.py,sha256=
|
183
|
-
omlish/configs/classes.py,sha256=
|
182
|
+
omlish/configs/all.py,sha256=xTfR7NySnlIeqhk0GlUOncPnWZ97cLhCtRDlN_Ny8og,1107
|
183
|
+
omlish/configs/classes.py,sha256=bRQ3NiYWpHNXspu7P52_9d-00P9YQz_cV8zWXTY2BZE,1173
|
184
184
|
omlish/configs/formats.py,sha256=RJw4Rzp7vlTd5YyAvpAoruQnk45v8dGPtPWwqH7aYyE,5301
|
185
185
|
omlish/configs/nginx.py,sha256=XuX9yyb0_MwkJ8esKiMS9gFkqHUPza_uCprhnWykNy8,2051
|
186
186
|
omlish/configs/shadow.py,sha256=-R5nbevC4pFgqDPYOCCIqNcusgXsMWlRIUOEG0HBoJg,2228
|
@@ -208,15 +208,15 @@ omlish/dataclasses/errors.py,sha256=tyv3WR6az66uGGiq9FIuCHvy1Ef-G7zeMY7mMG6hy2Y,
|
|
208
208
|
omlish/dataclasses/inspect.py,sha256=BlpPghVCU3w_YDnONEqqE99YHzJM2q3eoqe39YX25Ko,4596
|
209
209
|
omlish/dataclasses/internals.py,sha256=vIGCZnStgD3ef4drYRtVOrxhxmAPa0vJpo4pXcDcQvM,3073
|
210
210
|
omlish/dataclasses/reflection.py,sha256=5N4acL27xwSnQJvoks6ts2JseGfwL_P9D2gM9vqtAFM,2243
|
211
|
-
omlish/dataclasses/specs.py,sha256=
|
212
|
-
omlish/dataclasses/utils.py,sha256=
|
211
|
+
omlish/dataclasses/specs.py,sha256=r9hpIWy83ODiB1n7wTf7JL5fiCeeT8fWbMvxs7c4e3g,6148
|
212
|
+
omlish/dataclasses/utils.py,sha256=gv6za6oJYBr1VaeGd7oXqq9lhBs_sxkpC27XYzJggno,1870
|
213
213
|
omlish/dataclasses/api/__init__.py,sha256=GFodt19CKrfuBpdv1EUqVUCPAFIlHPnabE2G8QJElBY,426
|
214
214
|
omlish/dataclasses/api/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
215
215
|
omlish/dataclasses/api/classes/conversion.py,sha256=x1Ayo5W3t8lVh10KGH_ZBJ_kK7HqcdI2LdJA6mR_WXQ,810
|
216
|
-
omlish/dataclasses/api/classes/decorator.py,sha256=
|
217
|
-
omlish/dataclasses/api/classes/make.py,sha256=
|
216
|
+
omlish/dataclasses/api/classes/decorator.py,sha256=q-m05j6VhJ9_00TmrXBvwmv0_TFPTD8OURi1KbKo9-4,3933
|
217
|
+
omlish/dataclasses/api/classes/make.py,sha256=Q_8ZVjhhFEUstIZA3Ht_vlGptYjTcJqX48qT57W7SZw,2820
|
218
218
|
omlish/dataclasses/api/classes/metadata.py,sha256=2YafXunxqbqnHIdp5gsiGLyH7cWg9FR5wCwcxlLFd20,2685
|
219
|
-
omlish/dataclasses/api/classes/params.py,sha256=
|
219
|
+
omlish/dataclasses/api/classes/params.py,sha256=GmLJotHT4BuXcK9lAwP00boR0_mfM0xITWBFKrk0brY,1994
|
220
220
|
omlish/dataclasses/api/fields/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
221
221
|
omlish/dataclasses/api/fields/building.py,sha256=YVAJZ2c318vK0YWz9VU8_MdjA5qNjqsI3N85K-bD0TI,3314
|
222
222
|
omlish/dataclasses/api/fields/constructor.py,sha256=T2GeczTz9uy2EOTDlU4VJoiXp-I6jvlxnYXChvQqHxk,1533
|
@@ -237,7 +237,7 @@ omlish/dataclasses/concerns/order.py,sha256=f1JVDkeTWllO9Tu79xKkjHul-_rpsYZXHMTn
|
|
237
237
|
omlish/dataclasses/concerns/override.py,sha256=eegJ4KRs-p3Oj5ipY1eySwXJ3vFyVXG5gWRQZcsmvUQ,2810
|
238
238
|
omlish/dataclasses/concerns/params.py,sha256=ZrNGBUp87YkrOMW7bYn0GdYk9PuDHzxdwKn477lqUyE,404
|
239
239
|
omlish/dataclasses/concerns/replace.py,sha256=Q11NjVMMHVh9MjJ6osaXNFG5HuGWQM6qDgWK7IN0IIc,1501
|
240
|
-
omlish/dataclasses/concerns/repr.py,sha256=
|
240
|
+
omlish/dataclasses/concerns/repr.py,sha256=HHwCqZPGTMhRPsVgbqrZEh30DBV8LcVSXF2oSrqcjvM,3458
|
241
241
|
omlish/dataclasses/concerns/slots.py,sha256=xg6346UT_oUlb0kYaWFbeJUKzZcpQx4nJkT86CXfI5c,5922
|
242
242
|
omlish/dataclasses/generation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
243
243
|
omlish/dataclasses/generation/base.py,sha256=adi68lJogtjx1SoxGJ5hqC-f-CMX2gWi8iALmucIwKo,686
|
@@ -253,8 +253,8 @@ omlish/dataclasses/generation/processor.py,sha256=_rt_GHdx_pi5seRMzIu6DvLEx4MYGs
|
|
253
253
|
omlish/dataclasses/generation/registry.py,sha256=_Cfvs9QY6f8Pvf9cKUi-OTI-qaDem3z5jcWkSDNk3kQ,1006
|
254
254
|
omlish/dataclasses/generation/utils.py,sha256=u6DWRvzxgqrxqyfAGzNOyDvnOJYdMTYyZ7l1oOOiXrI,2089
|
255
255
|
omlish/dataclasses/metaclass/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
256
|
-
omlish/dataclasses/metaclass/bases.py,sha256=
|
257
|
-
omlish/dataclasses/metaclass/confer.py,sha256=
|
256
|
+
omlish/dataclasses/metaclass/bases.py,sha256=aKxhjk_dx87ssTkEs35y4kPGIhuas4LmM5nlzYzvqhg,1394
|
257
|
+
omlish/dataclasses/metaclass/confer.py,sha256=dErYZbTXBKgvGAi2eu3FocxTvd9lNSqv03haKWsNjcg,1395
|
258
258
|
omlish/dataclasses/metaclass/meta.py,sha256=0MQG7Sl1y8QccGRgLOC0VoLDTMBG6VoyT-wZdthO1zI,2639
|
259
259
|
omlish/dataclasses/metaclass/specs.py,sha256=djzkHK95h06Cgrx8rr3SGkv2gOvL-fPOhWOBWbbN8h4,789
|
260
260
|
omlish/dataclasses/processing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -344,7 +344,7 @@ omlish/formats/json5/__init__.py,sha256=BsjPz5zJDji3GjQ8x8hWvcl1GYPV_ZIHnE3c2Sr8
|
|
344
344
|
omlish/formats/json5/codec.py,sha256=ldnxCRo0JP1fkGLt0mMxJlLvNxqIF_1KUCcSp1HtI-M,452
|
345
345
|
omlish/formats/json5/errors.py,sha256=AHkR9ySjAoQdUrizpqgL8fg0M5oe5mHZkml3KZHEvC4,38
|
346
346
|
omlish/formats/json5/literals.py,sha256=rj4-9KFXfgdq5oK_eUkp57cgoMQ8T0gRaG9ga430he4,2429
|
347
|
-
omlish/formats/json5/parsing.py,sha256=
|
347
|
+
omlish/formats/json5/parsing.py,sha256=qYLcPgkMyjsWeolc6nMg-u5_2PMvBy7jtEUIJZoNZhs,2342
|
348
348
|
omlish/formats/json5/_antlr/Json5Lexer.py,sha256=8TKxlENDsl6CPfoLR06uQSvhDnzGcY7fKsIhFJ_g6N4,23237
|
349
349
|
omlish/formats/json5/_antlr/Json5Listener.py,sha256=fSiOzSS0CMjxaCev3sxZqJlW-buqIyDLwgnuRv-Uh80,2095
|
350
350
|
omlish/formats/json5/_antlr/Json5Parser.py,sha256=nbbwoCPvEVRcEh5_t092XLmsXIHnbzONvH0W0g_BYkQ,19677
|
@@ -460,12 +460,12 @@ omlish/iterators/iterators.py,sha256=RxW35yQ5ed8vBQ22IqpDXFx-i5JiLQdp7-pkMZXhJJ8
|
|
460
460
|
omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,472
|
461
461
|
omlish/iterators/tools.py,sha256=c4hArZEVV8y9_dFfmRwakusv1cWJLT4MkTkGRjnGN5U,2556
|
462
462
|
omlish/iterators/unique.py,sha256=Nw0pSaNEcHAkve0ugfLPvJcirDOn9ECyC5wIL8JlJKI,1395
|
463
|
-
omlish/lang/__init__.py,sha256=
|
463
|
+
omlish/lang/__init__.py,sha256=KCzbT9IMWi2TNldAlDZ6b8Rr-7hyV9Ne6kIKJLXNAxg,5315
|
464
464
|
omlish/lang/attrs.py,sha256=i7euRF81uNF8QDmUVXSK_BtqLGshaMi4VVdUnMjiMwg,5050
|
465
465
|
omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
|
466
466
|
omlish/lang/collections.py,sha256=aGi0j6VzVe2nz4l357Y4RD5_XNl8OJbmM5qM6BclrrY,1895
|
467
467
|
omlish/lang/comparison.py,sha256=MOwEG0Yny-jBPHO9kQto9FSRyeNpQW24UABsghkrHxY,1356
|
468
|
-
omlish/lang/contextmanagers.py,sha256=
|
468
|
+
omlish/lang/contextmanagers.py,sha256=pN8X4ZCagqU9_xWumi8gZPdMIWlInA-_zQrkl7o5VP0,7258
|
469
469
|
omlish/lang/datetimes.py,sha256=mrTtA67JYpfQwSlzdPcBtvm6dAyYM_dXNnlxFwFQH0M,228
|
470
470
|
omlish/lang/descriptors.py,sha256=zBtgO9LjdSTGHNUgiIqswh78WOVoGH6KzS0NbgB1Wls,6572
|
471
471
|
omlish/lang/enums.py,sha256=F9tflHfaAoV2MpyuhZzpfX9-H55M3zNa9hCszsngEo8,111
|
@@ -502,7 +502,7 @@ omlish/lite/__init__.py,sha256=ISLhM4q0LR1XXTCaHdZOZxBRyIsoZqYm4u0bf1BPcVk,148
|
|
502
502
|
omlish/lite/cached.py,sha256=O7ozcoDNFm1Hg2wtpHEqYSp_i_nCLNOP6Ueq_Uk-7mU,1300
|
503
503
|
omlish/lite/check.py,sha256=OLwtE2x6nlbGx4vS3Rda7zMHpgqzDSLJminTAX2lqLA,13529
|
504
504
|
omlish/lite/configs.py,sha256=Ev_19sbII67pTWzInYjYqa9VyTiZBvyjhZqyG8TtufE,908
|
505
|
-
omlish/lite/contextmanagers.py,sha256=
|
505
|
+
omlish/lite/contextmanagers.py,sha256=WrL2NPT7OA5JvHp4H-opwsCpYTHod27EJ4qB1cJ9Mjc,5691
|
506
506
|
omlish/lite/dataclasses.py,sha256=t1G5-xOuvE6o6w9RyqHzLT9wHD0HkqBh5P8HUZWxGzs,1912
|
507
507
|
omlish/lite/imports.py,sha256=o9WWrNrWg0hKeMvaj91giaovED_9VFanN2MyEHBGekY,1346
|
508
508
|
omlish/lite/inject.py,sha256=-tTsOqqef-Ix5Tgl2DP_JAsNWJQDFUptERl3lk14Uzs,29007
|
@@ -619,13 +619,13 @@ omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
|
|
619
619
|
omlish/reflect/subst.py,sha256=g3q7NmNWsmc67mcchmCE3WFPCMDSBq-FXn4ah-DWL_U,3622
|
620
620
|
omlish/reflect/types.py,sha256=Cn9FYGoiCNt0FS0YLiTTAR12WKcesWMapCrVYcb8IDo,9225
|
621
621
|
omlish/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
622
|
-
omlish/secrets/all.py,sha256=
|
622
|
+
omlish/secrets/all.py,sha256=kUTuS4pZVskJe1kFN6m1F1br09BNSjX7MUC2RZRndwc,437
|
623
623
|
omlish/secrets/crypto.py,sha256=9D21lnvPhStwu8arD4ssT0ih0bDG-nlqIRdVgYL40xA,3708
|
624
624
|
omlish/secrets/marshal.py,sha256=u90n1OfRfdpH1T2F0xK_pAPH1ENYL6acFt6XdVd3KvI,1986
|
625
625
|
omlish/secrets/openssl.py,sha256=UT_dXJ4zA1s9e-UHoW_NLGHQO7iouUNPnJNkkpuw3JI,6213
|
626
626
|
omlish/secrets/pwgen.py,sha256=5k7QMSysUfv9F65TDMdDlrhTIKy6QbMG3KT2HNVmnVg,1712
|
627
627
|
omlish/secrets/pwhash.py,sha256=Jctv3QzcMvVPXJsWA3w3LDUlzmyUDGEWG9sLiJz1xaw,4107
|
628
|
-
omlish/secrets/secrets.py,sha256=
|
628
|
+
omlish/secrets/secrets.py,sha256=h5OdFDgnhXVlPlkOkoE64MOeVzExmtVVYIxJyuQbRec,8009
|
629
629
|
omlish/secrets/ssl.py,sha256=_72xTNP6a1Xw0Pweuow9WK5yveqJ7hmjhala9iMnrAk,152
|
630
630
|
omlish/secrets/subprocesses.py,sha256=ZdShw4jrGDdyQW8mRMgl106-9qpCEq2J6w_x7ruz1wk,1217
|
631
631
|
omlish/secrets/tempssl.py,sha256=X_cAQbeaz-YcH8SzQ0luYTktIGJv4KMpfTD3t9l9Gqk,1879
|
@@ -769,6 +769,7 @@ omlish/sql/tabledefs/tabledefs.py,sha256=lIhvlt0pk6G7RZAtDFsFXm5j0l9BvRfnP7vNGey
|
|
769
769
|
omlish/subprocesses/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
770
770
|
omlish/subprocesses/async_.py,sha256=hPQTWFa3k5CE_s9p1JTY4KdTPOsqLJtq3lGMRznrVpY,2373
|
771
771
|
omlish/subprocesses/base.py,sha256=W6El-PUKKF9KLAks5LB6kzqs_n3FfkblJ-JOv6NFQbY,6133
|
772
|
+
omlish/subprocesses/editor.py,sha256=nLrudPayAZxv0u5LtZFecR_zdSEk0bd8G3XFjbOD81M,2386
|
772
773
|
omlish/subprocesses/run.py,sha256=3jwSnQJvFMDMHmJvtAkrrK5D-i7_8cw12vX84EWTuJo,3668
|
773
774
|
omlish/subprocesses/sync.py,sha256=HKmKM99_Y7tkJRg_n5onXrw41IZt5M5fqU0281LY-mo,3671
|
774
775
|
omlish/subprocesses/utils.py,sha256=MJb6hvKhZceTmBeFVqlc5oM7rDxWkUzSzK9nKvbIvM8,396
|
@@ -812,7 +813,7 @@ omlish/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
812
813
|
omlish/text/asdl.py,sha256=AS3irh-sag5pqyH3beJif78PjCbOaFso1NeKq-HXuTs,16867
|
813
814
|
omlish/text/decoding.py,sha256=sQWGckWzRslRHYKpj1SBeoo6AVqXm5HFlWFRARN1QpM,1286
|
814
815
|
omlish/text/delimit.py,sha256=z9uIuWJdbp7M3ku2KQRHo-lzJYZUJCqZTLse1sIUI4Q,4932
|
815
|
-
omlish/text/filecache.py,sha256=
|
816
|
+
omlish/text/filecache.py,sha256=U3sHtHzUYtPeXr8WrSw3eJ1m7zipJf_yu1jExcTcXgY,5411
|
816
817
|
omlish/text/glyphsplit.py,sha256=HI8TWDUaF_tJG5RnIdIjtUH_lYnjYZ7KZBANSxOXGZc,3808
|
817
818
|
omlish/text/indent.py,sha256=LOQgHskHMLVrRC6HLL9uIWay517dpvPEYQK0Igm-wm8,1341
|
818
819
|
omlish/text/linecache.py,sha256=hRYlEhD63ZfA6_ZOTkQIcnON-3W56QMAhcG3vEJqj9M,1858
|
@@ -823,17 +824,17 @@ omlish/text/random.py,sha256=8feS5JE_tSjYlMl-lp0j93kCfzBae9AM2cXlRLebXMA,199
|
|
823
824
|
omlish/text/templating.py,sha256=azhKpvkDR2uby8k3AJ8Y6GpdKVQUb7Xt_cGbDz6dkTM,2454
|
824
825
|
omlish/text/go/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
825
826
|
omlish/text/go/quoting.py,sha256=N9EYdnFdEX_A8fOviH-1w4jwV3XOQ7VU2WsoUNubYVY,9137
|
826
|
-
omlish/typedvalues/__init__.py,sha256=
|
827
|
-
omlish/typedvalues/accessor.py,sha256=
|
828
|
-
omlish/typedvalues/collection.py,sha256=
|
827
|
+
omlish/typedvalues/__init__.py,sha256=p5qfXsxpVeOfyHLUJrlOE2FIDPg3OmGoL_sWDXS8eTU,591
|
828
|
+
omlish/typedvalues/accessor.py,sha256=LOyvNHLpDPyyoITdufsnbk_5QccGsZgDG5-yTjxvD2M,2932
|
829
|
+
omlish/typedvalues/collection.py,sha256=Nc-5mbnZhlwmM7jTCo7oQQzbGxuhOvIW99FYbAFW6GA,5835
|
829
830
|
omlish/typedvalues/generic.py,sha256=byWG_gMXhNelckUwdmOoJE9FKkL71Q4BSi4ZLyy0XZ0,788
|
830
831
|
omlish/typedvalues/holder.py,sha256=4SwRezsmuDDEO5gENGx8kTm30pblF5UktoEAu02i-Gk,1554
|
831
|
-
omlish/typedvalues/marshal.py,sha256=
|
832
|
-
omlish/typedvalues/reflect.py,sha256=
|
833
|
-
omlish/typedvalues/values.py,sha256=
|
834
|
-
omlish-0.0.0.
|
835
|
-
omlish-0.0.0.
|
836
|
-
omlish-0.0.0.
|
837
|
-
omlish-0.0.0.
|
838
|
-
omlish-0.0.0.
|
839
|
-
omlish-0.0.0.
|
832
|
+
omlish/typedvalues/marshal.py,sha256=hWHRLcrGav7lvXJDtb9bNI0ickl4SKPQ6F4BbTpqw3A,4219
|
833
|
+
omlish/typedvalues/reflect.py,sha256=Ih1YgU-srUjsvBn_P7C66f73_VCvcwqE3ffeBnZBgt4,674
|
834
|
+
omlish/typedvalues/values.py,sha256=CEL8xeeneJBe8CrV3NXyZcC6sZ0FR6Cgz2YtaCBug6A,1359
|
835
|
+
omlish-0.0.0.dev293.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
836
|
+
omlish-0.0.0.dev293.dist-info/METADATA,sha256=N7qy2wkob-bA6_hhlB9z7YHoKuuAPsIhawoFZcZLEL4,4316
|
837
|
+
omlish-0.0.0.dev293.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
|
838
|
+
omlish-0.0.0.dev293.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
839
|
+
omlish-0.0.0.dev293.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
840
|
+
omlish-0.0.0.dev293.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|