omdev 0.0.0.dev338__py3-none-any.whl → 0.0.0.dev339__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 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
- def extract_manifest_target_name(line: str) -> str:
64
- for pat in _MANIFEST_GLOBAL_PATS:
65
- if (m := pat.match(line)) is not None:
66
- return m.groupdict()['name']
67
- raise Exception(line)
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'^[#@].*')),
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
- pat_match = check.not_none(_INLINE_MANIFEST_CLS_NAME_PAT.match(m.body))
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 = m.body[len(cls_name):]
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[m.end_line])
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
- nl = lines[m.end_line]
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.dev338
3
+ Version: 0.0.0.dev339
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.dev338
15
+ Requires-Dist: omlish==0.0.0.dev339
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=4Tevfhnw6Vn4EqgYoGKKjp7_n6bvs2-rAXLo30MLy-I,10107
168
+ omdev/manifests/build.py,sha256=vZtGhQAcLrhtIYsq04OstYVjkIwpW2IhmXMkh6RTop8,11009
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.dev338.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
300
- omdev-0.0.0.dev338.dist-info/METADATA,sha256=DqipAfDJkF8fdgokU6IFUDN1Eu_veiwAWV0mm4Fiyvc,1674
301
- omdev-0.0.0.dev338.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
302
- omdev-0.0.0.dev338.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
303
- omdev-0.0.0.dev338.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
304
- omdev-0.0.0.dev338.dist-info/RECORD,,
299
+ omdev-0.0.0.dev339.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
300
+ omdev-0.0.0.dev339.dist-info/METADATA,sha256=JXhgdNBLzWLNp-9mxu_-QfhmIxYKb4fPQ0Uok-P3RIQ,1674
301
+ omdev-0.0.0.dev339.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
302
+ omdev-0.0.0.dev339.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
303
+ omdev-0.0.0.dev339.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
304
+ omdev-0.0.0.dev339.dist-info/RECORD,,