omdev 0.0.0.dev147__py3-none-any.whl → 0.0.0.dev149__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.
Potentially problematic release.
This version of omdev might be problematic. Click here for more details.
- omdev/.manifests.json +12 -0
- omdev/amalg/amalg.py +1 -0
- omdev/cli/clicli.py +1 -1
- omdev/imgur.py +1 -1
- omdev/interp/cli.py +11 -6
- omdev/interp/inspect.py +5 -6
- omdev/interp/providers.py +6 -6
- omdev/interp/pyenv.py +77 -78
- omdev/interp/resolvers.py +11 -10
- omdev/interp/system.py +8 -8
- omdev/interp/types.py +2 -0
- omdev/manifests/__init__.py +0 -1
- omdev/manifests/__main__.py +11 -0
- omdev/manifests/build.py +2 -76
- omdev/manifests/main.py +84 -0
- omdev/pycharm/cli.py +1 -1
- omdev/pyproject/cli.py +21 -15
- omdev/scripts/interp.py +564 -134
- omdev/scripts/pyproject.py +1404 -975
- omdev/tools/doc.py +1 -1
- omdev/tools/docker.py +1 -1
- omdev/tools/git.py +1 -1
- omdev/tools/json/parsing.py +1 -1
- omdev/tools/notebook.py +1 -1
- omdev/tools/pip.py +1 -1
- omdev/tools/prof.py +1 -1
- omdev/tools/sqlrepl.py +1 -1
- {omdev-0.0.0.dev147.dist-info → omdev-0.0.0.dev149.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev147.dist-info → omdev-0.0.0.dev149.dist-info}/RECORD +33 -31
- {omdev-0.0.0.dev147.dist-info → omdev-0.0.0.dev149.dist-info}/LICENSE +0 -0
- {omdev-0.0.0.dev147.dist-info → omdev-0.0.0.dev149.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev147.dist-info → omdev-0.0.0.dev149.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev147.dist-info → omdev-0.0.0.dev149.dist-info}/top_level.txt +0 -0
omdev/manifests/build.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# ruff: noqa: UP006 UP007
|
|
2
|
+
# @omlish-lite
|
|
2
3
|
"""
|
|
3
4
|
TODO:
|
|
4
|
-
- separate build from cli
|
|
5
5
|
- verify classes instantiate
|
|
6
|
+
- embed in pyproject
|
|
6
7
|
|
|
7
8
|
See (entry_points):
|
|
8
9
|
- https://github.com/pytest-dev/pluggy/blob/main/src/pluggy/_manager.py#L405
|
|
@@ -11,14 +12,12 @@ See (entry_points):
|
|
|
11
12
|
- https://packaging.python.org/en/latest/guides/creating-and-discovering-plugins/
|
|
12
13
|
- [project.entry-points.omlish-manifests] \n omdev = omdev
|
|
13
14
|
"""
|
|
14
|
-
import argparse
|
|
15
15
|
import asyncio
|
|
16
16
|
import collections
|
|
17
17
|
import dataclasses as dc
|
|
18
18
|
import inspect
|
|
19
19
|
import itertools
|
|
20
20
|
import json
|
|
21
|
-
import multiprocessing as mp
|
|
22
21
|
import os.path
|
|
23
22
|
import re
|
|
24
23
|
import shlex
|
|
@@ -29,7 +28,6 @@ import typing as ta
|
|
|
29
28
|
|
|
30
29
|
from omlish.lite.cached import cached_nullary
|
|
31
30
|
from omlish.lite.json import json_dumps_pretty
|
|
32
|
-
from omlish.lite.logs import configure_standard_logging
|
|
33
31
|
from omlish.lite.logs import log
|
|
34
32
|
from omlish.manifests.load import ManifestLoader
|
|
35
33
|
from omlish.manifests.types import Manifest
|
|
@@ -282,75 +280,3 @@ def check_package_manifests(
|
|
|
282
280
|
key = f'${name}{key[1:]}'
|
|
283
281
|
cls = ldr.load_cls(key)
|
|
284
282
|
value = cls(**value_dct) # noqa
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
##
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
if __name__ == '__main__':
|
|
291
|
-
def _get_base(args) -> str:
|
|
292
|
-
if args.base is not None:
|
|
293
|
-
base = args.base
|
|
294
|
-
else:
|
|
295
|
-
base = os.getcwd()
|
|
296
|
-
base = os.path.abspath(base)
|
|
297
|
-
if not os.path.isdir(base):
|
|
298
|
-
raise RuntimeError(base)
|
|
299
|
-
return base
|
|
300
|
-
|
|
301
|
-
def _gen_cmd(args) -> None:
|
|
302
|
-
base = _get_base(args)
|
|
303
|
-
|
|
304
|
-
jobs = args.jobs or int(max(mp.cpu_count() // 1.5, 1))
|
|
305
|
-
builder = ManifestBuilder(
|
|
306
|
-
base,
|
|
307
|
-
jobs,
|
|
308
|
-
write=args.write or False,
|
|
309
|
-
)
|
|
310
|
-
|
|
311
|
-
async def do():
|
|
312
|
-
return await asyncio.gather(*[
|
|
313
|
-
builder.build_package_manifests(pkg)
|
|
314
|
-
for pkg in args.package
|
|
315
|
-
])
|
|
316
|
-
|
|
317
|
-
mss = asyncio.run(do())
|
|
318
|
-
if not args.quiet:
|
|
319
|
-
for ms in mss:
|
|
320
|
-
print(json_dumps_pretty([dc.asdict(m) for m in ms]))
|
|
321
|
-
|
|
322
|
-
def _check_cmd(args) -> None:
|
|
323
|
-
base = _get_base(args)
|
|
324
|
-
|
|
325
|
-
for pkg in args.package:
|
|
326
|
-
check_package_manifests(
|
|
327
|
-
pkg,
|
|
328
|
-
base,
|
|
329
|
-
)
|
|
330
|
-
|
|
331
|
-
def _main(argv=None) -> None:
|
|
332
|
-
configure_standard_logging('INFO')
|
|
333
|
-
|
|
334
|
-
parser = argparse.ArgumentParser()
|
|
335
|
-
subparsers = parser.add_subparsers()
|
|
336
|
-
|
|
337
|
-
parser_gen = subparsers.add_parser('gen')
|
|
338
|
-
parser_gen.add_argument('-b', '--base')
|
|
339
|
-
parser_gen.add_argument('-w', '--write', action='store_true')
|
|
340
|
-
parser_gen.add_argument('-q', '--quiet', action='store_true')
|
|
341
|
-
parser_gen.add_argument('-j', '--jobs', type=int)
|
|
342
|
-
parser_gen.add_argument('package', nargs='*')
|
|
343
|
-
parser_gen.set_defaults(func=_gen_cmd)
|
|
344
|
-
|
|
345
|
-
parser_check = subparsers.add_parser('check')
|
|
346
|
-
parser_check.add_argument('-b', '--base')
|
|
347
|
-
parser_check.add_argument('package', nargs='*')
|
|
348
|
-
parser_check.set_defaults(func=_check_cmd)
|
|
349
|
-
|
|
350
|
-
args = parser.parse_args(argv)
|
|
351
|
-
if not getattr(args, 'func', None):
|
|
352
|
-
parser.print_help()
|
|
353
|
-
else:
|
|
354
|
-
args.func(args)
|
|
355
|
-
|
|
356
|
-
_main()
|
omdev/manifests/main.py
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import asyncio
|
|
3
|
+
import dataclasses as dc
|
|
4
|
+
import multiprocessing as mp
|
|
5
|
+
import os.path
|
|
6
|
+
|
|
7
|
+
from omlish.lite.json import json_dumps_pretty
|
|
8
|
+
from omlish.lite.logs import configure_standard_logging
|
|
9
|
+
|
|
10
|
+
from .build import ManifestBuilder
|
|
11
|
+
from .build import check_package_manifests
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _get_base(args) -> str:
|
|
15
|
+
if args.base is not None:
|
|
16
|
+
base = args.base
|
|
17
|
+
else:
|
|
18
|
+
base = os.getcwd()
|
|
19
|
+
base = os.path.abspath(base)
|
|
20
|
+
if not os.path.isdir(base):
|
|
21
|
+
raise RuntimeError(base)
|
|
22
|
+
return base
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _gen_cmd(args) -> None:
|
|
26
|
+
base = _get_base(args)
|
|
27
|
+
|
|
28
|
+
jobs = args.jobs or int(max(mp.cpu_count() // 1.5, 1))
|
|
29
|
+
builder = ManifestBuilder(
|
|
30
|
+
base,
|
|
31
|
+
jobs,
|
|
32
|
+
write=args.write or False,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
async def do():
|
|
36
|
+
return await asyncio.gather(*[
|
|
37
|
+
builder.build_package_manifests(pkg)
|
|
38
|
+
for pkg in args.package
|
|
39
|
+
])
|
|
40
|
+
|
|
41
|
+
mss = asyncio.run(do())
|
|
42
|
+
if not args.quiet:
|
|
43
|
+
for ms in mss:
|
|
44
|
+
print(json_dumps_pretty([dc.asdict(m) for m in ms]))
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _check_cmd(args) -> None:
|
|
48
|
+
base = _get_base(args)
|
|
49
|
+
|
|
50
|
+
for pkg in args.package:
|
|
51
|
+
check_package_manifests(
|
|
52
|
+
pkg,
|
|
53
|
+
base,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _main(argv=None) -> None:
|
|
58
|
+
configure_standard_logging('INFO')
|
|
59
|
+
|
|
60
|
+
parser = argparse.ArgumentParser()
|
|
61
|
+
subparsers = parser.add_subparsers()
|
|
62
|
+
|
|
63
|
+
parser_gen = subparsers.add_parser('gen')
|
|
64
|
+
parser_gen.add_argument('-b', '--base')
|
|
65
|
+
parser_gen.add_argument('-w', '--write', action='store_true')
|
|
66
|
+
parser_gen.add_argument('-q', '--quiet', action='store_true')
|
|
67
|
+
parser_gen.add_argument('-j', '--jobs', type=int)
|
|
68
|
+
parser_gen.add_argument('package', nargs='*')
|
|
69
|
+
parser_gen.set_defaults(func=_gen_cmd)
|
|
70
|
+
|
|
71
|
+
parser_check = subparsers.add_parser('check')
|
|
72
|
+
parser_check.add_argument('-b', '--base')
|
|
73
|
+
parser_check.add_argument('package', nargs='*')
|
|
74
|
+
parser_check.set_defaults(func=_check_cmd)
|
|
75
|
+
|
|
76
|
+
args = parser.parse_args(argv)
|
|
77
|
+
if not getattr(args, 'func', None):
|
|
78
|
+
parser.print_help()
|
|
79
|
+
else:
|
|
80
|
+
args.func(args)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
if __name__ == '__main__':
|
|
84
|
+
_main()
|
omdev/pycharm/cli.py
CHANGED
omdev/pyproject/cli.py
CHANGED
|
@@ -21,6 +21,7 @@ See:
|
|
|
21
21
|
- https://github.com/tox-dev/tox/
|
|
22
22
|
"""
|
|
23
23
|
import argparse
|
|
24
|
+
import asyncio
|
|
24
25
|
import concurrent.futures as cf
|
|
25
26
|
import dataclasses as dc
|
|
26
27
|
import functools
|
|
@@ -33,6 +34,7 @@ import shutil
|
|
|
33
34
|
import sys
|
|
34
35
|
import typing as ta
|
|
35
36
|
|
|
37
|
+
from omlish.lite.cached import async_cached_nullary
|
|
36
38
|
from omlish.lite.cached import cached_nullary
|
|
37
39
|
from omlish.lite.check import check_not
|
|
38
40
|
from omlish.lite.check import check_not_none
|
|
@@ -120,10 +122,10 @@ class Venv:
|
|
|
120
122
|
def dir_name(self) -> str:
|
|
121
123
|
return os.path.join(self.DIR_NAME, self._name)
|
|
122
124
|
|
|
123
|
-
@
|
|
124
|
-
def interp_exe(self) -> str:
|
|
125
|
+
@async_cached_nullary
|
|
126
|
+
async def interp_exe(self) -> str:
|
|
125
127
|
i = InterpSpecifier.parse(check_not_none(self._cfg.interp))
|
|
126
|
-
return check_not_none(DEFAULT_INTERP_RESOLVER.resolve(i, install=True)).exe
|
|
128
|
+
return check_not_none(await DEFAULT_INTERP_RESOLVER.resolve(i, install=True)).exe
|
|
127
129
|
|
|
128
130
|
@cached_nullary
|
|
129
131
|
def exe(self) -> str:
|
|
@@ -132,14 +134,14 @@ class Venv:
|
|
|
132
134
|
raise Exception(f'venv exe {ve} does not exist or is not a file!')
|
|
133
135
|
return ve
|
|
134
136
|
|
|
135
|
-
@
|
|
136
|
-
def create(self) -> bool:
|
|
137
|
+
@async_cached_nullary
|
|
138
|
+
async def create(self) -> bool:
|
|
137
139
|
if os.path.exists(dn := self.dir_name):
|
|
138
140
|
if not os.path.isdir(dn):
|
|
139
141
|
raise Exception(f'{dn} exists but is not a directory!')
|
|
140
142
|
return False
|
|
141
143
|
|
|
142
|
-
log.info('Using interpreter %s', (ie := self.interp_exe()))
|
|
144
|
+
log.info('Using interpreter %s', (ie := await self.interp_exe()))
|
|
143
145
|
subprocess_check_call(ie, '-m', 'venv', dn)
|
|
144
146
|
|
|
145
147
|
ve = self.exe()
|
|
@@ -239,7 +241,7 @@ class Run:
|
|
|
239
241
|
##
|
|
240
242
|
|
|
241
243
|
|
|
242
|
-
def _venv_cmd(args) -> None:
|
|
244
|
+
async def _venv_cmd(args) -> None:
|
|
243
245
|
venv = Run().venvs()[args.name]
|
|
244
246
|
if (sd := venv.cfg.docker) is not None and sd != (cd := args._docker_container): # noqa
|
|
245
247
|
script = ' '.join([
|
|
@@ -276,10 +278,10 @@ def _venv_cmd(args) -> None:
|
|
|
276
278
|
|
|
277
279
|
cmd = args.cmd
|
|
278
280
|
if not cmd:
|
|
279
|
-
venv.create()
|
|
281
|
+
await venv.create()
|
|
280
282
|
|
|
281
283
|
elif cmd == 'python':
|
|
282
|
-
venv.create()
|
|
284
|
+
await venv.create()
|
|
283
285
|
os.execl(
|
|
284
286
|
(exe := venv.exe()),
|
|
285
287
|
exe,
|
|
@@ -287,12 +289,12 @@ def _venv_cmd(args) -> None:
|
|
|
287
289
|
)
|
|
288
290
|
|
|
289
291
|
elif cmd == 'exe':
|
|
290
|
-
venv.create()
|
|
292
|
+
await venv.create()
|
|
291
293
|
check_not(args.args)
|
|
292
294
|
print(venv.exe())
|
|
293
295
|
|
|
294
296
|
elif cmd == 'run':
|
|
295
|
-
venv.create()
|
|
297
|
+
await venv.create()
|
|
296
298
|
sh = check_not_none(shutil.which('bash'))
|
|
297
299
|
script = ' '.join(args.args)
|
|
298
300
|
if not script:
|
|
@@ -309,7 +311,7 @@ def _venv_cmd(args) -> None:
|
|
|
309
311
|
print('\n'.join(venv.srcs()))
|
|
310
312
|
|
|
311
313
|
elif cmd == 'test':
|
|
312
|
-
venv.create()
|
|
314
|
+
await venv.create()
|
|
313
315
|
subprocess_check_call(venv.exe(), '-m', 'pytest', *(args.args or []), *venv.srcs())
|
|
314
316
|
|
|
315
317
|
else:
|
|
@@ -319,7 +321,7 @@ def _venv_cmd(args) -> None:
|
|
|
319
321
|
##
|
|
320
322
|
|
|
321
323
|
|
|
322
|
-
def _pkg_cmd(args) -> None:
|
|
324
|
+
async def _pkg_cmd(args) -> None:
|
|
323
325
|
run = Run()
|
|
324
326
|
|
|
325
327
|
cmd = args.cmd
|
|
@@ -406,7 +408,7 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
406
408
|
return parser
|
|
407
409
|
|
|
408
410
|
|
|
409
|
-
def
|
|
411
|
+
async def _async_main(argv: ta.Optional[ta.Sequence[str]] = None) -> None:
|
|
410
412
|
check_runtime_version()
|
|
411
413
|
configure_standard_logging()
|
|
412
414
|
|
|
@@ -415,7 +417,11 @@ def _main(argv: ta.Optional[ta.Sequence[str]] = None) -> None:
|
|
|
415
417
|
if not getattr(args, 'func', None):
|
|
416
418
|
parser.print_help()
|
|
417
419
|
else:
|
|
418
|
-
args.func(args)
|
|
420
|
+
await args.func(args)
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def _main(argv: ta.Optional[ta.Sequence[str]] = None) -> None:
|
|
424
|
+
asyncio.run(_async_main(argv))
|
|
419
425
|
|
|
420
426
|
|
|
421
427
|
if __name__ == '__main__':
|