ominfra 0.0.0.dev162__tar.gz → 0.0.0.dev164__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. {ominfra-0.0.0.dev162/ominfra.egg-info → ominfra-0.0.0.dev164}/PKG-INFO +3 -3
  2. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/apps.py +3 -2
  3. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/specs.py +18 -0
  4. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/venvs.py +9 -4
  5. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/scripts/manage.py +29 -6
  6. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164/ominfra.egg-info}/PKG-INFO +3 -3
  7. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra.egg-info/requires.txt +2 -2
  8. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/pyproject.toml +3 -3
  9. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/LICENSE +0 -0
  10. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/MANIFEST.in +0 -0
  11. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/README.rst +0 -0
  12. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/.manifests.json +0 -0
  13. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/__about__.py +0 -0
  14. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/__init__.py +0 -0
  15. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/__init__.py +0 -0
  16. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/__init__.py +0 -0
  17. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/__main__.py +0 -0
  18. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/auth.py +0 -0
  19. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/cli.py +0 -0
  20. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/dataclasses.py +0 -0
  21. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
  22. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
  23. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
  24. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
  25. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/journald2aws/main.py +0 -0
  26. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
  27. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/logs.py +0 -0
  28. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/aws/metadata.py +0 -0
  29. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/gcp/__init__.py +0 -0
  30. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/clouds/gcp/auth.py +0 -0
  31. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/cmds.py +0 -0
  32. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/configs.py +0 -0
  33. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/journald/__init__.py +0 -0
  34. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/journald/fields.py +0 -0
  35. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/journald/genmessages.py +0 -0
  36. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/journald/messages.py +0 -0
  37. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/journald/tailer.py +0 -0
  38. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/__init__.py +0 -0
  39. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/__main__.py +0 -0
  40. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/bootstrap.py +0 -0
  41. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/bootstrap_.py +0 -0
  42. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/commands/__init__.py +0 -0
  43. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/commands/base.py +0 -0
  44. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/commands/inject.py +0 -0
  45. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/commands/local.py +0 -0
  46. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/commands/marshal.py +0 -0
  47. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/commands/ping.py +0 -0
  48. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/commands/subprocess.py +0 -0
  49. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/commands/types.py +0 -0
  50. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/config.py +0 -0
  51. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/__init__.py +0 -0
  52. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/commands.py +0 -0
  53. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/config.py +0 -0
  54. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/git.py +0 -0
  55. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/inject.py +0 -0
  56. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/interp.py +0 -0
  57. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/paths.py +0 -0
  58. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/tmp.py +0 -0
  59. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/deploy/types.py +0 -0
  60. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/inject.py +0 -0
  61. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/main.py +0 -0
  62. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/marshal.py +0 -0
  63. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/remote/__init__.py +0 -0
  64. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/remote/_main.py +0 -0
  65. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/remote/channel.py +0 -0
  66. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/remote/config.py +0 -0
  67. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/remote/connection.py +0 -0
  68. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/remote/execution.py +0 -0
  69. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/remote/inject.py +0 -0
  70. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/remote/payload.py +0 -0
  71. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/remote/spawning.py +0 -0
  72. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/system/__init__.py +0 -0
  73. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/system/commands.py +0 -0
  74. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/system/config.py +0 -0
  75. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/system/inject.py +0 -0
  76. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/system/packages.py +0 -0
  77. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/system/platforms.py +0 -0
  78. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/targets/__init__.py +0 -0
  79. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/targets/connection.py +0 -0
  80. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/targets/inject.py +0 -0
  81. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/manage/targets/targets.py +0 -0
  82. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/pyremote.py +0 -0
  83. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/scripts/__init__.py +0 -0
  84. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/scripts/journald2aws.py +0 -0
  85. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/scripts/supervisor.py +0 -0
  86. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/ssh.py +0 -0
  87. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/LICENSE.txt +0 -0
  88. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/__init__.py +0 -0
  89. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/__main__.py +0 -0
  90. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/configs.py +0 -0
  91. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/dispatchers.py +0 -0
  92. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/dispatchersimpl.py +0 -0
  93. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/events.py +0 -0
  94. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/exceptions.py +0 -0
  95. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/groups.py +0 -0
  96. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/groupsimpl.py +0 -0
  97. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/http.py +0 -0
  98. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/inject.py +0 -0
  99. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/io.py +0 -0
  100. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/main.py +0 -0
  101. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/pipes.py +0 -0
  102. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/privileges.py +0 -0
  103. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/process.py +0 -0
  104. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/processimpl.py +0 -0
  105. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/setup.py +0 -0
  106. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/setupimpl.py +0 -0
  107. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/signals.py +0 -0
  108. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/spawning.py +0 -0
  109. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/spawningimpl.py +0 -0
  110. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/states.py +0 -0
  111. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/supervisor.py +0 -0
  112. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/types.py +0 -0
  113. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/utils/__init__.py +0 -0
  114. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/utils/collections.py +0 -0
  115. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/utils/diag.py +0 -0
  116. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/utils/fds.py +0 -0
  117. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/utils/fs.py +0 -0
  118. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/utils/os.py +0 -0
  119. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/utils/ostypes.py +0 -0
  120. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/utils/signals.py +0 -0
  121. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/utils/strings.py +0 -0
  122. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/supervisor/utils/users.py +0 -0
  123. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/tailscale/__init__.py +0 -0
  124. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/tailscale/api.py +0 -0
  125. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/tailscale/cli.py +0 -0
  126. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/threadworkers.py +0 -0
  127. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/tools/__init__.py +0 -0
  128. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra/tools/listresources.py +0 -0
  129. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra.egg-info/SOURCES.txt +0 -0
  130. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra.egg-info/dependency_links.txt +0 -0
  131. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra.egg-info/entry_points.txt +0 -0
  132. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/ominfra.egg-info/top_level.txt +0 -0
  133. {ominfra-0.0.0.dev162 → ominfra-0.0.0.dev164}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ominfra
3
- Version: 0.0.0.dev162
3
+ Version: 0.0.0.dev164
4
4
  Summary: ominfra
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omdev==0.0.0.dev162
16
- Requires-Dist: omlish==0.0.0.dev162
15
+ Requires-Dist: omdev==0.0.0.dev164
16
+ Requires-Dist: omlish==0.0.0.dev164
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.18; extra == "all"
@@ -51,7 +51,7 @@ class DeployAppManager(DeployPathOwner):
51
51
 
52
52
  def get_owned_deploy_paths(self) -> ta.AbstractSet[DeployPath]:
53
53
  return {
54
- DeployPath.parse('apps/@app/@tag'),
54
+ DeployPath.parse('apps/@app/@tag/'),
55
55
  }
56
56
 
57
57
  async def prepare_app(
@@ -70,4 +70,5 @@ class DeployAppManager(DeployPathOwner):
70
70
 
71
71
  #
72
72
 
73
- await self._venvs.setup_app_venv(app_tag)
73
+ if spec.venv is not None:
74
+ await self._venvs.setup_app_venv(app_tag, spec.venv)
@@ -43,11 +43,29 @@ class DeployGitCheckout:
43
43
  ##
44
44
 
45
45
 
46
+ @dc.dataclass(frozen=True)
47
+ class DeployVenvSpec:
48
+ interp: ta.Optional[str] = None
49
+
50
+ requirements_files: ta.Optional[ta.Sequence[str]] = None
51
+ extra_dependencies: ta.Optional[ta.Sequence[str]] = None
52
+
53
+ use_uv: bool = False
54
+
55
+ def __post_init__(self) -> None:
56
+ hash(self)
57
+
58
+
59
+ ##
60
+
61
+
46
62
  @dc.dataclass(frozen=True)
47
63
  class DeploySpec:
48
64
  app: DeployApp
49
65
  checkout: DeployGitCheckout
50
66
 
67
+ venv: ta.Optional[DeployVenvSpec] = None
68
+
51
69
  def __post_init__(self) -> None:
52
70
  hash(self)
53
71
 
@@ -14,6 +14,7 @@ from omlish.os.atomics import AtomicPathSwapping
14
14
 
15
15
  from .paths import DeployPath
16
16
  from .paths import DeployPathOwner
17
+ from .specs import DeployVenvSpec
17
18
  from .types import DeployAppTag
18
19
  from .types import DeployHome
19
20
 
@@ -43,8 +44,7 @@ class DeployVenvManager(DeployPathOwner):
43
44
  self,
44
45
  app_dir: str,
45
46
  venv_dir: str,
46
- *,
47
- use_uv: bool = True,
47
+ spec: DeployVenvSpec,
48
48
  ) -> None:
49
49
  sys_exe = 'python3'
50
50
 
@@ -61,7 +61,7 @@ class DeployVenvManager(DeployPathOwner):
61
61
  reqs_txt = os.path.join(app_dir, 'requirements.txt')
62
62
 
63
63
  if os.path.isfile(reqs_txt):
64
- if use_uv:
64
+ if spec.use_uv:
65
65
  await asyncio_subprocesses.check_call(venv_exe, '-m', 'pip', 'install', 'uv')
66
66
  pip_cmd = ['-m', 'uv', 'pip']
67
67
  else:
@@ -69,8 +69,13 @@ class DeployVenvManager(DeployPathOwner):
69
69
 
70
70
  await asyncio_subprocesses.check_call(venv_exe, *pip_cmd,'install', '-r', reqs_txt)
71
71
 
72
- async def setup_app_venv(self, app_tag: DeployAppTag) -> None:
72
+ async def setup_app_venv(
73
+ self,
74
+ app_tag: DeployAppTag,
75
+ spec: DeployVenvSpec,
76
+ ) -> None:
73
77
  await self.setup_venv(
74
78
  os.path.join(check.non_empty_str(self._deploy_home), 'apps', app_tag.app, app_tag.tag),
75
79
  os.path.join(self._dir(), app_tag.app, app_tag.tag),
80
+ spec,
76
81
  )
@@ -4329,11 +4329,29 @@ class DeployGitCheckout:
4329
4329
  ##
4330
4330
 
4331
4331
 
4332
+ @dc.dataclass(frozen=True)
4333
+ class DeployVenvSpec:
4334
+ interp: ta.Optional[str] = None
4335
+
4336
+ requirements_files: ta.Optional[ta.Sequence[str]] = None
4337
+ extra_dependencies: ta.Optional[ta.Sequence[str]] = None
4338
+
4339
+ use_uv: bool = False
4340
+
4341
+ def __post_init__(self) -> None:
4342
+ hash(self)
4343
+
4344
+
4345
+ ##
4346
+
4347
+
4332
4348
  @dc.dataclass(frozen=True)
4333
4349
  class DeploySpec:
4334
4350
  app: DeployApp
4335
4351
  checkout: DeployGitCheckout
4336
4352
 
4353
+ venv: ta.Optional[DeployVenvSpec] = None
4354
+
4337
4355
  def __post_init__(self) -> None:
4338
4356
  hash(self)
4339
4357
 
@@ -8284,8 +8302,7 @@ class DeployVenvManager(DeployPathOwner):
8284
8302
  self,
8285
8303
  app_dir: str,
8286
8304
  venv_dir: str,
8287
- *,
8288
- use_uv: bool = True,
8305
+ spec: DeployVenvSpec,
8289
8306
  ) -> None:
8290
8307
  sys_exe = 'python3'
8291
8308
 
@@ -8302,7 +8319,7 @@ class DeployVenvManager(DeployPathOwner):
8302
8319
  reqs_txt = os.path.join(app_dir, 'requirements.txt')
8303
8320
 
8304
8321
  if os.path.isfile(reqs_txt):
8305
- if use_uv:
8322
+ if spec.use_uv:
8306
8323
  await asyncio_subprocesses.check_call(venv_exe, '-m', 'pip', 'install', 'uv')
8307
8324
  pip_cmd = ['-m', 'uv', 'pip']
8308
8325
  else:
@@ -8310,10 +8327,15 @@ class DeployVenvManager(DeployPathOwner):
8310
8327
 
8311
8328
  await asyncio_subprocesses.check_call(venv_exe, *pip_cmd,'install', '-r', reqs_txt)
8312
8329
 
8313
- async def setup_app_venv(self, app_tag: DeployAppTag) -> None:
8330
+ async def setup_app_venv(
8331
+ self,
8332
+ app_tag: DeployAppTag,
8333
+ spec: DeployVenvSpec,
8334
+ ) -> None:
8314
8335
  await self.setup_venv(
8315
8336
  os.path.join(check.non_empty_str(self._deploy_home), 'apps', app_tag.app, app_tag.tag),
8316
8337
  os.path.join(self._dir(), app_tag.app, app_tag.tag),
8338
+ spec,
8317
8339
  )
8318
8340
 
8319
8341
 
@@ -8879,7 +8901,7 @@ class DeployAppManager(DeployPathOwner):
8879
8901
 
8880
8902
  def get_owned_deploy_paths(self) -> ta.AbstractSet[DeployPath]:
8881
8903
  return {
8882
- DeployPath.parse('apps/@app/@tag'),
8904
+ DeployPath.parse('apps/@app/@tag/'),
8883
8905
  }
8884
8906
 
8885
8907
  async def prepare_app(
@@ -8898,7 +8920,8 @@ class DeployAppManager(DeployPathOwner):
8898
8920
 
8899
8921
  #
8900
8922
 
8901
- await self._venvs.setup_app_venv(app_tag)
8923
+ if spec.venv is not None:
8924
+ await self._venvs.setup_app_venv(app_tag, spec.venv)
8902
8925
 
8903
8926
 
8904
8927
  ########################################
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ominfra
3
- Version: 0.0.0.dev162
3
+ Version: 0.0.0.dev164
4
4
  Summary: ominfra
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omdev==0.0.0.dev162
16
- Requires-Dist: omlish==0.0.0.dev162
15
+ Requires-Dist: omdev==0.0.0.dev164
16
+ Requires-Dist: omlish==0.0.0.dev164
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.18; extra == "all"
@@ -1,5 +1,5 @@
1
- omdev==0.0.0.dev162
2
- omlish==0.0.0.dev162
1
+ omdev==0.0.0.dev164
2
+ omlish==0.0.0.dev164
3
3
 
4
4
  [all]
5
5
  paramiko~=3.5
@@ -12,7 +12,7 @@ authors = [
12
12
  urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = {text = 'BSD-3-Clause'}
14
14
  requires-python = '>=3.12'
15
- version = '0.0.0.dev162'
15
+ version = '0.0.0.dev164'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
@@ -22,8 +22,8 @@ classifiers = [
22
22
  ]
23
23
  description = 'ominfra'
24
24
  dependencies = [
25
- 'omdev == 0.0.0.dev162',
26
- 'omlish == 0.0.0.dev162',
25
+ 'omdev == 0.0.0.dev164',
26
+ 'omlish == 0.0.0.dev164',
27
27
  ]
28
28
 
29
29
  [project.optional-dependencies]
File without changes
File without changes