omdev 0.0.0.dev372__tar.gz → 0.0.0.dev373__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 (322) hide show
  1. {omdev-0.0.0.dev372/omdev.egg-info → omdev-0.0.0.dev373}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/.manifests.json +15 -15
  3. omdev-0.0.0.dev373/omdev/intellij/__init__.py +11 -0
  4. omdev-0.0.0.dev373/omdev/intellij/cli.py +86 -0
  5. omdev-0.0.0.dev373/omdev/intellij/ides.py +85 -0
  6. omdev-0.0.0.dev373/omdev/intellij/open.py +113 -0
  7. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/scripts/ci.py +63 -3
  8. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/scripts/pyproject.py +63 -3
  9. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373/omdev.egg-info}/PKG-INFO +2 -2
  10. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev.egg-info/SOURCES.txt +4 -1
  11. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev.egg-info/requires.txt +1 -1
  12. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/pyproject.toml +2 -2
  13. omdev-0.0.0.dev372/omdev/tools/intellij.py +0 -253
  14. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/LICENSE +0 -0
  15. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/MANIFEST.in +0 -0
  16. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/README.md +0 -0
  17. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/__about__.py +0 -0
  18. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/__init__.py +0 -0
  19. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/__init__.py +0 -0
  20. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/__main__.py +0 -0
  21. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/gen.py +0 -0
  22. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/imports.py +0 -0
  23. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/main.py +0 -0
  24. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/manifests.py +0 -0
  25. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/resources.py +0 -0
  26. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/srcfiles.py +0 -0
  27. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/strip.py +0 -0
  28. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/types.py +0 -0
  29. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/amalg/typing.py +0 -0
  30. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/__init__.py +0 -0
  31. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/compute/__init__.py +0 -0
  32. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/compute/cache.py +0 -0
  33. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/compute/contexts.py +0 -0
  34. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/compute/currents.py +0 -0
  35. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/compute/fns.py +0 -0
  36. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/compute/resolvers.py +0 -0
  37. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/compute/storage.py +0 -0
  38. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/compute/types.py +0 -0
  39. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/data/__init__.py +0 -0
  40. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/data/actions.py +0 -0
  41. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/data/cache.py +0 -0
  42. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/data/consts.py +0 -0
  43. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/data/defaults.py +0 -0
  44. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/data/manifests.py +0 -0
  45. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cache/data/specs.py +0 -0
  46. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cc/__init__.py +0 -0
  47. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cc/__main__.py +0 -0
  48. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cc/cdeps.py +0 -0
  49. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cc/cdeps.toml +0 -0
  50. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cc/cli.py +0 -0
  51. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cc/srclangs.py +0 -0
  52. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/__init__.py +0 -0
  53. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_boilerplate.cc +0 -0
  54. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/LICENSE +0 -0
  55. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/__init__.py +0 -0
  56. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/build_ext.py +0 -0
  57. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  58. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  59. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/compilers/options.py +0 -0
  60. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  61. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/dir_util.py +0 -0
  62. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/errors.py +0 -0
  63. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/extension.py +0 -0
  64. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/file_util.py +0 -0
  65. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/modified.py +0 -0
  66. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/spawn.py +0 -0
  67. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/sysconfig.py +0 -0
  68. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/util.py +0 -0
  69. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/_distutils/version.py +0 -0
  70. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/build.py +0 -0
  71. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/cmake.py +0 -0
  72. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/importhook.py +0 -0
  73. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/magic.py +0 -0
  74. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cexts/scan.py +0 -0
  75. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/__init__.py +0 -0
  76. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/__main__.py +0 -0
  77. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/cache.py +0 -0
  78. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/ci.py +0 -0
  79. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/cli.py +0 -0
  80. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/compose.py +0 -0
  81. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/consts.py +0 -0
  82. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/__init__.py +0 -0
  83. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/buildcaching.py +0 -0
  84. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/cache.py +0 -0
  85. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  86. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/cacheserved/cache.py +0 -0
  87. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  88. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/cmds.py +0 -0
  89. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/dataserver.py +0 -0
  90. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/imagepulling.py +0 -0
  91. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/inject.py +0 -0
  92. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/packing.py +0 -0
  93. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/repositories.py +0 -0
  94. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/docker/utils.py +0 -0
  95. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/__init__.py +0 -0
  96. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/api/__init__.py +0 -0
  97. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/api/clients.py +0 -0
  98. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/api/v1/__init__.py +0 -0
  99. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/api/v1/api.py +0 -0
  100. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/api/v1/client.py +0 -0
  101. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/api/v2/__init__.py +0 -0
  102. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/api/v2/api.py +0 -0
  103. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/api/v2/azure.py +0 -0
  104. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/api/v2/client.py +0 -0
  105. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/bootstrap.py +0 -0
  106. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/cache.py +0 -0
  107. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/cli.py +0 -0
  108. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/env.py +0 -0
  109. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/github/inject.py +0 -0
  110. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/inject.py +0 -0
  111. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/requirements.py +0 -0
  112. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/shell.py +0 -0
  113. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ci/utils.py +0 -0
  114. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cli/__init__.py +0 -0
  115. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cli/__main__.py +0 -0
  116. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cli/_pathhack.py +0 -0
  117. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cli/clicli.py +0 -0
  118. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cli/install.py +0 -0
  119. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cli/main.py +0 -0
  120. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cli/managers.py +0 -0
  121. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cli/types.py +0 -0
  122. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/clipboard/__init__.py +0 -0
  123. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/clipboard/clipboard.py +0 -0
  124. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/clipboard/darwin_cf.py +0 -0
  125. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/clipboard/linux_x11.py +0 -0
  126. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cmake.py +0 -0
  127. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cmdlog/__init__.py +0 -0
  128. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cmdlog/__main__.py +0 -0
  129. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cmdlog/_cmdlog.py +0 -0
  130. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cmdlog/cli.py +0 -0
  131. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/cmdlog/cmdlog.py +0 -0
  132. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/dataserver/__init__.py +0 -0
  133. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/dataserver/handlers.py +0 -0
  134. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/dataserver/http.py +0 -0
  135. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/dataserver/routes.py +0 -0
  136. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/dataserver/server.py +0 -0
  137. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/dataserver/targets.py +0 -0
  138. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/git/__init__.py +0 -0
  139. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/git/magic.py +0 -0
  140. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/git/revisions.py +0 -0
  141. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/git/shallow.py +0 -0
  142. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/git/status.py +0 -0
  143. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/home/__init__.py +0 -0
  144. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/home/paths.py +0 -0
  145. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/home/secrets.py +0 -0
  146. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/home/shadow.py +0 -0
  147. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/imgur.py +0 -0
  148. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/__init__.py +0 -0
  149. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/__main__.py +0 -0
  150. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/cli.py +0 -0
  151. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/default.py +0 -0
  152. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/inject.py +0 -0
  153. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/inspect.py +0 -0
  154. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/providers/__init__.py +0 -0
  155. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/providers/base.py +0 -0
  156. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/providers/inject.py +0 -0
  157. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/providers/running.py +0 -0
  158. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/providers/standalone.py +0 -0
  159. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/providers/system.py +0 -0
  160. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/pyenv/__init__.py +0 -0
  161. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/pyenv/inject.py +0 -0
  162. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/pyenv/install.py +0 -0
  163. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/pyenv/provider.py +0 -0
  164. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/pyenv/pyenv.py +0 -0
  165. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/resolvers.py +0 -0
  166. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/types.py +0 -0
  167. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/uv/__init__.py +0 -0
  168. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/uv/inject.py +0 -0
  169. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/uv/provider.py +0 -0
  170. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/uv/uv.py +0 -0
  171. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/interp/venvs.py +0 -0
  172. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/magic/__init__.py +0 -0
  173. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/magic/__main__.py +0 -0
  174. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/magic/cli.py +0 -0
  175. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/magic/find.py +0 -0
  176. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/magic/magic.py +0 -0
  177. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/magic/prepare.py +0 -0
  178. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/magic/styles.py +0 -0
  179. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/manifests/__init__.py +0 -0
  180. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/manifests/__main__.py +0 -0
  181. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/manifests/build.py +0 -0
  182. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/manifests/dumping.py +0 -0
  183. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/manifests/main.py +0 -0
  184. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/mypy/__init__.py +0 -0
  185. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/mypy/debug.py +0 -0
  186. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/mypy/report.py +0 -0
  187. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/__init__.py +0 -0
  188. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/building.py +0 -0
  189. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/compression.py +0 -0
  190. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/data.py +0 -0
  191. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/datarefs.py +0 -0
  192. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/dataserver.py +0 -0
  193. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/loading.py +0 -0
  194. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/media.py +0 -0
  195. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/pack/__init__.py +0 -0
  196. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/pack/packing.py +0 -0
  197. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/pack/repositories.py +0 -0
  198. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/pack/unpacking.py +0 -0
  199. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/repositories.py +0 -0
  200. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/oci/tars.py +0 -0
  201. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/packaging/__init__.py +0 -0
  202. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/packaging/marshal.py +0 -0
  203. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/packaging/names.py +0 -0
  204. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/packaging/requires.py +0 -0
  205. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/packaging/revisions.py +0 -0
  206. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/packaging/specifiers.py +0 -0
  207. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/packaging/versions.py +0 -0
  208. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/packaging/wheelfile.py +0 -0
  209. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pip.py +0 -0
  210. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/__init__.py +0 -0
  211. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/__main__.py +0 -0
  212. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/base.py +0 -0
  213. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/caches.py +0 -0
  214. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/git.py +0 -0
  215. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/imports.py +0 -0
  216. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/lite.py +0 -0
  217. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/main.py +0 -0
  218. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/manifests.py +0 -0
  219. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/scripts.py +0 -0
  220. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/precheck/unicode.py +0 -0
  221. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/__init__.py +0 -0
  222. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/apps/__init__.py +0 -0
  223. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/apps/ncdu.py +0 -0
  224. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/confirm.py +0 -0
  225. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/markdown/LICENSE +0 -0
  226. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/markdown/__init__.py +0 -0
  227. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/markdown/__main__.py +0 -0
  228. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/markdown/border.py +0 -0
  229. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/markdown/cli.py +0 -0
  230. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/markdown/markdown.py +0 -0
  231. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/markdown/parser.py +0 -0
  232. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/markdown/styles.py +0 -0
  233. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/markdown/tags.py +0 -0
  234. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/ptk/markdown/utils.py +0 -0
  235. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/__init__.py +0 -0
  236. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/attrdocs.py +0 -0
  237. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/bracepy.py +0 -0
  238. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/classdot.py +0 -0
  239. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/docstrings/LICENSE +0 -0
  240. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/docstrings/__init__.py +0 -0
  241. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/docstrings/attrdoc.py +0 -0
  242. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/docstrings/common.py +0 -0
  243. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/docstrings/epydoc.py +0 -0
  244. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/docstrings/google.py +0 -0
  245. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/docstrings/numpydoc.py +0 -0
  246. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/docstrings/parser.py +0 -0
  247. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/docstrings/rest.py +0 -0
  248. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/findimports.py +0 -0
  249. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/scripts/__init__.py +0 -0
  250. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/scripts/bumpversion.py +0 -0
  251. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/scripts/execstat.py +0 -0
  252. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/scripts/importtrace.py +0 -0
  253. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/srcheaders.py +0 -0
  254. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/tools/__init__.py +0 -0
  255. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/tools/importscan.py +0 -0
  256. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/py/tools/mkrelimp.py +0 -0
  257. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/__init__.py +0 -0
  258. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/__main__.py +0 -0
  259. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/cexts.py +0 -0
  260. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/cli.py +0 -0
  261. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/configs.py +0 -0
  262. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/inject.py +0 -0
  263. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/pkg.py +0 -0
  264. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/reqs.py +0 -0
  265. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/resources/__init__.py +0 -0
  266. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/resources/docker-dev.sh +0 -0
  267. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/resources/python.sh +0 -0
  268. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/pyproject/venvs.py +0 -0
  269. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/scripts/__init__.py +0 -0
  270. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/scripts/interp.py +0 -0
  271. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/scripts/slowcat.py +0 -0
  272. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/scripts/tmpexec.py +0 -0
  273. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tagstrings.py +0 -0
  274. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tokens/__init__.py +0 -0
  275. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tokens/all.py +0 -0
  276. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tokens/tokenizert.py +0 -0
  277. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tokens/utils.py +0 -0
  278. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/__init__.py +0 -0
  279. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/antlr/__init__.py +0 -0
  280. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/antlr/__main__.py +0 -0
  281. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/antlr/cli.py +0 -0
  282. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/antlr/consts.py +0 -0
  283. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/antlr/gen.py +0 -0
  284. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/cloc.py +0 -0
  285. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/diff.py +0 -0
  286. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/doc.py +0 -0
  287. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/docker.py +0 -0
  288. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/git/__init__.py +0 -0
  289. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/git/__main__.py +0 -0
  290. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/git/cli.py +0 -0
  291. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/git/consts.py +0 -0
  292. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/git/messages.py +0 -0
  293. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/json/__init__.py +0 -0
  294. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/json/__main__.py +0 -0
  295. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/json/cli.py +0 -0
  296. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/json/formats.py +0 -0
  297. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/json/io.py +0 -0
  298. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/json/parsing.py +0 -0
  299. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/json/processing.py +0 -0
  300. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/json/rendering.py +0 -0
  301. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/jsonview/__init__.py +0 -0
  302. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/jsonview/__main__.py +0 -0
  303. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/jsonview/cli.py +0 -0
  304. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/jsonview/resources/__init__.py +0 -0
  305. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  306. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  307. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/linehisto.py +0 -0
  308. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/mkenv.py +0 -0
  309. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/notebook.py +0 -0
  310. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/pawk/__init__.py +0 -0
  311. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/pawk/__main__.py +0 -0
  312. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/pawk/pawk.py +0 -0
  313. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/pip.py +0 -0
  314. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/prof.py +0 -0
  315. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/qr.py +0 -0
  316. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/shadow.py +0 -0
  317. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/shell.py +0 -0
  318. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev/tools/sqlrepl.py +0 -0
  319. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev.egg-info/dependency_links.txt +0 -0
  320. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev.egg-info/entry_points.txt +0 -0
  321. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/omdev.egg-info/top_level.txt +0 -0
  322. {omdev-0.0.0.dev372 → omdev-0.0.0.dev373}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev372
3
+ Version: 0.0.0.dev373
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.13
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev372
15
+ Requires-Dist: omlish==0.0.0.dev373
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -71,6 +71,21 @@
71
71
  }
72
72
  }
73
73
  },
74
+ {
75
+ "module": ".intellij.cli",
76
+ "attr": "_CLI_MODULE",
77
+ "file": "omdev/intellij/cli.py",
78
+ "line": 81,
79
+ "value": {
80
+ "$.cli.types.CliModule": {
81
+ "cmd_name": [
82
+ "intellij",
83
+ "ij"
84
+ ],
85
+ "mod_name": "omdev.intellij.cli"
86
+ }
87
+ }
88
+ },
74
89
  {
75
90
  "module": ".interp.__main__",
76
91
  "attr": "_CLI_MODULE",
@@ -378,21 +393,6 @@
378
393
  }
379
394
  }
380
395
  },
381
- {
382
- "module": ".tools.intellij",
383
- "attr": "_CLI_MODULE",
384
- "file": "omdev/tools/intellij.py",
385
- "line": 248,
386
- "value": {
387
- "$.cli.types.CliModule": {
388
- "cmd_name": [
389
- "intellij",
390
- "ij"
391
- ],
392
- "mod_name": "omdev.tools.intellij"
393
- }
394
- }
395
- },
396
396
  {
397
397
  "module": ".tools.json.__main__",
398
398
  "attr": "_CLI_MODULE",
@@ -0,0 +1,11 @@
1
+ from .ides import ( # noqa
2
+ Ide,
3
+
4
+ infer_directory_ide,
5
+
6
+ get_ide_version,
7
+ )
8
+
9
+ from .open import ( # noqa
10
+ open_ide,
11
+ )
@@ -0,0 +1,86 @@
1
+ """
2
+ TODO:
3
+ - PyCharm.app/Contents/plugins/python-ce/helpers/pydev/_pydevd_bundle/pydevd_constants.py -> USE_LOW_IMPACT_MONITORING
4
+ - DISPLAY=":1" - ls /tmp/.X11-unix/X1 ?
5
+ - https://unix.stackexchange.com/questions/17255/is-there-a-command-to-list-all-open-displays-on-a-machine
6
+ - w -oush
7
+ """
8
+ import inspect
9
+ import os.path
10
+ import subprocess
11
+ import tempfile
12
+
13
+ from omlish.argparse import all as ap
14
+
15
+ from ..cli import CliModule
16
+ from .ides import Ide
17
+ from .ides import get_ide_version
18
+ from .ides import infer_directory_ide
19
+ from .open import open_ide
20
+
21
+
22
+ ##
23
+
24
+
25
+ class IntellijCli(ap.Cli):
26
+ @ap.cmd(
27
+ ap.arg('python-exe'),
28
+ ap.arg('args', nargs=ap.REMAINDER),
29
+ )
30
+ def pycharm_runhack(self) -> int:
31
+ if not os.path.isfile(exe := self.args.python_exe):
32
+ raise FileNotFoundError(exe)
33
+
34
+ from omlish.diag._pycharm import runhack # noqa
35
+ src = inspect.getsource(runhack)
36
+
37
+ src_file = tempfile.mktemp(__package__ + '-runhack') # noqa
38
+ with open(src_file, 'w') as f:
39
+ f.write(src)
40
+
41
+ proc = subprocess.run([exe, src_file, *self.args.args], check=False)
42
+ return proc.returncode
43
+
44
+ #
45
+
46
+ def _get_ide(
47
+ self,
48
+ *,
49
+ cwd: str | None = None,
50
+ ) -> Ide: # noqa
51
+ if (ai := self.args.ide) is not None:
52
+ return Ide[ai.upper()] # noqa
53
+
54
+ if (ii := infer_directory_ide(cwd)) is not None:
55
+ return ii
56
+
57
+ return Ide.PYCHARM
58
+
59
+ @ap.cmd(
60
+ ap.arg('-e', '--ide'),
61
+ )
62
+ def version(self) -> None:
63
+ i = self._get_ide()
64
+ v = get_ide_version(i)
65
+ print(v)
66
+
67
+ @ap.cmd(
68
+ ap.arg('dir', nargs='?'),
69
+ ap.arg('-e', '--ide'),
70
+ )
71
+ def open(self) -> None:
72
+ dir = os.path.abspath(self.args.dir or '.') # noqa
73
+ ide = self._get_ide(cwd=dir)
74
+ open_ide(dir, ide=ide)
75
+
76
+
77
+ def _main() -> None:
78
+ IntellijCli()(exit=True)
79
+
80
+
81
+ # @omlish-manifest
82
+ _CLI_MODULE = CliModule(['intellij', 'ij'], __name__)
83
+
84
+
85
+ if __name__ == '__main__':
86
+ _main()
@@ -0,0 +1,85 @@
1
+ """
2
+ TODO:
3
+ - read .idea/ for inference?
4
+ """
5
+ import enum
6
+ import os.path
7
+ import typing as ta
8
+
9
+ from omlish.diag.pycharm import get_pycharm_version
10
+
11
+
12
+ ##
13
+
14
+
15
+ class Ide(enum.Enum):
16
+ PYCHARM = enum.auto()
17
+ IDEA = enum.auto()
18
+ CLION = enum.auto()
19
+ WEBSTORM = enum.auto()
20
+ GOLAND = enum.auto()
21
+
22
+
23
+ ##
24
+
25
+
26
+ _INFER_FILE_NAME_SETS_BY_IDE: ta.Mapping[Ide, ta.AbstractSet[str]] = {
27
+ Ide.PYCHARM: frozenset([
28
+ 'setup.py',
29
+ 'setup.cfg',
30
+ 'pyproject.toml',
31
+ 'requirements.txt',
32
+ 'Pipfile',
33
+ 'poetry.lock',
34
+ '.python-version',
35
+ 'wsgi.py',
36
+ 'asgi.py',
37
+ 'manage.py',
38
+ ]),
39
+ Ide.IDEA: frozenset([
40
+ 'pom.xml',
41
+ 'mvnw',
42
+ 'build.gradle',
43
+ 'build.gradle.kts',
44
+ 'gradlew',
45
+ 'module-info.java',
46
+ '.java-version',
47
+ ]),
48
+ Ide.CLION: frozenset([
49
+ 'CMakeLists.txt',
50
+ 'configure.ac',
51
+ 'configure.in',
52
+ 'config.h.in',
53
+ 'vcpkg.json',
54
+ ]),
55
+ Ide.WEBSTORM: frozenset([
56
+ 'package.json',
57
+ 'package-lock.json',
58
+ ]),
59
+ Ide.GOLAND: frozenset([
60
+ 'go.mod',
61
+ 'go.sum',
62
+ ]),
63
+ }
64
+
65
+
66
+ def infer_directory_ide(cwd: str | None) -> Ide | None:
67
+ if cwd is None:
68
+ cwd = os.getcwd()
69
+
70
+ for i, fs in _INFER_FILE_NAME_SETS_BY_IDE.items():
71
+ for f in fs:
72
+ if os.path.exists(os.path.join(cwd, f)):
73
+ return i
74
+
75
+ return None
76
+
77
+
78
+ ##
79
+
80
+
81
+ def get_ide_version(ide: Ide) -> str:
82
+ if ide is Ide.PYCHARM:
83
+ return get_pycharm_version()
84
+ else:
85
+ raise ValueError(ide)
@@ -0,0 +1,113 @@
1
+ import dataclasses as dc
2
+ import os.path
3
+ import shlex
4
+ import subprocess
5
+ import sys
6
+ import tempfile
7
+ import typing as ta
8
+
9
+ from .ides import Ide
10
+ from .ides import infer_directory_ide
11
+
12
+
13
+ ##
14
+
15
+
16
+ _DARWIN_OPEN_SCRIPT_APP_BY_IDE: ta.Mapping[Ide, str] = {
17
+ Ide.PYCHARM: 'PyCharm',
18
+ Ide.CLION: 'CLion',
19
+ Ide.IDEA: 'IntelliJ IDEA',
20
+ Ide.WEBSTORM: 'WebStorm',
21
+ Ide.GOLAND: 'GoLand',
22
+ }
23
+
24
+ _DARWIN_OPEN_SCRIPT = """
25
+ tell application "{app}"
26
+ activate
27
+ open "{dir}"
28
+ end tell
29
+ return
30
+ """
31
+
32
+
33
+ #
34
+
35
+
36
+ _LINUX_WM_CLASS_BY_IDE: ta.Mapping[Ide, str] = {
37
+ Ide.PYCHARM: 'jetbrains-pycharm.jetbrains-pycharm',
38
+ Ide.CLION: 'jetbrains-clion.jetbrains-clion',
39
+ Ide.IDEA: 'jetbrains-idea.jetbrains-idea',
40
+ Ide.WEBSTORM: 'jetbrains-webstorm.jetbrains-webstorm',
41
+ Ide.GOLAND: 'jetbrains-goland.jetbrains-goland',
42
+ }
43
+
44
+
45
+ # sudo apt install xdotool wmctrl
46
+ # TODO: nohup pycharm.sh "$PROJECT_PATH" > /dev/null 2>&1 & ?
47
+ _LINUX_OPEN_SCRIPT = """
48
+ xdotool key --delay 1000 alt+f alt+o
49
+ xdotool type --delay 1000 {dir}
50
+ xdotool key Return
51
+ """
52
+
53
+
54
+ @dc.dataclass(frozen=True)
55
+ class _WmctrlLine:
56
+ window_id: str
57
+ desktop_id: str
58
+ pid: str
59
+ wm_class: str
60
+ user: str
61
+ title: str
62
+
63
+
64
+ # TODO: https://stackoverflow.com/a/79016360
65
+ def _parse_wmctrl_lxp_line(l: str) -> _WmctrlLine:
66
+ return _WmctrlLine(*l.strip().split(maxsplit=5))
67
+
68
+
69
+ #
70
+
71
+
72
+ def open_ide(
73
+ dir: str, # noqa
74
+ *,
75
+ ide: Ide | None = None,
76
+ default_ide: Ide = Ide.PYCHARM,
77
+ ) -> None:
78
+ if ide is None:
79
+ if (ide := infer_directory_ide(dir)) is None:
80
+ ide = default_ide
81
+
82
+ if (plat := sys.platform) == 'darwin':
83
+ if '"' in dir:
84
+ raise ValueError(dir)
85
+
86
+ scpt_src = _DARWIN_OPEN_SCRIPT.format(
87
+ app=_DARWIN_OPEN_SCRIPT_APP_BY_IDE[ide],
88
+ dir=dir,
89
+ )
90
+
91
+ scpt_file = tempfile.mktemp(__package__ + '-intellij-open') # noqa
92
+ with open(scpt_file, 'w') as f:
93
+ f.write(scpt_src)
94
+
95
+ subprocess.check_call(['osascript', scpt_file])
96
+
97
+ elif plat == 'linux':
98
+ env = os.environ
99
+ env.setdefault('DISPLAY', ':1')
100
+
101
+ wmc_out = subprocess.check_output(['wmctrl', '-lxp'], env=env).decode()
102
+ wls = [_parse_wmctrl_lxp_line(l) for l in wmc_out.splitlines()]
103
+ tgt_wmc = _LINUX_WM_CLASS_BY_IDE[ide]
104
+ tgt_wl = next(wl for wl in wls if wl.wm_class == tgt_wmc)
105
+ subprocess.check_call(['wmctrl', '-ia', tgt_wl.window_id], env=env)
106
+
107
+ scpt = _LINUX_OPEN_SCRIPT.format(dir=shlex.quote(os.path.expanduser(dir)))
108
+ print(scpt)
109
+ # subprocess.check_call(scpt, shell=True, env=env) # noqa
110
+ raise NotImplementedError
111
+
112
+ else:
113
+ raise OSError(plat)
@@ -4753,7 +4753,6 @@ inj = InjectionApi()
4753
4753
  """
4754
4754
  TODO:
4755
4755
  - pickle stdlib objs? have to pin to 3.8 pickle protocol, will be cross-version
4756
- - literals
4757
4756
  - Options.sequence_cls = list, mapping_cls = dict, ... - def with_mutable_containers() -> Options
4758
4757
  """
4759
4758
 
@@ -4867,6 +4866,28 @@ class OptionalObjMarshaler(ObjMarshaler):
4867
4866
  return self.item.unmarshal(o, ctx)
4868
4867
 
4869
4868
 
4869
+ @dc.dataclass(frozen=True)
4870
+ class PrimitiveUnionObjMarshaler(ObjMarshaler):
4871
+ pt: ta.Tuple[type, ...]
4872
+ x: ta.Optional[ObjMarshaler] = None
4873
+
4874
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
4875
+ if isinstance(o, self.pt):
4876
+ return o
4877
+ elif self.x is not None:
4878
+ return self.x.marshal(o, ctx)
4879
+ else:
4880
+ raise TypeError(o)
4881
+
4882
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
4883
+ if isinstance(o, self.pt):
4884
+ return o
4885
+ elif self.x is not None:
4886
+ return self.x.unmarshal(o, ctx)
4887
+ else:
4888
+ raise TypeError(o)
4889
+
4890
+
4870
4891
  @dc.dataclass(frozen=True)
4871
4892
  class LiteralObjMarshaler(ObjMarshaler):
4872
4893
  item: ObjMarshaler
@@ -5065,6 +5086,13 @@ _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES: ta.Dict[ta.Any, type] = {
5065
5086
  collections.abc.MutableSequence: list,
5066
5087
  }
5067
5088
 
5089
+ _OBJ_MARSHALER_PRIMITIVE_TYPES: ta.Set[type] = {
5090
+ int,
5091
+ float,
5092
+ bool,
5093
+ str,
5094
+ }
5095
+
5068
5096
 
5069
5097
  ##
5070
5098
 
@@ -5213,8 +5241,16 @@ class ObjMarshalerManager:
5213
5241
 
5214
5242
  if is_literal_type(ty):
5215
5243
  lvs = frozenset(get_literal_type_args(ty))
5244
+ if None in lvs:
5245
+ is_opt = True
5246
+ lvs -= frozenset([None])
5247
+ else:
5248
+ is_opt = False
5216
5249
  lty = check.single(set(map(type, lvs)))
5217
- return LiteralObjMarshaler(rec(lty), lvs)
5250
+ lm: ObjMarshaler = LiteralObjMarshaler(rec(lty), lvs)
5251
+ if is_opt:
5252
+ lm = OptionalObjMarshaler(lm)
5253
+ return lm
5218
5254
 
5219
5255
  if is_generic_alias(ty):
5220
5256
  try:
@@ -5234,7 +5270,31 @@ class ObjMarshalerManager:
5234
5270
  return IterableObjMarshaler(st, rec(e))
5235
5271
 
5236
5272
  if is_union_alias(ty):
5237
- return OptionalObjMarshaler(rec(get_optional_alias_arg(ty)))
5273
+ uts = frozenset(ta.get_args(ty))
5274
+ if None in uts or type(None) in uts:
5275
+ is_opt = True
5276
+ uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
5277
+ else:
5278
+ is_opt = False
5279
+
5280
+ um: ObjMarshaler
5281
+ if not uts:
5282
+ raise TypeError(ty)
5283
+ elif len(uts) == 1:
5284
+ um = rec(check.single(uts))
5285
+ else:
5286
+ pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
5287
+ np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
5288
+ if not np_uts:
5289
+ um = PrimitiveUnionObjMarshaler(pt)
5290
+ elif len(np_uts) == 1:
5291
+ um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
5292
+ else:
5293
+ raise TypeError(ty)
5294
+
5295
+ if is_opt:
5296
+ um = OptionalObjMarshaler(um)
5297
+ return um
5238
5298
 
5239
5299
  raise TypeError(ty)
5240
5300
 
@@ -5508,7 +5508,6 @@ inj = InjectionApi()
5508
5508
  """
5509
5509
  TODO:
5510
5510
  - pickle stdlib objs? have to pin to 3.8 pickle protocol, will be cross-version
5511
- - literals
5512
5511
  - Options.sequence_cls = list, mapping_cls = dict, ... - def with_mutable_containers() -> Options
5513
5512
  """
5514
5513
 
@@ -5622,6 +5621,28 @@ class OptionalObjMarshaler(ObjMarshaler):
5622
5621
  return self.item.unmarshal(o, ctx)
5623
5622
 
5624
5623
 
5624
+ @dc.dataclass(frozen=True)
5625
+ class PrimitiveUnionObjMarshaler(ObjMarshaler):
5626
+ pt: ta.Tuple[type, ...]
5627
+ x: ta.Optional[ObjMarshaler] = None
5628
+
5629
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
5630
+ if isinstance(o, self.pt):
5631
+ return o
5632
+ elif self.x is not None:
5633
+ return self.x.marshal(o, ctx)
5634
+ else:
5635
+ raise TypeError(o)
5636
+
5637
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
5638
+ if isinstance(o, self.pt):
5639
+ return o
5640
+ elif self.x is not None:
5641
+ return self.x.unmarshal(o, ctx)
5642
+ else:
5643
+ raise TypeError(o)
5644
+
5645
+
5625
5646
  @dc.dataclass(frozen=True)
5626
5647
  class LiteralObjMarshaler(ObjMarshaler):
5627
5648
  item: ObjMarshaler
@@ -5820,6 +5841,13 @@ _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES: ta.Dict[ta.Any, type] = {
5820
5841
  collections.abc.MutableSequence: list,
5821
5842
  }
5822
5843
 
5844
+ _OBJ_MARSHALER_PRIMITIVE_TYPES: ta.Set[type] = {
5845
+ int,
5846
+ float,
5847
+ bool,
5848
+ str,
5849
+ }
5850
+
5823
5851
 
5824
5852
  ##
5825
5853
 
@@ -5968,8 +5996,16 @@ class ObjMarshalerManager:
5968
5996
 
5969
5997
  if is_literal_type(ty):
5970
5998
  lvs = frozenset(get_literal_type_args(ty))
5999
+ if None in lvs:
6000
+ is_opt = True
6001
+ lvs -= frozenset([None])
6002
+ else:
6003
+ is_opt = False
5971
6004
  lty = check.single(set(map(type, lvs)))
5972
- return LiteralObjMarshaler(rec(lty), lvs)
6005
+ lm: ObjMarshaler = LiteralObjMarshaler(rec(lty), lvs)
6006
+ if is_opt:
6007
+ lm = OptionalObjMarshaler(lm)
6008
+ return lm
5973
6009
 
5974
6010
  if is_generic_alias(ty):
5975
6011
  try:
@@ -5989,7 +6025,31 @@ class ObjMarshalerManager:
5989
6025
  return IterableObjMarshaler(st, rec(e))
5990
6026
 
5991
6027
  if is_union_alias(ty):
5992
- return OptionalObjMarshaler(rec(get_optional_alias_arg(ty)))
6028
+ uts = frozenset(ta.get_args(ty))
6029
+ if None in uts or type(None) in uts:
6030
+ is_opt = True
6031
+ uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
6032
+ else:
6033
+ is_opt = False
6034
+
6035
+ um: ObjMarshaler
6036
+ if not uts:
6037
+ raise TypeError(ty)
6038
+ elif len(uts) == 1:
6039
+ um = rec(check.single(uts))
6040
+ else:
6041
+ pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
6042
+ np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
6043
+ if not np_uts:
6044
+ um = PrimitiveUnionObjMarshaler(pt)
6045
+ elif len(np_uts) == 1:
6046
+ um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
6047
+ else:
6048
+ raise TypeError(ty)
6049
+
6050
+ if is_opt:
6051
+ um = OptionalObjMarshaler(um)
6052
+ return um
5993
6053
 
5994
6054
  raise TypeError(ty)
5995
6055
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev372
3
+ Version: 0.0.0.dev373
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.13
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev372
15
+ Requires-Dist: omlish==0.0.0.dev373
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -142,6 +142,10 @@ omdev/home/__init__.py
142
142
  omdev/home/paths.py
143
143
  omdev/home/secrets.py
144
144
  omdev/home/shadow.py
145
+ omdev/intellij/__init__.py
146
+ omdev/intellij/cli.py
147
+ omdev/intellij/ides.py
148
+ omdev/intellij/open.py
145
149
  omdev/interp/__init__.py
146
150
  omdev/interp/__main__.py
147
151
  omdev/interp/cli.py
@@ -277,7 +281,6 @@ omdev/tools/cloc.py
277
281
  omdev/tools/diff.py
278
282
  omdev/tools/doc.py
279
283
  omdev/tools/docker.py
280
- omdev/tools/intellij.py
281
284
  omdev/tools/linehisto.py
282
285
  omdev/tools/mkenv.py
283
286
  omdev/tools/notebook.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev372
1
+ omlish==0.0.0.dev373
2
2
 
3
3
  [all]
4
4
  black~=25.1
@@ -12,7 +12,7 @@ authors = [
12
12
  urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = {text = 'BSD-3-Clause'}
14
14
  requires-python = '>=3.13'
15
- version = '0.0.0.dev372'
15
+ version = '0.0.0.dev373'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
@@ -22,7 +22,7 @@ classifiers = [
22
22
  ]
23
23
  description = 'omdev'
24
24
  dependencies = [
25
- 'omlish == 0.0.0.dev372',
25
+ 'omlish == 0.0.0.dev373',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]