omdev 0.0.0.dev355__py3-none-any.whl → 0.0.0.dev357__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.
Files changed (39) hide show
  1. omdev/.manifests.json +1 -1
  2. omdev/ci/docker/dataserver.py +1 -1
  3. omdev/ci/docker/repositories.py +1 -1
  4. omdev/cli/clicli.py +9 -2
  5. omdev/interp/cli.py +3 -0
  6. omdev/interp/default.py +3 -0
  7. omdev/interp/inject.py +5 -0
  8. omdev/interp/inspect.py +3 -0
  9. omdev/interp/providers/inject.py +3 -0
  10. omdev/interp/providers/running.py +3 -0
  11. omdev/interp/providers/standalone.py +3 -0
  12. omdev/interp/pyenv/inject.py +3 -0
  13. omdev/interp/pyenv/provider.py +3 -0
  14. omdev/interp/pyenv/pyenv.py +3 -0
  15. omdev/interp/resolvers.py +3 -0
  16. omdev/interp/uv/inject.py +13 -1
  17. omdev/interp/uv/provider.py +22 -3
  18. omdev/interp/uv/uv.py +3 -0
  19. omdev/magic/magic.py +3 -0
  20. omdev/magic/prepare.py +3 -0
  21. omdev/magic/styles.py +3 -0
  22. omdev/precheck/git.py +1 -1
  23. omdev/precheck/imports.py +3 -3
  24. omdev/precheck/lite.py +1 -1
  25. omdev/precheck/manifests.py +1 -1
  26. omdev/precheck/scripts.py +1 -1
  27. omdev/scripts/ci.py +1 -1
  28. omdev/scripts/interp.py +143 -11
  29. omdev/scripts/pyproject.py +151 -11
  30. omdev/tools/json/cli.py +14 -6
  31. omdev/tools/json/parsing.py +4 -4
  32. omdev/tools/json/processing.py +18 -0
  33. omdev/tools/json/rendering.py +1 -1
  34. {omdev-0.0.0.dev355.dist-info → omdev-0.0.0.dev357.dist-info}/METADATA +2 -2
  35. {omdev-0.0.0.dev355.dist-info → omdev-0.0.0.dev357.dist-info}/RECORD +39 -39
  36. {omdev-0.0.0.dev355.dist-info → omdev-0.0.0.dev357.dist-info}/WHEEL +0 -0
  37. {omdev-0.0.0.dev355.dist-info → omdev-0.0.0.dev357.dist-info}/entry_points.txt +0 -0
  38. {omdev-0.0.0.dev355.dist-info → omdev-0.0.0.dev357.dist-info}/licenses/LICENSE +0 -0
  39. {omdev-0.0.0.dev355.dist-info → omdev-0.0.0.dev357.dist-info}/top_level.txt +0 -0
omdev/.manifests.json CHANGED
@@ -39,7 +39,7 @@
39
39
  "module": ".cli.clicli",
40
40
  "attr": "_CLI_MODULE",
41
41
  "file": "omdev/cli/clicli.py",
42
- "line": 186,
42
+ "line": 193,
43
43
  "value": {
44
44
  "$.cli.types.CliModule": {
45
45
  "cmd_name": "cli",
@@ -1,4 +1,4 @@
1
- # ruff: noqa: UP006 UP007 UP045
1
+ # ruff: noqa: UP006 UP007 UP043 UP045
2
2
  import asyncio
3
3
  import contextlib
4
4
  import logging
@@ -1,4 +1,4 @@
1
- # ruff: noqa: UP006 UP007 UP045
1
+ # ruff: noqa: UP006 UP007 UP043 UP045
2
2
  import abc
3
3
  import contextlib
4
4
  import shlex
omdev/cli/clicli.py CHANGED
@@ -91,11 +91,17 @@ class CliCli(ap.Cli):
91
91
  ap.arg('--local', action='store_true'),
92
92
  ap.arg('--no-deps', action='store_true'),
93
93
  ap.arg('--dry-run', action='store_true'),
94
+ ap.arg('--version'),
94
95
  ap.arg('extra_deps', nargs='*'),
95
96
  )
96
97
  def reinstall(self) -> None:
97
98
  latest_version = _parse_latest_version_str(lookup_latest_package_version(__package__.split('.')[0]))
98
99
 
100
+ if self.args.version is not None:
101
+ target_version: str = self.args.version
102
+ else:
103
+ target_version = latest_version
104
+
99
105
  #
100
106
 
101
107
  dep_set: set[str] = set(self.args.extra_deps or [])
@@ -142,6 +148,7 @@ class CliCli(ap.Cli):
142
148
 
143
149
  print(f'Current version: {__about__.__version__}')
144
150
  print(f'Latest version: {latest_version}')
151
+ print(f'Target version: {target_version}')
145
152
  print()
146
153
 
147
154
  #
@@ -163,7 +170,7 @@ class CliCli(ap.Cli):
163
170
  reco_cmd = ' '.join([
164
171
  'curl -LsSf',
165
172
  f"'{url}'" if (qu := shlex.quote(url)) == url else qu,
166
- f'| python3 - --version {shlex.quote(latest_version)}',
173
+ f'| python3 - --version {shlex.quote(target_version)}',
167
174
  *deps,
168
175
  ])
169
176
  print(f'Recovery command:\n\n{reco_cmd}\n')
@@ -178,7 +185,7 @@ class CliCli(ap.Cli):
178
185
  sys.executable,
179
186
  sys.executable,
180
187
  '-c', install_src,
181
- '--version', latest_version,
188
+ '--version', target_version,
182
189
  *deps,
183
190
  )
184
191
 
omdev/interp/cli.py CHANGED
@@ -25,6 +25,9 @@ from .resolvers import InterpResolverProviders
25
25
  from .types import InterpSpecifier
26
26
 
27
27
 
28
+ ##
29
+
30
+
28
31
  class InterpCli(ArgparseCli):
29
32
  @cached_nullary
30
33
  def injector(self) -> Injector:
omdev/interp/default.py CHANGED
@@ -5,6 +5,9 @@ from .inject import bind_interp
5
5
  from .resolvers import InterpResolver
6
6
 
7
7
 
8
+ ##
9
+
10
+
8
11
  @cached_nullary
9
12
  def get_default_interp_resolver() -> InterpResolver:
10
13
  return inj.create_injector(bind_interp())[InterpResolver]
omdev/interp/inject.py CHANGED
@@ -15,6 +15,10 @@ from .pyenv.provider import PyenvInterpProvider
15
15
  from .resolvers import InterpResolver
16
16
  from .resolvers import InterpResolverProviders
17
17
  from .uv.inject import bind_interp_uv
18
+ from .uv.provider import UvInterpProvider
19
+
20
+
21
+ ##
18
22
 
19
23
 
20
24
  def bind_interp() -> InjectorBindings:
@@ -36,6 +40,7 @@ def bind_interp() -> InjectorBindings:
36
40
  injector.provide(c)
37
41
  for c in [
38
42
  PyenvInterpProvider,
43
+ UvInterpProvider,
39
44
  RunningInterpProvider,
40
45
  SystemInterpProvider,
41
46
  ]
omdev/interp/inspect.py CHANGED
@@ -12,6 +12,9 @@ from .types import InterpOpts
12
12
  from .types import InterpVersion
13
13
 
14
14
 
15
+ ##
16
+
17
+
15
18
  @dc.dataclass(frozen=True)
16
19
  class InterpInspection:
17
20
  exe: str
@@ -11,6 +11,9 @@ from .running import RunningInterpProvider
11
11
  from .system import SystemInterpProvider
12
12
 
13
13
 
14
+ ##
15
+
16
+
14
17
  def bind_interp_providers() -> InjectorBindings:
15
18
  lst: ta.List[InjectorBindingOrBindings] = [
16
19
  inj.bind_array(InterpProvider),
@@ -10,6 +10,9 @@ from ..types import InterpVersion
10
10
  from .base import InterpProvider
11
11
 
12
12
 
13
+ ##
14
+
15
+
13
16
  class RunningInterpProvider(InterpProvider):
14
17
  @cached_nullary
15
18
  def version(self) -> InterpVersion:
@@ -36,6 +36,9 @@ from omlish.lite.check import check
36
36
  from omlish.lite.logs import log
37
37
 
38
38
 
39
+ ##
40
+
41
+
39
42
  class StandalonePythons:
40
43
  LAST_TAG_FOR_I686_LINUX = '118809599' # tag name: "20230826"
41
44
 
@@ -10,6 +10,9 @@ from .provider import PyenvInterpProvider
10
10
  from .pyenv import Pyenv
11
11
 
12
12
 
13
+ ##
14
+
15
+
13
16
  def bind_interp_pyenv() -> InjectorBindings:
14
17
  lst: ta.List[InjectorBindingOrBindings] = [
15
18
  inj.bind(Pyenv, singleton=True),
@@ -17,6 +17,9 @@ from .install import PyenvVersionInstaller
17
17
  from .pyenv import Pyenv
18
18
 
19
19
 
20
+ ##
21
+
22
+
20
23
  class PyenvInterpProvider(InterpProvider):
21
24
  @dc.dataclass(frozen=True)
22
25
  class Options:
@@ -19,6 +19,9 @@ from omlish.lite.cached import async_cached_nullary
19
19
  from omlish.lite.check import check
20
20
 
21
21
 
22
+ ##
23
+
24
+
22
25
  class Pyenv:
23
26
  def __init__(
24
27
  self,
omdev/interp/resolvers.py CHANGED
@@ -9,6 +9,9 @@ from .types import InterpSpecifier
9
9
  from .types import InterpVersion
10
10
 
11
11
 
12
+ ##
13
+
14
+
12
15
  @dc.dataclass(frozen=True)
13
16
  class InterpResolverProviders:
14
17
  providers: ta.Sequence[ta.Tuple[str, InterpProvider]]
omdev/interp/uv/inject.py CHANGED
@@ -5,8 +5,20 @@ from omlish.lite.inject import InjectorBindingOrBindings
5
5
  from omlish.lite.inject import InjectorBindings
6
6
  from omlish.lite.inject import inj
7
7
 
8
+ from ..providers.base import InterpProvider
9
+ from .provider import UvInterpProvider
10
+ from .uv import Uv
11
+
12
+
13
+ ##
14
+
8
15
 
9
16
  def bind_interp_uv() -> InjectorBindings:
10
- lst: ta.List[InjectorBindingOrBindings] = []
17
+ lst: ta.List[InjectorBindingOrBindings] = [
18
+ inj.bind(Uv, singleton=True),
19
+
20
+ inj.bind(UvInterpProvider, singleton=True),
21
+ inj.bind(InterpProvider, to_key=UvInterpProvider, array=True),
22
+ ]
11
23
 
12
24
  return inj.as_bindings(*lst)
@@ -5,17 +5,36 @@ uv run --python 3.11.6 pip
5
5
  uv venv --python 3.11.6 --seed barf
6
6
  python3 -m venv barf && barf/bin/pip install uv && barf/bin/uv venv --python 3.11.6 --seed barf2
7
7
  """
8
+ import logging
8
9
  import typing as ta
9
10
 
11
+ from ..inspect import InterpInspector
10
12
  from ..providers.base import InterpProvider
11
13
  from ..types import Interp
12
14
  from ..types import InterpSpecifier
13
15
  from ..types import InterpVersion
16
+ from .uv import Uv
17
+
18
+
19
+ ##
14
20
 
15
21
 
16
22
  class UvInterpProvider(InterpProvider):
17
- def get_installed_versions(self, spec: InterpSpecifier) -> ta.Awaitable[ta.Sequence[InterpVersion]]:
18
- raise NotImplementedError
23
+ def __init__(
24
+ self,
25
+ *,
26
+ pyenv: Uv,
27
+ inspector: InterpInspector,
28
+ log: ta.Optional[logging.Logger] = None,
29
+ ) -> None:
30
+ super().__init__()
31
+
32
+ self._pyenv = pyenv
33
+ self._inspector = inspector
34
+ self._log = log
35
+
36
+ async def get_installed_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
37
+ return []
19
38
 
20
- def get_installed_version(self, version: InterpVersion) -> ta.Awaitable[Interp]:
39
+ async def get_installed_version(self, version: InterpVersion) -> Interp:
21
40
  raise NotImplementedError
omdev/interp/uv/uv.py CHANGED
@@ -12,6 +12,9 @@ from omlish.lite.cached import async_cached_nullary
12
12
  from omlish.lite.check import check
13
13
 
14
14
 
15
+ ##
16
+
17
+
15
18
  @dc.dataclass(frozen=True)
16
19
  class UvConfig:
17
20
  ignore_path: bool = False
omdev/magic/magic.py CHANGED
@@ -3,6 +3,9 @@ import dataclasses as dc
3
3
  import typing as ta
4
4
 
5
5
 
6
+ ##
7
+
8
+
6
9
  @dc.dataclass(frozen=True)
7
10
  class Magic:
8
11
  key: str
omdev/magic/prepare.py CHANGED
@@ -2,6 +2,9 @@ import json
2
2
  import typing as ta
3
3
 
4
4
 
5
+ ##
6
+
7
+
5
8
  class MagicPrepareError(Exception):
6
9
  pass
7
10
 
omdev/magic/styles.py CHANGED
@@ -3,6 +3,9 @@ import dataclasses as dc
3
3
  import typing as ta
4
4
 
5
5
 
6
+ ##
7
+
8
+
6
9
  MAGIC_KEY_PREFIX = '@omlish-'
7
10
 
8
11
 
omdev/precheck/git.py CHANGED
@@ -25,7 +25,7 @@ class GitBlacklistPrecheck(Precheck['GitBlacklistPrecheck.Config']):
25
25
  def __init__(self, config: Config = Config()) -> None:
26
26
  super().__init__(config)
27
27
 
28
- async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
28
+ async def run(self) -> ta.AsyncGenerator[Precheck.Violation]:
29
29
  for f in self._config.files:
30
30
  proc = await asyncio.create_subprocess_exec('git', 'status', '-s', f)
31
31
  await proc.communicate()
omdev/precheck/imports.py CHANGED
@@ -35,7 +35,7 @@ class RootRelativeImportPrecheck(Precheck['RootRelativeImportPrecheck.Config']):
35
35
  self._headers_cache = headers_cache
36
36
  self._ast_cache = ast_cache
37
37
 
38
- async def _run_py_file(self, py_file: str, src_root: str) -> ta.AsyncGenerator[Precheck.Violation, None]:
38
+ async def _run_py_file(self, py_file: str, src_root: str) -> ta.AsyncGenerator[Precheck.Violation]:
39
39
  if isinstance(header_lines := self._headers_cache.get_file_headers(py_file), Exception):
40
40
  return
41
41
  if any(hl.src.strip() == '# ruff: noqa' for hl in header_lines):
@@ -58,7 +58,7 @@ class RootRelativeImportPrecheck(Precheck['RootRelativeImportPrecheck.Config']):
58
58
 
59
59
  return
60
60
 
61
- async def _run_src_root(self, src_root: str) -> ta.AsyncGenerator[Precheck.Violation, None]:
61
+ async def _run_src_root(self, src_root: str) -> ta.AsyncGenerator[Precheck.Violation]:
62
62
  py_files = [
63
63
  os.path.join(e.root, f)
64
64
  for e in self._dir_walk_cache.list_dir(src_root)
@@ -70,7 +70,7 @@ class RootRelativeImportPrecheck(Precheck['RootRelativeImportPrecheck.Config']):
70
70
  async for v in self._run_py_file(py_file, src_root):
71
71
  yield v
72
72
 
73
- async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
73
+ async def run(self) -> ta.AsyncGenerator[Precheck.Violation]:
74
74
  for src_root in self._context.src_roots:
75
75
  async for v in self._run_src_root(src_root):
76
76
  yield v
omdev/precheck/lite.py CHANGED
@@ -157,7 +157,7 @@ class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
157
157
  else:
158
158
  raise RuntimeError(f'Unknown target kind: {tgt.kind}')
159
159
 
160
- async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
160
+ async def run(self) -> ta.AsyncGenerator[Precheck.Violation]:
161
161
  tgts = await self._collect_targets()
162
162
 
163
163
  sem = asyncio.Semaphore(self._config.concurrency)
@@ -20,7 +20,7 @@ class ManifestsPrecheck(Precheck['ManifestsPrecheck.Config']):
20
20
 
21
21
  self._context = context
22
22
 
23
- async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
23
+ async def run(self) -> ta.AsyncGenerator[Precheck.Violation]:
24
24
  for src_root in self._context.src_roots:
25
25
  try:
26
26
  MANIFEST_LOADER.load(src_root)
omdev/precheck/scripts.py CHANGED
@@ -26,7 +26,7 @@ class ScriptDepsPrecheck(Precheck['ScriptDepsPrecheck.Config']):
26
26
 
27
27
  self._context = context
28
28
 
29
- async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
29
+ async def run(self) -> ta.AsyncGenerator[Precheck.Violation]:
30
30
  for fp in magic.find_magic_files(
31
31
  magic.PY_MAGIC_STYLE,
32
32
  self._context.src_roots,
omdev/scripts/ci.py CHANGED
@@ -5,7 +5,7 @@
5
5
  # @omlish-generated
6
6
  # @omlish-amalg-output ../ci/cli.py
7
7
  # @omlish-git-diff-omit
8
- # ruff: noqa: N802 TC003 UP006 UP007 UP036 UP045
8
+ # ruff: noqa: N802 TC003 UP006 UP007 UP036 UP043 UP045
9
9
  """
10
10
  Inputs:
11
11
  - requirements.txt
omdev/scripts/interp.py CHANGED
@@ -5,7 +5,7 @@
5
5
  # @omlish-generated
6
6
  # @omlish-amalg-output ../interp/cli.py
7
7
  # @omlish-git-diff-omit
8
- # ruff: noqa: N802 UP006 UP007 UP036 UP045
8
+ # ruff: noqa: N802 UP006 UP007 UP036 UP043 UP045
9
9
  """
10
10
  TODO:
11
11
  - partial best-matches - '3.12'
@@ -34,6 +34,7 @@ import shlex
34
34
  import shutil
35
35
  import subprocess
36
36
  import sys
37
+ import tempfile
37
38
  import threading
38
39
  import time
39
40
  import types
@@ -4020,16 +4021,6 @@ class Interp:
4020
4021
  version: InterpVersion
4021
4022
 
4022
4023
 
4023
- ########################################
4024
- # ../uv/inject.py
4025
-
4026
-
4027
- def bind_interp_uv() -> InjectorBindings:
4028
- lst: ta.List[InjectorBindingOrBindings] = []
4029
-
4030
- return inj.as_bindings(*lst)
4031
-
4032
-
4033
4024
  ########################################
4034
4025
  # ../../../omlish/logs/standard.py
4035
4026
  """
@@ -4435,6 +4426,9 @@ class BaseSubprocesses(abc.ABC): # noqa
4435
4426
  # ../resolvers.py
4436
4427
 
4437
4428
 
4429
+ ##
4430
+
4431
+
4438
4432
  @dc.dataclass(frozen=True)
4439
4433
  class InterpResolverProviders:
4440
4434
  providers: ta.Sequence[ta.Tuple[str, InterpProvider]]
@@ -4829,6 +4823,9 @@ asyncio_subprocesses = AsyncioSubprocesses()
4829
4823
  # ../inspect.py
4830
4824
 
4831
4825
 
4826
+ ##
4827
+
4828
+
4832
4829
  @dc.dataclass(frozen=True)
4833
4830
  class InterpInspection:
4834
4831
  exe: str
@@ -4938,6 +4935,9 @@ TODO:
4938
4935
  """
4939
4936
 
4940
4937
 
4938
+ ##
4939
+
4940
+
4941
4941
  class Pyenv:
4942
4942
  def __init__(
4943
4943
  self,
@@ -5005,10 +5005,74 @@ class Pyenv:
5005
5005
  return True
5006
5006
 
5007
5007
 
5008
+ ########################################
5009
+ # ../uv/uv.py
5010
+
5011
+
5012
+ ##
5013
+
5014
+
5015
+ @dc.dataclass(frozen=True)
5016
+ class UvConfig:
5017
+ ignore_path: bool = False
5018
+ pip_bootstrap: bool = True
5019
+
5020
+
5021
+ class Uv:
5022
+ def __init__(
5023
+ self,
5024
+ config: UvConfig = UvConfig(),
5025
+ *,
5026
+ log: ta.Optional[logging.Logger] = None,
5027
+ ) -> None:
5028
+ super().__init__()
5029
+
5030
+ self._config = config
5031
+ self._log = log
5032
+
5033
+ self._bootstrap_dir: ta.Optional[str] = None
5034
+
5035
+ def delete_bootstrap_dir(self) -> bool:
5036
+ if (bs := self._bootstrap_dir) is None:
5037
+ return False
5038
+
5039
+ shutil.rmtree(bs)
5040
+ self._bootstrap_dir = None
5041
+ return True
5042
+
5043
+ @async_cached_nullary
5044
+ async def uv_exe(self) -> ta.Optional[str]:
5045
+ if not self._config.ignore_path and (uv := shutil.which('uv')):
5046
+ return uv
5047
+
5048
+ if self._config.pip_bootstrap:
5049
+ if (bd := self._bootstrap_dir) is None:
5050
+ bd = self._bootstrap_dir = tempfile.mkdtemp()
5051
+
5052
+ if self._log is not None:
5053
+ self._log.info(f'Bootstrapping uv into %s', bd)
5054
+
5055
+ vn = 'uv-bootstrap'
5056
+ await asyncio_subprocesses.check_call(os.path.realpath(sys.executable), '-m', 'venv', vn, cwd=bd)
5057
+
5058
+ vx = os.path.join(bd, vn, 'bin', 'python3')
5059
+ await asyncio_subprocesses.check_call(vx, '-m', 'pip', 'install', 'uv', cwd=bd)
5060
+
5061
+ ux = os.path.join(bd, vn, 'bin', 'uv')
5062
+ check.state(os.path.isfile(ux))
5063
+
5064
+ return ux
5065
+
5066
+ return None
5067
+
5068
+
5008
5069
  ########################################
5009
5070
  # ../providers/running.py
5010
5071
 
5011
5072
 
5073
+ ##
5074
+
5075
+
5012
5076
  class RunningInterpProvider(InterpProvider):
5013
5077
  @cached_nullary
5014
5078
  def version(self) -> InterpVersion:
@@ -5415,10 +5479,47 @@ class PyenvVersionInstaller:
5415
5479
  return exe
5416
5480
 
5417
5481
 
5482
+ ########################################
5483
+ # ../uv/provider.py
5484
+ """
5485
+ uv run pip
5486
+ uv run --python 3.11.6 pip
5487
+ uv venv --python 3.11.6 --seed barf
5488
+ python3 -m venv barf && barf/bin/pip install uv && barf/bin/uv venv --python 3.11.6 --seed barf2
5489
+ """
5490
+
5491
+
5492
+ ##
5493
+
5494
+
5495
+ class UvInterpProvider(InterpProvider):
5496
+ def __init__(
5497
+ self,
5498
+ *,
5499
+ pyenv: Uv,
5500
+ inspector: InterpInspector,
5501
+ log: ta.Optional[logging.Logger] = None,
5502
+ ) -> None:
5503
+ super().__init__()
5504
+
5505
+ self._pyenv = pyenv
5506
+ self._inspector = inspector
5507
+ self._log = log
5508
+
5509
+ async def get_installed_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
5510
+ return []
5511
+
5512
+ async def get_installed_version(self, version: InterpVersion) -> Interp:
5513
+ raise NotImplementedError
5514
+
5515
+
5418
5516
  ########################################
5419
5517
  # ../providers/inject.py
5420
5518
 
5421
5519
 
5520
+ ##
5521
+
5522
+
5422
5523
  def bind_interp_providers() -> InjectorBindings:
5423
5524
  lst: ta.List[InjectorBindingOrBindings] = [
5424
5525
  inj.bind_array(InterpProvider),
@@ -5438,6 +5539,9 @@ def bind_interp_providers() -> InjectorBindings:
5438
5539
  # ../pyenv/provider.py
5439
5540
 
5440
5541
 
5542
+ ##
5543
+
5544
+
5441
5545
  class PyenvInterpProvider(InterpProvider):
5442
5546
  @dc.dataclass(frozen=True)
5443
5547
  class Options:
@@ -5565,10 +5669,31 @@ class PyenvInterpProvider(InterpProvider):
5565
5669
  return Interp(exe, version)
5566
5670
 
5567
5671
 
5672
+ ########################################
5673
+ # ../uv/inject.py
5674
+
5675
+
5676
+ ##
5677
+
5678
+
5679
+ def bind_interp_uv() -> InjectorBindings:
5680
+ lst: ta.List[InjectorBindingOrBindings] = [
5681
+ inj.bind(Uv, singleton=True),
5682
+
5683
+ inj.bind(UvInterpProvider, singleton=True),
5684
+ inj.bind(InterpProvider, to_key=UvInterpProvider, array=True),
5685
+ ]
5686
+
5687
+ return inj.as_bindings(*lst)
5688
+
5689
+
5568
5690
  ########################################
5569
5691
  # ../pyenv/inject.py
5570
5692
 
5571
5693
 
5694
+ ##
5695
+
5696
+
5572
5697
  def bind_interp_pyenv() -> InjectorBindings:
5573
5698
  lst: ta.List[InjectorBindingOrBindings] = [
5574
5699
  inj.bind(Pyenv, singleton=True),
@@ -5584,6 +5709,9 @@ def bind_interp_pyenv() -> InjectorBindings:
5584
5709
  # ../inject.py
5585
5710
 
5586
5711
 
5712
+ ##
5713
+
5714
+
5587
5715
  def bind_interp() -> InjectorBindings:
5588
5716
  lst: ta.List[InjectorBindingOrBindings] = [
5589
5717
  bind_interp_providers(),
@@ -5603,6 +5731,7 @@ def bind_interp() -> InjectorBindings:
5603
5731
  injector.provide(c)
5604
5732
  for c in [
5605
5733
  PyenvInterpProvider,
5734
+ UvInterpProvider,
5606
5735
  RunningInterpProvider,
5607
5736
  SystemInterpProvider,
5608
5737
  ]
@@ -5625,6 +5754,9 @@ def bind_interp() -> InjectorBindings:
5625
5754
  # cli.py
5626
5755
 
5627
5756
 
5757
+ ##
5758
+
5759
+
5628
5760
  class InterpCli(ArgparseCli):
5629
5761
  @cached_nullary
5630
5762
  def injector(self) -> Injector:
@@ -5,7 +5,7 @@
5
5
  # @omlish-generated
6
6
  # @omlish-amalg-output ../pyproject/cli.py
7
7
  # @omlish-git-diff-omit
8
- # ruff: noqa: N802 TC003 UP006 UP007 UP036 UP045
8
+ # ruff: noqa: N802 TC003 UP006 UP007 UP036 UP043 UP045
9
9
  """
10
10
  TODO:
11
11
  - check / tests, src dir sets
@@ -143,6 +143,9 @@ SubprocessChannelOption = ta.Literal['pipe', 'stdout', 'devnull'] # ta.TypeAlia
143
143
  # ../../magic/magic.py
144
144
 
145
145
 
146
+ ##
147
+
148
+
146
149
  @dc.dataclass(frozen=True)
147
150
  class Magic:
148
151
  key: str
@@ -161,6 +164,9 @@ class Magic:
161
164
  # ../../magic/prepare.py
162
165
 
163
166
 
167
+ ##
168
+
169
+
164
170
  class MagicPrepareError(Exception):
165
171
  pass
166
172
 
@@ -190,6 +196,9 @@ def json_magic_preparer(src: str) -> ta.Any:
190
196
  # ../../magic/styles.py
191
197
 
192
198
 
199
+ ##
200
+
201
+
193
202
  MAGIC_KEY_PREFIX = '@omlish-'
194
203
 
195
204
 
@@ -6390,16 +6399,6 @@ class Interp:
6390
6399
  version: InterpVersion
6391
6400
 
6392
6401
 
6393
- ########################################
6394
- # ../../interp/uv/inject.py
6395
-
6396
-
6397
- def bind_interp_uv() -> InjectorBindings:
6398
- lst: ta.List[InjectorBindingOrBindings] = []
6399
-
6400
- return inj.as_bindings(*lst)
6401
-
6402
-
6403
6402
  ########################################
6404
6403
  # ../../../omlish/logs/standard.py
6405
6404
  """
@@ -6805,6 +6804,9 @@ class BaseSubprocesses(abc.ABC): # noqa
6805
6804
  # ../../interp/resolvers.py
6806
6805
 
6807
6806
 
6807
+ ##
6808
+
6809
+
6808
6810
  @dc.dataclass(frozen=True)
6809
6811
  class InterpResolverProviders:
6810
6812
  providers: ta.Sequence[ta.Tuple[str, InterpProvider]]
@@ -7391,6 +7393,9 @@ asyncio_subprocesses = AsyncioSubprocesses()
7391
7393
  # ../../interp/inspect.py
7392
7394
 
7393
7395
 
7396
+ ##
7397
+
7398
+
7394
7399
  @dc.dataclass(frozen=True)
7395
7400
  class InterpInspection:
7396
7401
  exe: str
@@ -7500,6 +7505,9 @@ TODO:
7500
7505
  """
7501
7506
 
7502
7507
 
7508
+ ##
7509
+
7510
+
7503
7511
  class Pyenv:
7504
7512
  def __init__(
7505
7513
  self,
@@ -7567,6 +7575,67 @@ class Pyenv:
7567
7575
  return True
7568
7576
 
7569
7577
 
7578
+ ########################################
7579
+ # ../../interp/uv/uv.py
7580
+
7581
+
7582
+ ##
7583
+
7584
+
7585
+ @dc.dataclass(frozen=True)
7586
+ class UvConfig:
7587
+ ignore_path: bool = False
7588
+ pip_bootstrap: bool = True
7589
+
7590
+
7591
+ class Uv:
7592
+ def __init__(
7593
+ self,
7594
+ config: UvConfig = UvConfig(),
7595
+ *,
7596
+ log: ta.Optional[logging.Logger] = None,
7597
+ ) -> None:
7598
+ super().__init__()
7599
+
7600
+ self._config = config
7601
+ self._log = log
7602
+
7603
+ self._bootstrap_dir: ta.Optional[str] = None
7604
+
7605
+ def delete_bootstrap_dir(self) -> bool:
7606
+ if (bs := self._bootstrap_dir) is None:
7607
+ return False
7608
+
7609
+ shutil.rmtree(bs)
7610
+ self._bootstrap_dir = None
7611
+ return True
7612
+
7613
+ @async_cached_nullary
7614
+ async def uv_exe(self) -> ta.Optional[str]:
7615
+ if not self._config.ignore_path and (uv := shutil.which('uv')):
7616
+ return uv
7617
+
7618
+ if self._config.pip_bootstrap:
7619
+ if (bd := self._bootstrap_dir) is None:
7620
+ bd = self._bootstrap_dir = tempfile.mkdtemp()
7621
+
7622
+ if self._log is not None:
7623
+ self._log.info(f'Bootstrapping uv into %s', bd)
7624
+
7625
+ vn = 'uv-bootstrap'
7626
+ await asyncio_subprocesses.check_call(os.path.realpath(sys.executable), '-m', 'venv', vn, cwd=bd)
7627
+
7628
+ vx = os.path.join(bd, vn, 'bin', 'python3')
7629
+ await asyncio_subprocesses.check_call(vx, '-m', 'pip', 'install', 'uv', cwd=bd)
7630
+
7631
+ ux = os.path.join(bd, vn, 'bin', 'uv')
7632
+ check.state(os.path.isfile(ux))
7633
+
7634
+ return ux
7635
+
7636
+ return None
7637
+
7638
+
7570
7639
  ########################################
7571
7640
  # ../../packaging/revisions.py
7572
7641
  """
@@ -7691,6 +7760,9 @@ class GitRevisionAdder:
7691
7760
  # ../../interp/providers/running.py
7692
7761
 
7693
7762
 
7763
+ ##
7764
+
7765
+
7694
7766
  class RunningInterpProvider(InterpProvider):
7695
7767
  @cached_nullary
7696
7768
  def version(self) -> InterpVersion:
@@ -8097,6 +8169,40 @@ class PyenvVersionInstaller:
8097
8169
  return exe
8098
8170
 
8099
8171
 
8172
+ ########################################
8173
+ # ../../interp/uv/provider.py
8174
+ """
8175
+ uv run pip
8176
+ uv run --python 3.11.6 pip
8177
+ uv venv --python 3.11.6 --seed barf
8178
+ python3 -m venv barf && barf/bin/pip install uv && barf/bin/uv venv --python 3.11.6 --seed barf2
8179
+ """
8180
+
8181
+
8182
+ ##
8183
+
8184
+
8185
+ class UvInterpProvider(InterpProvider):
8186
+ def __init__(
8187
+ self,
8188
+ *,
8189
+ pyenv: Uv,
8190
+ inspector: InterpInspector,
8191
+ log: ta.Optional[logging.Logger] = None,
8192
+ ) -> None:
8193
+ super().__init__()
8194
+
8195
+ self._pyenv = pyenv
8196
+ self._inspector = inspector
8197
+ self._log = log
8198
+
8199
+ async def get_installed_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
8200
+ return []
8201
+
8202
+ async def get_installed_version(self, version: InterpVersion) -> Interp:
8203
+ raise NotImplementedError
8204
+
8205
+
8100
8206
  ########################################
8101
8207
  # ../pkg.py
8102
8208
  """
@@ -8659,6 +8765,9 @@ class _PyprojectCliPackageGenerator(BasePyprojectPackageGenerator):
8659
8765
  # ../../interp/providers/inject.py
8660
8766
 
8661
8767
 
8768
+ ##
8769
+
8770
+
8662
8771
  def bind_interp_providers() -> InjectorBindings:
8663
8772
  lst: ta.List[InjectorBindingOrBindings] = [
8664
8773
  inj.bind_array(InterpProvider),
@@ -8678,6 +8787,9 @@ def bind_interp_providers() -> InjectorBindings:
8678
8787
  # ../../interp/pyenv/provider.py
8679
8788
 
8680
8789
 
8790
+ ##
8791
+
8792
+
8681
8793
  class PyenvInterpProvider(InterpProvider):
8682
8794
  @dc.dataclass(frozen=True)
8683
8795
  class Options:
@@ -8805,10 +8917,31 @@ class PyenvInterpProvider(InterpProvider):
8805
8917
  return Interp(exe, version)
8806
8918
 
8807
8919
 
8920
+ ########################################
8921
+ # ../../interp/uv/inject.py
8922
+
8923
+
8924
+ ##
8925
+
8926
+
8927
+ def bind_interp_uv() -> InjectorBindings:
8928
+ lst: ta.List[InjectorBindingOrBindings] = [
8929
+ inj.bind(Uv, singleton=True),
8930
+
8931
+ inj.bind(UvInterpProvider, singleton=True),
8932
+ inj.bind(InterpProvider, to_key=UvInterpProvider, array=True),
8933
+ ]
8934
+
8935
+ return inj.as_bindings(*lst)
8936
+
8937
+
8808
8938
  ########################################
8809
8939
  # ../../interp/pyenv/inject.py
8810
8940
 
8811
8941
 
8942
+ ##
8943
+
8944
+
8812
8945
  def bind_interp_pyenv() -> InjectorBindings:
8813
8946
  lst: ta.List[InjectorBindingOrBindings] = [
8814
8947
  inj.bind(Pyenv, singleton=True),
@@ -8824,6 +8957,9 @@ def bind_interp_pyenv() -> InjectorBindings:
8824
8957
  # ../../interp/inject.py
8825
8958
 
8826
8959
 
8960
+ ##
8961
+
8962
+
8827
8963
  def bind_interp() -> InjectorBindings:
8828
8964
  lst: ta.List[InjectorBindingOrBindings] = [
8829
8965
  bind_interp_providers(),
@@ -8843,6 +8979,7 @@ def bind_interp() -> InjectorBindings:
8843
8979
  injector.provide(c)
8844
8980
  for c in [
8845
8981
  PyenvInterpProvider,
8982
+ UvInterpProvider,
8846
8983
  RunningInterpProvider,
8847
8984
  SystemInterpProvider,
8848
8985
  ]
@@ -8865,6 +9002,9 @@ def bind_interp() -> InjectorBindings:
8865
9002
  # ../../interp/default.py
8866
9003
 
8867
9004
 
9005
+ ##
9006
+
9007
+
8868
9008
  @cached_nullary
8869
9009
  def get_default_interp_resolver() -> InterpResolver:
8870
9010
  return inj.create_injector(bind_interp())[InterpResolver]
omdev/tools/json/cli.py CHANGED
@@ -1,7 +1,6 @@
1
1
  """
2
2
  TODO:
3
3
  - read from http
4
- - jmespath output flat, unquoted strs like jq '.[]'
5
4
 
6
5
  ==
7
6
 
@@ -68,10 +67,14 @@ T = ta.TypeVar('T')
68
67
  U = ta.TypeVar('U')
69
68
 
70
69
 
70
+ ##
71
+
72
+
71
73
  def _build_args_parser() -> argparse.ArgumentParser:
72
74
  parser = argparse.ArgumentParser()
73
75
 
74
76
  parser.add_argument('file', nargs='?')
77
+ parser.add_argument('--source')
75
78
 
76
79
  parser.add_argument('-S', '--stream', action='store_true')
77
80
  parser.add_argument('-B', '--stream-build', action='store_true')
@@ -83,6 +86,7 @@ def _build_args_parser() -> argparse.ArgumentParser:
83
86
  parser.add_argument('-f', '--format')
84
87
 
85
88
  parser.add_argument('-x', '--jmespath-expr')
89
+ parser.add_argument('-M', '--marshal', action='store_true')
86
90
  parser.add_argument('-F', '--flat', action='store_true')
87
91
  parser.add_argument('-E', '--omit-empty', action='store_true')
88
92
 
@@ -129,6 +133,7 @@ def _process_args(args: ta.Any) -> RunConfiguration:
129
133
 
130
134
  processing = ProcessingOptions(
131
135
  jmespath_expr=args.jmespath_expr,
136
+ marshal=args.marshal,
132
137
  flat=args.flat,
133
138
  omit_empty=args.omit_empty,
134
139
  )
@@ -177,13 +182,16 @@ def _main() -> None:
177
182
  #
178
183
 
179
184
  with contextlib.ExitStack() as es:
180
- if args.file is None:
185
+ in_file: ta.BinaryIO
186
+ if args.source is not None:
187
+ check.none(args.file)
188
+ in_file = io.BytesIO(args.source.encode('utf-8'))
189
+ elif args.file is None:
181
190
  in_file = sys.stdin.buffer
182
-
183
191
  else:
184
192
  in_file = es.enter_context(open(args.file, 'rb'))
185
193
 
186
- def yield_input() -> ta.Generator[bytes, None, None]:
194
+ def yield_input() -> ta.Generator[bytes]:
187
195
  fd = check.isinstance(in_file.fileno(), int)
188
196
 
189
197
  while True:
@@ -228,7 +236,7 @@ def _main() -> None:
228
236
  def flush_output(
229
237
  fn: ta.Callable[[T], ta.Iterable[U]],
230
238
  i: T,
231
- ) -> ta.Generator[U, None, None]:
239
+ ) -> ta.Generator[U]:
232
240
  n = 0
233
241
  for o in fn(i):
234
242
  yield o
@@ -247,7 +255,7 @@ def _main() -> None:
247
255
  def append_newlines(
248
256
  fn: ta.Callable[[T], ta.Iterable[str]],
249
257
  i: T,
250
- ) -> ta.Generator[str, None, None]:
258
+ ) -> ta.Generator[str]:
251
259
  yield from fn(i)
252
260
  yield '\n'
253
261
 
@@ -22,7 +22,7 @@ class EagerParser:
22
22
 
23
23
  self._fmt = fmt
24
24
 
25
- def parse(self, f: ta.TextIO) -> ta.Generator[ta.Any, None, None]:
25
+ def parse(self, f: ta.TextIO) -> ta.Generator[ta.Any]:
26
26
  return self._fmt.load(f)
27
27
 
28
28
 
@@ -42,7 +42,7 @@ class DelimitingParser:
42
42
 
43
43
  self._db = DelimitingBuffer(delimiters)
44
44
 
45
- def parse(self, b: bytes) -> ta.Generator[ta.Any, None, None]:
45
+ def parse(self, b: bytes) -> ta.Generator[ta.Any]:
46
46
  for chunk in self._db.feed(b):
47
47
  s = check.isinstance(chunk, bytes).decode('utf-8')
48
48
  v = self._fmt.load(io.StringIO(s))
@@ -58,7 +58,7 @@ class StreamBuilder(lang.ExitStacked):
58
58
  def _enter_contexts(self) -> None:
59
59
  self._builder = self._enter_context(JsonObjectBuilder())
60
60
 
61
- def build(self, e: JsonStreamParserEvent) -> ta.Generator[ta.Any, None, None]:
61
+ def build(self, e: JsonStreamParserEvent) -> ta.Generator[ta.Any]:
62
62
  yield from check.not_none(self._builder)(e)
63
63
 
64
64
 
@@ -72,7 +72,7 @@ class StreamParser(lang.ExitStacked):
72
72
  self._lex = self._enter_context(JsonStreamLexer())
73
73
  self._parse = self._enter_context(JsonStreamParser())
74
74
 
75
- def parse(self, b: bytes) -> ta.Generator[JsonStreamParserEvent, None, None]:
75
+ def parse(self, b: bytes) -> ta.Generator[JsonStreamParserEvent]:
76
76
  for s in self._decoder.decode(b, not b):
77
77
  for c in s:
78
78
  for t in self._lex(c):
@@ -5,8 +5,10 @@ from omlish import lang
5
5
 
6
6
 
7
7
  if ta.TYPE_CHECKING:
8
+ from omlish import marshal as msh
8
9
  from omlish.specs import jmespath
9
10
  else:
11
+ msh = lang.proxy_import('omlish.marshal')
10
12
  jmespath = lang.proxy_import('omlish.specs.jmespath')
11
13
 
12
14
 
@@ -16,6 +18,7 @@ else:
16
18
  @dc.dataclass(frozen=True, kw_only=True)
17
19
  class ProcessingOptions:
18
20
  jmespath_expr: ta.Any | None = None
21
+ marshal: bool = False
19
22
  flat: bool = False
20
23
  omit_empty: bool = False
21
24
 
@@ -31,10 +34,25 @@ class Processor:
31
34
  jmespath_expr = jmespath.compile(jmespath_expr)
32
35
  self._jmespath_expr: ta.Any | None = jmespath_expr
33
36
 
37
+ @lang.cached_function
38
+ def _marshaler_factory(self) -> 'msh.MarshalerFactory':
39
+ return msh.new_standard_marshaler_factory(
40
+ first=[msh.BASE64_MARSHALER_FACTORY],
41
+ )
42
+
43
+ def _marshal(self, v: ta.Any) -> ta.Any:
44
+ return msh.MarshalContext(
45
+ msh.GLOBAL_REGISTRY,
46
+ factory=self._marshaler_factory(),
47
+ ).marshal(v)
48
+
34
49
  def process(self, v: ta.Any) -> ta.Iterable[ta.Any]:
35
50
  if self._jmespath_expr is not None:
36
51
  v = self._jmespath_expr.search(v)
37
52
 
53
+ if self._opts.marshal:
54
+ v = self._marshal(v)
55
+
38
56
  vs: ta.Iterable[ta.Any]
39
57
  if self._opts.flat:
40
58
  if (
@@ -98,5 +98,5 @@ class StreamRenderer(Renderer):
98
98
  **self._kw,
99
99
  )
100
100
 
101
- def render(self, e: JsonStreamParserEvent) -> ta.Generator[str, None, None]:
101
+ def render(self, e: JsonStreamParserEvent) -> ta.Generator[str]:
102
102
  return self._renderer.render((e,))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev355
3
+ Version: 0.0.0.dev357
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.13
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev355
15
+ Requires-Dist: omlish==0.0.0.dev357
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -1,4 +1,4 @@
1
- omdev/.manifests.json,sha256=eThNbd6bCkCK4thijDHcXDZ2eDr6i-wfnmV_qxbzino,11870
1
+ omdev/.manifests.json,sha256=bc0ButqJqOkZiEgO6VZ6CRZ8RL9Mf_DiFUNxm81jl04,11870
2
2
  omdev/__about__.py,sha256=2_6pQyjxqAspvwBSJUWQgdBBcGaDO3zX8yETLaspUQE,1202
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omdev/cmake.py,sha256=9rfSvFHPmKDj9ngvfDB2vK8O-xO_ZwUm7hMKLWA-yOw,4578
@@ -76,11 +76,11 @@ omdev/ci/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  omdev/ci/docker/buildcaching.py,sha256=ge6TOKkffqVJMHMPJJl4sWy7hOkUeXgjmfq2cVJEsus,1839
77
77
  omdev/ci/docker/cache.py,sha256=Psk9EX9iDJ2Fk-tDGzbBa4TD8xgucroGoY_AErjgzDo,2120
78
78
  omdev/ci/docker/cmds.py,sha256=1aSLQqbMJpdAMskxfeGI-he5Amb910RWvo2DE6ZgID8,3067
79
- omdev/ci/docker/dataserver.py,sha256=at4t24yUkWKmIGUib7joR4f7L-sSL1-soaYON7wbsf4,5867
79
+ omdev/ci/docker/dataserver.py,sha256=3nDQhSJsEui3GG5vUqCND-n21EJJcMFKa7NO1Gkh_Go,5873
80
80
  omdev/ci/docker/imagepulling.py,sha256=6N8PkvZUlvd20kQ5zF0_7fInP6TYgZYFM9WsH9J7uIc,1832
81
81
  omdev/ci/docker/inject.py,sha256=vlWoIJHx2hzCai4wWspIcWnR3WhZ2bsOjq7fqq0qozE,2006
82
82
  omdev/ci/docker/packing.py,sha256=IayecomyP6AdaiKP1-Ki1wcb2ayfZz2mDqHWbPD8y50,2022
83
- omdev/ci/docker/repositories.py,sha256=R0IcY39oHwirfSuoIbaFF0NIc8qpcCJ9CWONvbf7kS8,1229
83
+ omdev/ci/docker/repositories.py,sha256=kZx4mqKapT9L9LnanstUHaIgM68v35rcZLbMwhxg80c,1235
84
84
  omdev/ci/docker/utils.py,sha256=7Tobiq2hMxicGpQfTkDoU7oTa8Tyw47LpDh8C554LLs,1135
85
85
  omdev/ci/docker/cacheserved/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
86
  omdev/ci/docker/cacheserved/cache.py,sha256=V9R1_HBNJzMGFqiSnTAP1M4VAv9pJBsXYvR7I52wR50,7025
@@ -103,7 +103,7 @@ omdev/ci/github/api/v2/client.py,sha256=bJtL_TZ4sB6IDuzfqtEXj-iWivKfyXQZ_MO30lgB
103
103
  omdev/cli/__init__.py,sha256=V_l6VP1SZMlJbO-8CJwSuO9TThOy2S_oaPepNYgIrbE,37
104
104
  omdev/cli/__main__.py,sha256=mOJpgc07o0r5luQ1DlX4tk2PqZkgmbwPbdzJ3KmtjgQ,138
105
105
  omdev/cli/_pathhack.py,sha256=UshIZX3oeXq0De-9X28gy2LgKMZDf_dzabdkUhZJdNA,2124
106
- omdev/cli/clicli.py,sha256=KS6PMfqJmInQCi9dzpgKKFNQ9bO1jxlBbqypBgTZADU,4819
106
+ omdev/cli/clicli.py,sha256=kJ6gyf2JGbZuo99HSPWh0E82538GstlraKmKcAyCd1I,5052
107
107
  omdev/cli/install.py,sha256=oB34AOwu07sqEztW_z5mgorAFoP_Tw556XiTPj2WSM0,4904
108
108
  omdev/cli/main.py,sha256=dxZFyzKuwRykHHhoKKUA0fUa9QsY0dgdvLHbXNuIPCY,6694
109
109
  omdev/cli/managers.py,sha256=BV98_n30Jj63OJrFgRoVZRfICxMLXEZKoEn4rMj9LV4,1160
@@ -134,35 +134,35 @@ omdev/home/secrets.py,sha256=XarB-uhwjRc3dpT5ZF-9yoRPDr7kpyr4Hgs0I4kKL4I,1992
134
134
  omdev/home/shadow.py,sha256=6mGDJV70IExa-nzd7mOUW4R3OZIXO0fBwmOUU9T9f4M,295
135
135
  omdev/interp/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
136
136
  omdev/interp/__main__.py,sha256=GMCqeGYltgt5dlJzHxY9gqisa8cRkrPfmZYuZnjg4WI,162
137
- omdev/interp/cli.py,sha256=hMTpu5sHg0AFCEYOGaipyv2DeCzWp0ZYH1zCByPKqQQ,2375
138
- omdev/interp/default.py,sha256=FTFQVvA8Lipe8k5eFbf-mLIbrcmfuEXka4ifPyQP8CA,285
139
- omdev/interp/inject.py,sha256=m2j5XCIi9jc9L0XcbooBD5z4IZ7cddVFObKCbb1t-B8,1488
140
- omdev/interp/inspect.py,sha256=4dAHCdK8OnQ5uc4tNR5hl0UW8aEigg3lcUMXrEFIWwc,2972
141
- omdev/interp/resolvers.py,sha256=2IC3dii7qzQX6aXC__4PMi2Gyv8HBSQBMtHVTH3IPls,2585
137
+ omdev/interp/cli.py,sha256=xYZHts_tYuWPenTTLQIQ-I1JWHao6XolsH0R73AufDY,2380
138
+ omdev/interp/default.py,sha256=1jxTsCeCkmYX1QDgr-bPcfSTFdbkYCNKrdfdVf4_P8M,290
139
+ omdev/interp/inject.py,sha256=MOppFILGFCp2f4-2uwmH5fN-7erHI3RyMQJaG0kw0Gc,1569
140
+ omdev/interp/inspect.py,sha256=tRhs4SXIrIjDrrjidNeos87RK6EF6KdTP7EsGECMG3A,2977
141
+ omdev/interp/resolvers.py,sha256=9ExwP0wcQ4mzyTLNurSG4Dg1AQ_IqLfR2ZyqR4VRANE,2590
142
142
  omdev/interp/types.py,sha256=Pr0wrVpNasoCw-ThEvKC5LG30Civ7YJ4EONwrwBLpy0,2516
143
143
  omdev/interp/venvs.py,sha256=B46sYxamM2X5BG_5KNk07ERtCHFF5Aqz47EGcCZMtP4,3280
144
144
  omdev/interp/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
145
  omdev/interp/providers/base.py,sha256=aftoEB3FQInKKGDHDSjpnI33cOLBpxPM4Cw_yOuV1fQ,1288
146
- omdev/interp/providers/inject.py,sha256=rJZDyTSBLw231BYw23UEt0pgrVFxdbRwtqtnXKOgyVc,852
147
- omdev/interp/providers/running.py,sha256=9MCJAcHotI0EmNIxPwt7b3W715Jp2Gfw1qtMhCEGsUQ,781
148
- omdev/interp/providers/standalone.py,sha256=zoHeEozKY63GPpFFXkdRmvchPDsltNw8sGTQWfF8wcU,7731
146
+ omdev/interp/providers/inject.py,sha256=NSDFBQVD3ZR9Mf162XB9_VvTUAXGCRhPcrjVlYcFDJk,857
147
+ omdev/interp/providers/running.py,sha256=M3Ni41f-iHRVEySyxogensOfh1RkONQ91kIMrfurY_M,786
148
+ omdev/interp/providers/standalone.py,sha256=9YVU9uGGxDFidnGkQ1kSIvjKrFQyhWDu45gBboFVicI,7736
149
149
  omdev/interp/providers/system.py,sha256=Lld7a-SZR9tELHxczm72gOYhjETM5nsz8r4l32y03vw,3991
150
150
  omdev/interp/pyenv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
- omdev/interp/pyenv/inject.py,sha256=4TXH_zoFZXT1f7ntyFMzrX3P2lTQrtooNb6CCDAfmOE,611
151
+ omdev/interp/pyenv/inject.py,sha256=Qj9nCnZn0eZMOx1jNAYi5f2RlIy8SHmN3maPK1ZDWwo,616
152
152
  omdev/interp/pyenv/install.py,sha256=knsHpM9R7SRQ7sc9pKqNKEPCkN4e52q4YeSBBNhugpY,8352
153
- omdev/interp/pyenv/provider.py,sha256=mGkzNGU_q__ZAiQgeum03E7JLhjZ8irnE863QP6daiw,4451
154
- omdev/interp/pyenv/pyenv.py,sha256=4dDjnnAvEagqWE3NZUWEo1xpTrStB1nGqEcQd9mSm14,2649
153
+ omdev/interp/pyenv/provider.py,sha256=1VJuyBkGmY1ChZ1TY3ihuk7E-4p-MQjGbibzQlgVXPs,4456
154
+ omdev/interp/pyenv/pyenv.py,sha256=Kf1K80v0zcw1BmBQPLczH4dz770_js_ma4Sj4_XOEcU,2654
155
155
  omdev/interp/uv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
- omdev/interp/uv/inject.py,sha256=yX5HKSC6Szfi9PumHUqBVAN1Eh2POR7qQoqO7GoqzeQ,320
157
- omdev/interp/uv/provider.py,sha256=CA3kx_6iTgU3Uf8CFZ1AiZ8NyvM_6KsnnxO5E-Ji_x0,674
158
- omdev/interp/uv/uv.py,sha256=kuAgNMoA_LL3m3LFFrjDMYlc-6ZlS_azC2Sqo81pEg4,1779
156
+ omdev/interp/uv/inject.py,sha256=nNCfjD-nrErM8wM__Z51rxqZjV3Cn0kE25jFAbkrPag,595
157
+ omdev/interp/uv/provider.py,sha256=Rq4VEB5rEMd5ZI3Jkk9fJO2JmRXQU36hlWTg1R3ymwE,1018
158
+ omdev/interp/uv/uv.py,sha256=-kp_1hkJemWxwh20isOApSU4uu87grU6mi643wRAtXE,1784
159
159
  omdev/magic/__init__.py,sha256=CBzRB71RLyylkrj8dph6JUEddA8KSMJvDgriHqFfJGU,478
160
160
  omdev/magic/__main__.py,sha256=1_BAKDtA6Rn5hswyl4S5J78BPRbynX4is_wQsD0U7jI,161
161
161
  omdev/magic/cli.py,sha256=DL4V34hSh0yVEtPyl6C7RSYd_td9FOT9Zn7kkyQZhvU,1190
162
162
  omdev/magic/find.py,sha256=n9v4XzkYAyh9MVAXRBSmiOlLgZSVbwLYrSJdQBx0G8s,6223
163
- omdev/magic/magic.py,sha256=dBa85H3VK9BNTKrIFeH5XTwK6dJKseiCx6EqoT0OjYw,230
164
- omdev/magic/prepare.py,sha256=V5jYT2AeFmazzPwk9sNismSouLwFXEoik6FwKcWCNUY,589
165
- omdev/magic/styles.py,sha256=QjYxOmrV8jQIFjQF4iaBCpec8Qj9XBsi-NIZoKZwXJ4,665
163
+ omdev/magic/magic.py,sha256=M1aOpp1eimbSxZSlKLbobXRZ15MoRrTtLWK-FQrxtGI,235
164
+ omdev/magic/prepare.py,sha256=SEOK-bl4zDxq0aphYXsEI-hCjbkV908VNnJt-dk0kL4,594
165
+ omdev/magic/styles.py,sha256=6LAL7XR3fkkH2rh-8nwUvdCYVHBkQxCfP0oEuPuw1Bg,670
166
166
  omdev/manifests/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
167
167
  omdev/manifests/__main__.py,sha256=JqyVDyV7_jo-NZ3wSs5clDU_xCMlxzJv-XFohoZWQ7E,174
168
168
  omdev/manifests/build.py,sha256=HirTi1z0hC_XzUNmvLWsCapr6OrywYk7s1ZQmd-islA,11017
@@ -197,12 +197,12 @@ omdev/precheck/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
197
197
  omdev/precheck/__main__.py,sha256=UEuS4z5-heIrwTtB-ONe1KeXJdqj8tYXMqWMpuO10so,165
198
198
  omdev/precheck/base.py,sha256=fKdrfakq2u1UU1_JZFnl-non9bIAZMsSkVY1SMYn8xQ,662
199
199
  omdev/precheck/caches.py,sha256=OZKP20DIj6OpUzdNwrjCufv1GzndEbsc7tLD-qHNv9g,1736
200
- omdev/precheck/git.py,sha256=2Z-xIDDy9MOiPWjBXxQjwSKFaEutR2XBWplydyNqNYg,780
201
- omdev/precheck/imports.py,sha256=r5r178A7f8_zJbkiHl7C1jZOBe4ESEXKyWX6rfU11W8,2567
202
- omdev/precheck/lite.py,sha256=rG6NYg0X85eN5UQ8-S7fagP5Ng2Nxwuf5Uh7uI8nQsE,4716
200
+ omdev/precheck/git.py,sha256=O8rNQZ_vlHec0pOFbK6LOkbly5ZIUYT_HXRMqQX8GaI,774
201
+ omdev/precheck/imports.py,sha256=JS-j1YWi_4YL43053xITl6b35isRW-7ChoYoztufVn0,2549
202
+ omdev/precheck/lite.py,sha256=qd6nXWEVut8aBSRD_NxnxXGRNa9ue8mu8ND8rGLisE4,4710
203
203
  omdev/precheck/main.py,sha256=VEPdq9n8Yo_HiDqfCdHH1pj3xuJgOzrXie_vWoNbKqw,4303
204
- omdev/precheck/manifests.py,sha256=4V4_mMh5ptW0jWBmq0nG3bsx3dyjejVs1ReEUoOz-JA,784
205
- omdev/precheck/scripts.py,sha256=Br163NGbLY6Mjkxr9htdzqqsYWiEJbg9Gq-Glz6YQUI,1342
204
+ omdev/precheck/manifests.py,sha256=EZkChCc9aDlAZswVVvq696p4r3Vy7VBQUSfn6DXhUcc,778
205
+ omdev/precheck/scripts.py,sha256=SyHTVUVMTnBoTzcrWywfwxuUoIfpeV_EQcPQZyaht6c,1336
206
206
  omdev/ptk/__init__.py,sha256=IemfBhxxqZe1GeZ2_IMQzqWAB5j0XyARp_aajnonyKY,5142
207
207
  omdev/ptk/confirm.py,sha256=kObMUAu-EZC0vdT9LLwtbNA6YLLNmn-Uy18SQTWBTb8,1471
208
208
  omdev/ptk/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -252,9 +252,9 @@ omdev/pyproject/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
252
252
  omdev/pyproject/resources/docker-dev.sh,sha256=DHkz5D18jok_oDolfg2mqrvGRWFoCe9GQo04dR1czcc,838
253
253
  omdev/pyproject/resources/python.sh,sha256=rFaN4SiJ9hdLDXXsDTwugI6zsw6EPkgYMmtacZeTbvw,749
254
254
  omdev/scripts/__init__.py,sha256=MKCvUAEQwsIvwLixwtPlpBqmkMXLCnjjXyAXvVpDwVk,91
255
- omdev/scripts/ci.py,sha256=PCCZi3PDF8X9uVym6F898TjSYKOmMTRbRw-8cJrrRRY,358020
256
- omdev/scripts/interp.py,sha256=HHEFZJCO-1r_DLNA2bwmCDgcQiXf6hnCZ_6OALpmHrk,155558
257
- omdev/scripts/pyproject.py,sha256=Y_QRE_6kxo_k6oobXz4hON3ctPX6NV9I5N4VNZtRKfo,265039
255
+ omdev/scripts/ci.py,sha256=IcEIPLYY92fdl-nEpTRSpNC3q_NNG91YpShloOGH450,358026
256
+ omdev/scripts/interp.py,sha256=SPoPSDco58C61CKUmu1OoFtld9zqYJ1IndBaDZpHUGo,158182
257
+ omdev/scripts/pyproject.py,sha256=n5sZwKVs8XuL-UikTTfRUwSG2e5RY-w3U6PIo66N5OE,267682
258
258
  omdev/scripts/slowcat.py,sha256=lssv4yrgJHiWfOiHkUut2p8E8Tq32zB-ujXESQxFFHY,2728
259
259
  omdev/scripts/tmpexec.py,sha256=WTYcf56Tj2qjYV14AWmV8SfT0u6Y8eIU6cKgQRvEK3c,1442
260
260
  omdev/tokens/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -288,12 +288,12 @@ omdev/tools/git/consts.py,sha256=JuXivUNDkNhM4pe97icjRVAKM8cNRbrODquHINNKqOE,40
288
288
  omdev/tools/git/messages.py,sha256=NWztIK0nAKJIOVzuVQcR_5LHZUgqyVkrOlpl7dFLMdU,2424
289
289
  omdev/tools/json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
290
290
  omdev/tools/json/__main__.py,sha256=wqpkN_NsQyNwKW4qjVj8ADJ4_C98KhrFBtE-Z1UamfU,168
291
- omdev/tools/json/cli.py,sha256=GLRg1dz_Y7HEzBtpiLWDZxmuqALMG3--22GFLyaQfl4,9786
291
+ omdev/tools/json/cli.py,sha256=EivaqeBlHNzrOYkSUvvxDUia0TuyS4KPtxrPxvfqFi8,9994
292
292
  omdev/tools/json/formats.py,sha256=0IXHUIkcbKnTVP0a53wYWsBMpfVtGTrHN04zRAs2JZo,2049
293
293
  omdev/tools/json/io.py,sha256=sfj2hJS9Hy3aUR8a_lLzOrYcmL9fSKyvOHiofdUASsI,1427
294
- omdev/tools/json/parsing.py,sha256=csoTuG2C2AJB7PgG4TKt2XqdiBAQXtpXRWBxoMkk14g,2103
295
- omdev/tools/json/processing.py,sha256=BKy385d86psrHVJGsu7U8_giUPUcU_R1s56u9v066VY,1461
296
- omdev/tools/json/rendering.py,sha256=t33eXnUoYTmusETBnrYrLCpkWLQNvkGmixudrd8C1ag,2573
294
+ omdev/tools/json/parsing.py,sha256=fBqPEmeQAbqSfq2Wuu-0xT1Jr6aTB0SM_KMtaZb7Z_8,2055
295
+ omdev/tools/json/processing.py,sha256=KVMVyW5dTaoPyjn2Aabkay4tBn5cwJJXtLQaJgZI7ZY,2016
296
+ omdev/tools/json/rendering.py,sha256=gCVjNrgfaZoviJNWU8j7Pq4sz1EHYjOxsshC6OxWwDE,2561
297
297
  omdev/tools/jsonview/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
298
298
  omdev/tools/jsonview/__main__.py,sha256=BF-MVWpPJJeQYUqJA48G395kxw0lEJnV-hRLV_F9G2A,173
299
299
  omdev/tools/jsonview/cli.py,sha256=8pHULS_xxDV00kM8bO5dLH7i-zqQIoNjXTKFwhxSZ_A,4245
@@ -303,9 +303,9 @@ omdev/tools/jsonview/resources/jsonview.js,sha256=faDvXDOXKvEvjOuIlz4D3F2ReQXb_b
303
303
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
304
304
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
305
305
  omdev/tools/pawk/pawk.py,sha256=zsEkfQX0jF5bn712uqPAyBSdJt2dno1LH2oeSMNfXQI,11424
306
- omdev-0.0.0.dev355.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
307
- omdev-0.0.0.dev355.dist-info/METADATA,sha256=WplfvKUSZEo6fA95YNRCzzo_ki_c8UsMX3-ey9MuLIY,1674
308
- omdev-0.0.0.dev355.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
309
- omdev-0.0.0.dev355.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
310
- omdev-0.0.0.dev355.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
311
- omdev-0.0.0.dev355.dist-info/RECORD,,
306
+ omdev-0.0.0.dev357.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
307
+ omdev-0.0.0.dev357.dist-info/METADATA,sha256=v6zON6tQfkSiWWzKCFx9oj3SqsXT0FY-9U9zybw--cQ,1674
308
+ omdev-0.0.0.dev357.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
309
+ omdev-0.0.0.dev357.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
310
+ omdev-0.0.0.dev357.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
311
+ omdev-0.0.0.dev357.dist-info/RECORD,,