omdev 0.0.0.dev208__tar.gz → 0.0.0.dev210__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. {omdev-0.0.0.dev208/omdev.egg-info → omdev-0.0.0.dev210}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/.manifests.json +1 -1
  3. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/main.py +10 -1
  4. omdev-0.0.0.dev210/omdev/cc/cdeps.py +38 -0
  5. omdev-0.0.0.dev210/omdev/cc/cdeps.toml +30 -0
  6. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cc/cli.py +2 -25
  7. omdev-0.0.0.dev210/omdev/ci/__main__.py +4 -0
  8. omdev-0.0.0.dev210/omdev/ci/cache.py +41 -0
  9. omdev-0.0.0.dev210/omdev/ci/ci.py +214 -0
  10. omdev-0.0.0.dev210/omdev/ci/cli.py +155 -0
  11. omdev-0.0.0.dev210/omdev/ci/compose.py +198 -0
  12. omdev-0.0.0.dev210/omdev/ci/dockertars.py +138 -0
  13. omdev-0.0.0.dev210/omdev/ci/requirements.py +79 -0
  14. omdev-0.0.0.dev210/omdev/ci/utils.py +32 -0
  15. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/cli.py +0 -1
  16. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/providers/system.py +2 -1
  17. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pycharm/cli.py +1 -1
  18. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/cli.py +0 -1
  19. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/revisions.py +0 -1
  20. omdev-0.0.0.dev210/omdev/scripts/ci.py +2183 -0
  21. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/scripts/interp.py +19 -3
  22. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/scripts/pyproject.py +19 -3
  23. omdev-0.0.0.dev210/omdev/tools/pawk/__init__.py +0 -0
  24. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/pawk/pawk.py +0 -1
  25. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210/omdev.egg-info}/PKG-INFO +2 -2
  26. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev.egg-info/SOURCES.txt +12 -0
  27. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev.egg-info/requires.txt +1 -1
  28. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/pyproject.toml +3 -2
  29. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/LICENSE +0 -0
  30. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/MANIFEST.in +0 -0
  31. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/README.rst +0 -0
  32. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/__about__.py +0 -0
  33. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/__init__.py +0 -0
  34. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/__init__.py +0 -0
  35. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/__main__.py +0 -0
  36. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/gen.py +0 -0
  37. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/imports.py +0 -0
  38. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/manifests.py +0 -0
  39. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/resources.py +0 -0
  40. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/srcfiles.py +0 -0
  41. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/strip.py +0 -0
  42. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/types.py +0 -0
  43. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/amalg/typing.py +0 -0
  44. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/antlr/__init__.py +0 -0
  45. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/antlr/consts.py +0 -0
  46. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/antlr/gen.py +0 -0
  47. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/bracepy.py +0 -0
  48. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/__init__.py +0 -0
  49. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/compute/__init__.py +0 -0
  50. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/compute/cache.py +0 -0
  51. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/compute/contexts.py +0 -0
  52. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/compute/currents.py +0 -0
  53. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/compute/fns.py +0 -0
  54. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/compute/resolvers.py +0 -0
  55. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/compute/storage.py +0 -0
  56. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/compute/types.py +0 -0
  57. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/data/__init__.py +0 -0
  58. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/data/actions.py +0 -0
  59. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/data/cache.py +0 -0
  60. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/data/consts.py +0 -0
  61. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/data/defaults.py +0 -0
  62. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/data/manifests.py +0 -0
  63. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cache/data/specs.py +0 -0
  64. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cc/__init__.py +0 -0
  65. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cc/__main__.py +0 -0
  66. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/__init__.py +0 -0
  67. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_boilerplate.cc +0 -0
  68. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/LICENSE +0 -0
  69. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/__init__.py +0 -0
  70. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/build_ext.py +0 -0
  71. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  72. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  73. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/compilers/options.py +0 -0
  74. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  75. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/dir_util.py +0 -0
  76. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/errors.py +0 -0
  77. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/extension.py +0 -0
  78. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/file_util.py +0 -0
  79. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/modified.py +0 -0
  80. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/spawn.py +0 -0
  81. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/sysconfig.py +0 -0
  82. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/util.py +0 -0
  83. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/_distutils/version.py +0 -0
  84. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/build.py +0 -0
  85. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/cmake.py +0 -0
  86. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/importhook.py +0 -0
  87. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/magic.py +0 -0
  88. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cexts/scan.py +0 -0
  89. {omdev-0.0.0.dev208/omdev/clipboard → omdev-0.0.0.dev210/omdev/ci}/__init__.py +0 -0
  90. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/classdot.py +0 -0
  91. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cli/__init__.py +0 -0
  92. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cli/__main__.py +0 -0
  93. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cli/_pathhack.py +0 -0
  94. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cli/clicli.py +0 -0
  95. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cli/install.py +0 -0
  96. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cli/main.py +0 -0
  97. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cli/managers.py +0 -0
  98. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cli/types.py +0 -0
  99. {omdev-0.0.0.dev208/omdev/git → omdev-0.0.0.dev210/omdev/clipboard}/__init__.py +0 -0
  100. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/clipboard/clipboard.py +0 -0
  101. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/clipboard/darwin_cf.py +0 -0
  102. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/clipboard/linux_x11.py +0 -0
  103. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/cmake.py +0 -0
  104. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/findimports.py +0 -0
  105. {omdev-0.0.0.dev208/omdev/interp/providers → omdev-0.0.0.dev210/omdev/git}/__init__.py +0 -0
  106. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/git/revisions.py +0 -0
  107. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/git/shallow.py +0 -0
  108. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/git/status.py +0 -0
  109. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/imgur.py +0 -0
  110. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/__init__.py +0 -0
  111. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/__main__.py +0 -0
  112. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/default.py +0 -0
  113. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/inject.py +0 -0
  114. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/inspect.py +0 -0
  115. {omdev-0.0.0.dev208/omdev/interp/pyenv → omdev-0.0.0.dev210/omdev/interp/providers}/__init__.py +0 -0
  116. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/providers/base.py +0 -0
  117. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/providers/inject.py +0 -0
  118. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/providers/running.py +0 -0
  119. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/providers/standalone.py +0 -0
  120. {omdev-0.0.0.dev208/omdev/interp/uv → omdev-0.0.0.dev210/omdev/interp/pyenv}/__init__.py +0 -0
  121. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/pyenv/inject.py +0 -0
  122. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/pyenv/install.py +0 -0
  123. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/pyenv/provider.py +0 -0
  124. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/pyenv/pyenv.py +0 -0
  125. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/resolvers.py +0 -0
  126. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/types.py +0 -0
  127. {omdev-0.0.0.dev208/omdev/mypy → omdev-0.0.0.dev210/omdev/interp/uv}/__init__.py +0 -0
  128. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/uv/inject.py +0 -0
  129. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/uv/provider.py +0 -0
  130. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/uv/uv.py +0 -0
  131. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/interp/venvs.py +0 -0
  132. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/magic/__init__.py +0 -0
  133. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/magic/__main__.py +0 -0
  134. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/magic/cli.py +0 -0
  135. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/magic/find.py +0 -0
  136. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/magic/magic.py +0 -0
  137. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/magic/prepare.py +0 -0
  138. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/magic/styles.py +0 -0
  139. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/manifests/__init__.py +0 -0
  140. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/manifests/__main__.py +0 -0
  141. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/manifests/build.py +0 -0
  142. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/manifests/main.py +0 -0
  143. {omdev-0.0.0.dev208/omdev/packaging → omdev-0.0.0.dev210/omdev/mypy}/__init__.py +0 -0
  144. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/mypy/debug.py +0 -0
  145. {omdev-0.0.0.dev208/omdev/precheck → omdev-0.0.0.dev210/omdev/packaging}/__init__.py +0 -0
  146. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/packaging/marshal.py +0 -0
  147. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/packaging/names.py +0 -0
  148. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/packaging/requires.py +0 -0
  149. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/packaging/specifiers.py +0 -0
  150. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/packaging/versions.py +0 -0
  151. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pip.py +0 -0
  152. {omdev-0.0.0.dev208/omdev/ptk/apps → omdev-0.0.0.dev210/omdev/precheck}/__init__.py +0 -0
  153. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/precheck/__main__.py +0 -0
  154. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/precheck/base.py +0 -0
  155. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/precheck/git.py +0 -0
  156. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/precheck/lite.py +0 -0
  157. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/precheck/main.py +0 -0
  158. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/precheck/manifests.py +0 -0
  159. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/precheck/scripts.py +0 -0
  160. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/ptk/__init__.py +0 -0
  161. {omdev-0.0.0.dev208/omdev/pycharm → omdev-0.0.0.dev210/omdev/ptk/apps}/__init__.py +0 -0
  162. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/ptk/apps/ncdu.py +0 -0
  163. {omdev-0.0.0.dev208/omdev/pyproject/resources → omdev-0.0.0.dev210/omdev/pycharm}/__init__.py +0 -0
  164. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pycharm/__main__.py +0 -0
  165. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/__init__.py +0 -0
  166. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/__main__.py +0 -0
  167. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/cexts.py +0 -0
  168. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/configs.py +0 -0
  169. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/inject.py +0 -0
  170. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/pkg.py +0 -0
  171. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/reqs.py +0 -0
  172. {omdev-0.0.0.dev208/omdev/tools/json → omdev-0.0.0.dev210/omdev/pyproject/resources}/__init__.py +0 -0
  173. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/resources/docker-dev.sh +0 -0
  174. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/resources/python.sh +0 -0
  175. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/pyproject/venvs.py +0 -0
  176. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/scripts/__init__.py +0 -0
  177. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/scripts/bumpversion.py +0 -0
  178. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/scripts/execrss.py +0 -0
  179. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/scripts/exectime.py +0 -0
  180. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/scripts/importtrace.py +0 -0
  181. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/scripts/slowcat.py +0 -0
  182. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/scripts/tmpexec.py +0 -0
  183. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/secrets.py +0 -0
  184. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tagstrings.py +0 -0
  185. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tokens.py +0 -0
  186. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/__init__.py +0 -0
  187. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/cloc.py +0 -0
  188. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/doc.py +0 -0
  189. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/docker.py +0 -0
  190. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/git.py +0 -0
  191. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/importscan.py +0 -0
  192. {omdev-0.0.0.dev208/omdev/tools/pawk → omdev-0.0.0.dev210/omdev/tools/json}/__init__.py +0 -0
  193. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/json/__main__.py +0 -0
  194. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/json/cli.py +0 -0
  195. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/json/formats.py +0 -0
  196. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/json/io.py +0 -0
  197. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/json/parsing.py +0 -0
  198. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/json/processing.py +0 -0
  199. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/json/rendering.py +0 -0
  200. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/linehisto.py +0 -0
  201. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/mkrelimp.py +0 -0
  202. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/notebook.py +0 -0
  203. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/pawk/__main__.py +0 -0
  204. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/pip.py +0 -0
  205. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/prof.py +0 -0
  206. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/qr.py +0 -0
  207. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/tools/sqlrepl.py +0 -0
  208. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev/wheelfile.py +0 -0
  209. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev.egg-info/dependency_links.txt +0 -0
  210. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev.egg-info/entry_points.txt +0 -0
  211. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/omdev.egg-info/top_level.txt +0 -0
  212. {omdev-0.0.0.dev208 → omdev-0.0.0.dev210}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omdev
3
- Version: 0.0.0.dev208
3
+ Version: 0.0.0.dev210
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.dev208
15
+ Requires-Dist: omlish==0.0.0.dev210
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -357,7 +357,7 @@
357
357
  "module": ".tools.pawk.pawk",
358
358
  "attr": "_CLI_MODULE",
359
359
  "file": "omdev/tools/pawk/pawk.py",
360
- "line": 390,
360
+ "line": 389,
361
361
  "value": {
362
362
  "$.cli.types.CliModule": {
363
363
  "cmd_name": "pawk",
@@ -28,6 +28,7 @@ Targets:
28
28
  import argparse
29
29
  import logging
30
30
  import os.path
31
+ import stat
31
32
  import typing as ta
32
33
 
33
34
  from omlish import check
@@ -60,7 +61,15 @@ def _gen_one(
60
61
  if output_path is not None:
61
62
  with open(output_path, 'w') as f:
62
63
  f.write(src)
63
- os.chmod(output_path, os.stat(input_path).st_mode)
64
+
65
+ src_mode = os.stat(input_path).st_mode
66
+ out_mode = (
67
+ src_mode
68
+ | (stat.S_IXUSR if src_mode & stat.S_IRUSR else 0)
69
+ | (stat.S_IXGRP if src_mode & stat.S_IRGRP else 0)
70
+ | (stat.S_IXOTH if src_mode & stat.S_IROTH else 0)
71
+ )
72
+ os.chmod(output_path, out_mode)
64
73
 
65
74
  else:
66
75
  print(src)
@@ -0,0 +1,38 @@
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
+
9
+
10
+ @dc.dataclass(frozen=True)
11
+ class Cdep:
12
+ @dc.dataclass(frozen=True)
13
+ class Git:
14
+ url: str
15
+ rev: str
16
+
17
+ subtrees: ta.Sequence[str] | None = None
18
+
19
+ git: Git
20
+
21
+ #
22
+
23
+ include: ta.Sequence[str] | None = None
24
+
25
+ #
26
+
27
+ @dc.dataclass(frozen=True)
28
+ class Cmake:
29
+ fetch_content_url: str | None = None
30
+
31
+ cmake: Cmake | None = None
32
+
33
+
34
+ @cached.function
35
+ def load_cdeps() -> ta.Mapping[str, Cdep]:
36
+ src = lang.get_relative_resources(globals=globals())['cdeps.toml'].read_text()
37
+ dct = tomllib.loads(src)
38
+ return msh.unmarshal(dct.get('deps', {}), ta.Mapping[str, Cdep]) # type: ignore
@@ -0,0 +1,30 @@
1
+ [deps.json]
2
+ include = ['single_include']
3
+
4
+ [deps.json.git]
5
+ url = 'https://github.com/nlohmann/json'
6
+ rev = '9cca280a4d0ccf0c08f47a99aa71d1b0e52f8d03'
7
+ subtrees = ['single_include']
8
+
9
+ [deps.json.cmake]
10
+ fetch_content_url = 'https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz'
11
+
12
+ #
13
+
14
+ [deps.pybind11]
15
+ include = ['include']
16
+
17
+ [deps.pybind11.git]
18
+ url = 'https://github.com/pybind/pybind11'
19
+ rev = '945e251a6ce7273058b36214d94415e9c9530b8e'
20
+ subtrees = ['include']
21
+
22
+ #
23
+
24
+ [deps.ut]
25
+ include = ['include']
26
+
27
+ [deps.ut.git]
28
+ url = 'https://github.com/boost-ext/ut'
29
+ rev = 'f83e15c7f1edb49b4ec20f866eec06940d18a47d'
30
+ subtrees = ['include']
@@ -19,45 +19,22 @@ TODO:
19
19
  - cext interop
20
20
  - gen cmake
21
21
  """
22
- import dataclasses as dc
23
22
  import os
24
23
  import shlex
25
24
  import shutil
26
25
  import subprocess
27
26
  import tempfile
28
- import tomllib
29
27
  import typing as ta
30
28
 
31
- from omlish import cached
32
29
  from omlish import check
33
- from omlish import lang
34
30
  from omlish import marshal as msh
35
31
  from omlish.argparse import all as ap
36
32
  from omlish.formats import json
37
33
 
38
34
  from .. import magic
39
35
  from ..cache import data as dcache
40
-
41
-
42
- @dc.dataclass(frozen=True)
43
- class Cdep:
44
- @dc.dataclass(frozen=True)
45
- class Git:
46
- url: str
47
- rev: str
48
-
49
- subtrees: ta.Sequence[str] | None = None
50
-
51
- git: Git
52
-
53
- include: ta.Sequence[str] | None = None
54
-
55
-
56
- @cached.function
57
- def load_cdeps() -> ta.Mapping[str, Cdep]:
58
- src = lang.get_relative_resources(globals=globals())['cdeps.toml'].read_text()
59
- dct = tomllib.loads(src)
60
- return msh.unmarshal(dct.get('deps', {}), ta.Mapping[str, Cdep]) # type: ignore
36
+ from .cdeps import Cdep
37
+ from .cdeps import load_cdeps
61
38
 
62
39
 
63
40
  class Cli(ap.Cli):
@@ -0,0 +1,4 @@
1
+ if __name__ == '__main__':
2
+ from .cli import _main # noqa
3
+
4
+ _main()
@@ -0,0 +1,41 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
3
+ import abc
4
+ import os.path
5
+ import shutil
6
+ import typing as ta
7
+
8
+
9
+ #
10
+
11
+
12
+ @abc.abstractmethod
13
+ class FileCache(abc.ABC):
14
+ @abc.abstractmethod
15
+ def get_file(self, name: str) -> ta.Optional[str]:
16
+ raise NotImplementedError
17
+
18
+ @abc.abstractmethod
19
+ def put_file(self, name: str) -> ta.Optional[str]:
20
+ raise NotImplementedError
21
+
22
+
23
+ #
24
+
25
+
26
+ class DirectoryFileCache(FileCache):
27
+ def __init__(self, dir: str) -> None: # noqa
28
+ super().__init__()
29
+
30
+ self._dir = dir
31
+
32
+ def get_file(self, name: str) -> ta.Optional[str]:
33
+ file_path = os.path.join(self._dir, name)
34
+ if not os.path.exists(file_path):
35
+ return None
36
+ return file_path
37
+
38
+ def put_file(self, file_path: str) -> None:
39
+ os.makedirs(self._dir, exist_ok=True)
40
+ cache_file_path = os.path.join(self._dir, os.path.basename(file_path))
41
+ shutil.copyfile(file_path, cache_file_path)
@@ -0,0 +1,214 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
3
+ import dataclasses as dc
4
+ import os.path
5
+ import shutil
6
+ import tarfile
7
+ import tempfile
8
+ import typing as ta
9
+
10
+ from omlish.lite.cached import cached_nullary
11
+ from omlish.lite.check import check
12
+ from omlish.lite.contextmanagers import ExitStacked
13
+ from omlish.lite.contextmanagers import defer
14
+
15
+ from .cache import FileCache
16
+ from .compose import DockerComposeRun
17
+ from .compose import get_compose_service_dependencies
18
+ from .dockertars import build_docker_file_hash
19
+ from .dockertars import build_docker_tar
20
+ from .dockertars import is_docker_image_present
21
+ from .dockertars import load_docker_tar
22
+ from .dockertars import pull_docker_tar
23
+ from .dockertars import read_docker_tar_image_id
24
+ from .requirements import build_requirements_hash
25
+ from .requirements import download_requirements
26
+
27
+
28
+ ##
29
+
30
+
31
+ class Ci(ExitStacked):
32
+ FILE_NAME_HASH_LEN = 16
33
+
34
+ @dc.dataclass(frozen=True)
35
+ class Config:
36
+ project_dir: str
37
+
38
+ docker_file: str
39
+
40
+ compose_file: str
41
+ service: str
42
+
43
+ requirements_txts: ta.Optional[ta.Sequence[str]] = None
44
+
45
+ def __post_init__(self) -> None:
46
+ check.not_isinstance(self.requirements_txts, str)
47
+
48
+ def __init__(
49
+ self,
50
+ cfg: Config,
51
+ *,
52
+ file_cache: ta.Optional[FileCache] = None,
53
+ ) -> None:
54
+ super().__init__()
55
+
56
+ self._cfg = cfg
57
+ self._file_cache = file_cache
58
+
59
+ #
60
+
61
+ def load_docker_image(self, image: str) -> None:
62
+ if is_docker_image_present(image):
63
+ return
64
+
65
+ dep_suffix = image
66
+ for c in '/:.-_':
67
+ dep_suffix = dep_suffix.replace(c, '-')
68
+
69
+ tar_file_name = f'docker-{dep_suffix}.tar'
70
+
71
+ if self._file_cache is not None and (cache_tar_file := self._file_cache.get_file(tar_file_name)):
72
+ load_docker_tar(cache_tar_file)
73
+ return
74
+
75
+ temp_dir = tempfile.mkdtemp()
76
+ with defer(lambda: shutil.rmtree(temp_dir)):
77
+ temp_tar_file = os.path.join(temp_dir, tar_file_name)
78
+
79
+ pull_docker_tar(
80
+ image,
81
+ temp_tar_file,
82
+ )
83
+
84
+ if self._file_cache is not None:
85
+ self._file_cache.put_file(temp_tar_file)
86
+
87
+ @cached_nullary
88
+ def load_compose_service_dependencies(self) -> None:
89
+ deps = get_compose_service_dependencies(
90
+ self._cfg.compose_file,
91
+ self._cfg.service,
92
+ )
93
+
94
+ for dep_image in deps.values():
95
+ self.load_docker_image(dep_image)
96
+
97
+ #
98
+
99
+ @cached_nullary
100
+ def build_ci_image(self) -> str:
101
+ docker_file_hash = build_docker_file_hash(self._cfg.docker_file)[:self.FILE_NAME_HASH_LEN]
102
+
103
+ tar_file_name = f'ci-{docker_file_hash}.tar'
104
+
105
+ if self._file_cache is not None and (cache_tar_file := self._file_cache.get_file(tar_file_name)):
106
+ image_id = read_docker_tar_image_id(cache_tar_file)
107
+ load_docker_tar(cache_tar_file)
108
+ return image_id
109
+
110
+ temp_dir = tempfile.mkdtemp()
111
+ with defer(lambda: shutil.rmtree(temp_dir)):
112
+ temp_tar_file = os.path.join(temp_dir, tar_file_name)
113
+
114
+ image_id = build_docker_tar(
115
+ self._cfg.docker_file,
116
+ temp_tar_file,
117
+ cwd=self._cfg.project_dir,
118
+ )
119
+
120
+ if self._file_cache is not None:
121
+ self._file_cache.put_file(temp_tar_file)
122
+
123
+ return image_id
124
+
125
+ #
126
+
127
+ @cached_nullary
128
+ def build_requirements_dir(self) -> str:
129
+ requirements_txts = check.not_none(self._cfg.requirements_txts)
130
+
131
+ requirements_hash = build_requirements_hash(requirements_txts)[:self.FILE_NAME_HASH_LEN]
132
+
133
+ tar_file_name = f'requirements-{requirements_hash}.tar'
134
+
135
+ temp_dir = tempfile.mkdtemp()
136
+ self._enter_context(defer(lambda: shutil.rmtree(temp_dir))) # noqa
137
+
138
+ if self._file_cache is not None and (cache_tar_file := self._file_cache.get_file(tar_file_name)):
139
+ with tarfile.open(cache_tar_file) as tar:
140
+ tar.extractall(path=temp_dir) # noqa
141
+
142
+ return temp_dir
143
+
144
+ temp_requirements_dir = os.path.join(temp_dir, 'requirements')
145
+ os.makedirs(temp_requirements_dir)
146
+
147
+ download_requirements(
148
+ self.build_ci_image(),
149
+ temp_requirements_dir,
150
+ requirements_txts,
151
+ )
152
+
153
+ if self._file_cache is not None:
154
+ temp_tar_file = os.path.join(temp_dir, tar_file_name)
155
+
156
+ with tarfile.open(temp_tar_file, 'w') as tar:
157
+ for requirement_file in os.listdir(temp_requirements_dir):
158
+ tar.add(
159
+ os.path.join(temp_requirements_dir, requirement_file),
160
+ arcname=requirement_file,
161
+ )
162
+
163
+ self._file_cache.put_file(temp_tar_file)
164
+
165
+ return temp_requirements_dir
166
+
167
+ #
168
+
169
+ def run(self) -> None:
170
+ self.load_compose_service_dependencies()
171
+
172
+ ci_image = self.build_ci_image()
173
+
174
+ requirements_dir = self.build_requirements_dir()
175
+
176
+ #
177
+
178
+ setup_cmds = [
179
+ 'pip install --root-user-action ignore --find-links /requirements --no-index uv',
180
+ (
181
+ 'uv pip install --system --find-links /requirements ' +
182
+ ' '.join(f'-r /project/{rf}' for rf in self._cfg.requirements_txts or [])
183
+ ),
184
+ ]
185
+
186
+ #
187
+
188
+ test_cmds = [
189
+ '(cd /project && python3 -m pytest -svv test.py)',
190
+ ]
191
+
192
+ #
193
+
194
+ bash_src = ' && '.join([
195
+ *setup_cmds,
196
+ *test_cmds,
197
+ ])
198
+
199
+ with DockerComposeRun(DockerComposeRun.Config(
200
+ compose_file=self._cfg.compose_file,
201
+ service=self._cfg.service,
202
+
203
+ image=ci_image,
204
+
205
+ run_cmd=['bash', '-c', bash_src],
206
+
207
+ run_options=[
208
+ '-v', f'{os.path.abspath(self._cfg.project_dir)}:/project',
209
+ '-v', f'{os.path.abspath(requirements_dir)}:/requirements',
210
+ ],
211
+
212
+ cwd=self._cfg.project_dir,
213
+ )) as ci_compose_run:
214
+ ci_compose_run.run()
@@ -0,0 +1,155 @@
1
+ # @omlish-amalg ../scripts/ci.py
2
+ # ruff: noqa: UP006 UP007
3
+ # @omlish-lite
4
+ """
5
+ Inputs:
6
+ - requirements.txt
7
+ - ci.Dockerfile
8
+ - compose.yml
9
+
10
+ ==
11
+
12
+ ./python -m ci run --cache-dir ci/cache ci/project omlish-ci
13
+ """
14
+ import asyncio
15
+ import os.path
16
+ import sys
17
+ import typing as ta
18
+
19
+ from omlish.argparse.cli import ArgparseCli
20
+ from omlish.argparse.cli import argparse_arg
21
+ from omlish.argparse.cli import argparse_cmd
22
+ from omlish.lite.check import check
23
+
24
+ from .cache import DirectoryFileCache
25
+ from .cache import FileCache
26
+ from .ci import Ci
27
+ from .compose import get_compose_service_dependencies
28
+ from .requirements import build_requirements_hash
29
+
30
+
31
+ ##
32
+
33
+
34
+ class CiCli(ArgparseCli):
35
+ #
36
+
37
+ @argparse_cmd(
38
+ argparse_arg('requirements-txt', nargs='+'),
39
+ )
40
+ def print_requirements_hash(self) -> None:
41
+ requirements_txts = self.args.requirements_txt
42
+
43
+ print(build_requirements_hash(requirements_txts))
44
+
45
+ #
46
+
47
+ @argparse_cmd(
48
+ argparse_arg('compose-file'),
49
+ argparse_arg('service'),
50
+ )
51
+ def dump_compose_deps(self) -> None:
52
+ compose_file = self.args.compose_file
53
+ service = self.args.service
54
+
55
+ print(get_compose_service_dependencies(
56
+ compose_file,
57
+ service,
58
+ ))
59
+
60
+ #
61
+
62
+ @argparse_cmd(
63
+ argparse_arg('project-dir'),
64
+ argparse_arg('service'),
65
+ argparse_arg('--docker-file'),
66
+ argparse_arg('--compose-file'),
67
+ argparse_arg('-r', '--requirements-txt', action='append'),
68
+ argparse_arg('--cache-dir'),
69
+ )
70
+ async def run(self) -> None:
71
+ await asyncio.sleep(1)
72
+
73
+ project_dir = self.args.project_dir
74
+ docker_file = self.args.docker_file
75
+ compose_file = self.args.compose_file
76
+ service = self.args.service
77
+ requirements_txts = self.args.requirements_txt
78
+ cache_dir = self.args.cache_dir
79
+
80
+ #
81
+
82
+ check.state(os.path.isdir(project_dir))
83
+
84
+ #
85
+
86
+ def find_alt_file(*alts: str) -> ta.Optional[str]:
87
+ for alt in alts:
88
+ alt_file = os.path.join(project_dir, alt)
89
+ if os.path.isfile(alt_file):
90
+ return alt_file
91
+ return None
92
+
93
+ if docker_file is None:
94
+ docker_file = find_alt_file(
95
+ 'docker/ci/Dockerfile',
96
+ 'docker/ci.Dockerfile',
97
+ 'ci.Dockerfile',
98
+ 'Dockerfile',
99
+ )
100
+ check.state(os.path.isfile(docker_file))
101
+
102
+ if compose_file is None:
103
+ compose_file = find_alt_file(
104
+ 'docker/compose.yml',
105
+ 'compose.yml',
106
+ )
107
+ check.state(os.path.isfile(compose_file))
108
+
109
+ if not requirements_txts:
110
+ requirements_txts = []
111
+ for rf in [
112
+ 'requirements.txt',
113
+ 'requirements-dev.txt',
114
+ 'requirements-ci.txt',
115
+ ]:
116
+ if os.path.exists(os.path.join(project_dir, rf)):
117
+ requirements_txts.append(rf)
118
+ else:
119
+ for rf in requirements_txts:
120
+ check.state(os.path.isfile(rf))
121
+
122
+ #
123
+
124
+ file_cache: ta.Optional[FileCache] = None
125
+ if cache_dir is not None:
126
+ if not os.path.exists(cache_dir):
127
+ os.makedirs(cache_dir)
128
+ check.state(os.path.isdir(cache_dir))
129
+ file_cache = DirectoryFileCache(cache_dir)
130
+
131
+ #
132
+
133
+ with Ci(
134
+ Ci.Config(
135
+ project_dir=project_dir,
136
+ docker_file=docker_file,
137
+ compose_file=compose_file,
138
+ service=service,
139
+ requirements_txts=requirements_txts,
140
+ ),
141
+ file_cache=file_cache,
142
+ ) as ci:
143
+ ci.run()
144
+
145
+
146
+ async def _async_main() -> ta.Optional[int]:
147
+ return await CiCli().async_cli_run()
148
+
149
+
150
+ def _main() -> None:
151
+ sys.exit(rc if isinstance(rc := asyncio.run(_async_main()), int) else 0)
152
+
153
+
154
+ if __name__ == '__main__':
155
+ _main()