omdev 0.0.0.dev338__py3-none-any.whl → 0.0.0.dev340__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.
- omdev/manifests/build.py +38 -15
- {omdev-0.0.0.dev338.dist-info → omdev-0.0.0.dev340.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev338.dist-info → omdev-0.0.0.dev340.dist-info}/RECORD +7 -7
- {omdev-0.0.0.dev338.dist-info → omdev-0.0.0.dev340.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev338.dist-info → omdev-0.0.0.dev340.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev338.dist-info → omdev-0.0.0.dev340.dist-info}/licenses/LICENSE +0 -0
- {omdev-0.0.0.dev338.dist-info → omdev-0.0.0.dev340.dist-info}/top_level.txt +0 -0
omdev/manifests/build.py
CHANGED
@@ -5,6 +5,7 @@ TODO:
|
|
5
5
|
- embed in pyproject
|
6
6
|
- roundtrip flexibility regarding json-ness - tuples vs lists vs sets vs frozensets etc
|
7
7
|
- kill _MANIFEST_GLOBAL_PATS lol, ast walk
|
8
|
+
- garbage skip_pat doesn't handle multiline decos, etc
|
8
9
|
|
9
10
|
See (entry_points):
|
10
11
|
- https://github.com/pytest-dev/pluggy/blob/main/src/pluggy/_manager.py#L405
|
@@ -53,18 +54,31 @@ MANIFEST_MAGIC_KEY = '@omlish-manifest'
|
|
53
54
|
_IDENT_PAT_PART = r'[A-Za-z_][A-Za-z0-9_]*'
|
54
55
|
_NAME_PAT_PART = rf'(?P<name>{_IDENT_PAT_PART})'
|
55
56
|
|
56
|
-
_MANIFEST_GLOBAL_PATS = tuple(re.compile(p) for p in [
|
57
|
-
rf'^{_NAME_PAT_PART}\s*=.*',
|
58
|
-
rf'^class {_NAME_PAT_PART}\s*(\(|$)',
|
59
|
-
rf'^{_NAME_PAT_PART}:\s+(ta\.|typing\.||)TypeAlias\s+=.*',
|
60
|
-
])
|
61
57
|
|
58
|
+
@dc.dataclass(frozen=True)
|
59
|
+
class _ManifestGlobalPat:
|
60
|
+
name_pat: re.Pattern
|
61
|
+
skip_pat: ta.Optional[re.Pattern] = None
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
63
|
+
|
64
|
+
_MANIFEST_GLOBAL_PATS: ta.Sequence[_ManifestGlobalPat] = [
|
65
|
+
_ManifestGlobalPat(re.compile(rf'^{_NAME_PAT_PART}\s*=.*')),
|
66
|
+
_ManifestGlobalPat(re.compile(rf'^class {_NAME_PAT_PART}\s*(\(|:|$)'), re.compile(r'^[#@\s].*')),
|
67
|
+
_ManifestGlobalPat(re.compile(rf'^{_NAME_PAT_PART}:\s+(ta\.|typing\.|)?TypeAlias\s+=.*')),
|
68
|
+
]
|
69
|
+
|
70
|
+
|
71
|
+
def extract_manifest_target_name(lines: ta.Sequence[str], start_idx: int) -> str:
|
72
|
+
check.not_isinstance(lines, str)
|
73
|
+
for mgp in _MANIFEST_GLOBAL_PATS:
|
74
|
+
cur_idx = start_idx
|
75
|
+
while cur_idx < len(lines):
|
76
|
+
if (m := mgp.name_pat.match(lines[cur_idx])) is not None:
|
77
|
+
return m.groupdict()['name']
|
78
|
+
if mgp.skip_pat is None or not mgp.skip_pat.match(lines[cur_idx]):
|
79
|
+
break
|
80
|
+
cur_idx += 1
|
81
|
+
raise Exception(lines[start_idx])
|
68
82
|
|
69
83
|
|
70
84
|
_INLINE_MANIFEST_CLS_NAME_PAT = re.compile(r'^(?P<cls_name>[_a-zA-Z][_a-zA-Z0-9.]*)\s*(?P<cls_args>\()?')
|
@@ -125,18 +139,28 @@ class ManifestBuilder:
|
|
125
139
|
|
126
140
|
lines = src.splitlines(keepends=True)
|
127
141
|
|
142
|
+
def prepare(s: str) -> ta.Any:
|
143
|
+
if s.startswith('$.'):
|
144
|
+
s = f'{mod_base}.{s[2:]}'
|
145
|
+
return magic.py_compile_magic_preparer(s)
|
146
|
+
|
128
147
|
magics = magic.find_magic(
|
129
148
|
magic.PY_MAGIC_STYLE,
|
130
149
|
lines,
|
131
150
|
file=file,
|
132
151
|
keys={MANIFEST_MAGIC_KEY},
|
152
|
+
preparer=prepare,
|
133
153
|
)
|
134
154
|
|
135
155
|
origins: ta.List[ManifestOrigin] = []
|
136
156
|
targets: ta.List[dict] = []
|
137
157
|
for m in magics:
|
138
158
|
if m.body:
|
139
|
-
|
159
|
+
body = m.body
|
160
|
+
if body.startswith('$.'):
|
161
|
+
body = f'{mod_base}.{body[2:]}'
|
162
|
+
|
163
|
+
pat_match = check.not_none(_INLINE_MANIFEST_CLS_NAME_PAT.match(body))
|
140
164
|
cls_name = check.non_empty_str(pat_match.groupdict()['cls_name'])
|
141
165
|
has_cls_args = bool(pat_match.groupdict().get('cls_args'))
|
142
166
|
|
@@ -151,14 +175,14 @@ class ManifestBuilder:
|
|
151
175
|
check.is_(cls_reload, cls)
|
152
176
|
|
153
177
|
if has_cls_args:
|
154
|
-
inl_init_src =
|
178
|
+
inl_init_src = body[len(cls_name):]
|
155
179
|
else:
|
156
180
|
inl_init_src = '()'
|
157
181
|
|
158
182
|
inl_kw: dict = {}
|
159
183
|
|
160
184
|
if issubclass(cls, ModAttrManifest):
|
161
|
-
attr_name = extract_manifest_target_name(lines
|
185
|
+
attr_name = extract_manifest_target_name(lines, m.end_line)
|
162
186
|
inl_kw.update({
|
163
187
|
'mod_name': mod_name,
|
164
188
|
'attr_name': attr_name,
|
@@ -183,8 +207,7 @@ class ManifestBuilder:
|
|
183
207
|
})
|
184
208
|
|
185
209
|
else:
|
186
|
-
|
187
|
-
attr_name = extract_manifest_target_name(nl)
|
210
|
+
attr_name = extract_manifest_target_name(lines, m.end_line)
|
188
211
|
|
189
212
|
origin = ManifestOrigin(
|
190
213
|
module='.'.join(['', *mod_name.split('.')[1:]]),
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: omdev
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev340
|
4
4
|
Summary: omdev
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Operating System :: POSIX
|
13
13
|
Requires-Python: >=3.12
|
14
14
|
License-File: LICENSE
|
15
|
-
Requires-Dist: omlish==0.0.0.
|
15
|
+
Requires-Dist: omlish==0.0.0.dev340
|
16
16
|
Provides-Extra: all
|
17
17
|
Requires-Dist: black~=25.1; extra == "all"
|
18
18
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
@@ -165,7 +165,7 @@ omdev/magic/prepare.py,sha256=V5jYT2AeFmazzPwk9sNismSouLwFXEoik6FwKcWCNUY,589
|
|
165
165
|
omdev/magic/styles.py,sha256=pYI57zFBxcaZAeyQaDtU1L6oVvdPQiB7ADaBKoUI7Q8,659
|
166
166
|
omdev/manifests/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
167
167
|
omdev/manifests/__main__.py,sha256=JqyVDyV7_jo-NZ3wSs5clDU_xCMlxzJv-XFohoZWQ7E,174
|
168
|
-
omdev/manifests/build.py,sha256=
|
168
|
+
omdev/manifests/build.py,sha256=ejpB3nKMYl-Si5eOT-xYWELjhvyNYmYmA3t5mMKBaXQ,11011
|
169
169
|
omdev/manifests/dumping.py,sha256=Cj0IbuHVS_Xgvj3H7wZr76UTsDuF_LBgca0BocgMV9I,4048
|
170
170
|
omdev/manifests/main.py,sha256=7zRlyE0BDPqITEbChlTBRGulAvG1nUZPHXrerNExriE,2126
|
171
171
|
omdev/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -296,9 +296,9 @@ omdev/tools/json/rendering.py,sha256=3HhdlKSetS6iK1tjF2aILzsl8Mb3D8wW92vYwGpRdVA
|
|
296
296
|
omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
297
297
|
omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
|
298
298
|
omdev/tools/pawk/pawk.py,sha256=zsEkfQX0jF5bn712uqPAyBSdJt2dno1LH2oeSMNfXQI,11424
|
299
|
-
omdev-0.0.0.
|
300
|
-
omdev-0.0.0.
|
301
|
-
omdev-0.0.0.
|
302
|
-
omdev-0.0.0.
|
303
|
-
omdev-0.0.0.
|
304
|
-
omdev-0.0.0.
|
299
|
+
omdev-0.0.0.dev340.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
300
|
+
omdev-0.0.0.dev340.dist-info/METADATA,sha256=HscWULxiQXY0o6G8slZ8P87tijBLhzZ7aRdpcbnQIu4,1674
|
301
|
+
omdev-0.0.0.dev340.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
302
|
+
omdev-0.0.0.dev340.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
|
303
|
+
omdev-0.0.0.dev340.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
|
304
|
+
omdev-0.0.0.dev340.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|