omdev 0.0.0.dev392__py3-none-any.whl → 0.0.0.dev393__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.json +11 -0
- omdev/manifests/__init__.py +0 -1
- omdev/manifests/{build.py → building.py} +134 -46
- omdev/manifests/dumping.py +16 -3
- omdev/manifests/main.py +12 -9
- {omdev-0.0.0.dev392.dist-info → omdev-0.0.0.dev393.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev392.dist-info → omdev-0.0.0.dev393.dist-info}/RECORD +11 -11
- {omdev-0.0.0.dev392.dist-info → omdev-0.0.0.dev393.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev392.dist-info → omdev-0.0.0.dev393.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev392.dist-info → omdev-0.0.0.dev393.dist-info}/licenses/LICENSE +0 -0
- {omdev-0.0.0.dev392.dist-info → omdev-0.0.0.dev393.dist-info}/top_level.txt +0 -0
omdev/.manifests.json
CHANGED
@@ -122,6 +122,17 @@
|
|
122
122
|
}
|
123
123
|
}
|
124
124
|
},
|
125
|
+
{
|
126
|
+
"module": ".manifests.tests.packages.foo.fargles",
|
127
|
+
"attr": "_SIMPLE_THINGY",
|
128
|
+
"file": "omdev/manifests/tests/packages/foo/fargles.py",
|
129
|
+
"line": 4,
|
130
|
+
"value": {
|
131
|
+
"$.manifests.tests.packages.foo.thingies.manifests.SimpleThingyManifest": {
|
132
|
+
"what": "fargles"
|
133
|
+
}
|
134
|
+
}
|
135
|
+
},
|
125
136
|
{
|
126
137
|
"module": ".precheck.__main__",
|
127
138
|
"attr": "_CLI_MODULE",
|
omdev/manifests/__init__.py
CHANGED
@@ -1 +0,0 @@
|
|
1
|
-
# @omlish-lite
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# ruff: noqa: UP006 UP007 UP045
|
2
|
+
# @omlish-lite
|
2
3
|
"""
|
3
4
|
TODO:
|
4
5
|
- verify classes instantiate
|
@@ -6,6 +7,10 @@ TODO:
|
|
6
7
|
- roundtrip flexibility regarding json-ness - tuples vs lists vs sets vs frozensets etc
|
7
8
|
- kill _MANIFEST_GLOBAL_PATS lol, ast walk
|
8
9
|
- garbage skip_pat doesn't handle multiline decos, etc
|
10
|
+
- relative paths
|
11
|
+
- is this lite? or not?
|
12
|
+
- can this run externally? or not? what does it have to import?
|
13
|
+
- has to import manifest classes, but not modules with manifest magics
|
9
14
|
|
10
15
|
See (entry_points):
|
11
16
|
- https://github.com/pytest-dev/pluggy/blob/main/src/pluggy/_manager.py#L405
|
@@ -44,6 +49,8 @@ from .dumping import _ModuleManifestDumper
|
|
44
49
|
|
45
50
|
T = ta.TypeVar('T')
|
46
51
|
|
52
|
+
ManifestDumperTarget = ta.Union['InlineManifestDumperTarget', 'AttrManifestDumperTarget'] # ta.TypeAlias
|
53
|
+
|
47
54
|
|
48
55
|
##
|
49
56
|
|
@@ -87,45 +94,56 @@ _INLINE_MANIFEST_CLS_NAME_PAT = re.compile(r'^(?P<cls_name>[_a-zA-Z][_a-zA-Z0-9.
|
|
87
94
|
##
|
88
95
|
|
89
96
|
|
97
|
+
class InlineManifestDumperTarget(ta.TypedDict):
|
98
|
+
origin: ta.Mapping[str, ta.Any]
|
99
|
+
kind: ta.Literal['inline']
|
100
|
+
cls_mod_name: str
|
101
|
+
cls_qualname: str
|
102
|
+
init_src: str
|
103
|
+
kwargs: ta.Mapping[str, ta.Any]
|
104
|
+
|
105
|
+
|
106
|
+
class AttrManifestDumperTarget(ta.TypedDict):
|
107
|
+
origin: ta.Mapping[str, ta.Any]
|
108
|
+
kind: ta.Literal['attr']
|
109
|
+
attr: str
|
110
|
+
|
111
|
+
|
112
|
+
##
|
113
|
+
|
114
|
+
|
90
115
|
@cached_nullary
|
91
|
-
def
|
116
|
+
def _module_manifest_dumper_payload_src() -> str:
|
92
117
|
return inspect.getsource(_ModuleManifestDumper)
|
93
118
|
|
94
119
|
|
95
120
|
class ManifestBuilder:
|
96
121
|
def __init__(
|
97
122
|
self,
|
98
|
-
|
123
|
+
base_dir: str,
|
99
124
|
concurrency: int = 8,
|
100
125
|
*,
|
101
|
-
|
126
|
+
subprocess_kwargs: ta.Optional[ta.Mapping[str, ta.Any]] = None,
|
127
|
+
module_dumper_payload_src: ta.Optional[str] = None,
|
102
128
|
) -> None:
|
103
129
|
super().__init__()
|
104
130
|
|
105
|
-
self.
|
131
|
+
self._base_dir = base_dir
|
132
|
+
self._subprocess_kwargs = subprocess_kwargs
|
133
|
+
self._module_dumper_payload_src = module_dumper_payload_src
|
134
|
+
|
106
135
|
self._sem = asyncio.Semaphore(concurrency)
|
107
|
-
self._write = write
|
108
136
|
|
109
|
-
|
110
|
-
await self._sem.acquire()
|
111
|
-
try:
|
112
|
-
try:
|
113
|
-
return await fn(*args, **kwargs)
|
114
|
-
except Exception: # noqa
|
115
|
-
log.exception('Exception in task: %s, %r, %r', fn, args, kwargs)
|
116
|
-
raise
|
117
|
-
finally:
|
118
|
-
self._sem.release()
|
137
|
+
#
|
119
138
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
) -> ta.Sequence[Manifest]:
|
127
|
-
log.info('Extracting manifests from file %s', file)
|
139
|
+
@dc.dataclass(frozen=True)
|
140
|
+
class FileModule:
|
141
|
+
file: str
|
142
|
+
|
143
|
+
mod_name: str
|
144
|
+
mod_base: str
|
128
145
|
|
146
|
+
def build_file_module(self, file: str) -> FileModule:
|
129
147
|
if not file.endswith('.py'):
|
130
148
|
raise Exception(file)
|
131
149
|
|
@@ -134,31 +152,41 @@ class ManifestBuilder:
|
|
134
152
|
if mod_base != (first_dir := file.split(os.path.sep)[0]):
|
135
153
|
raise Exception(f'Unexpected module base: {mod_base=} != {first_dir=}')
|
136
154
|
|
137
|
-
|
155
|
+
return ManifestBuilder.FileModule(
|
156
|
+
file=file,
|
157
|
+
|
158
|
+
mod_name=mod_name,
|
159
|
+
mod_base=mod_base,
|
160
|
+
)
|
161
|
+
|
162
|
+
#
|
163
|
+
|
164
|
+
def collect_module_manifest_targets(self, fm: FileModule) -> ta.List[ManifestDumperTarget]:
|
165
|
+
with open(os.path.join(self._base_dir, fm.file)) as f: # noqa
|
138
166
|
src = f.read()
|
139
167
|
|
140
168
|
lines = src.splitlines(keepends=True)
|
141
169
|
|
142
170
|
def prepare(s: str) -> ta.Any:
|
143
171
|
if s.startswith('$.'):
|
144
|
-
s = f'{mod_base}.{s[2:]}'
|
172
|
+
s = f'{fm.mod_base}.{s[2:]}'
|
145
173
|
return magic.py_compile_magic_preparer(s)
|
146
174
|
|
147
175
|
magics = magic.find_magic(
|
148
176
|
magic.PY_MAGIC_STYLE,
|
149
177
|
lines,
|
150
|
-
file=file,
|
178
|
+
file=fm.file,
|
151
179
|
keys={MANIFEST_MAGIC_KEY},
|
152
180
|
preparer=prepare,
|
153
181
|
)
|
154
182
|
|
155
183
|
origins: ta.List[ManifestOrigin] = []
|
156
|
-
targets: ta.List[
|
184
|
+
targets: ta.List[ManifestDumperTarget] = []
|
157
185
|
for m in magics:
|
158
186
|
if m.body:
|
159
187
|
body = m.body
|
160
188
|
if body.startswith('$.'):
|
161
|
-
body = f'{mod_base}.{body[2:]}'
|
189
|
+
body = f'{fm.mod_base}.{body[2:]}'
|
162
190
|
|
163
191
|
pat_match = check.not_none(_INLINE_MANIFEST_CLS_NAME_PAT.match(body))
|
164
192
|
cls_name = check.non_empty_str(pat_match.groupdict()['cls_name'])
|
@@ -184,15 +212,15 @@ class ManifestBuilder:
|
|
184
212
|
if issubclass(cls, ModAttrManifest):
|
185
213
|
attr_name = extract_manifest_target_name(lines, m.end_line)
|
186
214
|
inl_kw.update({
|
187
|
-
'mod_name': mod_name,
|
215
|
+
'mod_name': fm.mod_name,
|
188
216
|
'attr_name': attr_name,
|
189
217
|
})
|
190
218
|
|
191
219
|
origin = ManifestOrigin(
|
192
|
-
module='.'.join(['', *mod_name.split('.')[1:]]),
|
220
|
+
module='.'.join(['', *fm.mod_name.split('.')[1:]]),
|
193
221
|
attr=None,
|
194
222
|
|
195
|
-
file=file,
|
223
|
+
file=fm.file,
|
196
224
|
line=m.start_line,
|
197
225
|
)
|
198
226
|
|
@@ -210,10 +238,10 @@ class ManifestBuilder:
|
|
210
238
|
attr_name = extract_manifest_target_name(lines, m.end_line)
|
211
239
|
|
212
240
|
origin = ManifestOrigin(
|
213
|
-
module='.'.join(['', *mod_name.split('.')[1:]]),
|
241
|
+
module='.'.join(['', *fm.mod_name.split('.')[1:]]),
|
214
242
|
attr=attr_name,
|
215
243
|
|
216
|
-
file=file,
|
244
|
+
file=fm.file,
|
217
245
|
line=m.start_line,
|
218
246
|
)
|
219
247
|
|
@@ -230,9 +258,27 @@ class ManifestBuilder:
|
|
230
258
|
if (dups := [k for k, v in collections.Counter(o.attr for o in origins if o.attr is not None).items() if v > 1]): # noqa
|
231
259
|
raise Exception(f'Duplicate attrs: {dups}')
|
232
260
|
|
261
|
+
return targets
|
262
|
+
|
263
|
+
#
|
264
|
+
|
265
|
+
async def _dump_module_manifests(
|
266
|
+
self,
|
267
|
+
fm: FileModule,
|
268
|
+
targets: ta.Sequence[ManifestDumperTarget],
|
269
|
+
*,
|
270
|
+
shell_wrap: bool = True,
|
271
|
+
warn_threshold_s: ta.Optional[float] = 1.,
|
272
|
+
):
|
273
|
+
dumper_payload_src: str
|
274
|
+
if self._module_dumper_payload_src is not None:
|
275
|
+
dumper_payload_src = self._module_dumper_payload_src
|
276
|
+
else:
|
277
|
+
dumper_payload_src = _module_manifest_dumper_payload_src()
|
278
|
+
|
233
279
|
subproc_src = '\n\n'.join([
|
234
|
-
|
235
|
-
f'_ModuleManifestDumper({mod_name!r})({", ".join(repr(tgt) for tgt in targets)})\n',
|
280
|
+
dumper_payload_src,
|
281
|
+
f'_ModuleManifestDumper({fm.mod_name!r})({", ".join(repr(tgt) for tgt in targets)})\n',
|
236
282
|
])
|
237
283
|
|
238
284
|
args = [
|
@@ -246,7 +292,12 @@ class ManifestBuilder:
|
|
246
292
|
|
247
293
|
start_time = time.time()
|
248
294
|
|
249
|
-
proc = await asyncio.create_subprocess_exec(
|
295
|
+
proc = await asyncio.create_subprocess_exec(
|
296
|
+
*args,
|
297
|
+
stdout=subprocess.PIPE,
|
298
|
+
**(self._subprocess_kwargs or {}),
|
299
|
+
)
|
300
|
+
|
250
301
|
subproc_out, _ = await proc.communicate()
|
251
302
|
if proc.returncode:
|
252
303
|
raise Exception('Subprocess failed')
|
@@ -254,17 +305,20 @@ class ManifestBuilder:
|
|
254
305
|
end_time = time.time()
|
255
306
|
|
256
307
|
if warn_threshold_s is not None and (elapsed_time := (end_time - start_time)) >= warn_threshold_s:
|
257
|
-
log.warning('Manifest extraction took a long time: %s, %.2f s', file, elapsed_time)
|
308
|
+
log.warning('Manifest extraction took a long time: %s, %.2f s', fm.file, elapsed_time)
|
258
309
|
|
259
310
|
sp_lines = subproc_out.decode().strip().splitlines()
|
260
311
|
if len(sp_lines) != 1:
|
261
312
|
raise Exception('Unexpected subprocess output')
|
262
313
|
|
263
314
|
sp_outs = json.loads(sp_lines[0])
|
264
|
-
|
265
|
-
# if set(dct) != set(attrs):
|
266
|
-
# raise Exception('Unexpected subprocess output keys')
|
315
|
+
return sp_outs
|
267
316
|
|
317
|
+
def _process_module_dump_output(
|
318
|
+
self,
|
319
|
+
fm: FileModule,
|
320
|
+
sp_outs: ta.Sequence[ta.Mapping[str, ta.Any]],
|
321
|
+
) -> ta.List[Manifest]:
|
268
322
|
out: ta.List[Manifest] = []
|
269
323
|
for sp_out in sp_outs:
|
270
324
|
value = sp_out['value']
|
@@ -278,7 +332,7 @@ class ManifestBuilder:
|
|
278
332
|
|
279
333
|
[(key, value_dct)] = value.items()
|
280
334
|
kb, _, kr = key[1:].partition('.') # noqa
|
281
|
-
if kb == mod_base: # noqa
|
335
|
+
if kb == fm.mod_base: # noqa
|
282
336
|
key = f'$.{kr}'
|
283
337
|
value = {key: value_dct}
|
284
338
|
|
@@ -289,11 +343,45 @@ class ManifestBuilder:
|
|
289
343
|
|
290
344
|
return out
|
291
345
|
|
346
|
+
#
|
347
|
+
|
348
|
+
async def build_module_manifests(self, file: str) -> ta.Sequence[Manifest]:
|
349
|
+
log.info('Extracting manifests from file %s', file)
|
350
|
+
|
351
|
+
fm = self.build_file_module(file)
|
352
|
+
|
353
|
+
targets = self.collect_module_manifest_targets(fm)
|
354
|
+
|
355
|
+
sp_outs = await self._dump_module_manifests(fm, targets)
|
356
|
+
|
357
|
+
# FIXME:
|
358
|
+
# if set(dct) != set(attrs):
|
359
|
+
# raise Exception('Unexpected subprocess output keys')
|
360
|
+
|
361
|
+
out = self._process_module_dump_output(fm, sp_outs)
|
362
|
+
|
363
|
+
return out
|
364
|
+
|
365
|
+
#
|
366
|
+
|
367
|
+
async def _spawn(self, fn: ta.Callable[..., ta.Awaitable[T]], *args: ta.Any, **kwargs: ta.Any) -> T:
|
368
|
+
await self._sem.acquire()
|
369
|
+
try:
|
370
|
+
try:
|
371
|
+
return await fn(*args, **kwargs)
|
372
|
+
except Exception: # noqa
|
373
|
+
log.exception('Exception in task: %s, %r, %r', fn, args, kwargs)
|
374
|
+
raise
|
375
|
+
finally:
|
376
|
+
self._sem.release()
|
377
|
+
|
292
378
|
async def build_package_manifests(
|
293
379
|
self,
|
294
380
|
name: str,
|
381
|
+
*,
|
382
|
+
write: bool = False,
|
295
383
|
) -> ta.List[Manifest]:
|
296
|
-
pkg_dir = os.path.join(self.
|
384
|
+
pkg_dir = os.path.join(self._base_dir, name)
|
297
385
|
if not os.path.isdir(pkg_dir) or not os.path.isfile(os.path.join(pkg_dir, '__init__.py')):
|
298
386
|
raise Exception(pkg_dir)
|
299
387
|
|
@@ -305,12 +393,12 @@ class ManifestBuilder:
|
|
305
393
|
manifests: ta.List[Manifest] = list(itertools.chain.from_iterable(await asyncio.gather(*[
|
306
394
|
self._spawn(
|
307
395
|
self.build_module_manifests,
|
308
|
-
os.path.relpath(file, self.
|
396
|
+
os.path.relpath(file, self._base_dir),
|
309
397
|
)
|
310
398
|
for file in files
|
311
399
|
])))
|
312
400
|
|
313
|
-
if
|
401
|
+
if write:
|
314
402
|
with open(os.path.join(pkg_dir, '.manifests.json'), 'w') as f: # noqa
|
315
403
|
f.write(json_dumps_pretty([dc.asdict(m) for m in manifests]))
|
316
404
|
f.write('\n')
|
@@ -323,9 +411,9 @@ class ManifestBuilder:
|
|
323
411
|
|
324
412
|
def check_package_manifests(
|
325
413
|
name: str,
|
326
|
-
|
414
|
+
base_dir: str,
|
327
415
|
) -> None:
|
328
|
-
pkg_dir = os.path.join(
|
416
|
+
pkg_dir = os.path.join(base_dir, name)
|
329
417
|
if not os.path.isdir(pkg_dir) or not os.path.isfile(os.path.join(pkg_dir, '__init__.py')):
|
330
418
|
raise Exception(pkg_dir)
|
331
419
|
|
omdev/manifests/dumping.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# ruff: noqa: UP006 UP007 UP037 UP045
|
2
|
+
# @omlish-lite
|
2
3
|
import typing as ta
|
3
4
|
|
4
5
|
|
@@ -6,10 +7,19 @@ import typing as ta
|
|
6
7
|
|
7
8
|
|
8
9
|
class _ModuleManifestDumper:
|
9
|
-
def __init__(
|
10
|
+
def __init__(
|
11
|
+
self,
|
12
|
+
spec: str,
|
13
|
+
*,
|
14
|
+
output: 'ta.Optional[ta.Callable[[str], None]]' = None,
|
15
|
+
) -> None:
|
10
16
|
super().__init__()
|
11
17
|
|
12
18
|
self._spec = spec
|
19
|
+
if output is None:
|
20
|
+
output = print
|
21
|
+
self._output = output
|
22
|
+
|
13
23
|
self._imported_mod: 'ta.Optional[ta.Any]' = None
|
14
24
|
|
15
25
|
def _mod(self) -> 'ta.Any':
|
@@ -32,7 +42,10 @@ class _ModuleManifestDumper:
|
|
32
42
|
def __missing__(self, key):
|
33
43
|
return self.__get_missing(key)
|
34
44
|
|
35
|
-
def __call__(
|
45
|
+
def __call__(
|
46
|
+
self,
|
47
|
+
*targets: dict, # .build.ManifestDumperTarget
|
48
|
+
) -> None:
|
36
49
|
import collections.abc
|
37
50
|
import dataclasses as dc # noqa
|
38
51
|
import functools
|
@@ -115,4 +128,4 @@ class _ModuleManifestDumper:
|
|
115
128
|
})
|
116
129
|
|
117
130
|
out_json = json.dumps(out, indent=None, separators=(',', ':'))
|
118
|
-
|
131
|
+
self._output(out_json)
|
omdev/manifests/main.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# ruff: noqa: UP006 UP007 UP045
|
2
|
+
# @omlish-lite
|
2
3
|
import argparse
|
3
4
|
import asyncio
|
4
5
|
import dataclasses as dc
|
@@ -8,14 +9,14 @@ import os.path
|
|
8
9
|
from omlish.lite.json import json_dumps_pretty
|
9
10
|
from omlish.logs.standard import configure_standard_logging
|
10
11
|
|
11
|
-
from .
|
12
|
-
from .
|
12
|
+
from .building import ManifestBuilder
|
13
|
+
from .building import check_package_manifests
|
13
14
|
|
14
15
|
|
15
16
|
##
|
16
17
|
|
17
18
|
|
18
|
-
def
|
19
|
+
def _get_base_dir(args) -> str:
|
19
20
|
if args.base is not None:
|
20
21
|
base = args.base
|
21
22
|
else:
|
@@ -27,18 +28,20 @@ def _get_base(args) -> str:
|
|
27
28
|
|
28
29
|
|
29
30
|
def _gen_cmd(args) -> None:
|
30
|
-
|
31
|
+
base_dir = _get_base_dir(args)
|
31
32
|
|
32
33
|
jobs = args.jobs or int(max(mp.cpu_count() // 1.5, 1))
|
33
34
|
builder = ManifestBuilder(
|
34
|
-
|
35
|
+
base_dir,
|
35
36
|
jobs,
|
36
|
-
write=args.write or False,
|
37
37
|
)
|
38
38
|
|
39
39
|
async def do():
|
40
40
|
return await asyncio.gather(*[
|
41
|
-
builder.build_package_manifests(
|
41
|
+
builder.build_package_manifests(
|
42
|
+
pkg,
|
43
|
+
write=bool(args.write),
|
44
|
+
)
|
42
45
|
for pkg in args.package
|
43
46
|
])
|
44
47
|
|
@@ -49,12 +52,12 @@ def _gen_cmd(args) -> None:
|
|
49
52
|
|
50
53
|
|
51
54
|
def _check_cmd(args) -> None:
|
52
|
-
|
55
|
+
base_dir = _get_base_dir(args)
|
53
56
|
|
54
57
|
for pkg in args.package:
|
55
58
|
check_package_manifests(
|
56
59
|
pkg,
|
57
|
-
|
60
|
+
base_dir,
|
58
61
|
)
|
59
62
|
|
60
63
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: omdev
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev393
|
4
4
|
Summary: omdev
|
5
5
|
Author: wrmsr
|
6
6
|
License-Expression: BSD-3-Clause
|
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
14
14
|
Requires-Python: >=3.13
|
15
15
|
Description-Content-Type: text/markdown
|
16
16
|
License-File: LICENSE
|
17
|
-
Requires-Dist: omlish==0.0.0.
|
17
|
+
Requires-Dist: omlish==0.0.0.dev393
|
18
18
|
Provides-Extra: all
|
19
19
|
Requires-Dist: black~=25.1; extra == "all"
|
20
20
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
omdev/.manifests.json,sha256=
|
1
|
+
omdev/.manifests.json,sha256=IuYiaGqGlhwqLm9NpW2koVLjr5dmDxt-BztIpn3E9YQ,12170
|
2
2
|
omdev/__about__.py,sha256=fQNmzSa1MntcPSrzg_Vpo6JRU2RbXik2NqRz0oQCApE,1202
|
3
3
|
omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
omdev/cmake.py,sha256=9rfSvFHPmKDj9ngvfDB2vK8O-xO_ZwUm7hMKLWA-yOw,4578
|
@@ -175,11 +175,11 @@ omdev/magic/find.py,sha256=n9v4XzkYAyh9MVAXRBSmiOlLgZSVbwLYrSJdQBx0G8s,6223
|
|
175
175
|
omdev/magic/magic.py,sha256=M1aOpp1eimbSxZSlKLbobXRZ15MoRrTtLWK-FQrxtGI,235
|
176
176
|
omdev/magic/prepare.py,sha256=SEOK-bl4zDxq0aphYXsEI-hCjbkV908VNnJt-dk0kL4,594
|
177
177
|
omdev/magic/styles.py,sha256=6LAL7XR3fkkH2rh-8nwUvdCYVHBkQxCfP0oEuPuw1Bg,670
|
178
|
-
omdev/manifests/__init__.py,sha256=
|
178
|
+
omdev/manifests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
179
179
|
omdev/manifests/__main__.py,sha256=JqyVDyV7_jo-NZ3wSs5clDU_xCMlxzJv-XFohoZWQ7E,174
|
180
|
-
omdev/manifests/
|
181
|
-
omdev/manifests/dumping.py,sha256=
|
182
|
-
omdev/manifests/main.py,sha256=
|
180
|
+
omdev/manifests/building.py,sha256=VMTSHQgIYv7ysm-ne2aIjj1RDeyh57rgtV0RiarK1RI,13372
|
181
|
+
omdev/manifests/dumping.py,sha256=CKUCHeO-7cLwCDmzc75FX7fvqIRmOx4s10Vx7nB3C6w,4342
|
182
|
+
omdev/manifests/main.py,sha256=jh7YN2D8YCDkT1ptDIv-HK0aMJJzuTw6CZXIM98mTgs,2222
|
183
183
|
omdev/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
184
184
|
omdev/mypy/debug.py,sha256=VskRcr9trNhyPG2ErZZ7IX_v1DLKTLBOjp34o-fEWaM,3294
|
185
185
|
omdev/mypy/report.py,sha256=faX1GmbX_irmZptsOZN2HJnmHxxnrqxScmPdl7B3BI4,1570
|
@@ -316,9 +316,9 @@ omdev/tools/jsonview/resources/jsonview.js,sha256=faDvXDOXKvEvjOuIlz4D3F2ReQXb_b
|
|
316
316
|
omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
317
317
|
omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
|
318
318
|
omdev/tools/pawk/pawk.py,sha256=ao5mdrpiSU4AZ8mBozoEaV3UVlmVTnRG9wD9XP70MZE,11429
|
319
|
-
omdev-0.0.0.
|
320
|
-
omdev-0.0.0.
|
321
|
-
omdev-0.0.0.
|
322
|
-
omdev-0.0.0.
|
323
|
-
omdev-0.0.0.
|
324
|
-
omdev-0.0.0.
|
319
|
+
omdev-0.0.0.dev393.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
320
|
+
omdev-0.0.0.dev393.dist-info/METADATA,sha256=eQk1MmelIztqeIJPUYpqr501nWXSQSIBkD5ZzgXHh4M,5094
|
321
|
+
omdev-0.0.0.dev393.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
322
|
+
omdev-0.0.0.dev393.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
|
323
|
+
omdev-0.0.0.dev393.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
|
324
|
+
omdev-0.0.0.dev393.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|