omlish 0.0.0.dev395__py3-none-any.whl → 0.0.0.dev397__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 -3
- omlish/collections/__init__.py +4 -0
- omlish/collections/trie.py +156 -0
- omlish/dataclasses/__init__.py +6 -6
- omlish/dataclasses/{api → impl/api}/classes/conversion.py +4 -4
- omlish/dataclasses/{api → impl/api}/classes/decorator.py +5 -5
- omlish/dataclasses/{api → impl/api}/classes/metadata.py +4 -4
- omlish/dataclasses/{api → impl/api}/classes/params.py +4 -4
- omlish/dataclasses/{api → impl/api}/fields/building.py +7 -7
- omlish/dataclasses/{api → impl/api}/fields/constructor.py +4 -4
- omlish/dataclasses/{api → impl/api}/fields/conversion.py +8 -8
- omlish/dataclasses/{api → impl/api}/fields/metadata.py +5 -5
- omlish/dataclasses/{concerns → impl/concerns}/copy.py +1 -1
- omlish/dataclasses/{concerns → impl/concerns}/fields.py +6 -6
- omlish/dataclasses/{concerns → impl/concerns}/frozen.py +3 -3
- omlish/dataclasses/{concerns → impl/concerns}/hash.py +1 -1
- omlish/dataclasses/{concerns → impl/concerns}/init.py +9 -9
- omlish/dataclasses/{concerns → impl/concerns}/matchargs.py +1 -1
- omlish/dataclasses/{concerns → impl/concerns}/mro.py +1 -1
- omlish/dataclasses/{concerns → impl/concerns}/params.py +2 -2
- omlish/dataclasses/{concerns → impl/concerns}/replace.py +4 -4
- omlish/dataclasses/{concerns → impl/concerns}/repr.py +3 -3
- omlish/dataclasses/impl/configs.py +69 -0
- omlish/dataclasses/{generation → impl/generation}/compilation.py +1 -1
- omlish/dataclasses/{generation → impl/generation}/execution.py +1 -1
- omlish/dataclasses/{generation → impl/generation}/globals.py +3 -3
- omlish/dataclasses/{generation → impl/generation}/mangling.py +1 -1
- omlish/dataclasses/{generation → impl/generation}/plans.py +1 -1
- omlish/dataclasses/{generation → impl/generation}/processor.py +41 -14
- omlish/dataclasses/{generation → impl/generation}/registry.py +2 -2
- omlish/dataclasses/impl/processing/__init__.py +0 -0
- omlish/dataclasses/{processing → impl/processing}/base.py +3 -3
- omlish/dataclasses/{processing → impl/processing}/driving.py +34 -2
- omlish/dataclasses/{processing → impl/processing}/registry.py +2 -2
- omlish/dataclasses/{utils.py → impl/utils.py} +1 -1
- omlish/dataclasses/inspect.py +4 -4
- omlish/dataclasses/metaclass/bases.py +2 -2
- omlish/dataclasses/metaclass/confer.py +1 -1
- omlish/dataclasses/metaclass/meta.py +1 -1
- omlish/dataclasses/metaclass/specs.py +1 -1
- omlish/dataclasses/reflection.py +9 -9
- omlish/dataclasses/tools/as_.py +2 -2
- omlish/dataclasses/tools/static.py +2 -2
- omlish/diag/timers.py +4 -0
- omlish/inject/.dataclasses.json +3 -0
- omlish/marshal/.dataclasses.json +3 -0
- {omlish-0.0.0.dev395.dist-info → omlish-0.0.0.dev397.dist-info}/METADATA +3 -3
- {omlish-0.0.0.dev395.dist-info → omlish-0.0.0.dev397.dist-info}/RECORD +72 -67
- /omlish/dataclasses/{internals.py → _internals.py} +0 -0
- /omlish/dataclasses/{api/classes → impl}/__init__.py +0 -0
- /omlish/dataclasses/{api → impl/api}/__init__.py +0 -0
- /omlish/dataclasses/{api/fields → impl/api/classes}/__init__.py +0 -0
- /omlish/dataclasses/{api → impl/api}/classes/make.py +0 -0
- /omlish/dataclasses/{generation → impl/api/fields}/__init__.py +0 -0
- /omlish/dataclasses/{concerns → impl/concerns}/__init__.py +0 -0
- /omlish/dataclasses/{concerns → impl/concerns}/abc.py +0 -0
- /omlish/dataclasses/{concerns → impl/concerns}/doc.py +0 -0
- /omlish/dataclasses/{concerns → impl/concerns}/eq.py +0 -0
- /omlish/dataclasses/{concerns → impl/concerns}/order.py +0 -0
- /omlish/dataclasses/{concerns → impl/concerns}/override.py +0 -0
- /omlish/dataclasses/{concerns → impl/concerns}/slots.py +0 -0
- /omlish/dataclasses/{processing → impl/generation}/__init__.py +0 -0
- /omlish/dataclasses/{generation → impl/generation}/base.py +0 -0
- /omlish/dataclasses/{generation → impl/generation}/idents.py +0 -0
- /omlish/dataclasses/{generation → impl/generation}/manifests.py +0 -0
- /omlish/dataclasses/{generation → impl/generation}/ops.py +0 -0
- /omlish/dataclasses/{generation → impl/generation}/utils.py +0 -0
- /omlish/dataclasses/{processing → impl/processing}/priority.py +0 -0
- {omlish-0.0.0.dev395.dist-info → omlish-0.0.0.dev397.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev395.dist-info → omlish-0.0.0.dev397.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev395.dist-info → omlish-0.0.0.dev397.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev395.dist-info → omlish-0.0.0.dev397.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.dev397'
|
2
|
+
__revision__ = '9e68fce944686b71edd6536d7dc62e5d833442ef'
|
3
3
|
|
4
4
|
|
5
5
|
#
|
@@ -69,7 +69,7 @@ class Project(ProjectBase):
|
|
69
69
|
|
70
70
|
'pyyaml ~= 6.0',
|
71
71
|
|
72
|
-
'cbor2 ~= 5.
|
72
|
+
'cbor2 ~= 5.7',
|
73
73
|
|
74
74
|
'cloudpickle ~= 3.1',
|
75
75
|
],
|
@@ -175,6 +175,7 @@ class SetuptoolsBase:
|
|
175
175
|
'*.g4',
|
176
176
|
'*.h',
|
177
177
|
|
178
|
+
'.dataclasses.json',
|
178
179
|
'.manifests.json',
|
179
180
|
|
180
181
|
'LICENSE',
|
omlish/collections/__init__.py
CHANGED
@@ -0,0 +1,156 @@
|
|
1
|
+
import typing as ta
|
2
|
+
|
3
|
+
|
4
|
+
K = ta.TypeVar('K')
|
5
|
+
V = ta.TypeVar('V')
|
6
|
+
K2 = ta.TypeVar('K2')
|
7
|
+
V2 = ta.TypeVar('V2')
|
8
|
+
|
9
|
+
|
10
|
+
##
|
11
|
+
|
12
|
+
|
13
|
+
class Trie(ta.MutableMapping[ta.Sequence[K], V], ta.Generic[K, V]):
|
14
|
+
class Node(ta.Generic[K2, V2]):
|
15
|
+
def __init__(self) -> None:
|
16
|
+
self._children: dict[K2, Trie.Node[K2, V2]] = {}
|
17
|
+
|
18
|
+
_value: V2
|
19
|
+
|
20
|
+
def __init_subclass__(cls, **kwargs):
|
21
|
+
raise TypeError
|
22
|
+
|
23
|
+
@property
|
24
|
+
def has_value(self) -> bool:
|
25
|
+
try:
|
26
|
+
self._value # noqa
|
27
|
+
except AttributeError:
|
28
|
+
return False
|
29
|
+
else:
|
30
|
+
return True
|
31
|
+
|
32
|
+
@property
|
33
|
+
def value(self) -> V2:
|
34
|
+
return self._value
|
35
|
+
|
36
|
+
@property
|
37
|
+
def children(self) -> ta.Mapping[K2, 'Trie.Node[K2, V2]']:
|
38
|
+
return self._children
|
39
|
+
|
40
|
+
def __init__(self) -> None:
|
41
|
+
super().__init__()
|
42
|
+
|
43
|
+
self._len = 0
|
44
|
+
self._root: Trie.Node[K, V] = Trie.Node()
|
45
|
+
|
46
|
+
@property
|
47
|
+
def root(self) -> Node[K, V]:
|
48
|
+
return self._root
|
49
|
+
|
50
|
+
def __len__(self) -> int:
|
51
|
+
return self._len
|
52
|
+
|
53
|
+
def get_node(self, k: ta.Iterable[K]) -> Node[K, V]:
|
54
|
+
cur = self._root
|
55
|
+
for x in k:
|
56
|
+
cur = cur._children[x] # noqa
|
57
|
+
return cur
|
58
|
+
|
59
|
+
def __getitem__(self, k: ta.Iterable[K]) -> V:
|
60
|
+
try:
|
61
|
+
node = self.get_node(k)
|
62
|
+
except KeyError:
|
63
|
+
raise KeyError(k) from None
|
64
|
+
|
65
|
+
try:
|
66
|
+
return node.value
|
67
|
+
except AttributeError:
|
68
|
+
raise KeyError(k) from None
|
69
|
+
|
70
|
+
def __setitem__(self, k: ta.Iterable[K], v: V) -> None:
|
71
|
+
cur = self._root
|
72
|
+
for x in k:
|
73
|
+
try:
|
74
|
+
cur = cur._children[x] # noqa
|
75
|
+
except KeyError:
|
76
|
+
nxt: Trie.Node[K, V] = Trie.Node()
|
77
|
+
cur._children[x] = nxt # noqa
|
78
|
+
cur = nxt
|
79
|
+
|
80
|
+
try:
|
81
|
+
cur._value # noqa
|
82
|
+
except AttributeError:
|
83
|
+
self._len += 1
|
84
|
+
cur._value = v # noqa
|
85
|
+
|
86
|
+
def __delitem__(self, k: ta.Iterable[K]) -> None:
|
87
|
+
stack: list[tuple[K, Trie.Node[K, V]]] = []
|
88
|
+
cur = self._root
|
89
|
+
for x in k:
|
90
|
+
stack.append((x, cur))
|
91
|
+
cur = cur._children[x] # noqa
|
92
|
+
|
93
|
+
try:
|
94
|
+
del cur._value # noqa
|
95
|
+
except AttributeError:
|
96
|
+
raise KeyError(k) from None
|
97
|
+
|
98
|
+
self._len -= 1
|
99
|
+
for x, parent in reversed(stack):
|
100
|
+
if cur.has_value or cur._children: # noqa
|
101
|
+
break
|
102
|
+
del parent._children[x] # noqa
|
103
|
+
cur = parent
|
104
|
+
|
105
|
+
def iter_nodes(
|
106
|
+
self,
|
107
|
+
*,
|
108
|
+
share_key: bool = False,
|
109
|
+
root: ta.Optional['Trie.Node[K, V]'] = None,
|
110
|
+
sort_children: bool | ta.Callable[[list[tuple[K, Node[K, V]]]], None] = False,
|
111
|
+
) -> ta.Iterator[tuple[ta.Sequence[K], Node[K, V]]]:
|
112
|
+
if root is None:
|
113
|
+
root = self._root
|
114
|
+
|
115
|
+
ic: ta.Callable[[ta.Mapping[K, Trie.Node[K, V]]], ta.Iterator[tuple[K, Trie.Node[K, V]]]]
|
116
|
+
if sort_children is True:
|
117
|
+
ic = lambda cd: iter(sorted(cd.items(), key=lambda t: t[0])) # type: ignore
|
118
|
+
elif sort_children is False:
|
119
|
+
ic = lambda cd: iter(cd.items())
|
120
|
+
else:
|
121
|
+
def ic(cd):
|
122
|
+
il = list(cd.items())
|
123
|
+
sort_children(il)
|
124
|
+
return iter(il)
|
125
|
+
|
126
|
+
key: list[K] = []
|
127
|
+
stack: list[tuple[Trie.Node[K, V], ta.Iterator[tuple[K, Trie.Node[K, V]]]]] = []
|
128
|
+
|
129
|
+
stack.append((root, ic(root._children))) # noqa
|
130
|
+
yield (key if share_key else tuple(key), root)
|
131
|
+
|
132
|
+
while stack:
|
133
|
+
node, it = stack[-1]
|
134
|
+
|
135
|
+
try:
|
136
|
+
k, c = next(it)
|
137
|
+
except StopIteration:
|
138
|
+
stack.pop()
|
139
|
+
if stack:
|
140
|
+
key.pop()
|
141
|
+
continue
|
142
|
+
key.append(k)
|
143
|
+
|
144
|
+
stack.append((c, ic(c._children))) # noqa
|
145
|
+
yield (key if share_key else tuple(key), c)
|
146
|
+
|
147
|
+
def iter_items(self, **kwargs: ta.Any) -> ta.Iterator[tuple[ta.Sequence[K], V]]:
|
148
|
+
for k, node in self.iter_nodes(**kwargs):
|
149
|
+
try:
|
150
|
+
yield (k, node._value) # noqa
|
151
|
+
except AttributeError:
|
152
|
+
pass
|
153
|
+
|
154
|
+
def __iter__(self) -> ta.Iterator[ta.Sequence[K]]:
|
155
|
+
for k, _ in self.iter_items():
|
156
|
+
yield k
|
omlish/dataclasses/__init__.py
CHANGED
@@ -22,7 +22,7 @@ from dataclasses import ( # noqa
|
|
22
22
|
replace,
|
23
23
|
)
|
24
24
|
|
25
|
-
from .api import ( # noqa
|
25
|
+
from .impl.api import ( # noqa
|
26
26
|
dataclass as xdataclass,
|
27
27
|
|
28
28
|
make_dataclass as xmake_dataclass,
|
@@ -30,15 +30,15 @@ from .api import ( # noqa
|
|
30
30
|
field as xfield,
|
31
31
|
)
|
32
32
|
|
33
|
+
from .impl.concerns.replace import ( # noqa
|
34
|
+
replace as xreplace,
|
35
|
+
)
|
36
|
+
|
33
37
|
from .tools.as_ import ( # noqa
|
34
38
|
asdict,
|
35
39
|
astuple,
|
36
40
|
)
|
37
41
|
|
38
|
-
from .concerns.replace import ( # noqa
|
39
|
-
replace as xreplace,
|
40
|
-
)
|
41
|
-
|
42
42
|
|
43
43
|
##
|
44
44
|
# globals hack
|
@@ -54,7 +54,7 @@ globals()['replace'] = xreplace
|
|
54
54
|
##
|
55
55
|
# additional interface
|
56
56
|
|
57
|
-
from .api import ( # noqa
|
57
|
+
from .impl.api import ( # noqa
|
58
58
|
append_class_metadata,
|
59
59
|
extra_class_params,
|
60
60
|
init,
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import typing as ta
|
2
2
|
|
3
|
-
from
|
4
|
-
from
|
5
|
-
from
|
6
|
-
from
|
3
|
+
from ..... import check
|
4
|
+
from ...._internals import StdParams
|
5
|
+
from ....specs import ClassSpec
|
6
|
+
from ....specs import FieldSpec
|
7
7
|
|
8
8
|
|
9
9
|
##
|
@@ -5,12 +5,12 @@ TODO:
|
|
5
5
|
import inspect
|
6
6
|
import typing as ta
|
7
7
|
|
8
|
-
from
|
9
|
-
from
|
10
|
-
from
|
11
|
-
from
|
8
|
+
from ..... import check
|
9
|
+
from ..... import lang
|
10
|
+
from ...._internals import STD_FIELDS_ATTR
|
11
|
+
from ...._internals import STD_PARAMS_ATTR
|
12
|
+
from ....specs import ClassSpec
|
12
13
|
from ...processing.driving import drive_cls_processing
|
13
|
-
from ...specs import ClassSpec
|
14
14
|
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
|
@@ -1,10 +1,10 @@
|
|
1
1
|
import dataclasses as dc
|
2
2
|
import typing as ta
|
3
3
|
|
4
|
-
from
|
5
|
-
from
|
6
|
-
from
|
7
|
-
from
|
4
|
+
from ..... import check
|
5
|
+
from ..... import lang
|
6
|
+
from .....lite.dataclasses import is_immediate_dataclass
|
7
|
+
from ....specs import InitFn
|
8
8
|
|
9
9
|
|
10
10
|
T = ta.TypeVar('T')
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import typing as ta
|
2
2
|
|
3
|
-
from
|
4
|
-
from
|
5
|
-
from
|
6
|
-
from
|
3
|
+
from ..... import check
|
4
|
+
from ...._internals import STD_PARAMS_ATTR
|
5
|
+
from ...._internals import StdParams
|
6
|
+
from ....specs import ClassSpec
|
7
7
|
|
8
8
|
|
9
9
|
##
|
@@ -2,13 +2,13 @@ import dataclasses as dc
|
|
2
2
|
import types
|
3
3
|
import typing as ta
|
4
4
|
|
5
|
-
from
|
6
|
-
from
|
7
|
-
from
|
8
|
-
from
|
9
|
-
from
|
10
|
-
from
|
11
|
-
from
|
5
|
+
from ..... import check
|
6
|
+
from ...._internals import STD_FIELDS_ATTR
|
7
|
+
from ...._internals import StdFieldType
|
8
|
+
from ...._internals import std_is_classvar
|
9
|
+
from ...._internals import std_is_initvar
|
10
|
+
from ...._internals import std_is_kw_only
|
11
|
+
from ....inspect import get_cls_annotations
|
12
12
|
|
13
13
|
|
14
14
|
##
|
@@ -2,10 +2,10 @@ import collections
|
|
2
2
|
import dataclasses as dc
|
3
3
|
import typing as ta
|
4
4
|
|
5
|
-
from
|
6
|
-
from
|
7
|
-
from
|
8
|
-
from
|
5
|
+
from ..... import lang
|
6
|
+
from ....specs import CoerceFn
|
7
|
+
from ....specs import ReprFn
|
8
|
+
from ....specs import ValidateFn
|
9
9
|
from .metadata import _ExtraFieldParamsMetadata
|
10
10
|
from .metadata import extra_field_params
|
11
11
|
|
@@ -1,14 +1,14 @@
|
|
1
1
|
import dataclasses as dc
|
2
2
|
import typing as ta
|
3
3
|
|
4
|
-
from
|
5
|
-
from
|
6
|
-
from
|
7
|
-
from
|
8
|
-
from
|
9
|
-
from
|
10
|
-
from
|
11
|
-
from
|
4
|
+
from ..... import check
|
5
|
+
from ..... import lang
|
6
|
+
from ...._internals import StdFieldType
|
7
|
+
from ...._internals import std_field_type
|
8
|
+
from ....debug import DEBUG
|
9
|
+
from ....specs import DefaultFactory
|
10
|
+
from ....specs import FieldSpec
|
11
|
+
from ....specs import FieldType
|
12
12
|
from .metadata import _ExtraFieldParamsMetadata
|
13
13
|
from .metadata import set_field_spec_metadata
|
14
14
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
import dataclasses as dc
|
2
2
|
import typing as ta
|
3
3
|
|
4
|
-
from
|
5
|
-
from
|
6
|
-
from
|
7
|
-
from
|
8
|
-
from
|
4
|
+
from ..... import check
|
5
|
+
from ..... import lang
|
6
|
+
from ....debug import DEBUG
|
7
|
+
from ....specs import FieldSpec
|
8
|
+
from ....tools.modifiers import field_modifier
|
9
9
|
from ...utils import chain_mapping_proxy
|
10
10
|
|
11
11
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import dataclasses as dc
|
2
2
|
import typing as ta
|
3
3
|
|
4
|
+
from ...specs import FieldType
|
4
5
|
from ..generation.base import Generator
|
5
6
|
from ..generation.base import Plan
|
6
7
|
from ..generation.base import PlanResult
|
@@ -10,7 +11,6 @@ from ..generation.ops import Op
|
|
10
11
|
from ..generation.registry import register_generator_type
|
11
12
|
from ..generation.utils import build_attr_kwargs_body_src_lines
|
12
13
|
from ..processing.base import ProcessingContext
|
13
|
-
from ..specs import FieldType
|
14
14
|
|
15
15
|
|
16
16
|
##
|
@@ -1,18 +1,18 @@
|
|
1
1
|
import dataclasses as dc
|
2
2
|
import typing as ta
|
3
3
|
|
4
|
-
from
|
5
|
-
from
|
4
|
+
from .... import check
|
5
|
+
from ..._internals import STD_FIELDS_ATTR
|
6
|
+
from ...debug import DEBUG
|
7
|
+
from ...inspect import FieldsInspection
|
8
|
+
from ...specs import FieldSpec
|
9
|
+
from ...specs import FieldType
|
6
10
|
from ..generation.idents import IDENT_PREFIX
|
7
|
-
from ..inspect import FieldsInspection
|
8
|
-
from ..internals import STD_FIELDS_ATTR
|
9
11
|
from ..processing.base import ProcessingContext
|
10
12
|
from ..processing.base import Processor
|
11
13
|
from ..processing.priority import ProcessorPriority
|
12
14
|
from ..processing.registry import register_processing_context_item_factory
|
13
15
|
from ..processing.registry import register_processor_type
|
14
|
-
from ..specs import FieldSpec
|
15
|
-
from ..specs import FieldType
|
16
16
|
|
17
17
|
|
18
18
|
##
|
@@ -7,7 +7,9 @@ import dataclasses as dc
|
|
7
7
|
import typing as ta
|
8
8
|
import weakref
|
9
9
|
|
10
|
-
from
|
10
|
+
from .... import check
|
11
|
+
from ..._internals import STD_FIELDS_ATTR
|
12
|
+
from ..._internals import STD_PARAMS_ATTR
|
11
13
|
from ..generation.base import Generator
|
12
14
|
from ..generation.base import Plan
|
13
15
|
from ..generation.base import PlanResult
|
@@ -17,8 +19,6 @@ from ..generation.idents import IDENT_PREFIX
|
|
17
19
|
from ..generation.ops import AddMethodOp
|
18
20
|
from ..generation.ops import Op
|
19
21
|
from ..generation.registry import register_generator_type
|
20
|
-
from ..internals import STD_FIELDS_ATTR
|
21
|
-
from ..internals import STD_PARAMS_ATTR
|
22
22
|
from ..processing.base import ProcessingContext
|
23
23
|
|
24
24
|
|
@@ -7,7 +7,15 @@ import dataclasses as dc
|
|
7
7
|
import itertools
|
8
8
|
import typing as ta
|
9
9
|
|
10
|
-
from
|
10
|
+
from .... import check
|
11
|
+
from ..._internals import STD_POST_INIT_NAME
|
12
|
+
from ...inspect import FieldsInspection
|
13
|
+
from ...specs import CoerceFn
|
14
|
+
from ...specs import DefaultFactory
|
15
|
+
from ...specs import FieldSpec
|
16
|
+
from ...specs import FieldType
|
17
|
+
from ...specs import InitFn
|
18
|
+
from ...specs import ValidateFn
|
11
19
|
from ..generation.base import Generator
|
12
20
|
from ..generation.base import Plan
|
13
21
|
from ..generation.base import PlanResult
|
@@ -24,15 +32,7 @@ from ..generation.ops import OpRef
|
|
24
32
|
from ..generation.ops import Ref
|
25
33
|
from ..generation.registry import register_generator_type
|
26
34
|
from ..generation.utils import SetattrSrcBuilder
|
27
|
-
from ..inspect import FieldsInspection
|
28
|
-
from ..internals import STD_POST_INIT_NAME
|
29
35
|
from ..processing.base import ProcessingContext
|
30
|
-
from ..specs import CoerceFn
|
31
|
-
from ..specs import DefaultFactory
|
32
|
-
from ..specs import FieldSpec
|
33
|
-
from ..specs import FieldType
|
34
|
-
from ..specs import InitFn
|
35
|
-
from ..specs import ValidateFn
|
36
36
|
from .fields import InitFields
|
37
37
|
from .mro import MroDict
|
38
38
|
|
@@ -1,5 +1,5 @@
|
|
1
|
-
from
|
2
|
-
from
|
1
|
+
from .... import check
|
2
|
+
from ..._internals import STD_PARAMS_ATTR
|
3
3
|
from ..processing.base import Processor
|
4
4
|
from ..processing.priority import ProcessorPriority
|
5
5
|
from ..processing.registry import register_processor_type
|
@@ -1,10 +1,10 @@
|
|
1
1
|
import dataclasses as dc
|
2
2
|
import typing as ta
|
3
3
|
|
4
|
-
from
|
5
|
-
from
|
6
|
-
from
|
7
|
-
from
|
4
|
+
from ..._internals import STD_FIELDS_ATTR
|
5
|
+
from ..._internals import StdFieldType
|
6
|
+
from ..._internals import std_field_type
|
7
|
+
from ..._internals import std_is_dataclass_instance
|
8
8
|
from ..processing.base import Processor
|
9
9
|
from ..processing.priority import ProcessorPriority
|
10
10
|
from ..processing.registry import register_processor_type
|
@@ -1,6 +1,9 @@
|
|
1
1
|
import dataclasses as dc
|
2
2
|
import typing as ta
|
3
3
|
|
4
|
+
from ...specs import FieldSpec
|
5
|
+
from ...specs import FieldType
|
6
|
+
from ...specs import ReprFn
|
4
7
|
from ..generation.base import Generator
|
5
8
|
from ..generation.base import Plan
|
6
9
|
from ..generation.base import PlanResult
|
@@ -11,9 +14,6 @@ from ..generation.ops import OpRef
|
|
11
14
|
from ..generation.ops import Ref
|
12
15
|
from ..generation.registry import register_generator_type
|
13
16
|
from ..processing.base import ProcessingContext
|
14
|
-
from ..specs import FieldSpec
|
15
|
-
from ..specs import FieldType
|
16
|
-
from ..specs import ReprFn
|
17
17
|
from .fields import InitFields
|
18
18
|
|
19
19
|
|
@@ -0,0 +1,69 @@
|
|
1
|
+
import dataclasses as dc
|
2
|
+
import importlib.resources
|
3
|
+
import json
|
4
|
+
import typing as ta
|
5
|
+
|
6
|
+
|
7
|
+
##
|
8
|
+
|
9
|
+
|
10
|
+
PACKAGE_CONFIG_FILE_NAME = '.dataclasses.json'
|
11
|
+
|
12
|
+
|
13
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
14
|
+
class PackageConfig:
|
15
|
+
codegen: bool = False
|
16
|
+
|
17
|
+
def __init_subclass__(cls, **kwargs):
|
18
|
+
raise TypeError
|
19
|
+
|
20
|
+
@classmethod
|
21
|
+
def loads(cls, s: str) -> 'PackageConfig':
|
22
|
+
return cls(**json.loads(s))
|
23
|
+
|
24
|
+
def dumps(self) -> str:
|
25
|
+
return json.dumps(dc.asdict(self), indent=2)
|
26
|
+
|
27
|
+
|
28
|
+
DEFAULT_PACKAGE_CONFIG = PackageConfig()
|
29
|
+
|
30
|
+
|
31
|
+
##
|
32
|
+
|
33
|
+
|
34
|
+
class PackageConfigCache:
|
35
|
+
def __init__(self) -> None:
|
36
|
+
super().__init__()
|
37
|
+
|
38
|
+
self._dct: dict[str, PackageConfig | None] = {}
|
39
|
+
|
40
|
+
@ta.overload
|
41
|
+
def get(self, pkg: str, default: PackageConfig) -> PackageConfig:
|
42
|
+
...
|
43
|
+
|
44
|
+
@ta.overload
|
45
|
+
def get(self, pkg: str, default: PackageConfig | None = None) -> PackageConfig | None:
|
46
|
+
...
|
47
|
+
|
48
|
+
def get(self, pkg, default=None):
|
49
|
+
try:
|
50
|
+
return self._dct[pkg]
|
51
|
+
except KeyError:
|
52
|
+
pass
|
53
|
+
|
54
|
+
try:
|
55
|
+
s = importlib.resources.read_text(pkg, PACKAGE_CONFIG_FILE_NAME)
|
56
|
+
except FileNotFoundError:
|
57
|
+
self._dct[pkg] = None
|
58
|
+
else:
|
59
|
+
c = PackageConfig.loads(s)
|
60
|
+
self._dct[pkg] = c
|
61
|
+
return c
|
62
|
+
|
63
|
+
if '.' not in pkg:
|
64
|
+
return default
|
65
|
+
|
66
|
+
return self.get(pkg.rpartition('.')[0], default)
|
67
|
+
|
68
|
+
|
69
|
+
PACKAGE_CONFIG_CACHE = PackageConfigCache()
|
@@ -3,9 +3,9 @@ import reprlib
|
|
3
3
|
import types
|
4
4
|
import typing as ta
|
5
5
|
|
6
|
-
from
|
7
|
-
from
|
8
|
-
from
|
6
|
+
from ...errors import FieldFnValidationError
|
7
|
+
from ...errors import FieldTypeValidationError
|
8
|
+
from ...errors import FnValidationError
|
9
9
|
from .idents import IDENT_PREFIX
|
10
10
|
|
11
11
|
|