omdev 0.0.0.dev212__tar.gz → 0.0.0.dev214__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (230) hide show
  1. {omdev-0.0.0.dev212/omdev.egg-info → omdev-0.0.0.dev214}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/.manifests.json +1 -1
  3. omdev-0.0.0.dev214/omdev/cc/cdeps.py +71 -0
  4. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cc/cdeps.toml +19 -2
  5. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cc/cli.py +13 -1
  6. omdev-0.0.0.dev214/omdev/ci/cache.py +147 -0
  7. omdev-0.0.0.dev214/omdev/ci/ci.py +274 -0
  8. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ci/cli.py +62 -30
  9. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ci/compose.py +26 -62
  10. omdev-0.0.0.dev214/omdev/ci/consts.py +1 -0
  11. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ci/docker.py +39 -22
  12. omdev-0.0.0.dev212/omdev/ci/github/cacheapi.py → omdev-0.0.0.dev214/omdev/ci/github/api.py +1 -2
  13. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ci/github/bootstrap.py +8 -1
  14. omdev-0.0.0.dev214/omdev/ci/github/cache.py +71 -0
  15. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ci/github/cli.py +9 -5
  16. omdev-0.0.0.dev214/omdev/ci/github/client.py +492 -0
  17. omdev-0.0.0.dev214/omdev/ci/github/env.py +21 -0
  18. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ci/requirements.py +0 -1
  19. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ci/shell.py +0 -1
  20. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ci/utils.py +2 -14
  21. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/git/shallow.py +1 -1
  22. omdev-0.0.0.dev214/omdev/pyproject/__init__.py +1 -0
  23. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/scripts/ci.py +1602 -887
  24. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/scripts/interp.py +23 -0
  25. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/scripts/pyproject.py +23 -0
  26. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tokens/tokenizert.py +1 -3
  27. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/docker.py +6 -0
  28. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214/omdev.egg-info}/PKG-INFO +2 -2
  29. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev.egg-info/SOURCES.txt +4 -1
  30. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev.egg-info/requires.txt +1 -1
  31. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/pyproject.toml +2 -2
  32. omdev-0.0.0.dev212/omdev/cc/cdeps.py +0 -38
  33. omdev-0.0.0.dev212/omdev/ci/cache.py +0 -168
  34. omdev-0.0.0.dev212/omdev/ci/ci.py +0 -249
  35. omdev-0.0.0.dev212/omdev/ci/github/cache.py +0 -355
  36. omdev-0.0.0.dev212/omdev/tools/pawk/__init__.py +0 -0
  37. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/LICENSE +0 -0
  38. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/MANIFEST.in +0 -0
  39. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/README.rst +0 -0
  40. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/__about__.py +0 -0
  41. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/__init__.py +0 -0
  42. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/__init__.py +0 -0
  43. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/__main__.py +0 -0
  44. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/gen.py +0 -0
  45. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/imports.py +0 -0
  46. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/main.py +0 -0
  47. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/manifests.py +0 -0
  48. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/resources.py +0 -0
  49. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/srcfiles.py +0 -0
  50. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/strip.py +0 -0
  51. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/types.py +0 -0
  52. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/amalg/typing.py +0 -0
  53. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/antlr/__init__.py +0 -0
  54. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/antlr/consts.py +0 -0
  55. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/antlr/gen.py +0 -0
  56. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/bracepy.py +0 -0
  57. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/__init__.py +0 -0
  58. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/compute/__init__.py +0 -0
  59. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/compute/cache.py +0 -0
  60. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/compute/contexts.py +0 -0
  61. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/compute/currents.py +0 -0
  62. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/compute/fns.py +0 -0
  63. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/compute/resolvers.py +0 -0
  64. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/compute/storage.py +0 -0
  65. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/compute/types.py +0 -0
  66. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/data/__init__.py +0 -0
  67. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/data/actions.py +0 -0
  68. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/data/cache.py +0 -0
  69. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/data/consts.py +0 -0
  70. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/data/defaults.py +0 -0
  71. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/data/manifests.py +0 -0
  72. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cache/data/specs.py +0 -0
  73. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cc/__init__.py +0 -0
  74. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cc/__main__.py +0 -0
  75. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/__init__.py +0 -0
  76. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_boilerplate.cc +0 -0
  77. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/LICENSE +0 -0
  78. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/__init__.py +0 -0
  79. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/build_ext.py +0 -0
  80. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  81. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  82. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/compilers/options.py +0 -0
  83. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  84. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/dir_util.py +0 -0
  85. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/errors.py +0 -0
  86. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/extension.py +0 -0
  87. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/file_util.py +0 -0
  88. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/modified.py +0 -0
  89. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/spawn.py +0 -0
  90. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/sysconfig.py +0 -0
  91. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/util.py +0 -0
  92. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/_distutils/version.py +0 -0
  93. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/build.py +0 -0
  94. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/cmake.py +0 -0
  95. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/importhook.py +0 -0
  96. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/magic.py +0 -0
  97. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cexts/scan.py +0 -0
  98. {omdev-0.0.0.dev212/omdev/interp → omdev-0.0.0.dev214/omdev/ci}/__init__.py +0 -0
  99. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ci/__main__.py +0 -0
  100. {omdev-0.0.0.dev212/omdev/ci → omdev-0.0.0.dev214/omdev/ci/github}/__init__.py +0 -0
  101. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/classdot.py +0 -0
  102. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cli/__init__.py +0 -0
  103. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cli/__main__.py +0 -0
  104. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cli/_pathhack.py +0 -0
  105. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cli/clicli.py +0 -0
  106. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cli/install.py +0 -0
  107. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cli/main.py +0 -0
  108. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cli/managers.py +0 -0
  109. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cli/types.py +0 -0
  110. {omdev-0.0.0.dev212/omdev/ci/github → omdev-0.0.0.dev214/omdev/clipboard}/__init__.py +0 -0
  111. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/clipboard/clipboard.py +0 -0
  112. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/clipboard/darwin_cf.py +0 -0
  113. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/clipboard/linux_x11.py +0 -0
  114. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/cmake.py +0 -0
  115. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/findimports.py +0 -0
  116. {omdev-0.0.0.dev212/omdev/clipboard → omdev-0.0.0.dev214/omdev/git}/__init__.py +0 -0
  117. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/git/revisions.py +0 -0
  118. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/git/status.py +0 -0
  119. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/imgur.py +0 -0
  120. {omdev-0.0.0.dev212/omdev/manifests → omdev-0.0.0.dev214/omdev/interp}/__init__.py +0 -0
  121. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/__main__.py +0 -0
  122. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/cli.py +0 -0
  123. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/default.py +0 -0
  124. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/inject.py +0 -0
  125. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/inspect.py +0 -0
  126. {omdev-0.0.0.dev212/omdev/git → omdev-0.0.0.dev214/omdev/interp/providers}/__init__.py +0 -0
  127. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/providers/base.py +0 -0
  128. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/providers/inject.py +0 -0
  129. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/providers/running.py +0 -0
  130. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/providers/standalone.py +0 -0
  131. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/providers/system.py +0 -0
  132. {omdev-0.0.0.dev212/omdev/interp/providers → omdev-0.0.0.dev214/omdev/interp/pyenv}/__init__.py +0 -0
  133. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/pyenv/inject.py +0 -0
  134. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/pyenv/install.py +0 -0
  135. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/pyenv/provider.py +0 -0
  136. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/pyenv/pyenv.py +0 -0
  137. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/resolvers.py +0 -0
  138. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/types.py +0 -0
  139. {omdev-0.0.0.dev212/omdev/interp/pyenv → omdev-0.0.0.dev214/omdev/interp/uv}/__init__.py +0 -0
  140. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/uv/inject.py +0 -0
  141. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/uv/provider.py +0 -0
  142. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/uv/uv.py +0 -0
  143. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/interp/venvs.py +0 -0
  144. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/magic/__init__.py +0 -0
  145. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/magic/__main__.py +0 -0
  146. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/magic/cli.py +0 -0
  147. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/magic/find.py +0 -0
  148. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/magic/magic.py +0 -0
  149. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/magic/prepare.py +0 -0
  150. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/magic/styles.py +0 -0
  151. {omdev-0.0.0.dev212/omdev/pyproject → omdev-0.0.0.dev214/omdev/manifests}/__init__.py +0 -0
  152. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/manifests/__main__.py +0 -0
  153. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/manifests/build.py +0 -0
  154. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/manifests/main.py +0 -0
  155. {omdev-0.0.0.dev212/omdev/interp/uv → omdev-0.0.0.dev214/omdev/mypy}/__init__.py +0 -0
  156. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/mypy/debug.py +0 -0
  157. {omdev-0.0.0.dev212/omdev/mypy → omdev-0.0.0.dev214/omdev/packaging}/__init__.py +0 -0
  158. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/packaging/marshal.py +0 -0
  159. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/packaging/names.py +0 -0
  160. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/packaging/requires.py +0 -0
  161. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/packaging/specifiers.py +0 -0
  162. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/packaging/versions.py +0 -0
  163. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pip.py +0 -0
  164. {omdev-0.0.0.dev212/omdev/packaging → omdev-0.0.0.dev214/omdev/precheck}/__init__.py +0 -0
  165. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/precheck/__main__.py +0 -0
  166. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/precheck/base.py +0 -0
  167. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/precheck/git.py +0 -0
  168. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/precheck/lite.py +0 -0
  169. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/precheck/main.py +0 -0
  170. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/precheck/manifests.py +0 -0
  171. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/precheck/scripts.py +0 -0
  172. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ptk/__init__.py +0 -0
  173. {omdev-0.0.0.dev212/omdev/precheck → omdev-0.0.0.dev214/omdev/ptk/apps}/__init__.py +0 -0
  174. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/ptk/apps/ncdu.py +0 -0
  175. {omdev-0.0.0.dev212/omdev/ptk/apps → omdev-0.0.0.dev214/omdev/pycharm}/__init__.py +0 -0
  176. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pycharm/__main__.py +0 -0
  177. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pycharm/cli.py +0 -0
  178. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pyproject/__main__.py +0 -0
  179. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pyproject/cexts.py +0 -0
  180. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pyproject/cli.py +0 -0
  181. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pyproject/configs.py +0 -0
  182. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pyproject/inject.py +0 -0
  183. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pyproject/pkg.py +0 -0
  184. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pyproject/reqs.py +0 -0
  185. {omdev-0.0.0.dev212/omdev/pycharm → omdev-0.0.0.dev214/omdev/pyproject/resources}/__init__.py +0 -0
  186. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pyproject/resources/docker-dev.sh +0 -0
  187. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pyproject/resources/python.sh +0 -0
  188. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/pyproject/venvs.py +0 -0
  189. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/revisions.py +0 -0
  190. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/scripts/__init__.py +0 -0
  191. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/scripts/bumpversion.py +0 -0
  192. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/scripts/execrss.py +0 -0
  193. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/scripts/exectime.py +0 -0
  194. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/scripts/importtrace.py +0 -0
  195. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/scripts/slowcat.py +0 -0
  196. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/scripts/tmpexec.py +0 -0
  197. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/secrets.py +0 -0
  198. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tagstrings.py +0 -0
  199. {omdev-0.0.0.dev212/omdev/pyproject/resources → omdev-0.0.0.dev214/omdev/tokens}/__init__.py +0 -0
  200. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tokens/all.py +0 -0
  201. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tokens/utils.py +0 -0
  202. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/__init__.py +0 -0
  203. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/cloc.py +0 -0
  204. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/doc.py +0 -0
  205. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/git.py +0 -0
  206. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/importscan.py +0 -0
  207. {omdev-0.0.0.dev212/omdev/tokens → omdev-0.0.0.dev214/omdev/tools/json}/__init__.py +0 -0
  208. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/json/__main__.py +0 -0
  209. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/json/cli.py +0 -0
  210. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/json/formats.py +0 -0
  211. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/json/io.py +0 -0
  212. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/json/parsing.py +0 -0
  213. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/json/processing.py +0 -0
  214. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/json/rendering.py +0 -0
  215. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/linehisto.py +0 -0
  216. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/mkenv.py +0 -0
  217. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/mkrelimp.py +0 -0
  218. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/notebook.py +0 -0
  219. {omdev-0.0.0.dev212/omdev/tools/json → omdev-0.0.0.dev214/omdev/tools/pawk}/__init__.py +0 -0
  220. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/pawk/__main__.py +0 -0
  221. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/pawk/pawk.py +0 -0
  222. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/pip.py +0 -0
  223. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/prof.py +0 -0
  224. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/qr.py +0 -0
  225. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/tools/sqlrepl.py +0 -0
  226. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev/wheelfile.py +0 -0
  227. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev.egg-info/dependency_links.txt +0 -0
  228. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev.egg-info/entry_points.txt +0 -0
  229. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/omdev.egg-info/top_level.txt +0 -0
  230. {omdev-0.0.0.dev212 → omdev-0.0.0.dev214}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omdev
3
- Version: 0.0.0.dev212
3
+ Version: 0.0.0.dev214
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.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev212
15
+ Requires-Dist: omlish==0.0.0.dev214
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -267,7 +267,7 @@
267
267
  "module": ".tools.docker",
268
268
  "attr": "_CLI_MODULE",
269
269
  "file": "omdev/tools/docker.py",
270
- "line": 258,
270
+ "line": 264,
271
271
  "value": {
272
272
  "$.cli.types.CliModule": {
273
273
  "cmd_name": "docker",
@@ -0,0 +1,71 @@
1
+ import dataclasses as dc
2
+ import tomllib
3
+ import typing as ta
4
+
5
+ from omlish import cached
6
+ from omlish import lang
7
+ from omlish import marshal as msh
8
+ from omlish.configs import all as configs
9
+
10
+
11
+ @dc.dataclass(frozen=True)
12
+ class Cdep:
13
+ @dc.dataclass(frozen=True)
14
+ class Git:
15
+ url: str
16
+ rev: str
17
+
18
+ subtrees: ta.Sequence[str] | None = None
19
+
20
+ git: Git
21
+
22
+ #
23
+
24
+ sources: ta.Sequence[str] | None = None
25
+ include: ta.Sequence[str] | None = None
26
+
27
+ #
28
+
29
+ @dc.dataclass(frozen=True)
30
+ class Cmake:
31
+ @dc.dataclass(frozen=True)
32
+ class FetchContent:
33
+ url: str | None = None
34
+
35
+ @dc.dataclass(frozen=True)
36
+ class Git:
37
+ repository: str | None = None
38
+ tag: str | None = None
39
+
40
+ git: Git | None = None
41
+
42
+ fetch_content: FetchContent | None = None
43
+
44
+ cmake: Cmake | None = None
45
+
46
+
47
+ def process_marshaled_cdep(obj: ta.Any) -> ta.Any:
48
+ obj = configs.processing.matched_rewrite(
49
+ lambda s: s if isinstance(s, str) else ''.join(s),
50
+ obj,
51
+ ('sources', None),
52
+ ('include', None),
53
+ )
54
+
55
+ return obj
56
+
57
+
58
+ @cached.function
59
+ def load_cdeps() -> ta.Mapping[str, Cdep]:
60
+ src = lang.get_relative_resources(globals=globals())['cdeps.toml'].read_text()
61
+ dct = tomllib.loads(src)
62
+
63
+ dct = {
64
+ **dct,
65
+ 'deps': {
66
+ k: process_marshaled_cdep(v)
67
+ for k, v in dct.get('deps', {}).items()
68
+ },
69
+ }
70
+
71
+ return msh.unmarshal(dct.get('deps', {}), ta.Mapping[str, Cdep]) # type: ignore
@@ -1,3 +1,18 @@
1
+ [deps.httplib]
2
+ include = ['.']
3
+
4
+ [deps.httplib.git]
5
+ url = 'https://github.com/yhirose/cpp-httplib'
6
+ rev = 'a7bc00e3307fecdb4d67545e93be7b88cfb1e186'
7
+ subtrees = ['httplib.h']
8
+
9
+ [deps.httplib.cmake.fetch_content.git]
10
+ repository = 'https://github.com/yhirose/cpp-httplib.git'
11
+ tag = 'a7bc00e3307fecdb4d67545e93be7b88cfb1e186'
12
+
13
+
14
+ #
15
+
1
16
  [deps.json]
2
17
  include = ['single_include']
3
18
 
@@ -6,8 +21,9 @@ url = 'https://github.com/nlohmann/json'
6
21
  rev = '9cca280a4d0ccf0c08f47a99aa71d1b0e52f8d03'
7
22
  subtrees = ['single_include']
8
23
 
9
- [deps.json.cmake]
10
- fetch_content_url = 'https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz'
24
+ [deps.json.cmake.fetch_content]
25
+ url = 'https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz'
26
+
11
27
 
12
28
  #
13
29
 
@@ -19,6 +35,7 @@ url = 'https://github.com/pybind/pybind11'
19
35
  rev = '945e251a6ce7273058b36214d94415e9c9530b8e'
20
36
  subtrees = ['include']
21
37
 
38
+
22
39
  #
23
40
 
24
41
  [deps.ut]
@@ -18,6 +18,8 @@ Freestanding options:
18
18
  TODO:
19
19
  - cext interop
20
20
  - gen cmake
21
+ - fix CFLAGS/CCFLAGS/CPPFLAGS/CXXFLAGS
22
+ - jit-gen cmake mode? multi-src builds
21
23
  """
22
24
  import os
23
25
  import shlex
@@ -35,6 +37,7 @@ from .. import magic
35
37
  from ..cache import data as dcache
36
38
  from .cdeps import Cdep
37
39
  from .cdeps import load_cdeps
40
+ from .cdeps import process_marshaled_cdep
38
41
 
39
42
 
40
43
  class Cli(ap.Cli):
@@ -64,16 +67,22 @@ class Cli(ap.Cli):
64
67
  if src_magic.key == '@omlish-cdeps':
65
68
  for dep in check.isinstance(src_magic.prepared, ta.Sequence):
66
69
  if isinstance(dep, ta.Mapping):
67
- dep = msh.unmarshal(dep, Cdep) # type: ignore
70
+ dep = process_marshaled_cdep(dep)
71
+ dep = msh.unmarshal(dep, Cdep)
68
72
  else:
69
73
  dep = load_cdeps()[check.isinstance(dep, str)]
70
74
 
75
+ if dep.sources:
76
+ # TODO
77
+ raise NotImplementedError
78
+
71
79
  dep_spec = dcache.GitSpec(
72
80
  url=dep.git.url,
73
81
  rev=dep.git.rev,
74
82
  subtrees=dep.git.subtrees,
75
83
  )
76
84
  dep_dir = dcache.default().get(dep_spec)
85
+
77
86
  for dep_inc in dep.include or []:
78
87
  inc_dir = os.path.join(dep_dir, dep_inc)
79
88
  check.state(os.path.isdir(inc_dir))
@@ -96,6 +105,9 @@ class Cli(ap.Cli):
96
105
  if cflags := os.environ.get('CFLAGS'):
97
106
  sh_parts.append(cflags) # Explicitly shell-unquoted
98
107
 
108
+ if ldflags := os.environ.get('LDFLAGS'):
109
+ sh_parts.append(ldflags) # Explicitly shell-unquoted
110
+
99
111
  sh_parts.extend([
100
112
  '-std=c++20',
101
113
  shlex.quote(os.path.abspath(src_file)),
@@ -0,0 +1,147 @@
1
+ # ruff: noqa: UP006 UP007
2
+ import abc
3
+ import os.path
4
+ import shutil
5
+ import typing as ta
6
+
7
+ from omlish.lite.cached import cached_nullary
8
+ from omlish.lite.check import check
9
+ from omlish.lite.logs import log
10
+
11
+ from .consts import CI_CACHE_VERSION
12
+
13
+
14
+ ##
15
+
16
+
17
+ @abc.abstractmethod
18
+ class FileCache(abc.ABC):
19
+ def __init__(
20
+ self,
21
+ *,
22
+ version: int = CI_CACHE_VERSION,
23
+ ) -> None:
24
+ super().__init__()
25
+
26
+ check.isinstance(version, int)
27
+ check.arg(version >= 0)
28
+ self._version = version
29
+
30
+ @property
31
+ def version(self) -> int:
32
+ return self._version
33
+
34
+ #
35
+
36
+ @abc.abstractmethod
37
+ def get_file(self, key: str) -> ta.Awaitable[ta.Optional[str]]:
38
+ raise NotImplementedError
39
+
40
+ @abc.abstractmethod
41
+ def put_file(
42
+ self,
43
+ key: str,
44
+ file_path: str,
45
+ *,
46
+ steal: bool = False,
47
+ ) -> ta.Awaitable[str]:
48
+ raise NotImplementedError
49
+
50
+
51
+ #
52
+
53
+
54
+ class DirectoryFileCache(FileCache):
55
+ def __init__(
56
+ self,
57
+ dir: str, # noqa
58
+ *,
59
+ no_create: bool = False,
60
+ no_purge: bool = False,
61
+ **kwargs: ta.Any,
62
+ ) -> None: # noqa
63
+ super().__init__(**kwargs)
64
+
65
+ self._dir = dir
66
+ self._no_create = no_create
67
+ self._no_purge = no_purge
68
+
69
+ #
70
+
71
+ VERSION_FILE_NAME = '.ci-cache-version'
72
+
73
+ @cached_nullary
74
+ def setup_dir(self) -> None:
75
+ version_file = os.path.join(self._dir, self.VERSION_FILE_NAME)
76
+
77
+ if self._no_create:
78
+ check.state(os.path.isdir(self._dir))
79
+
80
+ elif not os.path.isdir(self._dir):
81
+ os.makedirs(self._dir)
82
+ with open(version_file, 'w') as f:
83
+ f.write(str(self._version))
84
+ return
85
+
86
+ with open(version_file) as f:
87
+ dir_version = int(f.read().strip())
88
+
89
+ if dir_version == self._version:
90
+ return
91
+
92
+ if self._no_purge:
93
+ raise RuntimeError(f'{dir_version=} != {self._version=}')
94
+
95
+ dirs = [n for n in sorted(os.listdir(self._dir)) if os.path.isdir(os.path.join(self._dir, n))]
96
+ if dirs:
97
+ raise RuntimeError(
98
+ f'Refusing to remove stale cache dir {self._dir!r} '
99
+ f'due to present directories: {", ".join(dirs)}',
100
+ )
101
+
102
+ for n in sorted(os.listdir(self._dir)):
103
+ if n.startswith('.'):
104
+ continue
105
+ fp = os.path.join(self._dir, n)
106
+ check.state(os.path.isfile(fp))
107
+ log.debug('Purging stale cache file: %s', fp)
108
+ os.unlink(fp)
109
+
110
+ os.unlink(version_file)
111
+
112
+ with open(version_file, 'w') as f:
113
+ f.write(str(self._version))
114
+
115
+ #
116
+
117
+ def get_cache_file_path(
118
+ self,
119
+ key: str,
120
+ ) -> str:
121
+ self.setup_dir()
122
+ return os.path.join(self._dir, key)
123
+
124
+ def format_incomplete_file(self, f: str) -> str:
125
+ return os.path.join(os.path.dirname(f), f'_{os.path.basename(f)}.incomplete')
126
+
127
+ #
128
+
129
+ async def get_file(self, key: str) -> ta.Optional[str]:
130
+ cache_file_path = self.get_cache_file_path(key)
131
+ if not os.path.exists(cache_file_path):
132
+ return None
133
+ return cache_file_path
134
+
135
+ async def put_file(
136
+ self,
137
+ key: str,
138
+ file_path: str,
139
+ *,
140
+ steal: bool = False,
141
+ ) -> str:
142
+ cache_file_path = self.get_cache_file_path(key)
143
+ if steal:
144
+ shutil.move(file_path, cache_file_path)
145
+ else:
146
+ shutil.copyfile(file_path, cache_file_path)
147
+ return cache_file_path
@@ -0,0 +1,274 @@
1
+ # ruff: noqa: UP006 UP007
2
+ import dataclasses as dc
3
+ import os.path
4
+ import typing as ta
5
+
6
+ from omlish.lite.cached import async_cached_nullary
7
+ from omlish.lite.cached import cached_nullary
8
+ from omlish.lite.check import check
9
+ from omlish.lite.contextmanagers import AsyncExitStacked
10
+ from omlish.os.temp import temp_file_context
11
+
12
+ from .cache import FileCache
13
+ from .compose import DockerComposeRun
14
+ from .compose import get_compose_service_dependencies
15
+ from .docker import build_docker_file_hash
16
+ from .docker import build_docker_image
17
+ from .docker import is_docker_image_present
18
+ from .docker import load_docker_tar_cmd
19
+ from .docker import pull_docker_image
20
+ from .docker import save_docker_tar_cmd
21
+ from .docker import tag_docker_image
22
+ from .requirements import build_requirements_hash
23
+ from .shell import ShellCmd
24
+ from .utils import log_timing_context
25
+
26
+
27
+ class Ci(AsyncExitStacked):
28
+ KEY_HASH_LEN = 16
29
+
30
+ @dc.dataclass(frozen=True)
31
+ class Config:
32
+ project_dir: str
33
+
34
+ docker_file: str
35
+
36
+ compose_file: str
37
+ service: str
38
+
39
+ cmd: ShellCmd
40
+
41
+ #
42
+
43
+ requirements_txts: ta.Optional[ta.Sequence[str]] = None
44
+
45
+ always_pull: bool = False
46
+ always_build: bool = False
47
+
48
+ no_dependencies: bool = False
49
+
50
+ run_options: ta.Optional[ta.Sequence[str]] = None
51
+
52
+ #
53
+
54
+ def __post_init__(self) -> None:
55
+ check.not_isinstance(self.requirements_txts, str)
56
+
57
+ def __init__(
58
+ self,
59
+ cfg: Config,
60
+ *,
61
+ file_cache: ta.Optional[FileCache] = None,
62
+ ) -> None:
63
+ super().__init__()
64
+
65
+ self._cfg = cfg
66
+ self._file_cache = file_cache
67
+
68
+ #
69
+
70
+ async def _load_docker_image(self, image: str) -> None:
71
+ if not self._cfg.always_pull and (await is_docker_image_present(image)):
72
+ return
73
+
74
+ dep_suffix = image
75
+ for c in '/:.-_':
76
+ dep_suffix = dep_suffix.replace(c, '-')
77
+
78
+ cache_key = f'docker-{dep_suffix}'
79
+ if (await self._load_cache_docker_image(cache_key)) is not None:
80
+ return
81
+
82
+ await pull_docker_image(image)
83
+
84
+ await self._save_cache_docker_image(cache_key, image)
85
+
86
+ async def load_docker_image(self, image: str) -> None:
87
+ with log_timing_context(f'Load docker image: {image}'):
88
+ await self._load_docker_image(image)
89
+
90
+ #
91
+
92
+ async def _load_cache_docker_image(self, key: str) -> ta.Optional[str]:
93
+ if self._file_cache is None:
94
+ return None
95
+
96
+ cache_file = await self._file_cache.get_file(key)
97
+ if cache_file is None:
98
+ return None
99
+
100
+ get_cache_cmd = ShellCmd(f'cat {cache_file} | zstd -cd --long')
101
+
102
+ return await load_docker_tar_cmd(get_cache_cmd)
103
+
104
+ async def _save_cache_docker_image(self, key: str, image: str) -> None:
105
+ if self._file_cache is None:
106
+ return
107
+
108
+ with temp_file_context() as tmp_file:
109
+ write_tmp_cmd = ShellCmd(f'zstd > {tmp_file}')
110
+
111
+ await save_docker_tar_cmd(image, write_tmp_cmd)
112
+
113
+ await self._file_cache.put_file(key, tmp_file, steal=True)
114
+
115
+ #
116
+
117
+ async def _resolve_docker_image(
118
+ self,
119
+ cache_key: str,
120
+ build_and_tag: ta.Callable[[str], ta.Awaitable[str]],
121
+ ) -> str:
122
+ image_tag = f'{self._cfg.service}:{cache_key}'
123
+
124
+ if not self._cfg.always_build and (await is_docker_image_present(image_tag)):
125
+ return image_tag
126
+
127
+ if (cache_image_id := await self._load_cache_docker_image(cache_key)) is not None:
128
+ await tag_docker_image(
129
+ cache_image_id,
130
+ image_tag,
131
+ )
132
+ return image_tag
133
+
134
+ image_id = await build_and_tag(image_tag)
135
+
136
+ await self._save_cache_docker_image(cache_key, image_id)
137
+
138
+ return image_tag
139
+
140
+ #
141
+
142
+ @cached_nullary
143
+ def docker_file_hash(self) -> str:
144
+ return build_docker_file_hash(self._cfg.docker_file)[:self.KEY_HASH_LEN]
145
+
146
+ async def _resolve_ci_base_image(self) -> str:
147
+ async def build_and_tag(image_tag: str) -> str:
148
+ return await build_docker_image(
149
+ self._cfg.docker_file,
150
+ tag=image_tag,
151
+ cwd=self._cfg.project_dir,
152
+ )
153
+
154
+ cache_key = f'ci-base-{self.docker_file_hash()}'
155
+
156
+ return await self._resolve_docker_image(cache_key, build_and_tag)
157
+
158
+ @async_cached_nullary
159
+ async def resolve_ci_base_image(self) -> str:
160
+ with log_timing_context('Resolve ci base image') as ltc:
161
+ image_id = await self._resolve_ci_base_image()
162
+ ltc.set_description(f'Resolve ci base image: {image_id}')
163
+ return image_id
164
+
165
+ #
166
+
167
+ @cached_nullary
168
+ def requirements_txts(self) -> ta.Sequence[str]:
169
+ return [
170
+ os.path.join(self._cfg.project_dir, rf)
171
+ for rf in check.not_none(self._cfg.requirements_txts)
172
+ ]
173
+
174
+ @cached_nullary
175
+ def requirements_hash(self) -> str:
176
+ return build_requirements_hash(self.requirements_txts())[:self.KEY_HASH_LEN]
177
+
178
+ async def _resolve_ci_image(self) -> str:
179
+ async def build_and_tag(image_tag: str) -> str:
180
+ base_image = await self.resolve_ci_base_image()
181
+
182
+ setup_cmds = [
183
+ ' '.join([
184
+ 'pip install',
185
+ '--no-cache-dir',
186
+ '--root-user-action ignore',
187
+ 'uv',
188
+ ]),
189
+ ' '.join([
190
+ 'uv pip install',
191
+ '--no-cache',
192
+ '--index-strategy unsafe-best-match',
193
+ '--system',
194
+ *[f'-r /project/{rf}' for rf in self._cfg.requirements_txts or []],
195
+ ]),
196
+ ]
197
+ setup_cmd = ' && '.join(setup_cmds)
198
+
199
+ docker_file_lines = [
200
+ f'FROM {base_image}',
201
+ 'RUN mkdir /project',
202
+ *[f'COPY {rf} /project/{rf}' for rf in self._cfg.requirements_txts or []],
203
+ f'RUN {setup_cmd}',
204
+ 'RUN rm /project/*',
205
+ 'WORKDIR /project',
206
+ ]
207
+
208
+ with temp_file_context() as docker_file:
209
+ with open(docker_file, 'w') as f: # noqa
210
+ f.write('\n'.join(docker_file_lines))
211
+
212
+ return await build_docker_image(
213
+ docker_file,
214
+ tag=image_tag,
215
+ cwd=self._cfg.project_dir,
216
+ )
217
+
218
+ cache_key = f'ci-{self.docker_file_hash()}-{self.requirements_hash()}'
219
+
220
+ return await self._resolve_docker_image(cache_key, build_and_tag)
221
+
222
+ @async_cached_nullary
223
+ async def resolve_ci_image(self) -> str:
224
+ with log_timing_context('Resolve ci image') as ltc:
225
+ image_id = await self._resolve_ci_image()
226
+ ltc.set_description(f'Resolve ci image: {image_id}')
227
+ return image_id
228
+
229
+ #
230
+
231
+ @async_cached_nullary
232
+ async def load_dependencies(self) -> None:
233
+ deps = get_compose_service_dependencies(
234
+ self._cfg.compose_file,
235
+ self._cfg.service,
236
+ )
237
+
238
+ for dep_image in deps.values():
239
+ await self.load_docker_image(dep_image)
240
+
241
+ #
242
+
243
+ async def _run_compose_(self) -> None:
244
+ async with DockerComposeRun(DockerComposeRun.Config(
245
+ compose_file=self._cfg.compose_file,
246
+ service=self._cfg.service,
247
+
248
+ image=await self.resolve_ci_image(),
249
+
250
+ cmd=self._cfg.cmd,
251
+
252
+ run_options=[
253
+ '-v', f'{os.path.abspath(self._cfg.project_dir)}:/project',
254
+ *(self._cfg.run_options or []),
255
+ ],
256
+
257
+ cwd=self._cfg.project_dir,
258
+
259
+ no_dependencies=self._cfg.no_dependencies,
260
+ )) as ci_compose_run:
261
+ await ci_compose_run.run()
262
+
263
+ async def _run_compose(self) -> None:
264
+ with log_timing_context('Run compose'):
265
+ await self._run_compose_()
266
+
267
+ #
268
+
269
+ async def run(self) -> None:
270
+ await self.resolve_ci_image()
271
+
272
+ await self.load_dependencies()
273
+
274
+ await self._run_compose()