omdev 0.0.0.dev180__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.dev180/omdev.egg-info → omdev-0.0.0.dev182}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/inject.py +1 -1
  3. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/inspect.py +9 -4
  4. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/providers/system.py +5 -2
  5. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/pyenv/inject.py +1 -1
  6. omdev-0.0.0.dev180/omdev/interp/pyenv/pyenv.py → omdev-0.0.0.dev182/omdev/interp/pyenv/install.py +1 -216
  7. omdev-0.0.0.dev182/omdev/interp/pyenv/provider.py +144 -0
  8. omdev-0.0.0.dev182/omdev/interp/pyenv/pyenv.py +86 -0
  9. {omdev-0.0.0.dev180/omdev/pyproject → omdev-0.0.0.dev182/omdev/interp}/venvs.py +41 -41
  10. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pyproject/configs.py +3 -4
  11. omdev-0.0.0.dev182/omdev/pyproject/inject.py +12 -0
  12. omdev-0.0.0.dev182/omdev/pyproject/venvs.py +78 -0
  13. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/scripts/interp.py +121 -114
  14. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/scripts/pyproject.py +477 -343
  15. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182/omdev.egg-info}/PKG-INFO +2 -2
  16. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev.egg-info/SOURCES.txt +4 -0
  17. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev.egg-info/requires.txt +1 -1
  18. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/pyproject.toml +2 -2
  19. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/LICENSE +0 -0
  20. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/MANIFEST.in +0 -0
  21. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/README.rst +0 -0
  22. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/.manifests.json +0 -0
  23. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/__about__.py +0 -0
  24. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/__init__.py +0 -0
  25. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/__init__.py +0 -0
  26. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/__main__.py +0 -0
  27. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/gen.py +0 -0
  28. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/imports.py +0 -0
  29. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/main.py +0 -0
  30. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/manifests.py +0 -0
  31. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/resources.py +0 -0
  32. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/srcfiles.py +0 -0
  33. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/strip.py +0 -0
  34. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/types.py +0 -0
  35. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/amalg/typing.py +0 -0
  36. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/antlr/__init__.py +0 -0
  37. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/antlr/consts.py +0 -0
  38. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/antlr/gen.py +0 -0
  39. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/bracepy.py +0 -0
  40. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/__init__.py +0 -0
  41. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/compute/__init__.py +0 -0
  42. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/compute/cache.py +0 -0
  43. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/compute/contexts.py +0 -0
  44. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/compute/currents.py +0 -0
  45. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/compute/fns.py +0 -0
  46. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/compute/resolvers.py +0 -0
  47. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/compute/storage.py +0 -0
  48. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/compute/types.py +0 -0
  49. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/data/__init__.py +0 -0
  50. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/data/actions.py +0 -0
  51. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/data/cache.py +0 -0
  52. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/data/consts.py +0 -0
  53. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/data/defaults.py +0 -0
  54. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/data/manifests.py +0 -0
  55. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cache/data/specs.py +0 -0
  56. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/__init__.py +0 -0
  57. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_boilerplate.cc +0 -0
  58. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/LICENSE +0 -0
  59. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/__init__.py +0 -0
  60. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/build_ext.py +0 -0
  61. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  62. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  63. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/compilers/options.py +0 -0
  64. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  65. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/dir_util.py +0 -0
  66. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/errors.py +0 -0
  67. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/extension.py +0 -0
  68. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/file_util.py +0 -0
  69. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/modified.py +0 -0
  70. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/spawn.py +0 -0
  71. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/sysconfig.py +0 -0
  72. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/util.py +0 -0
  73. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/_distutils/version.py +0 -0
  74. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/build.py +0 -0
  75. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/cmake.py +0 -0
  76. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/importhook.py +0 -0
  77. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/magic.py +0 -0
  78. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cexts/scan.py +0 -0
  79. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/classdot.py +0 -0
  80. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cli/__init__.py +0 -0
  81. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cli/__main__.py +0 -0
  82. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cli/_pathhack.py +0 -0
  83. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cli/clicli.py +0 -0
  84. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cli/install.py +0 -0
  85. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cli/main.py +0 -0
  86. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cli/managers.py +0 -0
  87. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cli/types.py +0 -0
  88. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/clipboard/__init__.py +0 -0
  89. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/clipboard/clipboard.py +0 -0
  90. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/clipboard/darwin_cf.py +0 -0
  91. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/clipboard/linux_x11.py +0 -0
  92. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/cmake.py +0 -0
  93. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/findimports.py +0 -0
  94. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/git/__init__.py +0 -0
  95. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/git/revisions.py +0 -0
  96. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/git/status.py +0 -0
  97. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/git/subtrees.py +0 -0
  98. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/imgur.py +0 -0
  99. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/__init__.py +0 -0
  100. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/__main__.py +0 -0
  101. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/cli.py +0 -0
  102. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/default.py +0 -0
  103. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/providers/__init__.py +0 -0
  104. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/providers/base.py +0 -0
  105. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/providers/inject.py +0 -0
  106. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/providers/running.py +0 -0
  107. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/providers/standalone.py +0 -0
  108. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/pyenv/__init__.py +0 -0
  109. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/resolvers.py +0 -0
  110. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/types.py +0 -0
  111. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/uv/__init__.py +0 -0
  112. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/uv/inject.py +0 -0
  113. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/interp/uv/uv.py +0 -0
  114. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/magic/__init__.py +0 -0
  115. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/magic/__main__.py +0 -0
  116. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/magic/cli.py +0 -0
  117. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/magic/find.py +0 -0
  118. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/magic/magic.py +0 -0
  119. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/magic/prepare.py +0 -0
  120. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/magic/styles.py +0 -0
  121. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/manifests/__init__.py +0 -0
  122. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/manifests/__main__.py +0 -0
  123. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/manifests/build.py +0 -0
  124. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/manifests/main.py +0 -0
  125. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/mypy/__init__.py +0 -0
  126. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/mypy/debug.py +0 -0
  127. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/packaging/__init__.py +0 -0
  128. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/packaging/marshal.py +0 -0
  129. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/packaging/names.py +0 -0
  130. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/packaging/requires.py +0 -0
  131. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/packaging/specifiers.py +0 -0
  132. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/packaging/versions.py +0 -0
  133. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pip.py +0 -0
  134. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/precheck/__init__.py +0 -0
  135. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/precheck/__main__.py +0 -0
  136. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/precheck/base.py +0 -0
  137. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/precheck/git.py +0 -0
  138. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/precheck/lite.py +0 -0
  139. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/precheck/main.py +0 -0
  140. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/precheck/manifests.py +0 -0
  141. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/precheck/scripts.py +0 -0
  142. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/ptk/__init__.py +0 -0
  143. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/ptk/apps/__init__.py +0 -0
  144. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/ptk/apps/ncdu.py +0 -0
  145. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pycharm/__init__.py +0 -0
  146. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pycharm/__main__.py +0 -0
  147. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pycharm/cli.py +0 -0
  148. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pyproject/__init__.py +0 -0
  149. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pyproject/__main__.py +0 -0
  150. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pyproject/cexts.py +0 -0
  151. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pyproject/cli.py +0 -0
  152. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pyproject/pkg.py +0 -0
  153. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/pyproject/reqs.py +0 -0
  154. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/revisions.py +0 -0
  155. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/scripts/__init__.py +0 -0
  156. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/scripts/bumpversion.py +0 -0
  157. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/scripts/execrss.py +0 -0
  158. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/scripts/exectime.py +0 -0
  159. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/scripts/importtrace.py +0 -0
  160. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/scripts/slowcat.py +0 -0
  161. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/scripts/tmpexec.py +0 -0
  162. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/secrets.py +0 -0
  163. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tokens.py +0 -0
  164. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/toml/__init__.py +0 -0
  165. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/toml/parser.py +0 -0
  166. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/toml/writer.py +0 -0
  167. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/__init__.py +0 -0
  168. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/cloc.py +0 -0
  169. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/doc.py +0 -0
  170. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/docker.py +0 -0
  171. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/git.py +0 -0
  172. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/importscan.py +0 -0
  173. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/json/__init__.py +0 -0
  174. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/json/__main__.py +0 -0
  175. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/json/cli.py +0 -0
  176. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/json/formats.py +0 -0
  177. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/json/io.py +0 -0
  178. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/json/parsing.py +0 -0
  179. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/json/processing.py +0 -0
  180. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/json/rendering.py +0 -0
  181. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/mkrelimp.py +0 -0
  182. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/notebook.py +0 -0
  183. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/pawk/__init__.py +0 -0
  184. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/pawk/__main__.py +0 -0
  185. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/pawk/pawk.py +0 -0
  186. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/pip.py +0 -0
  187. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/prof.py +0 -0
  188. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/qr.py +0 -0
  189. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/tools/sqlrepl.py +0 -0
  190. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev/wheelfile.py +0 -0
  191. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev.egg-info/dependency_links.txt +0 -0
  192. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev.egg-info/entry_points.txt +0 -0
  193. {omdev-0.0.0.dev180 → omdev-0.0.0.dev182}/omdev.egg-info/top_level.txt +0 -0
  194. {omdev-0.0.0.dev180 → 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.dev180
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.dev180
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,7 +6,6 @@ import sys
6
6
  import typing as ta
7
7
 
8
8
  from omlish.asyncs.asyncio.subprocesses import asyncio_subprocesses
9
- from omlish.lite.logs import log
10
9
 
11
10
  from ..packaging.versions import Version
12
11
  from .types import InterpOpts
@@ -43,9 +42,15 @@ class InterpInspection:
43
42
 
44
43
 
45
44
  class InterpInspector:
46
- def __init__(self) -> None:
45
+ def __init__(
46
+ self,
47
+ *,
48
+ log: ta.Optional[logging.Logger] = None,
49
+ ) -> None:
47
50
  super().__init__()
48
51
 
52
+ self._log = log
53
+
49
54
  self._cache: ta.Dict[str, ta.Optional[InterpInspection]] = {}
50
55
 
51
56
  _RAW_INSPECTION_CODE = """
@@ -94,8 +99,8 @@ class InterpInspector:
94
99
  try:
95
100
  ret = await self._inspect(exe)
96
101
  except Exception as e: # noqa
97
- if log.isEnabledFor(logging.DEBUG):
98
- log.exception('Failed to inspect interp: %s', exe)
102
+ if self._log is not None and self._log.isEnabledFor(logging.DEBUG):
103
+ self._log.exception('Failed to inspect interp: %s', exe)
99
104
  ret = None
100
105
  self._cache[exe] = ret
101
106
  return ret
@@ -5,13 +5,13 @@ TODO:
5
5
  - check if path py's are venvs: sys.prefix != sys.base_prefix
6
6
  """
7
7
  import dataclasses as dc
8
+ import logging
8
9
  import os
9
10
  import re
10
11
  import typing as ta
11
12
 
12
13
  from omlish.lite.cached import cached_nullary
13
14
  from omlish.lite.check import check
14
- from omlish.lite.logs import log
15
15
 
16
16
  from ...packaging.versions import InvalidVersion
17
17
  from ..inspect import InterpInspector
@@ -37,12 +37,14 @@ class SystemInterpProvider(InterpProvider):
37
37
  options: Options = Options(),
38
38
  *,
39
39
  inspector: ta.Optional[InterpInspector] = None,
40
+ log: ta.Optional[logging.Logger] = None,
40
41
  ) -> None:
41
42
  super().__init__()
42
43
 
43
44
  self._options = options
44
45
 
45
46
  self._inspector = inspector
47
+ self._log = log
46
48
 
47
49
  #
48
50
 
@@ -116,7 +118,8 @@ class SystemInterpProvider(InterpProvider):
116
118
  lst = []
117
119
  for e in self.exes():
118
120
  if (ev := await self.get_exe_version(e)) is None:
119
- log.debug('Invalid system version: %s', e)
121
+ if self._log is not None:
122
+ self._log.debug('Invalid system version: %s', e)
120
123
  continue
121
124
  lst.append((e, ev))
122
125
  return lst
@@ -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,15 +1,4 @@
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
@@ -22,86 +11,9 @@ from omlish.asyncs.asyncio.subprocesses import asyncio_subprocesses
22
11
  from omlish.lite.cached import async_cached_nullary
23
12
  from omlish.lite.cached import cached_nullary
24
13
  from omlish.lite.check import check
25
- from omlish.lite.logs import log
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,130 +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
- ) -> None:
359
- super().__init__()
360
-
361
- self._options = options
362
-
363
- self._pyenv = pyenv
364
- self._inspector = inspector
365
-
366
- #
367
-
368
- @staticmethod
369
- def guess_version(s: str) -> ta.Optional[InterpVersion]:
370
- def strip_sfx(s: str, sfx: str) -> ta.Tuple[str, bool]:
371
- if s.endswith(sfx):
372
- return s[:-len(sfx)], True
373
- return s, False
374
- ok = {}
375
- s, ok['debug'] = strip_sfx(s, '-debug')
376
- s, ok['threaded'] = strip_sfx(s, 't')
377
- try:
378
- v = Version(s)
379
- except InvalidVersion:
380
- return None
381
- return InterpVersion(v, InterpOpts(**ok))
382
-
383
- class Installed(ta.NamedTuple):
384
- name: str
385
- exe: str
386
- version: InterpVersion
387
-
388
- async def _make_installed(self, vn: str, ep: str) -> ta.Optional[Installed]:
389
- iv: ta.Optional[InterpVersion]
390
- if self._options.inspect:
391
- try:
392
- iv = check.not_none(await self._inspector.inspect(ep)).iv
393
- except Exception as e: # noqa
394
- return None
395
- else:
396
- iv = self.guess_version(vn)
397
- if iv is None:
398
- return None
399
- return PyenvInterpProvider.Installed(
400
- name=vn,
401
- exe=ep,
402
- version=iv,
403
- )
404
-
405
- async def installed(self) -> ta.Sequence[Installed]:
406
- ret: ta.List[PyenvInterpProvider.Installed] = []
407
- for vn, ep in await self._pyenv.version_exes():
408
- if (i := await self._make_installed(vn, ep)) is None:
409
- log.debug('Invalid pyenv version: %s', vn)
410
- continue
411
- ret.append(i)
412
- return ret
413
-
414
- #
415
-
416
- async def get_installed_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
417
- return [i.version for i in await self.installed()]
418
-
419
- async def get_installed_version(self, version: InterpVersion) -> Interp:
420
- for i in await self.installed():
421
- if i.version == version:
422
- return Interp(
423
- exe=i.exe,
424
- version=i.version,
425
- )
426
- raise KeyError(version)
427
-
428
- #
429
-
430
- async def _get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
431
- lst = []
432
-
433
- for vs in await self._pyenv.installable_versions():
434
- if (iv := self.guess_version(vs)) is None:
435
- continue
436
- if iv.opts.debug:
437
- raise Exception('Pyenv installable versions not expected to have debug suffix')
438
- for d in [False, True]:
439
- lst.append(dc.replace(iv, opts=dc.replace(iv.opts, debug=d)))
440
-
441
- return lst
442
-
443
- async def get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
444
- lst = await self._get_installable_versions(spec)
445
-
446
- if self._options.try_update and not any(v in spec for v in lst):
447
- if self._pyenv.update():
448
- lst = await self._get_installable_versions(spec)
449
-
450
- return lst
451
-
452
- async def install_version(self, version: InterpVersion) -> Interp:
453
- inst_version = str(version.version)
454
- inst_opts = version.opts
455
- if inst_opts.threaded:
456
- inst_version += 't'
457
- inst_opts = dc.replace(inst_opts, threaded=False)
458
-
459
- installer = PyenvVersionInstaller(
460
- inst_version,
461
- interp_opts=inst_opts,
462
- pyenv=self._pyenv,
463
- )
464
-
465
- exe = await installer.install()
466
- 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