omdev 0.0.0.dev178__tar.gz → 0.0.0.dev179__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. {omdev-0.0.0.dev178/omdev.egg-info → omdev-0.0.0.dev179}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/main.py +1 -0
  3. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/importhook.py +1 -1
  4. omdev-0.0.0.dev179/omdev/interp/cli.py +78 -0
  5. omdev-0.0.0.dev179/omdev/interp/default.py +10 -0
  6. omdev-0.0.0.dev179/omdev/interp/inject.py +54 -0
  7. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/interp/inspect.py +0 -3
  8. omdev-0.0.0.dev178/omdev/interp/providers.py → omdev-0.0.0.dev179/omdev/interp/providers/base.py +4 -24
  9. omdev-0.0.0.dev179/omdev/interp/providers/inject.py +26 -0
  10. omdev-0.0.0.dev179/omdev/interp/providers/running.py +27 -0
  11. {omdev-0.0.0.dev178/omdev/interp → omdev-0.0.0.dev179/omdev/interp/providers}/system.py +27 -15
  12. omdev-0.0.0.dev179/omdev/interp/pyenv/inject.py +21 -0
  13. {omdev-0.0.0.dev178/omdev/interp → omdev-0.0.0.dev179/omdev/interp/pyenv}/pyenv.py +24 -23
  14. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/interp/resolvers.py +7 -22
  15. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/interp/types.py +12 -0
  16. omdev-0.0.0.dev179/omdev/interp/uv/inject.py +12 -0
  17. {omdev-0.0.0.dev178/omdev/interp → omdev-0.0.0.dev179/omdev/interp/uv}/uv.py +4 -4
  18. omdev-0.0.0.dev179/omdev/pycharm/__init__.py +0 -0
  19. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pyproject/venvs.py +2 -2
  20. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/scripts/interp.py +1968 -466
  21. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/scripts/pyproject.py +3464 -2227
  22. omdev-0.0.0.dev179/omdev/tools/json/__init__.py +0 -0
  23. omdev-0.0.0.dev179/omdev/tools/pawk/__init__.py +0 -0
  24. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179/omdev.egg-info}/PKG-INFO +2 -2
  25. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev.egg-info/SOURCES.txt +14 -5
  26. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev.egg-info/requires.txt +1 -1
  27. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/pyproject.toml +2 -2
  28. omdev-0.0.0.dev178/omdev/interp/cli.py +0 -77
  29. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/LICENSE +0 -0
  30. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/MANIFEST.in +0 -0
  31. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/README.rst +0 -0
  32. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/.manifests.json +0 -0
  33. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/__about__.py +0 -0
  34. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/__init__.py +0 -0
  35. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/__init__.py +0 -0
  36. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/__main__.py +0 -0
  37. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/gen.py +0 -0
  38. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/imports.py +0 -0
  39. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/manifests.py +0 -0
  40. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/resources.py +0 -0
  41. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/srcfiles.py +0 -0
  42. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/strip.py +0 -0
  43. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/types.py +0 -0
  44. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/amalg/typing.py +0 -0
  45. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/antlr/__init__.py +0 -0
  46. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/antlr/consts.py +0 -0
  47. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/antlr/gen.py +0 -0
  48. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/bracepy.py +0 -0
  49. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/__init__.py +0 -0
  50. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/compute/__init__.py +0 -0
  51. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/compute/cache.py +0 -0
  52. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/compute/contexts.py +0 -0
  53. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/compute/currents.py +0 -0
  54. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/compute/fns.py +0 -0
  55. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/compute/resolvers.py +0 -0
  56. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/compute/storage.py +0 -0
  57. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/compute/types.py +0 -0
  58. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/data/__init__.py +0 -0
  59. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/data/actions.py +0 -0
  60. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/data/cache.py +0 -0
  61. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/data/consts.py +0 -0
  62. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/data/defaults.py +0 -0
  63. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/data/manifests.py +0 -0
  64. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cache/data/specs.py +0 -0
  65. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/__init__.py +0 -0
  66. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_boilerplate.cc +0 -0
  67. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/LICENSE +0 -0
  68. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/__init__.py +0 -0
  69. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/build_ext.py +0 -0
  70. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  71. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  72. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/compilers/options.py +0 -0
  73. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  74. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/dir_util.py +0 -0
  75. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/errors.py +0 -0
  76. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/extension.py +0 -0
  77. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/file_util.py +0 -0
  78. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/modified.py +0 -0
  79. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/spawn.py +0 -0
  80. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/sysconfig.py +0 -0
  81. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/util.py +0 -0
  82. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/_distutils/version.py +0 -0
  83. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/build.py +0 -0
  84. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/cmake.py +0 -0
  85. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/magic.py +0 -0
  86. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cexts/scan.py +0 -0
  87. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/classdot.py +0 -0
  88. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cli/__init__.py +0 -0
  89. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cli/__main__.py +0 -0
  90. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cli/_pathhack.py +0 -0
  91. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cli/clicli.py +0 -0
  92. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cli/install.py +0 -0
  93. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cli/main.py +0 -0
  94. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cli/managers.py +0 -0
  95. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cli/types.py +0 -0
  96. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/clipboard/__init__.py +0 -0
  97. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/clipboard/clipboard.py +0 -0
  98. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/clipboard/darwin_cf.py +0 -0
  99. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/clipboard/linux_x11.py +0 -0
  100. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/cmake.py +0 -0
  101. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/findimports.py +0 -0
  102. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/git/__init__.py +0 -0
  103. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/git/revisions.py +0 -0
  104. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/git/status.py +0 -0
  105. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/git/subtrees.py +0 -0
  106. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/imgur.py +0 -0
  107. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/interp/__init__.py +0 -0
  108. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/interp/__main__.py +0 -0
  109. {omdev-0.0.0.dev178/omdev/mypy → omdev-0.0.0.dev179/omdev/interp/providers}/__init__.py +0 -0
  110. {omdev-0.0.0.dev178/omdev/interp → omdev-0.0.0.dev179/omdev/interp/providers}/standalone.py +0 -0
  111. {omdev-0.0.0.dev178/omdev/packaging → omdev-0.0.0.dev179/omdev/interp/pyenv}/__init__.py +0 -0
  112. {omdev-0.0.0.dev178/omdev/precheck → omdev-0.0.0.dev179/omdev/interp/uv}/__init__.py +0 -0
  113. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/magic/__init__.py +0 -0
  114. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/magic/find.py +0 -0
  115. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/magic/magic.py +0 -0
  116. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/magic/prepare.py +0 -0
  117. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/magic/styles.py +0 -0
  118. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/manifests/__init__.py +0 -0
  119. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/manifests/__main__.py +0 -0
  120. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/manifests/build.py +0 -0
  121. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/manifests/main.py +0 -0
  122. {omdev-0.0.0.dev178/omdev/ptk/apps → omdev-0.0.0.dev179/omdev/mypy}/__init__.py +0 -0
  123. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/mypy/debug.py +0 -0
  124. {omdev-0.0.0.dev178/omdev/pycharm → omdev-0.0.0.dev179/omdev/packaging}/__init__.py +0 -0
  125. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/packaging/marshal.py +0 -0
  126. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/packaging/names.py +0 -0
  127. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/packaging/requires.py +0 -0
  128. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/packaging/specifiers.py +0 -0
  129. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/packaging/versions.py +0 -0
  130. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pip.py +0 -0
  131. {omdev-0.0.0.dev178/omdev/tools/json → omdev-0.0.0.dev179/omdev/precheck}/__init__.py +0 -0
  132. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/precheck/__main__.py +0 -0
  133. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/precheck/base.py +0 -0
  134. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/precheck/git.py +0 -0
  135. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/precheck/lite.py +0 -0
  136. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/precheck/main.py +0 -0
  137. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/precheck/manifests.py +0 -0
  138. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/precheck/scripts.py +0 -0
  139. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/ptk/__init__.py +0 -0
  140. {omdev-0.0.0.dev178/omdev/tools/pawk → omdev-0.0.0.dev179/omdev/ptk/apps}/__init__.py +0 -0
  141. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/ptk/apps/ncdu.py +0 -0
  142. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pycharm/__main__.py +0 -0
  143. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pycharm/cli.py +0 -0
  144. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pyproject/__init__.py +0 -0
  145. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pyproject/__main__.py +0 -0
  146. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pyproject/cexts.py +0 -0
  147. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pyproject/cli.py +0 -0
  148. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pyproject/configs.py +0 -0
  149. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pyproject/pkg.py +0 -0
  150. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/pyproject/reqs.py +0 -0
  151. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/revisions.py +0 -0
  152. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/scripts/__init__.py +0 -0
  153. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/scripts/bumpversion.py +0 -0
  154. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/scripts/execrss.py +0 -0
  155. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/scripts/exectime.py +0 -0
  156. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/scripts/importtrace.py +0 -0
  157. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/scripts/slowcat.py +0 -0
  158. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/scripts/tmpexec.py +0 -0
  159. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/secrets.py +0 -0
  160. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tokens.py +0 -0
  161. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/toml/__init__.py +0 -0
  162. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/toml/parser.py +0 -0
  163. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/toml/writer.py +0 -0
  164. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/__init__.py +0 -0
  165. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/cloc.py +0 -0
  166. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/doc.py +0 -0
  167. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/docker.py +0 -0
  168. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/git.py +0 -0
  169. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/importscan.py +0 -0
  170. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/json/__main__.py +0 -0
  171. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/json/cli.py +0 -0
  172. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/json/formats.py +0 -0
  173. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/json/io.py +0 -0
  174. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/json/parsing.py +0 -0
  175. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/json/processing.py +0 -0
  176. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/json/rendering.py +0 -0
  177. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/mkrelimp.py +0 -0
  178. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/notebook.py +0 -0
  179. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/pawk/__main__.py +0 -0
  180. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/pawk/pawk.py +0 -0
  181. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/pip.py +0 -0
  182. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/prof.py +0 -0
  183. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/qr.py +0 -0
  184. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/tools/sqlrepl.py +0 -0
  185. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev/wheelfile.py +0 -0
  186. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev.egg-info/dependency_links.txt +0 -0
  187. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev.egg-info/entry_points.txt +0 -0
  188. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/omdev.egg-info/top_level.txt +0 -0
  189. {omdev-0.0.0.dev178 → omdev-0.0.0.dev179}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev178
3
+ Version: 0.0.0.dev179
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.dev178
15
+ Requires-Dist: omlish==0.0.0.dev179
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -5,6 +5,7 @@ Conventions:
5
5
 
6
6
  TODO:
7
7
  - !! check only importing lite code
8
+ - check no rel impots
8
9
  - !! strip manifests? or relegate them to a separate tiny module ala __main__.py?
9
10
  - # @omlish-no-amalg ? in cli.types? will strip stmt (more than 1 line) following @manifest, so shouldn't import
10
11
  - more sanity checks lol
@@ -26,7 +26,7 @@ def load_dynamic(name: str, path: str) -> types.ModuleType:
26
26
  spec = importlib.machinery.ModuleSpec(name=name, loader=loader, origin=path)
27
27
 
28
28
  import importlib._bootstrap # FIXME: # noqa
29
- return importlib._bootstrap._load(spec) # noqa
29
+ return importlib._bootstrap._load(spec) # type: ignore # noqa
30
30
 
31
31
 
32
32
  ##
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env python3
2
+ # @omlish-amalg ../scripts/interp.py
3
+ # ruff: noqa: UP007
4
+ """
5
+ TODO:
6
+ - partial best-matches - '3.12'
7
+ - https://github.com/asdf-vm/asdf support (instead of pyenv) ?
8
+ - colon sep provider name prefix - pyenv:3.12
9
+ """
10
+ import asyncio
11
+ import typing as ta
12
+
13
+ from omlish.argparse.cli import ArgparseCli
14
+ from omlish.argparse.cli import argparse_arg
15
+ from omlish.argparse.cli import argparse_command
16
+ from omlish.lite.cached import cached_nullary
17
+ from omlish.lite.check import check
18
+ from omlish.lite.inject import Injector
19
+ from omlish.lite.inject import inj
20
+ from omlish.lite.runtime import check_lite_runtime_version
21
+ from omlish.logs.standard import configure_standard_logging
22
+
23
+ from .inject import bind_interp
24
+ from .resolvers import InterpResolver
25
+ from .resolvers import InterpResolverProviders
26
+ from .types import InterpSpecifier
27
+
28
+
29
+ class InterpCli(ArgparseCli):
30
+ @cached_nullary
31
+ def injector(self) -> Injector:
32
+ return inj.create_injector(bind_interp())
33
+
34
+ @cached_nullary
35
+ def providers(self) -> InterpResolverProviders:
36
+ return self.injector()[InterpResolverProviders]
37
+
38
+ #
39
+
40
+ @argparse_command(
41
+ argparse_arg('version'),
42
+ argparse_arg('-d', '--debug', action='store_true'),
43
+ )
44
+ async def list(self) -> None:
45
+ r = InterpResolver(self.providers())
46
+ s = InterpSpecifier.parse(self.args.version)
47
+ await r.list(s)
48
+
49
+ @argparse_command(
50
+ argparse_arg('version'),
51
+ argparse_arg('-p', '--provider'),
52
+ argparse_arg('-d', '--debug', action='store_true'),
53
+ argparse_arg('-i', '--install', action='store_true'),
54
+ )
55
+ async def resolve(self) -> None:
56
+ if self.args.provider:
57
+ p = check.single([p for n, p in self.providers().providers if n == self.args.provider])
58
+ r = InterpResolver(InterpResolverProviders([(p.name, p)]))
59
+ else:
60
+ r = InterpResolver(self.providers())
61
+ s = InterpSpecifier.parse(self.args.version)
62
+ print(check.not_none(await r.resolve(s, install=bool(self.args.install))).exe)
63
+
64
+
65
+ async def _async_main(argv: ta.Optional[ta.Sequence[str]] = None) -> None:
66
+ check_lite_runtime_version()
67
+ configure_standard_logging()
68
+
69
+ cli = ArgparseCli(argv)
70
+ await cli.async_cli_run()
71
+
72
+
73
+ def _main(argv: ta.Optional[ta.Sequence[str]] = None) -> None:
74
+ asyncio.run(_async_main(argv))
75
+
76
+
77
+ if __name__ == '__main__':
78
+ _main()
@@ -0,0 +1,10 @@
1
+ from omlish.lite.cached import cached_nullary
2
+ from omlish.lite.inject import inj
3
+
4
+ from .inject import bind_interp
5
+ from .resolvers import InterpResolver
6
+
7
+
8
+ @cached_nullary
9
+ def get_default_interp_resolver() -> InterpResolver:
10
+ return inj.create_injector(bind_interp())[InterpResolver]
@@ -0,0 +1,54 @@
1
+ # ruff: noqa: UP006 UP007
2
+ import typing as ta
3
+
4
+ from omlish.lite.inject import Injector
5
+ from omlish.lite.inject import InjectorBindingOrBindings
6
+ from omlish.lite.inject import InjectorBindings
7
+ from omlish.lite.inject import inj
8
+
9
+ from .inspect import InterpInspector
10
+ from .providers.inject import bind_interp_providers
11
+ from .providers.running import RunningInterpProvider
12
+ from .providers.system import SystemInterpProvider
13
+ from .pyenv.inject import bind_interp_pyenv
14
+ from .pyenv.pyenv import PyenvInterpProvider
15
+ from .resolvers import InterpResolver
16
+ from .resolvers import InterpResolverProviders
17
+ from .uv.inject import bind_interp_uv
18
+
19
+
20
+ def bind_interp() -> InjectorBindings:
21
+ lst: ta.List[InjectorBindingOrBindings] = [
22
+ bind_interp_providers(),
23
+
24
+ bind_interp_pyenv(),
25
+
26
+ bind_interp_uv(),
27
+
28
+ inj.bind(InterpInspector, singleton=True),
29
+ ]
30
+
31
+ #
32
+
33
+ def provide_interp_resolver_providers(injector: Injector) -> InterpResolverProviders:
34
+ # FIXME: lol
35
+ rps: ta.List[ta.Any] = [
36
+ injector.provide(c)
37
+ for c in [
38
+ PyenvInterpProvider,
39
+ RunningInterpProvider,
40
+ SystemInterpProvider,
41
+ ]
42
+ ]
43
+
44
+ return InterpResolverProviders([(rp.name, rp) for rp in rps])
45
+
46
+ lst.append(inj.bind(provide_interp_resolver_providers, singleton=True))
47
+
48
+ lst.extend([
49
+ inj.bind(InterpResolver, singleton=True),
50
+ ])
51
+
52
+ #
53
+
54
+ return inj.as_bindings(*lst)
@@ -99,6 +99,3 @@ class InterpInspector:
99
99
  ret = None
100
100
  self._cache[exe] = ret
101
101
  return ret
102
-
103
-
104
- INTERP_INSPECTOR = InterpInspector()
@@ -7,16 +7,13 @@ TODO:
7
7
  - loose versions
8
8
  """
9
9
  import abc
10
- import sys
11
10
  import typing as ta
12
11
 
13
- from omlish.lite.cached import cached_nullary
14
12
  from omlish.lite.strings import snake_case
15
13
 
16
- from .inspect import InterpInspector
17
- from .types import Interp
18
- from .types import InterpSpecifier
19
- from .types import InterpVersion
14
+ from ..types import Interp
15
+ from ..types import InterpSpecifier
16
+ from ..types import InterpVersion
20
17
 
21
18
 
22
19
  ##
@@ -48,21 +45,4 @@ class InterpProvider(abc.ABC):
48
45
  raise TypeError
49
46
 
50
47
 
51
- ##
52
-
53
-
54
- class RunningInterpProvider(InterpProvider):
55
- @cached_nullary
56
- def version(self) -> InterpVersion:
57
- return InterpInspector.running().iv
58
-
59
- async def get_installed_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
60
- return [self.version()]
61
-
62
- async def get_installed_version(self, version: InterpVersion) -> Interp:
63
- if version != self.version():
64
- raise KeyError(version)
65
- return Interp(
66
- exe=sys.executable,
67
- version=self.version(),
68
- )
48
+ InterpProviders = ta.NewType('InterpProviders', ta.Sequence[InterpProvider])
@@ -0,0 +1,26 @@
1
+ # ruff: noqa: UP006 UP007
2
+ import typing as ta
3
+
4
+ from omlish.lite.inject import InjectorBindingOrBindings
5
+ from omlish.lite.inject import InjectorBindings
6
+ from omlish.lite.inject import inj
7
+
8
+ from .base import InterpProvider
9
+ from .base import InterpProviders
10
+ from .running import RunningInterpProvider
11
+ from .system import SystemInterpProvider
12
+
13
+
14
+ def bind_interp_providers() -> InjectorBindings:
15
+ lst: ta.List[InjectorBindingOrBindings] = [
16
+ inj.bind_array(InterpProvider),
17
+ inj.bind_array_type(InterpProvider, InterpProviders),
18
+
19
+ inj.bind(RunningInterpProvider, singleton=True),
20
+ inj.bind(InterpProvider, to_key=RunningInterpProvider, array=True),
21
+
22
+ inj.bind(SystemInterpProvider, singleton=True),
23
+ inj.bind(InterpProvider, to_key=SystemInterpProvider, array=True),
24
+ ]
25
+
26
+ return inj.as_bindings(*lst)
@@ -0,0 +1,27 @@
1
+ import sys
2
+ import typing as ta
3
+
4
+ from omlish.lite.cached import cached_nullary
5
+
6
+ from ..inspect import InterpInspector
7
+ from ..types import Interp
8
+ from ..types import InterpSpecifier
9
+ from ..types import InterpVersion
10
+ from .base import InterpProvider
11
+
12
+
13
+ class RunningInterpProvider(InterpProvider):
14
+ @cached_nullary
15
+ def version(self) -> InterpVersion:
16
+ return InterpInspector.running().iv
17
+
18
+ async def get_installed_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
19
+ return [self.version()]
20
+
21
+ async def get_installed_version(self, version: InterpVersion) -> Interp:
22
+ if version != self.version():
23
+ raise KeyError(version)
24
+ return Interp(
25
+ exe=sys.executable,
26
+ version=self.version(),
27
+ )
@@ -10,27 +10,39 @@ import re
10
10
  import typing as ta
11
11
 
12
12
  from omlish.lite.cached import cached_nullary
13
+ from omlish.lite.check import check
13
14
  from omlish.lite.logs import log
14
15
 
15
- from ..packaging.versions import InvalidVersion
16
- from .inspect import INTERP_INSPECTOR
17
- from .inspect import InterpInspector
18
- from .providers import InterpProvider
19
- from .types import Interp
20
- from .types import InterpSpecifier
21
- from .types import InterpVersion
16
+ from ...packaging.versions import InvalidVersion
17
+ from ..inspect import InterpInspector
18
+ from ..types import Interp
19
+ from ..types import InterpSpecifier
20
+ from ..types import InterpVersion
21
+ from .base import InterpProvider
22
22
 
23
23
 
24
24
  ##
25
25
 
26
26
 
27
- @dc.dataclass(frozen=True)
28
27
  class SystemInterpProvider(InterpProvider):
29
- cmd: str = 'python3'
30
- path: ta.Optional[str] = None
28
+ @dc.dataclass(frozen=True)
29
+ class Options:
30
+ cmd: str = 'python3' # FIXME: unused lol
31
+ path: ta.Optional[str] = None
31
32
 
32
- inspect: bool = False
33
- inspector: InterpInspector = INTERP_INSPECTOR
33
+ inspect: bool = False
34
+
35
+ def __init__(
36
+ self,
37
+ options: Options = Options(),
38
+ *,
39
+ inspector: ta.Optional[InterpInspector] = None,
40
+ ) -> None:
41
+ super().__init__()
42
+
43
+ self._options = options
44
+
45
+ self._inspector = inspector
34
46
 
35
47
  #
36
48
 
@@ -82,13 +94,13 @@ class SystemInterpProvider(InterpProvider):
82
94
  def exes(self) -> ta.List[str]:
83
95
  return self._re_which(
84
96
  re.compile(r'python3(\.\d+)?'),
85
- path=self.path,
97
+ path=self._options.path,
86
98
  )
87
99
 
88
100
  #
89
101
 
90
102
  async def get_exe_version(self, exe: str) -> ta.Optional[InterpVersion]:
91
- if not self.inspect:
103
+ if not self._options.inspect:
92
104
  s = os.path.basename(exe)
93
105
  if s.startswith('python'):
94
106
  s = s[len('python'):]
@@ -97,7 +109,7 @@ class SystemInterpProvider(InterpProvider):
97
109
  return InterpVersion.parse(s)
98
110
  except InvalidVersion:
99
111
  pass
100
- ii = await self.inspector.inspect(exe)
112
+ ii = await check.not_none(self._inspector).inspect(exe)
101
113
  return ii.iv if ii is not None else None
102
114
 
103
115
  async def exe_versions(self) -> ta.Sequence[ta.Tuple[str, InterpVersion]]:
@@ -0,0 +1,21 @@
1
+ # ruff: noqa: UP006 UP007
2
+ import typing as ta
3
+
4
+ from omlish.lite.inject import InjectorBindingOrBindings
5
+ from omlish.lite.inject import InjectorBindings
6
+ from omlish.lite.inject import inj
7
+
8
+ from ..providers.base import InterpProvider
9
+ from .pyenv import Pyenv
10
+ from .pyenv import PyenvInterpProvider
11
+
12
+
13
+ def bind_interp_pyenv() -> InjectorBindings:
14
+ lst: ta.List[InjectorBindingOrBindings] = [
15
+ inj.bind(Pyenv, singleton=True),
16
+
17
+ inj.bind(PyenvInterpProvider, singleton=True),
18
+ inj.bind(InterpProvider, to_key=PyenvInterpProvider, array=True),
19
+ ]
20
+
21
+ return inj.as_bindings(*lst)
@@ -24,15 +24,14 @@ from omlish.lite.cached import cached_nullary
24
24
  from omlish.lite.check import check
25
25
  from omlish.lite.logs import log
26
26
 
27
- from ..packaging.versions import InvalidVersion
28
- from ..packaging.versions import Version
29
- from .inspect import INTERP_INSPECTOR
30
- from .inspect import InterpInspector
31
- from .providers import InterpProvider
32
- from .types import Interp
33
- from .types import InterpOpts
34
- from .types import InterpSpecifier
35
- from .types import InterpVersion
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
+ from ..types import InterpOpts
33
+ from ..types import InterpSpecifier
34
+ from ..types import InterpVersion
36
35
 
37
36
 
38
37
  ##
@@ -251,9 +250,10 @@ class PyenvVersionInstaller:
251
250
  opts: ta.Optional[PyenvInstallOpts] = None,
252
251
  interp_opts: InterpOpts = InterpOpts(),
253
252
  *,
253
+ pyenv: Pyenv,
254
+
254
255
  install_name: ta.Optional[str] = None,
255
256
  no_default_opts: bool = False,
256
- pyenv: Pyenv = Pyenv(),
257
257
  ) -> None:
258
258
  super().__init__()
259
259
 
@@ -343,26 +343,26 @@ class PyenvVersionInstaller:
343
343
 
344
344
 
345
345
  class PyenvInterpProvider(InterpProvider):
346
- def __init__(
347
- self,
348
- pyenv: Pyenv = Pyenv(),
346
+ @dc.dataclass(frozen=True)
347
+ class Options:
348
+ inspect: bool = False
349
349
 
350
- inspect: bool = False,
351
- inspector: InterpInspector = INTERP_INSPECTOR,
350
+ try_update: bool = False
352
351
 
352
+ def __init__(
353
+ self,
354
+ options: Options = Options(),
353
355
  *,
354
-
355
- try_update: bool = False,
356
+ pyenv: Pyenv,
357
+ inspector: InterpInspector,
356
358
  ) -> None:
357
359
  super().__init__()
358
360
 
359
- self._pyenv = pyenv
361
+ self._options = options
360
362
 
361
- self._inspect = inspect
363
+ self._pyenv = pyenv
362
364
  self._inspector = inspector
363
365
 
364
- self._try_update = try_update
365
-
366
366
  #
367
367
 
368
368
  @staticmethod
@@ -387,7 +387,7 @@ class PyenvInterpProvider(InterpProvider):
387
387
 
388
388
  async def _make_installed(self, vn: str, ep: str) -> ta.Optional[Installed]:
389
389
  iv: ta.Optional[InterpVersion]
390
- if self._inspect:
390
+ if self._options.inspect:
391
391
  try:
392
392
  iv = check.not_none(await self._inspector.inspect(ep)).iv
393
393
  except Exception as e: # noqa
@@ -443,7 +443,7 @@ class PyenvInterpProvider(InterpProvider):
443
443
  async def get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
444
444
  lst = await self._get_installable_versions(spec)
445
445
 
446
- if self._try_update and not any(v in spec for v in lst):
446
+ if self._options.try_update and not any(v in spec for v in lst):
447
447
  if self._pyenv.update():
448
448
  lst = await self._get_installable_versions(spec)
449
449
 
@@ -459,6 +459,7 @@ class PyenvInterpProvider(InterpProvider):
459
459
  installer = PyenvVersionInstaller(
460
460
  inst_version,
461
461
  interp_opts=inst_opts,
462
+ pyenv=self._pyenv,
462
463
  )
463
464
 
464
465
  exe = await installer.install()
@@ -1,32 +1,27 @@
1
1
  # ruff: noqa: UP006 UP007
2
- import abc
3
2
  import collections
3
+ import dataclasses as dc
4
4
  import typing as ta
5
5
 
6
- from omlish.lite.reflect import deep_subclasses
7
-
8
- from .providers import InterpProvider
9
- from .providers import RunningInterpProvider
10
- from .pyenv import PyenvInterpProvider
11
- from .system import SystemInterpProvider
6
+ from .providers.base import InterpProvider
12
7
  from .types import Interp
13
8
  from .types import InterpSpecifier
14
9
  from .types import InterpVersion
15
10
 
16
11
 
17
- INTERP_PROVIDER_TYPES_BY_NAME: ta.Mapping[str, ta.Type[InterpProvider]] = {
18
- cls.name: cls for cls in deep_subclasses(InterpProvider) if abc.ABC not in cls.__bases__ # type: ignore
19
- }
12
+ @dc.dataclass(frozen=True)
13
+ class InterpResolverProviders:
14
+ providers: ta.Sequence[ta.Tuple[str, InterpProvider]]
20
15
 
21
16
 
22
17
  class InterpResolver:
23
18
  def __init__(
24
19
  self,
25
- providers: ta.Sequence[ta.Tuple[str, InterpProvider]],
20
+ providers: InterpResolverProviders,
26
21
  ) -> None:
27
22
  super().__init__()
28
23
 
29
- self._providers: ta.Mapping[str, InterpProvider] = collections.OrderedDict(providers)
24
+ self._providers: ta.Mapping[str, InterpProvider] = collections.OrderedDict(providers.providers)
30
25
 
31
26
  async def _resolve_installed(self, spec: InterpSpecifier) -> ta.Optional[ta.Tuple[InterpProvider, InterpVersion]]:
32
27
  lst = [
@@ -96,13 +91,3 @@ class InterpResolver:
96
91
  print(f' {n}')
97
92
  for si in lst:
98
93
  print(f' {si}')
99
-
100
-
101
- DEFAULT_INTERP_RESOLVER = InterpResolver([(p.name, p) for p in [
102
- # pyenv is preferred to system interpreters as it tends to have more support for things like tkinter
103
- PyenvInterpProvider(try_update=True),
104
-
105
- RunningInterpProvider(),
106
-
107
- SystemInterpProvider(),
108
- ]])
@@ -8,6 +8,9 @@ from ..packaging.versions import InvalidVersion
8
8
  from ..packaging.versions import Version
9
9
 
10
10
 
11
+ ##
12
+
13
+
11
14
  # See https://peps.python.org/pep-3149/
12
15
  INTERP_OPT_GLYPHS_BY_ATTR: ta.Mapping[str, str] = collections.OrderedDict([
13
16
  ('debug', 'd'),
@@ -39,6 +42,9 @@ class InterpOpts:
39
42
  return s, cls(**kw)
40
43
 
41
44
 
45
+ ##
46
+
47
+
42
48
  @dc.dataclass(frozen=True)
43
49
  class InterpVersion:
44
50
  version: Version
@@ -64,6 +70,9 @@ class InterpVersion:
64
70
  return None
65
71
 
66
72
 
73
+ ##
74
+
75
+
67
76
  @dc.dataclass(frozen=True)
68
77
  class InterpSpecifier:
69
78
  specifier: Specifier
@@ -91,6 +100,9 @@ class InterpSpecifier:
91
100
  return self.contains(iv)
92
101
 
93
102
 
103
+ ##
104
+
105
+
94
106
  @dc.dataclass(frozen=True)
95
107
  class Interp:
96
108
  exe: str
@@ -0,0 +1,12 @@
1
+ # ruff: noqa: UP006 UP007
2
+ import typing as ta
3
+
4
+ from omlish.lite.inject import InjectorBindingOrBindings
5
+ from omlish.lite.inject import InjectorBindings
6
+ from omlish.lite.inject import inj
7
+
8
+
9
+ def bind_interp_uv() -> InjectorBindings:
10
+ lst: ta.List[InjectorBindingOrBindings] = []
11
+
12
+ return inj.as_bindings(*lst)
@@ -7,10 +7,10 @@ python3 -m venv barf && barf/bin/pip install uv && barf/bin/uv venv --python 3.1
7
7
  """
8
8
  import typing as ta
9
9
 
10
- from .providers import InterpProvider
11
- from .types import Interp
12
- from .types import InterpSpecifier
13
- from .types import InterpVersion
10
+ from ..providers.base import InterpProvider
11
+ from ..types import Interp
12
+ from ..types import InterpSpecifier
13
+ from ..types import InterpVersion
14
14
 
15
15
 
16
16
  class PyenvInterpProvider(InterpProvider):
File without changes
@@ -9,7 +9,7 @@ from omlish.lite.cached import cached_nullary
9
9
  from omlish.lite.check import check
10
10
  from omlish.lite.logs import log
11
11
 
12
- from ..interp.resolvers import DEFAULT_INTERP_RESOLVER
12
+ from ..interp.default import get_default_interp_resolver
13
13
  from ..interp.types import InterpSpecifier
14
14
  from .configs import VenvConfig
15
15
  from .reqs import RequirementsRewriter
@@ -41,7 +41,7 @@ class Venv:
41
41
  @async_cached_nullary
42
42
  async def interp_exe(self) -> str:
43
43
  i = InterpSpecifier.parse(check.not_none(self._cfg.interp))
44
- return check.not_none(await DEFAULT_INTERP_RESOLVER.resolve(i, install=True)).exe
44
+ return check.not_none(await get_default_interp_resolver().resolve(i, install=True)).exe
45
45
 
46
46
  @cached_nullary
47
47
  def exe(self) -> str: