omdev 0.0.0.dev215__tar.gz → 0.0.0.dev217__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. {omdev-0.0.0.dev215/omdev.egg-info → omdev-0.0.0.dev217}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/.manifests.json +1 -1
  3. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/precheck/lite.py +55 -27
  4. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/precheck/main.py +1 -0
  5. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/scripts/ci.py +68 -6
  6. omdev-0.0.0.dev217/omdev/scripts/exectime.py +106 -0
  7. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/scripts/interp.py +66 -4
  8. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/scripts/pyproject.py +66 -4
  9. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/json/formats.py +4 -0
  10. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217/omdev.egg-info}/PKG-INFO +2 -2
  11. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev.egg-info/requires.txt +1 -1
  12. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/pyproject.toml +2 -2
  13. omdev-0.0.0.dev215/omdev/scripts/exectime.py +0 -34
  14. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/LICENSE +0 -0
  15. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/MANIFEST.in +0 -0
  16. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/README.rst +0 -0
  17. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/__about__.py +0 -0
  18. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/__init__.py +0 -0
  19. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/__init__.py +0 -0
  20. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/__main__.py +0 -0
  21. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/gen.py +0 -0
  22. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/imports.py +0 -0
  23. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/main.py +0 -0
  24. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/manifests.py +0 -0
  25. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/resources.py +0 -0
  26. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/srcfiles.py +0 -0
  27. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/strip.py +0 -0
  28. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/types.py +0 -0
  29. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/amalg/typing.py +0 -0
  30. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/antlr/__init__.py +0 -0
  31. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/antlr/consts.py +0 -0
  32. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/antlr/gen.py +0 -0
  33. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/bracepy.py +0 -0
  34. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/__init__.py +0 -0
  35. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/compute/__init__.py +0 -0
  36. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/compute/cache.py +0 -0
  37. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/compute/contexts.py +0 -0
  38. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/compute/currents.py +0 -0
  39. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/compute/fns.py +0 -0
  40. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/compute/resolvers.py +0 -0
  41. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/compute/storage.py +0 -0
  42. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/compute/types.py +0 -0
  43. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/data/__init__.py +0 -0
  44. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/data/actions.py +0 -0
  45. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/data/cache.py +0 -0
  46. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/data/consts.py +0 -0
  47. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/data/defaults.py +0 -0
  48. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/data/manifests.py +0 -0
  49. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cache/data/specs.py +0 -0
  50. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cc/__init__.py +0 -0
  51. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cc/__main__.py +0 -0
  52. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cc/cdeps.py +0 -0
  53. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cc/cdeps.toml +0 -0
  54. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cc/cli.py +0 -0
  55. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/__init__.py +0 -0
  56. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_boilerplate.cc +0 -0
  57. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/LICENSE +0 -0
  58. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/__init__.py +0 -0
  59. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/build_ext.py +0 -0
  60. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  61. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  62. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/compilers/options.py +0 -0
  63. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  64. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/dir_util.py +0 -0
  65. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/errors.py +0 -0
  66. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/extension.py +0 -0
  67. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/file_util.py +0 -0
  68. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/modified.py +0 -0
  69. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/spawn.py +0 -0
  70. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/sysconfig.py +0 -0
  71. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/util.py +0 -0
  72. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/_distutils/version.py +0 -0
  73. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/build.py +0 -0
  74. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/cmake.py +0 -0
  75. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/importhook.py +0 -0
  76. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/magic.py +0 -0
  77. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cexts/scan.py +0 -0
  78. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/__init__.py +0 -0
  79. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/__main__.py +0 -0
  80. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/cache.py +0 -0
  81. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/ci.py +0 -0
  82. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/cli.py +0 -0
  83. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/compose.py +0 -0
  84. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/consts.py +0 -0
  85. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/docker.py +0 -0
  86. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/github/__init__.py +0 -0
  87. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/github/api.py +0 -0
  88. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/github/bootstrap.py +0 -0
  89. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/github/cache.py +0 -0
  90. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/github/cli.py +0 -0
  91. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/github/client.py +0 -0
  92. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/github/env.py +0 -0
  93. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/requirements.py +0 -0
  94. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/shell.py +0 -0
  95. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ci/utils.py +0 -0
  96. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/classdot.py +0 -0
  97. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cli/__init__.py +0 -0
  98. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cli/__main__.py +0 -0
  99. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cli/_pathhack.py +0 -0
  100. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cli/clicli.py +0 -0
  101. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cli/install.py +0 -0
  102. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cli/main.py +0 -0
  103. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cli/managers.py +0 -0
  104. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cli/types.py +0 -0
  105. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/clipboard/__init__.py +0 -0
  106. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/clipboard/clipboard.py +0 -0
  107. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/clipboard/darwin_cf.py +0 -0
  108. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/clipboard/linux_x11.py +0 -0
  109. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/cmake.py +0 -0
  110. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/findimports.py +0 -0
  111. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/git/__init__.py +0 -0
  112. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/git/revisions.py +0 -0
  113. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/git/shallow.py +0 -0
  114. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/git/status.py +0 -0
  115. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/imgur.py +0 -0
  116. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/__init__.py +0 -0
  117. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/__main__.py +0 -0
  118. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/cli.py +0 -0
  119. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/default.py +0 -0
  120. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/inject.py +0 -0
  121. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/inspect.py +0 -0
  122. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/providers/__init__.py +0 -0
  123. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/providers/base.py +0 -0
  124. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/providers/inject.py +0 -0
  125. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/providers/running.py +0 -0
  126. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/providers/standalone.py +0 -0
  127. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/providers/system.py +0 -0
  128. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/pyenv/__init__.py +0 -0
  129. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/pyenv/inject.py +0 -0
  130. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/pyenv/install.py +0 -0
  131. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/pyenv/provider.py +0 -0
  132. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/pyenv/pyenv.py +0 -0
  133. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/resolvers.py +0 -0
  134. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/types.py +0 -0
  135. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/uv/__init__.py +0 -0
  136. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/uv/inject.py +0 -0
  137. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/uv/provider.py +0 -0
  138. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/uv/uv.py +0 -0
  139. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/interp/venvs.py +0 -0
  140. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/magic/__init__.py +0 -0
  141. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/magic/__main__.py +0 -0
  142. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/magic/cli.py +0 -0
  143. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/magic/find.py +0 -0
  144. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/magic/magic.py +0 -0
  145. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/magic/prepare.py +0 -0
  146. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/magic/styles.py +0 -0
  147. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/manifests/__init__.py +0 -0
  148. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/manifests/__main__.py +0 -0
  149. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/manifests/build.py +0 -0
  150. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/manifests/main.py +0 -0
  151. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/mypy/__init__.py +0 -0
  152. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/mypy/debug.py +0 -0
  153. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/packaging/__init__.py +0 -0
  154. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/packaging/marshal.py +0 -0
  155. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/packaging/names.py +0 -0
  156. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/packaging/requires.py +0 -0
  157. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/packaging/specifiers.py +0 -0
  158. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/packaging/versions.py +0 -0
  159. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pip.py +0 -0
  160. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/precheck/__init__.py +0 -0
  161. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/precheck/__main__.py +0 -0
  162. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/precheck/base.py +0 -0
  163. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/precheck/git.py +0 -0
  164. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/precheck/manifests.py +0 -0
  165. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/precheck/scripts.py +0 -0
  166. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ptk/__init__.py +0 -0
  167. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ptk/apps/__init__.py +0 -0
  168. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/ptk/apps/ncdu.py +0 -0
  169. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pycharm/__init__.py +0 -0
  170. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pycharm/__main__.py +0 -0
  171. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pycharm/cli.py +0 -0
  172. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/__init__.py +0 -0
  173. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/__main__.py +0 -0
  174. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/cexts.py +0 -0
  175. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/cli.py +0 -0
  176. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/configs.py +0 -0
  177. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/inject.py +0 -0
  178. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/pkg.py +0 -0
  179. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/reqs.py +0 -0
  180. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/resources/__init__.py +0 -0
  181. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/resources/docker-dev.sh +0 -0
  182. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/resources/python.sh +0 -0
  183. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/pyproject/venvs.py +0 -0
  184. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/revisions.py +0 -0
  185. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/scripts/__init__.py +0 -0
  186. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/scripts/bumpversion.py +0 -0
  187. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/scripts/execrss.py +0 -0
  188. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/scripts/importtrace.py +0 -0
  189. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/scripts/slowcat.py +0 -0
  190. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/scripts/tmpexec.py +0 -0
  191. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/secrets.py +0 -0
  192. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tagstrings.py +0 -0
  193. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tokens/__init__.py +0 -0
  194. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tokens/all.py +0 -0
  195. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tokens/tokenizert.py +0 -0
  196. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tokens/utils.py +0 -0
  197. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/__init__.py +0 -0
  198. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/cloc.py +0 -0
  199. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/doc.py +0 -0
  200. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/docker.py +0 -0
  201. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/git.py +0 -0
  202. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/importscan.py +0 -0
  203. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/json/__init__.py +0 -0
  204. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/json/__main__.py +0 -0
  205. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/json/cli.py +0 -0
  206. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/json/io.py +0 -0
  207. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/json/parsing.py +0 -0
  208. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/json/processing.py +0 -0
  209. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/json/rendering.py +0 -0
  210. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/linehisto.py +0 -0
  211. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/mkenv.py +0 -0
  212. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/mkrelimp.py +0 -0
  213. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/notebook.py +0 -0
  214. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/pawk/__init__.py +0 -0
  215. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/pawk/__main__.py +0 -0
  216. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/pawk/pawk.py +0 -0
  217. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/pip.py +0 -0
  218. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/prof.py +0 -0
  219. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/qr.py +0 -0
  220. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/tools/sqlrepl.py +0 -0
  221. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev/wheelfile.py +0 -0
  222. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev.egg-info/SOURCES.txt +0 -0
  223. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev.egg-info/dependency_links.txt +0 -0
  224. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev.egg-info/entry_points.txt +0 -0
  225. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/omdev.egg-info/top_level.txt +0 -0
  226. {omdev-0.0.0.dev215 → omdev-0.0.0.dev217}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omdev
3
- Version: 0.0.0.dev215
3
+ Version: 0.0.0.dev217
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.dev215
15
+ Requires-Dist: omlish==0.0.0.dev217
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -195,7 +195,7 @@
195
195
  "module": ".scripts.exectime",
196
196
  "attr": "_CLI_MODULE",
197
197
  "file": "omdev/scripts/exectime.py",
198
- "line": 7,
198
+ "line": 66,
199
199
  "value": {
200
200
  "$.cli.types.CliModule": {
201
201
  "cmd_name": "py/exectime",
@@ -25,13 +25,46 @@ log = logging.getLogger(__name__)
25
25
  class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
26
26
  @dc.dataclass(frozen=True)
27
27
  class Config(Precheck.Config):
28
- pass
28
+ python: str = '.venvs/8/bin/python'
29
+ concurrency: int = 4
29
30
 
30
31
  def __init__(self, context: PrecheckContext, config: Config = Config()) -> None:
31
32
  super().__init__(context, config)
32
33
 
33
34
  #
34
35
 
36
+ @dc.dataclass(frozen=True)
37
+ class _Target:
38
+ path: str
39
+ kind: ta.Literal['script', 'module']
40
+
41
+ async def _collect_targets(self) -> list[_Target]:
42
+ lst = []
43
+
44
+ for fp in magic.find_magic_files(
45
+ magic.PY_MAGIC_STYLE,
46
+ self._context.src_roots,
47
+ keys=['@omlish-lite'],
48
+ ):
49
+ with open(fp) as f: # noqa # FIXME
50
+ src = f.read()
51
+
52
+ is_script = '# @omlish-script' in src.splitlines()
53
+
54
+ if is_script:
55
+ lst.append(self._Target(fp, 'script'))
56
+
57
+ elif fp.endswith('__init__.py'):
58
+ for g in glob.glob(os.path.join(os.path.dirname(fp), '**/*.py'), recursive=True):
59
+ lst.append(self._Target(g, 'module'))
60
+
61
+ else:
62
+ lst.append(self._Target(fp, 'module'))
63
+
64
+ return lst
65
+
66
+ #
67
+
35
68
  @staticmethod
36
69
  def _load_file_module(fp: str) -> None:
37
70
  import os.path # noqa
@@ -71,7 +104,7 @@ class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
71
104
 
72
105
  proc = await asyncio.create_subprocess_exec(
73
106
  *subprocess_maybe_shell_wrap_exec(
74
- '.venvs/8/bin/python',
107
+ self._config.python,
75
108
  '-c',
76
109
  self._load_file_module_payload(),
77
110
  fp,
@@ -85,7 +118,7 @@ class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
85
118
 
86
119
  return vs
87
120
 
88
- async def _run_one_module(self, fp: str) -> list[Precheck.Violation]:
121
+ async def _run_module(self, fp: str) -> list[Precheck.Violation]:
89
122
  vs: list[Precheck.Violation] = []
90
123
 
91
124
  mod = fp.rpartition('.')[0].replace(os.sep, '.')
@@ -94,7 +127,7 @@ class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
94
127
 
95
128
  proc = await asyncio.create_subprocess_exec(
96
129
  *subprocess_maybe_shell_wrap_exec(
97
- '.venvs/8/bin/python',
130
+ self._config.python,
98
131
  '-c',
99
132
  f'import {mod}',
100
133
  ),
@@ -107,34 +140,29 @@ class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
107
140
 
108
141
  return vs
109
142
 
110
- async def _run_module(self, fp: str) -> list[Precheck.Violation]:
111
- vs: list[Precheck.Violation] = []
143
+ #
112
144
 
113
- if fp.endswith('__init__.py'):
114
- pfps = glob.glob(os.path.join(os.path.dirname(fp), '**/*.py'), recursive=True)
115
- else:
116
- pfps = [fp]
145
+ async def _run_one(self, tgt: _Target) -> list[Precheck.Violation]:
146
+ if tgt.kind == 'script':
147
+ return await self._run_script(tgt.path)
117
148
 
118
- for pfp in pfps:
119
- vs.extend(await self._run_one_module(pfp))
149
+ elif tgt.kind == 'module':
150
+ return await self._run_module(tgt.path)
120
151
 
121
- return vs
152
+ else:
153
+ raise RuntimeError(f'Unknown target kind: {tgt.kind}')
122
154
 
123
155
  async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
124
- for fp in magic.find_magic_files(
125
- magic.PY_MAGIC_STYLE,
126
- self._context.src_roots,
127
- keys=['@omlish-lite'],
128
- ):
129
- with open(fp) as f: # noqa # FIXME
130
- src = f.read()
156
+ tgts = await self._collect_targets()
131
157
 
132
- is_script = '# @omlish-script' in src.splitlines()
158
+ sem = asyncio.Semaphore(self._config.concurrency)
133
159
 
134
- if is_script:
135
- for v in await self._run_script(fp):
136
- yield v
160
+ async def run(tgt):
161
+ async with sem:
162
+ return await self._run_one(tgt)
137
163
 
138
- else:
139
- for v in await self._run_module(fp):
140
- yield v
164
+ tasks = [asyncio.create_task(run(tgt)) for tgt in tgts]
165
+
166
+ for coro in asyncio.as_completed(tasks):
167
+ for v in await coro:
168
+ yield v
@@ -60,6 +60,7 @@ def _check_cmd(args) -> None:
60
60
  vs: list[Precheck.Violation] = []
61
61
 
62
62
  for pc in pcs:
63
+ log.info('Running precheck: %s', type(pc).__name__)
63
64
  async for v in pc.run():
64
65
  vs.append(v)
65
66
  print('*** VIOLATION ***')
@@ -167,7 +167,7 @@ def asyncio_once(fn: CallableT) -> CallableT:
167
167
  return ta.cast(CallableT, inner)
168
168
 
169
169
 
170
- def drain_tasks(loop=None):
170
+ def drain_asyncio_tasks(loop=None):
171
171
  if loop is None:
172
172
  loop = asyncio.get_running_loop()
173
173
 
@@ -182,7 +182,7 @@ def draining_asyncio_tasks() -> ta.Iterator[None]:
182
182
  yield
183
183
  finally:
184
184
  if loop is not None:
185
- drain_tasks(loop) # noqa
185
+ drain_asyncio_tasks(loop) # noqa
186
186
 
187
187
 
188
188
  async def asyncio_wait_concurrent(
@@ -2563,7 +2563,7 @@ TODO:
2563
2563
 
2564
2564
  STANDARD_LOG_FORMAT_PARTS = [
2565
2565
  ('asctime', '%(asctime)-15s'),
2566
- ('process', 'pid=%(process)-6s'),
2566
+ ('process', 'pid=%(process)s'),
2567
2567
  ('thread', 'tid=%(thread)x'),
2568
2568
  ('levelname', '%(levelname)s'),
2569
2569
  ('name', '%(name)s'),
@@ -2676,6 +2676,12 @@ def configure_standard_logging(
2676
2676
  ##
2677
2677
 
2678
2678
 
2679
+ # Valid channel type kwarg values:
2680
+ # - A special flag negative int
2681
+ # - A positive fd int
2682
+ # - A file-like object
2683
+ # - None
2684
+
2679
2685
  SUBPROCESS_CHANNEL_OPTION_VALUES: ta.Mapping[SubprocessChannelOption, int] = {
2680
2686
  'pipe': subprocess.PIPE,
2681
2687
  'stdout': subprocess.STDOUT,
@@ -2721,6 +2727,25 @@ def subprocess_close(
2721
2727
  ##
2722
2728
 
2723
2729
 
2730
+ class VerboseCalledProcessError(subprocess.CalledProcessError):
2731
+ @classmethod
2732
+ def from_std(cls, e: subprocess.CalledProcessError) -> 'VerboseCalledProcessError':
2733
+ return cls(
2734
+ e.returncode,
2735
+ e.cmd,
2736
+ output=e.output,
2737
+ stderr=e.stderr,
2738
+ )
2739
+
2740
+ def __str__(self) -> str:
2741
+ msg = super().__str__()
2742
+ if self.output is not None:
2743
+ msg += f' Output: {self.output!r}'
2744
+ if self.stderr is not None:
2745
+ msg += f' Stderr: {self.stderr!r}'
2746
+ return msg
2747
+
2748
+
2724
2749
  class BaseSubprocesses(abc.ABC): # noqa
2725
2750
  DEFAULT_LOGGER: ta.ClassVar[ta.Optional[logging.Logger]] = None
2726
2751
 
@@ -2754,16 +2779,31 @@ class BaseSubprocesses(abc.ABC): # noqa
2754
2779
  if extra_env:
2755
2780
  self._log.debug('Subprocesses.prepare_args: extra_env=%r', extra_env)
2756
2781
 
2782
+ #
2783
+
2757
2784
  if extra_env:
2758
2785
  env = {**(env if env is not None else os.environ), **extra_env}
2759
2786
 
2787
+ #
2788
+
2760
2789
  if quiet and 'stderr' not in kwargs:
2761
2790
  if self._log and not self._log.isEnabledFor(logging.DEBUG):
2762
2791
  kwargs['stderr'] = subprocess.DEVNULL
2763
2792
 
2793
+ for chk in ('stdout', 'stderr'):
2794
+ try:
2795
+ chv = kwargs[chk]
2796
+ except KeyError:
2797
+ continue
2798
+ kwargs[chk] = SUBPROCESS_CHANNEL_OPTION_VALUES.get(chv, chv)
2799
+
2800
+ #
2801
+
2764
2802
  if not shell:
2765
2803
  cmd = subprocess_maybe_shell_wrap_exec(*cmd)
2766
2804
 
2805
+ #
2806
+
2767
2807
  return cmd, dict(
2768
2808
  env=env,
2769
2809
  shell=shell,
@@ -2771,35 +2811,57 @@ class BaseSubprocesses(abc.ABC): # noqa
2771
2811
  )
2772
2812
 
2773
2813
  @contextlib.contextmanager
2774
- def wrap_call(self, *cmd: ta.Any, **kwargs: ta.Any) -> ta.Iterator[None]:
2814
+ def wrap_call(
2815
+ self,
2816
+ *cmd: ta.Any,
2817
+ raise_verbose: bool = False,
2818
+ **kwargs: ta.Any,
2819
+ ) -> ta.Iterator[None]:
2775
2820
  start_time = time.time()
2776
2821
  try:
2777
2822
  if self._log:
2778
2823
  self._log.debug('Subprocesses.wrap_call.try: cmd=%r', cmd)
2824
+
2779
2825
  yield
2780
2826
 
2781
2827
  except Exception as exc: # noqa
2782
2828
  if self._log:
2783
2829
  self._log.debug('Subprocesses.wrap_call.except: exc=%r', exc)
2830
+
2831
+ if (
2832
+ raise_verbose and
2833
+ isinstance(exc, subprocess.CalledProcessError) and
2834
+ not isinstance(exc, VerboseCalledProcessError) and
2835
+ (exc.output is not None or exc.stderr is not None)
2836
+ ):
2837
+ raise VerboseCalledProcessError.from_std(exc) from exc
2838
+
2784
2839
  raise
2785
2840
 
2786
2841
  finally:
2787
2842
  end_time = time.time()
2788
2843
  elapsed_s = end_time - start_time
2844
+
2789
2845
  if self._log:
2790
- self._log.debug('sSubprocesses.wrap_call.finally: elapsed_s=%f cmd=%r', elapsed_s, cmd)
2846
+ self._log.debug('Subprocesses.wrap_call.finally: elapsed_s=%f cmd=%r', elapsed_s, cmd)
2791
2847
 
2792
2848
  @contextlib.contextmanager
2793
2849
  def prepare_and_wrap(
2794
2850
  self,
2795
2851
  *cmd: ta.Any,
2852
+ raise_verbose: bool = False,
2796
2853
  **kwargs: ta.Any,
2797
2854
  ) -> ta.Iterator[ta.Tuple[
2798
2855
  ta.Tuple[ta.Any, ...],
2799
2856
  ta.Dict[str, ta.Any],
2800
2857
  ]]:
2801
2858
  cmd, kwargs = self.prepare_args(*cmd, **kwargs)
2802
- with self.wrap_call(*cmd, **kwargs):
2859
+
2860
+ with self.wrap_call(
2861
+ *cmd,
2862
+ raise_verbose=raise_verbose,
2863
+ **kwargs,
2864
+ ):
2803
2865
  yield cmd, kwargs
2804
2866
 
2805
2867
  #
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python3
2
+ # @omlish-script
3
+
4
+
5
+ ##
6
+
7
+
8
+ def _run_one(src, pre=None):
9
+ import time
10
+
11
+ if pre:
12
+ exec(pre)
13
+
14
+ co = compile(src, '<string>', 'exec')
15
+ start = time.time_ns()
16
+ exec(co)
17
+ end = time.time_ns()
18
+
19
+ return end - start
20
+
21
+
22
+ ##
23
+
24
+
25
+ def _run(n, src, pre=None):
26
+ if n is None:
27
+ return _run_one(src, pre=pre)
28
+
29
+ #
30
+
31
+ import inspect
32
+
33
+ cmd = '\n'.join([
34
+ inspect.getsource(_run_one),
35
+ f'print(_run_one({src!r}, pre={pre!r}))',
36
+ ])
37
+
38
+ #
39
+
40
+ import subprocess
41
+ import sys
42
+
43
+ ts = []
44
+ for _ in range(n):
45
+ out = subprocess.check_output([sys.executable, '-c', cmd]).decode()
46
+ t = int(out.strip())
47
+ ts.append(t)
48
+
49
+ #
50
+
51
+ import statistics
52
+
53
+ o = {
54
+ # 'times': ts,
55
+ 'mean': statistics.mean(ts),
56
+ 'median': statistics.median(ts),
57
+ 'quantiles': statistics.quantiles(ts),
58
+ }
59
+
60
+ return o
61
+
62
+
63
+ ##
64
+
65
+
66
+ # @omlish-manifest
67
+ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
68
+ 'cmd_name': 'py/exectime',
69
+ 'mod_name': __name__,
70
+ }}
71
+
72
+
73
+ def _main():
74
+ import sys
75
+
76
+ args = sys.argv[1:]
77
+
78
+ n = None
79
+ if args:
80
+ try:
81
+ n = int(args[0])
82
+ except ValueError:
83
+ pass
84
+ else:
85
+ args.pop(0)
86
+
87
+ if len(args) > 1:
88
+ pre = args.pop(0)
89
+ else:
90
+ pre = None
91
+
92
+ if len(args) != 1:
93
+ raise Exception('Invalid arguments')
94
+ [src] = args
95
+
96
+ #
97
+
98
+ o = _run(n, src, pre=pre)
99
+
100
+ import json
101
+
102
+ print(json.dumps(o, indent=2))
103
+
104
+
105
+ if __name__ == '__main__':
106
+ _main()
@@ -3500,7 +3500,7 @@ TODO:
3500
3500
 
3501
3501
  STANDARD_LOG_FORMAT_PARTS = [
3502
3502
  ('asctime', '%(asctime)-15s'),
3503
- ('process', 'pid=%(process)-6s'),
3503
+ ('process', 'pid=%(process)s'),
3504
3504
  ('thread', 'tid=%(thread)x'),
3505
3505
  ('levelname', '%(levelname)s'),
3506
3506
  ('name', '%(name)s'),
@@ -3613,6 +3613,12 @@ def configure_standard_logging(
3613
3613
  ##
3614
3614
 
3615
3615
 
3616
+ # Valid channel type kwarg values:
3617
+ # - A special flag negative int
3618
+ # - A positive fd int
3619
+ # - A file-like object
3620
+ # - None
3621
+
3616
3622
  SUBPROCESS_CHANNEL_OPTION_VALUES: ta.Mapping[SubprocessChannelOption, int] = {
3617
3623
  'pipe': subprocess.PIPE,
3618
3624
  'stdout': subprocess.STDOUT,
@@ -3658,6 +3664,25 @@ def subprocess_close(
3658
3664
  ##
3659
3665
 
3660
3666
 
3667
+ class VerboseCalledProcessError(subprocess.CalledProcessError):
3668
+ @classmethod
3669
+ def from_std(cls, e: subprocess.CalledProcessError) -> 'VerboseCalledProcessError':
3670
+ return cls(
3671
+ e.returncode,
3672
+ e.cmd,
3673
+ output=e.output,
3674
+ stderr=e.stderr,
3675
+ )
3676
+
3677
+ def __str__(self) -> str:
3678
+ msg = super().__str__()
3679
+ if self.output is not None:
3680
+ msg += f' Output: {self.output!r}'
3681
+ if self.stderr is not None:
3682
+ msg += f' Stderr: {self.stderr!r}'
3683
+ return msg
3684
+
3685
+
3661
3686
  class BaseSubprocesses(abc.ABC): # noqa
3662
3687
  DEFAULT_LOGGER: ta.ClassVar[ta.Optional[logging.Logger]] = None
3663
3688
 
@@ -3691,16 +3716,31 @@ class BaseSubprocesses(abc.ABC): # noqa
3691
3716
  if extra_env:
3692
3717
  self._log.debug('Subprocesses.prepare_args: extra_env=%r', extra_env)
3693
3718
 
3719
+ #
3720
+
3694
3721
  if extra_env:
3695
3722
  env = {**(env if env is not None else os.environ), **extra_env}
3696
3723
 
3724
+ #
3725
+
3697
3726
  if quiet and 'stderr' not in kwargs:
3698
3727
  if self._log and not self._log.isEnabledFor(logging.DEBUG):
3699
3728
  kwargs['stderr'] = subprocess.DEVNULL
3700
3729
 
3730
+ for chk in ('stdout', 'stderr'):
3731
+ try:
3732
+ chv = kwargs[chk]
3733
+ except KeyError:
3734
+ continue
3735
+ kwargs[chk] = SUBPROCESS_CHANNEL_OPTION_VALUES.get(chv, chv)
3736
+
3737
+ #
3738
+
3701
3739
  if not shell:
3702
3740
  cmd = subprocess_maybe_shell_wrap_exec(*cmd)
3703
3741
 
3742
+ #
3743
+
3704
3744
  return cmd, dict(
3705
3745
  env=env,
3706
3746
  shell=shell,
@@ -3708,35 +3748,57 @@ class BaseSubprocesses(abc.ABC): # noqa
3708
3748
  )
3709
3749
 
3710
3750
  @contextlib.contextmanager
3711
- def wrap_call(self, *cmd: ta.Any, **kwargs: ta.Any) -> ta.Iterator[None]:
3751
+ def wrap_call(
3752
+ self,
3753
+ *cmd: ta.Any,
3754
+ raise_verbose: bool = False,
3755
+ **kwargs: ta.Any,
3756
+ ) -> ta.Iterator[None]:
3712
3757
  start_time = time.time()
3713
3758
  try:
3714
3759
  if self._log:
3715
3760
  self._log.debug('Subprocesses.wrap_call.try: cmd=%r', cmd)
3761
+
3716
3762
  yield
3717
3763
 
3718
3764
  except Exception as exc: # noqa
3719
3765
  if self._log:
3720
3766
  self._log.debug('Subprocesses.wrap_call.except: exc=%r', exc)
3767
+
3768
+ if (
3769
+ raise_verbose and
3770
+ isinstance(exc, subprocess.CalledProcessError) and
3771
+ not isinstance(exc, VerboseCalledProcessError) and
3772
+ (exc.output is not None or exc.stderr is not None)
3773
+ ):
3774
+ raise VerboseCalledProcessError.from_std(exc) from exc
3775
+
3721
3776
  raise
3722
3777
 
3723
3778
  finally:
3724
3779
  end_time = time.time()
3725
3780
  elapsed_s = end_time - start_time
3781
+
3726
3782
  if self._log:
3727
- self._log.debug('sSubprocesses.wrap_call.finally: elapsed_s=%f cmd=%r', elapsed_s, cmd)
3783
+ self._log.debug('Subprocesses.wrap_call.finally: elapsed_s=%f cmd=%r', elapsed_s, cmd)
3728
3784
 
3729
3785
  @contextlib.contextmanager
3730
3786
  def prepare_and_wrap(
3731
3787
  self,
3732
3788
  *cmd: ta.Any,
3789
+ raise_verbose: bool = False,
3733
3790
  **kwargs: ta.Any,
3734
3791
  ) -> ta.Iterator[ta.Tuple[
3735
3792
  ta.Tuple[ta.Any, ...],
3736
3793
  ta.Dict[str, ta.Any],
3737
3794
  ]]:
3738
3795
  cmd, kwargs = self.prepare_args(*cmd, **kwargs)
3739
- with self.wrap_call(*cmd, **kwargs):
3796
+
3797
+ with self.wrap_call(
3798
+ *cmd,
3799
+ raise_verbose=raise_verbose,
3800
+ **kwargs,
3801
+ ):
3740
3802
  yield cmd, kwargs
3741
3803
 
3742
3804
  #