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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
  #