omdev 0.0.0.dev180__py3-none-any.whl → 0.0.0.dev182__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- omdev/interp/inject.py +1 -1
- omdev/interp/inspect.py +9 -4
- omdev/interp/providers/system.py +5 -2
- omdev/interp/pyenv/inject.py +1 -1
- omdev/interp/pyenv/install.py +251 -0
- omdev/interp/pyenv/provider.py +144 -0
- omdev/interp/pyenv/pyenv.py +0 -380
- omdev/interp/venvs.py +114 -0
- omdev/pyproject/configs.py +3 -4
- omdev/pyproject/inject.py +12 -0
- omdev/pyproject/venvs.py +16 -52
- omdev/scripts/interp.py +121 -114
- omdev/scripts/pyproject.py +477 -343
- {omdev-0.0.0.dev180.dist-info → omdev-0.0.0.dev182.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev180.dist-info → omdev-0.0.0.dev182.dist-info}/RECORD +19 -15
- {omdev-0.0.0.dev180.dist-info → omdev-0.0.0.dev182.dist-info}/LICENSE +0 -0
- {omdev-0.0.0.dev180.dist-info → omdev-0.0.0.dev182.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev180.dist-info → omdev-0.0.0.dev182.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev180.dist-info → omdev-0.0.0.dev182.dist-info}/top_level.txt +0 -0
omdev/scripts/interp.py
CHANGED
@@ -1050,13 +1050,6 @@ json_dump_compact: ta.Callable[..., bytes] = functools.partial(json.dump, **JSON
|
|
1050
1050
|
json_dumps_compact: ta.Callable[..., str] = functools.partial(json.dumps, **JSON_COMPACT_KWARGS)
|
1051
1051
|
|
1052
1052
|
|
1053
|
-
########################################
|
1054
|
-
# ../../../omlish/lite/logs.py
|
1055
|
-
|
1056
|
-
|
1057
|
-
log = logging.getLogger(__name__)
|
1058
|
-
|
1059
|
-
|
1060
1053
|
########################################
|
1061
1054
|
# ../../../omlish/lite/maybes.py
|
1062
1055
|
|
@@ -4205,9 +4198,15 @@ class InterpInspection:
|
|
4205
4198
|
|
4206
4199
|
|
4207
4200
|
class InterpInspector:
|
4208
|
-
def __init__(
|
4201
|
+
def __init__(
|
4202
|
+
self,
|
4203
|
+
*,
|
4204
|
+
log: ta.Optional[logging.Logger] = None,
|
4205
|
+
) -> None:
|
4209
4206
|
super().__init__()
|
4210
4207
|
|
4208
|
+
self._log = log
|
4209
|
+
|
4211
4210
|
self._cache: ta.Dict[str, ta.Optional[InterpInspection]] = {}
|
4212
4211
|
|
4213
4212
|
_RAW_INSPECTION_CODE = """
|
@@ -4256,13 +4255,95 @@ class InterpInspector:
|
|
4256
4255
|
try:
|
4257
4256
|
ret = await self._inspect(exe)
|
4258
4257
|
except Exception as e: # noqa
|
4259
|
-
if
|
4260
|
-
|
4258
|
+
if self._log is not None and self._log.isEnabledFor(logging.DEBUG):
|
4259
|
+
self._log.exception('Failed to inspect interp: %s', exe)
|
4261
4260
|
ret = None
|
4262
4261
|
self._cache[exe] = ret
|
4263
4262
|
return ret
|
4264
4263
|
|
4265
4264
|
|
4265
|
+
########################################
|
4266
|
+
# ../pyenv/pyenv.py
|
4267
|
+
"""
|
4268
|
+
TODO:
|
4269
|
+
- custom tags
|
4270
|
+
- 'aliases'
|
4271
|
+
- https://github.com/pyenv/pyenv/pull/2966
|
4272
|
+
- https://github.com/pyenv/pyenv/issues/218 (lol)
|
4273
|
+
- probably need custom (temp?) definition file
|
4274
|
+
- *or* python-build directly just into the versions dir?
|
4275
|
+
- optionally install / upgrade pyenv itself
|
4276
|
+
- new vers dont need these custom mac opts, only run on old vers
|
4277
|
+
"""
|
4278
|
+
|
4279
|
+
|
4280
|
+
class Pyenv:
|
4281
|
+
def __init__(
|
4282
|
+
self,
|
4283
|
+
*,
|
4284
|
+
root: ta.Optional[str] = None,
|
4285
|
+
) -> None:
|
4286
|
+
if root is not None and not (isinstance(root, str) and root):
|
4287
|
+
raise ValueError(f'pyenv_root: {root!r}')
|
4288
|
+
|
4289
|
+
super().__init__()
|
4290
|
+
|
4291
|
+
self._root_kw = root
|
4292
|
+
|
4293
|
+
@async_cached_nullary
|
4294
|
+
async def root(self) -> ta.Optional[str]:
|
4295
|
+
if self._root_kw is not None:
|
4296
|
+
return self._root_kw
|
4297
|
+
|
4298
|
+
if shutil.which('pyenv'):
|
4299
|
+
return await asyncio_subprocesses.check_output_str('pyenv', 'root')
|
4300
|
+
|
4301
|
+
d = os.path.expanduser('~/.pyenv')
|
4302
|
+
if os.path.isdir(d) and os.path.isfile(os.path.join(d, 'bin', 'pyenv')):
|
4303
|
+
return d
|
4304
|
+
|
4305
|
+
return None
|
4306
|
+
|
4307
|
+
@async_cached_nullary
|
4308
|
+
async def exe(self) -> str:
|
4309
|
+
return os.path.join(check.not_none(await self.root()), 'bin', 'pyenv')
|
4310
|
+
|
4311
|
+
async def version_exes(self) -> ta.List[ta.Tuple[str, str]]:
|
4312
|
+
if (root := await self.root()) is None:
|
4313
|
+
return []
|
4314
|
+
ret = []
|
4315
|
+
vp = os.path.join(root, 'versions')
|
4316
|
+
if os.path.isdir(vp):
|
4317
|
+
for dn in os.listdir(vp):
|
4318
|
+
ep = os.path.join(vp, dn, 'bin', 'python')
|
4319
|
+
if not os.path.isfile(ep):
|
4320
|
+
continue
|
4321
|
+
ret.append((dn, ep))
|
4322
|
+
return ret
|
4323
|
+
|
4324
|
+
async def installable_versions(self) -> ta.List[str]:
|
4325
|
+
if await self.root() is None:
|
4326
|
+
return []
|
4327
|
+
ret = []
|
4328
|
+
s = await asyncio_subprocesses.check_output_str(await self.exe(), 'install', '--list')
|
4329
|
+
for l in s.splitlines():
|
4330
|
+
if not l.startswith(' '):
|
4331
|
+
continue
|
4332
|
+
l = l.strip()
|
4333
|
+
if not l:
|
4334
|
+
continue
|
4335
|
+
ret.append(l)
|
4336
|
+
return ret
|
4337
|
+
|
4338
|
+
async def update(self) -> bool:
|
4339
|
+
if (root := await self.root()) is None:
|
4340
|
+
return False
|
4341
|
+
if not os.path.isdir(os.path.join(root, '.git')):
|
4342
|
+
return False
|
4343
|
+
await asyncio_subprocesses.check_call('git', 'pull', cwd=root)
|
4344
|
+
return True
|
4345
|
+
|
4346
|
+
|
4266
4347
|
########################################
|
4267
4348
|
# ../resolvers.py
|
4268
4349
|
|
@@ -4397,12 +4478,14 @@ class SystemInterpProvider(InterpProvider):
|
|
4397
4478
|
options: Options = Options(),
|
4398
4479
|
*,
|
4399
4480
|
inspector: ta.Optional[InterpInspector] = None,
|
4481
|
+
log: ta.Optional[logging.Logger] = None,
|
4400
4482
|
) -> None:
|
4401
4483
|
super().__init__()
|
4402
4484
|
|
4403
4485
|
self._options = options
|
4404
4486
|
|
4405
4487
|
self._inspector = inspector
|
4488
|
+
self._log = log
|
4406
4489
|
|
4407
4490
|
#
|
4408
4491
|
|
@@ -4476,7 +4559,8 @@ class SystemInterpProvider(InterpProvider):
|
|
4476
4559
|
lst = []
|
4477
4560
|
for e in self.exes():
|
4478
4561
|
if (ev := await self.get_exe_version(e)) is None:
|
4479
|
-
|
4562
|
+
if self._log is not None:
|
4563
|
+
self._log.debug('Invalid system version: %s', e)
|
4480
4564
|
continue
|
4481
4565
|
lst.append((e, ev))
|
4482
4566
|
return lst
|
@@ -4498,88 +4582,7 @@ class SystemInterpProvider(InterpProvider):
|
|
4498
4582
|
|
4499
4583
|
|
4500
4584
|
########################################
|
4501
|
-
# ../pyenv/
|
4502
|
-
"""
|
4503
|
-
TODO:
|
4504
|
-
- custom tags
|
4505
|
-
- 'aliases'
|
4506
|
-
- https://github.com/pyenv/pyenv/pull/2966
|
4507
|
-
- https://github.com/pyenv/pyenv/issues/218 (lol)
|
4508
|
-
- probably need custom (temp?) definition file
|
4509
|
-
- *or* python-build directly just into the versions dir?
|
4510
|
-
- optionally install / upgrade pyenv itself
|
4511
|
-
- new vers dont need these custom mac opts, only run on old vers
|
4512
|
-
"""
|
4513
|
-
|
4514
|
-
|
4515
|
-
##
|
4516
|
-
|
4517
|
-
|
4518
|
-
class Pyenv:
|
4519
|
-
def __init__(
|
4520
|
-
self,
|
4521
|
-
*,
|
4522
|
-
root: ta.Optional[str] = None,
|
4523
|
-
) -> None:
|
4524
|
-
if root is not None and not (isinstance(root, str) and root):
|
4525
|
-
raise ValueError(f'pyenv_root: {root!r}')
|
4526
|
-
|
4527
|
-
super().__init__()
|
4528
|
-
|
4529
|
-
self._root_kw = root
|
4530
|
-
|
4531
|
-
@async_cached_nullary
|
4532
|
-
async def root(self) -> ta.Optional[str]:
|
4533
|
-
if self._root_kw is not None:
|
4534
|
-
return self._root_kw
|
4535
|
-
|
4536
|
-
if shutil.which('pyenv'):
|
4537
|
-
return await asyncio_subprocesses.check_output_str('pyenv', 'root')
|
4538
|
-
|
4539
|
-
d = os.path.expanduser('~/.pyenv')
|
4540
|
-
if os.path.isdir(d) and os.path.isfile(os.path.join(d, 'bin', 'pyenv')):
|
4541
|
-
return d
|
4542
|
-
|
4543
|
-
return None
|
4544
|
-
|
4545
|
-
@async_cached_nullary
|
4546
|
-
async def exe(self) -> str:
|
4547
|
-
return os.path.join(check.not_none(await self.root()), 'bin', 'pyenv')
|
4548
|
-
|
4549
|
-
async def version_exes(self) -> ta.List[ta.Tuple[str, str]]:
|
4550
|
-
if (root := await self.root()) is None:
|
4551
|
-
return []
|
4552
|
-
ret = []
|
4553
|
-
vp = os.path.join(root, 'versions')
|
4554
|
-
if os.path.isdir(vp):
|
4555
|
-
for dn in os.listdir(vp):
|
4556
|
-
ep = os.path.join(vp, dn, 'bin', 'python')
|
4557
|
-
if not os.path.isfile(ep):
|
4558
|
-
continue
|
4559
|
-
ret.append((dn, ep))
|
4560
|
-
return ret
|
4561
|
-
|
4562
|
-
async def installable_versions(self) -> ta.List[str]:
|
4563
|
-
if await self.root() is None:
|
4564
|
-
return []
|
4565
|
-
ret = []
|
4566
|
-
s = await asyncio_subprocesses.check_output_str(await self.exe(), 'install', '--list')
|
4567
|
-
for l in s.splitlines():
|
4568
|
-
if not l.startswith(' '):
|
4569
|
-
continue
|
4570
|
-
l = l.strip()
|
4571
|
-
if not l:
|
4572
|
-
continue
|
4573
|
-
ret.append(l)
|
4574
|
-
return ret
|
4575
|
-
|
4576
|
-
async def update(self) -> bool:
|
4577
|
-
if (root := await self.root()) is None:
|
4578
|
-
return False
|
4579
|
-
if not os.path.isdir(os.path.join(root, '.git')):
|
4580
|
-
return False
|
4581
|
-
await asyncio_subprocesses.check_call('git', 'pull', cwd=root)
|
4582
|
-
return True
|
4585
|
+
# ../pyenv/install.py
|
4583
4586
|
|
4584
4587
|
|
4585
4588
|
##
|
@@ -4817,7 +4820,27 @@ class PyenvVersionInstaller:
|
|
4817
4820
|
return exe
|
4818
4821
|
|
4819
4822
|
|
4820
|
-
|
4823
|
+
########################################
|
4824
|
+
# ../providers/inject.py
|
4825
|
+
|
4826
|
+
|
4827
|
+
def bind_interp_providers() -> InjectorBindings:
|
4828
|
+
lst: ta.List[InjectorBindingOrBindings] = [
|
4829
|
+
inj.bind_array(InterpProvider),
|
4830
|
+
inj.bind_array_type(InterpProvider, InterpProviders),
|
4831
|
+
|
4832
|
+
inj.bind(RunningInterpProvider, singleton=True),
|
4833
|
+
inj.bind(InterpProvider, to_key=RunningInterpProvider, array=True),
|
4834
|
+
|
4835
|
+
inj.bind(SystemInterpProvider, singleton=True),
|
4836
|
+
inj.bind(InterpProvider, to_key=SystemInterpProvider, array=True),
|
4837
|
+
]
|
4838
|
+
|
4839
|
+
return inj.as_bindings(*lst)
|
4840
|
+
|
4841
|
+
|
4842
|
+
########################################
|
4843
|
+
# ../pyenv/provider.py
|
4821
4844
|
|
4822
4845
|
|
4823
4846
|
class PyenvInterpProvider(InterpProvider):
|
@@ -4833,6 +4856,7 @@ class PyenvInterpProvider(InterpProvider):
|
|
4833
4856
|
*,
|
4834
4857
|
pyenv: Pyenv,
|
4835
4858
|
inspector: InterpInspector,
|
4859
|
+
log: ta.Optional[logging.Logger] = None,
|
4836
4860
|
) -> None:
|
4837
4861
|
super().__init__()
|
4838
4862
|
|
@@ -4840,6 +4864,7 @@ class PyenvInterpProvider(InterpProvider):
|
|
4840
4864
|
|
4841
4865
|
self._pyenv = pyenv
|
4842
4866
|
self._inspector = inspector
|
4867
|
+
self._log = log
|
4843
4868
|
|
4844
4869
|
#
|
4845
4870
|
|
@@ -4884,7 +4909,8 @@ class PyenvInterpProvider(InterpProvider):
|
|
4884
4909
|
ret: ta.List[PyenvInterpProvider.Installed] = []
|
4885
4910
|
for vn, ep in await self._pyenv.version_exes():
|
4886
4911
|
if (i := await self._make_installed(vn, ep)) is None:
|
4887
|
-
|
4912
|
+
if self._log is not None:
|
4913
|
+
self._log.debug('Invalid pyenv version: %s', vn)
|
4888
4914
|
continue
|
4889
4915
|
ret.append(i)
|
4890
4916
|
return ret
|
@@ -4944,25 +4970,6 @@ class PyenvInterpProvider(InterpProvider):
|
|
4944
4970
|
return Interp(exe, version)
|
4945
4971
|
|
4946
4972
|
|
4947
|
-
########################################
|
4948
|
-
# ../providers/inject.py
|
4949
|
-
|
4950
|
-
|
4951
|
-
def bind_interp_providers() -> InjectorBindings:
|
4952
|
-
lst: ta.List[InjectorBindingOrBindings] = [
|
4953
|
-
inj.bind_array(InterpProvider),
|
4954
|
-
inj.bind_array_type(InterpProvider, InterpProviders),
|
4955
|
-
|
4956
|
-
inj.bind(RunningInterpProvider, singleton=True),
|
4957
|
-
inj.bind(InterpProvider, to_key=RunningInterpProvider, array=True),
|
4958
|
-
|
4959
|
-
inj.bind(SystemInterpProvider, singleton=True),
|
4960
|
-
inj.bind(InterpProvider, to_key=SystemInterpProvider, array=True),
|
4961
|
-
]
|
4962
|
-
|
4963
|
-
return inj.as_bindings(*lst)
|
4964
|
-
|
4965
|
-
|
4966
4973
|
########################################
|
4967
4974
|
# ../pyenv/inject.py
|
4968
4975
|
|