omdev 0.0.0.dev181__tar.gz → 0.0.0.dev182__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 (194) hide show
  1. {omdev-0.0.0.dev181/omdev.egg-info → omdev-0.0.0.dev182}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/inject.py +1 -1
  3. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/pyenv/inject.py +1 -1
  4. omdev-0.0.0.dev181/omdev/interp/pyenv/pyenv.py → omdev-0.0.0.dev182/omdev/interp/pyenv/install.py +1 -219
  5. omdev-0.0.0.dev182/omdev/interp/pyenv/provider.py +144 -0
  6. omdev-0.0.0.dev182/omdev/interp/pyenv/pyenv.py +86 -0
  7. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/scripts/interp.py +104 -102
  8. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/scripts/pyproject.py +214 -212
  9. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182/omdev.egg-info}/PKG-INFO +2 -2
  10. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev.egg-info/SOURCES.txt +2 -0
  11. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev.egg-info/requires.txt +1 -1
  12. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/pyproject.toml +2 -2
  13. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/LICENSE +0 -0
  14. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/MANIFEST.in +0 -0
  15. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/README.rst +0 -0
  16. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/.manifests.json +0 -0
  17. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/__about__.py +0 -0
  18. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/__init__.py +0 -0
  19. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/__init__.py +0 -0
  20. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/__main__.py +0 -0
  21. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/gen.py +0 -0
  22. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/imports.py +0 -0
  23. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/main.py +0 -0
  24. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/manifests.py +0 -0
  25. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/resources.py +0 -0
  26. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/srcfiles.py +0 -0
  27. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/strip.py +0 -0
  28. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/types.py +0 -0
  29. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/amalg/typing.py +0 -0
  30. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/antlr/__init__.py +0 -0
  31. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/antlr/consts.py +0 -0
  32. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/antlr/gen.py +0 -0
  33. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/bracepy.py +0 -0
  34. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/__init__.py +0 -0
  35. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/compute/__init__.py +0 -0
  36. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/compute/cache.py +0 -0
  37. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/compute/contexts.py +0 -0
  38. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/compute/currents.py +0 -0
  39. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/compute/fns.py +0 -0
  40. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/compute/resolvers.py +0 -0
  41. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/compute/storage.py +0 -0
  42. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/compute/types.py +0 -0
  43. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/data/__init__.py +0 -0
  44. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/data/actions.py +0 -0
  45. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/data/cache.py +0 -0
  46. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/data/consts.py +0 -0
  47. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/data/defaults.py +0 -0
  48. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/data/manifests.py +0 -0
  49. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cache/data/specs.py +0 -0
  50. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/__init__.py +0 -0
  51. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_boilerplate.cc +0 -0
  52. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/LICENSE +0 -0
  53. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/__init__.py +0 -0
  54. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/build_ext.py +0 -0
  55. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  56. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  57. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/compilers/options.py +0 -0
  58. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  59. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/dir_util.py +0 -0
  60. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/errors.py +0 -0
  61. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/extension.py +0 -0
  62. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/file_util.py +0 -0
  63. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/modified.py +0 -0
  64. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/spawn.py +0 -0
  65. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/sysconfig.py +0 -0
  66. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/util.py +0 -0
  67. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/version.py +0 -0
  68. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/build.py +0 -0
  69. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/cmake.py +0 -0
  70. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/importhook.py +0 -0
  71. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/magic.py +0 -0
  72. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cexts/scan.py +0 -0
  73. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/classdot.py +0 -0
  74. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cli/__init__.py +0 -0
  75. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cli/__main__.py +0 -0
  76. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cli/_pathhack.py +0 -0
  77. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cli/clicli.py +0 -0
  78. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cli/install.py +0 -0
  79. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cli/main.py +0 -0
  80. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cli/managers.py +0 -0
  81. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cli/types.py +0 -0
  82. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/clipboard/__init__.py +0 -0
  83. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/clipboard/clipboard.py +0 -0
  84. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/clipboard/darwin_cf.py +0 -0
  85. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/clipboard/linux_x11.py +0 -0
  86. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/cmake.py +0 -0
  87. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/findimports.py +0 -0
  88. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/git/__init__.py +0 -0
  89. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/git/revisions.py +0 -0
  90. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/git/status.py +0 -0
  91. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/git/subtrees.py +0 -0
  92. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/imgur.py +0 -0
  93. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/__init__.py +0 -0
  94. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/__main__.py +0 -0
  95. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/cli.py +0 -0
  96. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/default.py +0 -0
  97. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/inspect.py +0 -0
  98. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/providers/__init__.py +0 -0
  99. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/providers/base.py +0 -0
  100. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/providers/inject.py +0 -0
  101. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/providers/running.py +0 -0
  102. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/providers/standalone.py +0 -0
  103. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/providers/system.py +0 -0
  104. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/pyenv/__init__.py +0 -0
  105. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/resolvers.py +0 -0
  106. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/types.py +0 -0
  107. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/uv/__init__.py +0 -0
  108. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/uv/inject.py +0 -0
  109. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/uv/uv.py +0 -0
  110. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/interp/venvs.py +0 -0
  111. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/magic/__init__.py +0 -0
  112. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/magic/__main__.py +0 -0
  113. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/magic/cli.py +0 -0
  114. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/magic/find.py +0 -0
  115. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/magic/magic.py +0 -0
  116. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/magic/prepare.py +0 -0
  117. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/magic/styles.py +0 -0
  118. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/manifests/__init__.py +0 -0
  119. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/manifests/__main__.py +0 -0
  120. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/manifests/build.py +0 -0
  121. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/manifests/main.py +0 -0
  122. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/mypy/__init__.py +0 -0
  123. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/mypy/debug.py +0 -0
  124. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/packaging/__init__.py +0 -0
  125. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/packaging/marshal.py +0 -0
  126. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/packaging/names.py +0 -0
  127. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/packaging/requires.py +0 -0
  128. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/packaging/specifiers.py +0 -0
  129. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/packaging/versions.py +0 -0
  130. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pip.py +0 -0
  131. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/precheck/__init__.py +0 -0
  132. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/precheck/__main__.py +0 -0
  133. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/precheck/base.py +0 -0
  134. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/precheck/git.py +0 -0
  135. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/precheck/lite.py +0 -0
  136. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/precheck/main.py +0 -0
  137. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/precheck/manifests.py +0 -0
  138. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/precheck/scripts.py +0 -0
  139. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/ptk/__init__.py +0 -0
  140. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/ptk/apps/__init__.py +0 -0
  141. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/ptk/apps/ncdu.py +0 -0
  142. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pycharm/__init__.py +0 -0
  143. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pycharm/__main__.py +0 -0
  144. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pycharm/cli.py +0 -0
  145. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pyproject/__init__.py +0 -0
  146. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pyproject/__main__.py +0 -0
  147. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pyproject/cexts.py +0 -0
  148. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pyproject/cli.py +0 -0
  149. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pyproject/configs.py +0 -0
  150. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pyproject/inject.py +0 -0
  151. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pyproject/pkg.py +0 -0
  152. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pyproject/reqs.py +0 -0
  153. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/pyproject/venvs.py +0 -0
  154. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/revisions.py +0 -0
  155. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/scripts/__init__.py +0 -0
  156. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/scripts/bumpversion.py +0 -0
  157. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/scripts/execrss.py +0 -0
  158. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/scripts/exectime.py +0 -0
  159. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/scripts/importtrace.py +0 -0
  160. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/scripts/slowcat.py +0 -0
  161. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/scripts/tmpexec.py +0 -0
  162. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/secrets.py +0 -0
  163. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tokens.py +0 -0
  164. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/toml/__init__.py +0 -0
  165. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/toml/parser.py +0 -0
  166. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/toml/writer.py +0 -0
  167. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/__init__.py +0 -0
  168. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/cloc.py +0 -0
  169. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/doc.py +0 -0
  170. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/docker.py +0 -0
  171. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/git.py +0 -0
  172. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/importscan.py +0 -0
  173. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/json/__init__.py +0 -0
  174. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/json/__main__.py +0 -0
  175. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/json/cli.py +0 -0
  176. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/json/formats.py +0 -0
  177. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/json/io.py +0 -0
  178. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/json/parsing.py +0 -0
  179. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/json/processing.py +0 -0
  180. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/json/rendering.py +0 -0
  181. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/mkrelimp.py +0 -0
  182. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/notebook.py +0 -0
  183. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/pawk/__init__.py +0 -0
  184. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/pawk/__main__.py +0 -0
  185. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/pawk/pawk.py +0 -0
  186. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/pip.py +0 -0
  187. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/prof.py +0 -0
  188. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/qr.py +0 -0
  189. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/tools/sqlrepl.py +0 -0
  190. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev/wheelfile.py +0 -0
  191. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev.egg-info/dependency_links.txt +0 -0
  192. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev.egg-info/entry_points.txt +0 -0
  193. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/omdev.egg-info/top_level.txt +0 -0
  194. {omdev-0.0.0.dev181 → omdev-0.0.0.dev182}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev181
3
+ Version: 0.0.0.dev182
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.dev181
15
+ Requires-Dist: omlish==0.0.0.dev182
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -11,7 +11,7 @@ from .providers.inject import bind_interp_providers
11
11
  from .providers.running import RunningInterpProvider
12
12
  from .providers.system import SystemInterpProvider
13
13
  from .pyenv.inject import bind_interp_pyenv
14
- from .pyenv.pyenv import PyenvInterpProvider
14
+ from .pyenv.provider import PyenvInterpProvider
15
15
  from .resolvers import InterpResolver
16
16
  from .resolvers import InterpResolverProviders
17
17
  from .uv.inject import bind_interp_uv
@@ -6,8 +6,8 @@ from omlish.lite.inject import InjectorBindings
6
6
  from omlish.lite.inject import inj
7
7
 
8
8
  from ..providers.base import InterpProvider
9
+ from .provider import PyenvInterpProvider
9
10
  from .pyenv import Pyenv
10
- from .pyenv import PyenvInterpProvider
11
11
 
12
12
 
13
13
  def bind_interp_pyenv() -> InjectorBindings:
@@ -1,19 +1,7 @@
1
1
  # ruff: noqa: UP006 UP007
2
- """
3
- TODO:
4
- - custom tags
5
- - 'aliases'
6
- - https://github.com/pyenv/pyenv/pull/2966
7
- - https://github.com/pyenv/pyenv/issues/218 (lol)
8
- - probably need custom (temp?) definition file
9
- - *or* python-build directly just into the versions dir?
10
- - optionally install / upgrade pyenv itself
11
- - new vers dont need these custom mac opts, only run on old vers
12
- """
13
2
  import abc
14
3
  import dataclasses as dc
15
4
  import itertools
16
- import logging
17
5
  import os.path
18
6
  import shutil
19
7
  import sys
@@ -24,84 +12,8 @@ from omlish.lite.cached import async_cached_nullary
24
12
  from omlish.lite.cached import cached_nullary
25
13
  from omlish.lite.check import check
26
14
 
27
- from ...packaging.versions import InvalidVersion
28
- from ...packaging.versions import Version
29
- from ..inspect import InterpInspector
30
- from ..providers.base import InterpProvider
31
- from ..types import Interp
32
15
  from ..types import InterpOpts
33
- from ..types import InterpSpecifier
34
- from ..types import InterpVersion
35
-
36
-
37
- ##
38
-
39
-
40
- class Pyenv:
41
- def __init__(
42
- self,
43
- *,
44
- root: ta.Optional[str] = None,
45
- ) -> None:
46
- if root is not None and not (isinstance(root, str) and root):
47
- raise ValueError(f'pyenv_root: {root!r}')
48
-
49
- super().__init__()
50
-
51
- self._root_kw = root
52
-
53
- @async_cached_nullary
54
- async def root(self) -> ta.Optional[str]:
55
- if self._root_kw is not None:
56
- return self._root_kw
57
-
58
- if shutil.which('pyenv'):
59
- return await asyncio_subprocesses.check_output_str('pyenv', 'root')
60
-
61
- d = os.path.expanduser('~/.pyenv')
62
- if os.path.isdir(d) and os.path.isfile(os.path.join(d, 'bin', 'pyenv')):
63
- return d
64
-
65
- return None
66
-
67
- @async_cached_nullary
68
- async def exe(self) -> str:
69
- return os.path.join(check.not_none(await self.root()), 'bin', 'pyenv')
70
-
71
- async def version_exes(self) -> ta.List[ta.Tuple[str, str]]:
72
- if (root := await self.root()) is None:
73
- return []
74
- ret = []
75
- vp = os.path.join(root, 'versions')
76
- if os.path.isdir(vp):
77
- for dn in os.listdir(vp):
78
- ep = os.path.join(vp, dn, 'bin', 'python')
79
- if not os.path.isfile(ep):
80
- continue
81
- ret.append((dn, ep))
82
- return ret
83
-
84
- async def installable_versions(self) -> ta.List[str]:
85
- if await self.root() is None:
86
- return []
87
- ret = []
88
- s = await asyncio_subprocesses.check_output_str(await self.exe(), 'install', '--list')
89
- for l in s.splitlines():
90
- if not l.startswith(' '):
91
- continue
92
- l = l.strip()
93
- if not l:
94
- continue
95
- ret.append(l)
96
- return ret
97
-
98
- async def update(self) -> bool:
99
- if (root := await self.root()) is None:
100
- return False
101
- if not os.path.isdir(os.path.join(root, '.git')):
102
- return False
103
- await asyncio_subprocesses.check_call('git', 'pull', cwd=root)
104
- return True
16
+ from .pyenv import Pyenv
105
17
 
106
18
 
107
19
  ##
@@ -337,133 +249,3 @@ class PyenvVersionInstaller:
337
249
  if not os.path.isfile(exe):
338
250
  raise RuntimeError(f'Interpreter not found: {exe}')
339
251
  return exe
340
-
341
-
342
- ##
343
-
344
-
345
- class PyenvInterpProvider(InterpProvider):
346
- @dc.dataclass(frozen=True)
347
- class Options:
348
- inspect: bool = False
349
-
350
- try_update: bool = False
351
-
352
- def __init__(
353
- self,
354
- options: Options = Options(),
355
- *,
356
- pyenv: Pyenv,
357
- inspector: InterpInspector,
358
- log: ta.Optional[logging.Logger] = None,
359
- ) -> None:
360
- super().__init__()
361
-
362
- self._options = options
363
-
364
- self._pyenv = pyenv
365
- self._inspector = inspector
366
- self._log = log
367
-
368
- #
369
-
370
- @staticmethod
371
- def guess_version(s: str) -> ta.Optional[InterpVersion]:
372
- def strip_sfx(s: str, sfx: str) -> ta.Tuple[str, bool]:
373
- if s.endswith(sfx):
374
- return s[:-len(sfx)], True
375
- return s, False
376
- ok = {}
377
- s, ok['debug'] = strip_sfx(s, '-debug')
378
- s, ok['threaded'] = strip_sfx(s, 't')
379
- try:
380
- v = Version(s)
381
- except InvalidVersion:
382
- return None
383
- return InterpVersion(v, InterpOpts(**ok))
384
-
385
- class Installed(ta.NamedTuple):
386
- name: str
387
- exe: str
388
- version: InterpVersion
389
-
390
- async def _make_installed(self, vn: str, ep: str) -> ta.Optional[Installed]:
391
- iv: ta.Optional[InterpVersion]
392
- if self._options.inspect:
393
- try:
394
- iv = check.not_none(await self._inspector.inspect(ep)).iv
395
- except Exception as e: # noqa
396
- return None
397
- else:
398
- iv = self.guess_version(vn)
399
- if iv is None:
400
- return None
401
- return PyenvInterpProvider.Installed(
402
- name=vn,
403
- exe=ep,
404
- version=iv,
405
- )
406
-
407
- async def installed(self) -> ta.Sequence[Installed]:
408
- ret: ta.List[PyenvInterpProvider.Installed] = []
409
- for vn, ep in await self._pyenv.version_exes():
410
- if (i := await self._make_installed(vn, ep)) is None:
411
- if self._log is not None:
412
- self._log.debug('Invalid pyenv version: %s', vn)
413
- continue
414
- ret.append(i)
415
- return ret
416
-
417
- #
418
-
419
- async def get_installed_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
420
- return [i.version for i in await self.installed()]
421
-
422
- async def get_installed_version(self, version: InterpVersion) -> Interp:
423
- for i in await self.installed():
424
- if i.version == version:
425
- return Interp(
426
- exe=i.exe,
427
- version=i.version,
428
- )
429
- raise KeyError(version)
430
-
431
- #
432
-
433
- async def _get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
434
- lst = []
435
-
436
- for vs in await self._pyenv.installable_versions():
437
- if (iv := self.guess_version(vs)) is None:
438
- continue
439
- if iv.opts.debug:
440
- raise Exception('Pyenv installable versions not expected to have debug suffix')
441
- for d in [False, True]:
442
- lst.append(dc.replace(iv, opts=dc.replace(iv.opts, debug=d)))
443
-
444
- return lst
445
-
446
- async def get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
447
- lst = await self._get_installable_versions(spec)
448
-
449
- if self._options.try_update and not any(v in spec for v in lst):
450
- if self._pyenv.update():
451
- lst = await self._get_installable_versions(spec)
452
-
453
- return lst
454
-
455
- async def install_version(self, version: InterpVersion) -> Interp:
456
- inst_version = str(version.version)
457
- inst_opts = version.opts
458
- if inst_opts.threaded:
459
- inst_version += 't'
460
- inst_opts = dc.replace(inst_opts, threaded=False)
461
-
462
- installer = PyenvVersionInstaller(
463
- inst_version,
464
- interp_opts=inst_opts,
465
- pyenv=self._pyenv,
466
- )
467
-
468
- exe = await installer.install()
469
- return Interp(exe, version)
@@ -0,0 +1,144 @@
1
+ # ruff: noqa: UP006 UP007
2
+ import dataclasses as dc
3
+ import logging
4
+ import typing as ta
5
+
6
+ from omlish.lite.check import check
7
+
8
+ from ...packaging.versions import InvalidVersion
9
+ from ...packaging.versions import Version
10
+ from ..inspect import InterpInspector
11
+ from ..providers.base import InterpProvider
12
+ from ..types import Interp
13
+ from ..types import InterpOpts
14
+ from ..types import InterpSpecifier
15
+ from ..types import InterpVersion
16
+ from .install import PyenvVersionInstaller
17
+ from .pyenv import Pyenv
18
+
19
+
20
+ class PyenvInterpProvider(InterpProvider):
21
+ @dc.dataclass(frozen=True)
22
+ class Options:
23
+ inspect: bool = False
24
+
25
+ try_update: bool = False
26
+
27
+ def __init__(
28
+ self,
29
+ options: Options = Options(),
30
+ *,
31
+ pyenv: Pyenv,
32
+ inspector: InterpInspector,
33
+ log: ta.Optional[logging.Logger] = None,
34
+ ) -> None:
35
+ super().__init__()
36
+
37
+ self._options = options
38
+
39
+ self._pyenv = pyenv
40
+ self._inspector = inspector
41
+ self._log = log
42
+
43
+ #
44
+
45
+ @staticmethod
46
+ def guess_version(s: str) -> ta.Optional[InterpVersion]:
47
+ def strip_sfx(s: str, sfx: str) -> ta.Tuple[str, bool]:
48
+ if s.endswith(sfx):
49
+ return s[:-len(sfx)], True
50
+ return s, False
51
+ ok = {}
52
+ s, ok['debug'] = strip_sfx(s, '-debug')
53
+ s, ok['threaded'] = strip_sfx(s, 't')
54
+ try:
55
+ v = Version(s)
56
+ except InvalidVersion:
57
+ return None
58
+ return InterpVersion(v, InterpOpts(**ok))
59
+
60
+ class Installed(ta.NamedTuple):
61
+ name: str
62
+ exe: str
63
+ version: InterpVersion
64
+
65
+ async def _make_installed(self, vn: str, ep: str) -> ta.Optional[Installed]:
66
+ iv: ta.Optional[InterpVersion]
67
+ if self._options.inspect:
68
+ try:
69
+ iv = check.not_none(await self._inspector.inspect(ep)).iv
70
+ except Exception as e: # noqa
71
+ return None
72
+ else:
73
+ iv = self.guess_version(vn)
74
+ if iv is None:
75
+ return None
76
+ return PyenvInterpProvider.Installed(
77
+ name=vn,
78
+ exe=ep,
79
+ version=iv,
80
+ )
81
+
82
+ async def installed(self) -> ta.Sequence[Installed]:
83
+ ret: ta.List[PyenvInterpProvider.Installed] = []
84
+ for vn, ep in await self._pyenv.version_exes():
85
+ if (i := await self._make_installed(vn, ep)) is None:
86
+ if self._log is not None:
87
+ self._log.debug('Invalid pyenv version: %s', vn)
88
+ continue
89
+ ret.append(i)
90
+ return ret
91
+
92
+ #
93
+
94
+ async def get_installed_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
95
+ return [i.version for i in await self.installed()]
96
+
97
+ async def get_installed_version(self, version: InterpVersion) -> Interp:
98
+ for i in await self.installed():
99
+ if i.version == version:
100
+ return Interp(
101
+ exe=i.exe,
102
+ version=i.version,
103
+ )
104
+ raise KeyError(version)
105
+
106
+ #
107
+
108
+ async def _get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
109
+ lst = []
110
+
111
+ for vs in await self._pyenv.installable_versions():
112
+ if (iv := self.guess_version(vs)) is None:
113
+ continue
114
+ if iv.opts.debug:
115
+ raise Exception('Pyenv installable versions not expected to have debug suffix')
116
+ for d in [False, True]:
117
+ lst.append(dc.replace(iv, opts=dc.replace(iv.opts, debug=d)))
118
+
119
+ return lst
120
+
121
+ async def get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
122
+ lst = await self._get_installable_versions(spec)
123
+
124
+ if self._options.try_update and not any(v in spec for v in lst):
125
+ if self._pyenv.update():
126
+ lst = await self._get_installable_versions(spec)
127
+
128
+ return lst
129
+
130
+ async def install_version(self, version: InterpVersion) -> Interp:
131
+ inst_version = str(version.version)
132
+ inst_opts = version.opts
133
+ if inst_opts.threaded:
134
+ inst_version += 't'
135
+ inst_opts = dc.replace(inst_opts, threaded=False)
136
+
137
+ installer = PyenvVersionInstaller(
138
+ inst_version,
139
+ interp_opts=inst_opts,
140
+ pyenv=self._pyenv,
141
+ )
142
+
143
+ exe = await installer.install()
144
+ return Interp(exe, version)
@@ -0,0 +1,86 @@
1
+ # ruff: noqa: UP006 UP007
2
+ """
3
+ TODO:
4
+ - custom tags
5
+ - 'aliases'
6
+ - https://github.com/pyenv/pyenv/pull/2966
7
+ - https://github.com/pyenv/pyenv/issues/218 (lol)
8
+ - probably need custom (temp?) definition file
9
+ - *or* python-build directly just into the versions dir?
10
+ - optionally install / upgrade pyenv itself
11
+ - new vers dont need these custom mac opts, only run on old vers
12
+ """
13
+ import os.path
14
+ import shutil
15
+ import typing as ta
16
+
17
+ from omlish.asyncs.asyncio.subprocesses import asyncio_subprocesses
18
+ from omlish.lite.cached import async_cached_nullary
19
+ from omlish.lite.check import check
20
+
21
+
22
+ class Pyenv:
23
+ def __init__(
24
+ self,
25
+ *,
26
+ root: ta.Optional[str] = None,
27
+ ) -> None:
28
+ if root is not None and not (isinstance(root, str) and root):
29
+ raise ValueError(f'pyenv_root: {root!r}')
30
+
31
+ super().__init__()
32
+
33
+ self._root_kw = root
34
+
35
+ @async_cached_nullary
36
+ async def root(self) -> ta.Optional[str]:
37
+ if self._root_kw is not None:
38
+ return self._root_kw
39
+
40
+ if shutil.which('pyenv'):
41
+ return await asyncio_subprocesses.check_output_str('pyenv', 'root')
42
+
43
+ d = os.path.expanduser('~/.pyenv')
44
+ if os.path.isdir(d) and os.path.isfile(os.path.join(d, 'bin', 'pyenv')):
45
+ return d
46
+
47
+ return None
48
+
49
+ @async_cached_nullary
50
+ async def exe(self) -> str:
51
+ return os.path.join(check.not_none(await self.root()), 'bin', 'pyenv')
52
+
53
+ async def version_exes(self) -> ta.List[ta.Tuple[str, str]]:
54
+ if (root := await self.root()) is None:
55
+ return []
56
+ ret = []
57
+ vp = os.path.join(root, 'versions')
58
+ if os.path.isdir(vp):
59
+ for dn in os.listdir(vp):
60
+ ep = os.path.join(vp, dn, 'bin', 'python')
61
+ if not os.path.isfile(ep):
62
+ continue
63
+ ret.append((dn, ep))
64
+ return ret
65
+
66
+ async def installable_versions(self) -> ta.List[str]:
67
+ if await self.root() is None:
68
+ return []
69
+ ret = []
70
+ s = await asyncio_subprocesses.check_output_str(await self.exe(), 'install', '--list')
71
+ for l in s.splitlines():
72
+ if not l.startswith(' '):
73
+ continue
74
+ l = l.strip()
75
+ if not l:
76
+ continue
77
+ ret.append(l)
78
+ return ret
79
+
80
+ async def update(self) -> bool:
81
+ if (root := await self.root()) is None:
82
+ return False
83
+ if not os.path.isdir(os.path.join(root, '.git')):
84
+ return False
85
+ await asyncio_subprocesses.check_call('git', 'pull', cwd=root)
86
+ return True