omdev 0.0.0.dev310__tar.gz → 0.0.0.dev312__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 (301) hide show
  1. {omdev-0.0.0.dev310/omdev.egg-info → omdev-0.0.0.dev312}/PKG-INFO +2 -2
  2. omdev-0.0.0.dev312/README.md +44 -0
  3. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/.manifests.json +12 -0
  4. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/__init__.py +5 -2
  5. omdev-0.0.0.dev312/omdev/ptk/confirm.py +54 -0
  6. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/markdown.py +6 -0
  7. omdev-0.0.0.dev312/omdev/tools/antlr/__main__.py +11 -0
  8. omdev-0.0.0.dev312/omdev/tools/antlr/cli.py +62 -0
  9. {omdev-0.0.0.dev310/omdev → omdev-0.0.0.dev312/omdev/tools}/antlr/consts.py +1 -1
  10. omdev-0.0.0.dev312/omdev/tools/antlr/gen.py +187 -0
  11. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/git/cli.py +16 -4
  12. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312/omdev.egg-info}/PKG-INFO +2 -2
  13. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev.egg-info/SOURCES.txt +6 -3
  14. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev.egg-info/requires.txt +1 -1
  15. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/pyproject.toml +2 -2
  16. omdev-0.0.0.dev310/README.md +0 -17
  17. omdev-0.0.0.dev310/omdev/antlr/gen.py +0 -114
  18. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/LICENSE +0 -0
  19. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/MANIFEST.in +0 -0
  20. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/__about__.py +0 -0
  21. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/__init__.py +0 -0
  22. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/__init__.py +0 -0
  23. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/__main__.py +0 -0
  24. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/gen.py +0 -0
  25. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/imports.py +0 -0
  26. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/main.py +0 -0
  27. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/manifests.py +0 -0
  28. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/resources.py +0 -0
  29. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/srcfiles.py +0 -0
  30. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/strip.py +0 -0
  31. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/types.py +0 -0
  32. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/typing.py +0 -0
  33. {omdev-0.0.0.dev310/omdev/antlr → omdev-0.0.0.dev312/omdev/cache}/__init__.py +0 -0
  34. {omdev-0.0.0.dev310/omdev/cache → omdev-0.0.0.dev312/omdev/cache/compute}/__init__.py +0 -0
  35. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/cache.py +0 -0
  36. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/contexts.py +0 -0
  37. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/currents.py +0 -0
  38. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/fns.py +0 -0
  39. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/resolvers.py +0 -0
  40. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/storage.py +0 -0
  41. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/types.py +0 -0
  42. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/__init__.py +0 -0
  43. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/actions.py +0 -0
  44. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/cache.py +0 -0
  45. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/consts.py +0 -0
  46. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/defaults.py +0 -0
  47. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/manifests.py +0 -0
  48. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/specs.py +0 -0
  49. {omdev-0.0.0.dev310/omdev/cache/compute → omdev-0.0.0.dev312/omdev/cc}/__init__.py +0 -0
  50. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cc/__main__.py +0 -0
  51. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cc/cdeps.py +0 -0
  52. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cc/cdeps.toml +0 -0
  53. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cc/cli.py +0 -0
  54. {omdev-0.0.0.dev310/omdev/cc → omdev-0.0.0.dev312/omdev/cexts}/__init__.py +0 -0
  55. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_boilerplate.cc +0 -0
  56. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/LICENSE +0 -0
  57. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/__init__.py +0 -0
  58. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/build_ext.py +0 -0
  59. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  60. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  61. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/compilers/options.py +0 -0
  62. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  63. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/dir_util.py +0 -0
  64. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/errors.py +0 -0
  65. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/extension.py +0 -0
  66. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/file_util.py +0 -0
  67. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/modified.py +0 -0
  68. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/spawn.py +0 -0
  69. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/sysconfig.py +0 -0
  70. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/util.py +0 -0
  71. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/version.py +0 -0
  72. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/build.py +0 -0
  73. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/cmake.py +0 -0
  74. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/importhook.py +0 -0
  75. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/magic.py +0 -0
  76. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/scan.py +0 -0
  77. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/__init__.py +0 -0
  78. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/__main__.py +0 -0
  79. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/cache.py +0 -0
  80. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/ci.py +0 -0
  81. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/cli.py +0 -0
  82. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/compose.py +0 -0
  83. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/consts.py +0 -0
  84. {omdev-0.0.0.dev310/omdev/cexts → omdev-0.0.0.dev312/omdev/ci/docker}/__init__.py +0 -0
  85. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/buildcaching.py +0 -0
  86. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/cache.py +0 -0
  87. {omdev-0.0.0.dev310/omdev/ci/docker → omdev-0.0.0.dev312/omdev/ci/docker/cacheserved}/__init__.py +0 -0
  88. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/cacheserved/cache.py +0 -0
  89. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  90. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/cmds.py +0 -0
  91. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/dataserver.py +0 -0
  92. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/imagepulling.py +0 -0
  93. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/inject.py +0 -0
  94. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/packing.py +0 -0
  95. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/repositories.py +0 -0
  96. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/utils.py +0 -0
  97. {omdev-0.0.0.dev310/omdev/ci/docker/cacheserved → omdev-0.0.0.dev312/omdev/ci/github}/__init__.py +0 -0
  98. {omdev-0.0.0.dev310/omdev/ci/github → omdev-0.0.0.dev312/omdev/ci/github/api}/__init__.py +0 -0
  99. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/clients.py +0 -0
  100. {omdev-0.0.0.dev310/omdev/ci/github/api → omdev-0.0.0.dev312/omdev/ci/github/api/v1}/__init__.py +0 -0
  101. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/v1/api.py +0 -0
  102. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/v1/client.py +0 -0
  103. {omdev-0.0.0.dev310/omdev/ci/github/api/v1 → omdev-0.0.0.dev312/omdev/ci/github/api/v2}/__init__.py +0 -0
  104. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/v2/api.py +0 -0
  105. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/v2/azure.py +0 -0
  106. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/v2/client.py +0 -0
  107. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/bootstrap.py +0 -0
  108. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/cache.py +0 -0
  109. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/cli.py +0 -0
  110. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/env.py +0 -0
  111. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/inject.py +0 -0
  112. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/inject.py +0 -0
  113. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/requirements.py +0 -0
  114. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/shell.py +0 -0
  115. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/utils.py +0 -0
  116. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/__init__.py +0 -0
  117. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/__main__.py +0 -0
  118. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/_pathhack.py +0 -0
  119. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/clicli.py +0 -0
  120. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/install.py +0 -0
  121. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/main.py +0 -0
  122. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/managers.py +0 -0
  123. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/types.py +0 -0
  124. {omdev-0.0.0.dev310/omdev/ci/github/api/v2 → omdev-0.0.0.dev312/omdev/clipboard}/__init__.py +0 -0
  125. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/clipboard/clipboard.py +0 -0
  126. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/clipboard/darwin_cf.py +0 -0
  127. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/clipboard/linux_x11.py +0 -0
  128. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmake.py +0 -0
  129. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmdlog/__init__.py +0 -0
  130. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmdlog/__main__.py +0 -0
  131. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmdlog/_cmdlog.py +0 -0
  132. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmdlog/cli.py +0 -0
  133. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmdlog/cmdlog.py +0 -0
  134. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/__init__.py +0 -0
  135. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/handlers.py +0 -0
  136. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/http.py +0 -0
  137. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/routes.py +0 -0
  138. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/server.py +0 -0
  139. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/targets.py +0 -0
  140. {omdev-0.0.0.dev310/omdev/clipboard → omdev-0.0.0.dev312/omdev/git}/__init__.py +0 -0
  141. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/git/magic.py +0 -0
  142. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/git/revisions.py +0 -0
  143. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/git/shallow.py +0 -0
  144. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/git/status.py +0 -0
  145. {omdev-0.0.0.dev310/omdev/git → omdev-0.0.0.dev312/omdev/home}/__init__.py +0 -0
  146. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/home/paths.py +0 -0
  147. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/home/secrets.py +0 -0
  148. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/home/shadow.py +0 -0
  149. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/imgur.py +0 -0
  150. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/__init__.py +0 -0
  151. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/__main__.py +0 -0
  152. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/cli.py +0 -0
  153. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/default.py +0 -0
  154. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/inject.py +0 -0
  155. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/inspect.py +0 -0
  156. {omdev-0.0.0.dev310/omdev/home → omdev-0.0.0.dev312/omdev/interp/providers}/__init__.py +0 -0
  157. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/providers/base.py +0 -0
  158. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/providers/inject.py +0 -0
  159. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/providers/running.py +0 -0
  160. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/providers/standalone.py +0 -0
  161. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/providers/system.py +0 -0
  162. {omdev-0.0.0.dev310/omdev/interp/providers → omdev-0.0.0.dev312/omdev/interp/pyenv}/__init__.py +0 -0
  163. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/pyenv/inject.py +0 -0
  164. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/pyenv/install.py +0 -0
  165. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/pyenv/provider.py +0 -0
  166. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/pyenv/pyenv.py +0 -0
  167. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/resolvers.py +0 -0
  168. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/types.py +0 -0
  169. {omdev-0.0.0.dev310/omdev/interp/pyenv → omdev-0.0.0.dev312/omdev/interp/uv}/__init__.py +0 -0
  170. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/uv/inject.py +0 -0
  171. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/uv/provider.py +0 -0
  172. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/uv/uv.py +0 -0
  173. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/venvs.py +0 -0
  174. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/__init__.py +0 -0
  175. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/__main__.py +0 -0
  176. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/cli.py +0 -0
  177. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/find.py +0 -0
  178. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/magic.py +0 -0
  179. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/prepare.py +0 -0
  180. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/styles.py +0 -0
  181. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/manifests/__init__.py +0 -0
  182. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/manifests/__main__.py +0 -0
  183. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/manifests/build.py +0 -0
  184. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/manifests/dumping.py +0 -0
  185. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/manifests/main.py +0 -0
  186. {omdev-0.0.0.dev310/omdev/interp/uv → omdev-0.0.0.dev312/omdev/mypy}/__init__.py +0 -0
  187. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/mypy/debug.py +0 -0
  188. {omdev-0.0.0.dev310/omdev/mypy → omdev-0.0.0.dev312/omdev/oci}/__init__.py +0 -0
  189. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/building.py +0 -0
  190. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/compression.py +0 -0
  191. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/data.py +0 -0
  192. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/datarefs.py +0 -0
  193. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/dataserver.py +0 -0
  194. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/loading.py +0 -0
  195. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/media.py +0 -0
  196. {omdev-0.0.0.dev310/omdev/oci → omdev-0.0.0.dev312/omdev/oci/pack}/__init__.py +0 -0
  197. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/pack/packing.py +0 -0
  198. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/pack/repositories.py +0 -0
  199. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/pack/unpacking.py +0 -0
  200. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/repositories.py +0 -0
  201. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/tars.py +0 -0
  202. {omdev-0.0.0.dev310/omdev/oci/pack → omdev-0.0.0.dev312/omdev/packaging}/__init__.py +0 -0
  203. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/marshal.py +0 -0
  204. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/names.py +0 -0
  205. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/requires.py +0 -0
  206. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/revisions.py +0 -0
  207. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/specifiers.py +0 -0
  208. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/versions.py +0 -0
  209. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/wheelfile.py +0 -0
  210. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pip.py +0 -0
  211. {omdev-0.0.0.dev310/omdev/packaging → omdev-0.0.0.dev312/omdev/precheck}/__init__.py +0 -0
  212. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/__main__.py +0 -0
  213. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/base.py +0 -0
  214. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/caches.py +0 -0
  215. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/git.py +0 -0
  216. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/imports.py +0 -0
  217. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/lite.py +0 -0
  218. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/main.py +0 -0
  219. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/manifests.py +0 -0
  220. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/scripts.py +0 -0
  221. {omdev-0.0.0.dev310/omdev/precheck → omdev-0.0.0.dev312/omdev/ptk/apps}/__init__.py +0 -0
  222. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/apps/ncdu.py +0 -0
  223. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/LICENSE +0 -0
  224. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/__init__.py +0 -0
  225. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/__main__.py +0 -0
  226. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/border.py +0 -0
  227. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/cli.py +0 -0
  228. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/parser.py +0 -0
  229. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/styles.py +0 -0
  230. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/tags.py +0 -0
  231. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/utils.py +0 -0
  232. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/__init__.py +0 -0
  233. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/attrdocs.py +0 -0
  234. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/bracepy.py +0 -0
  235. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/classdot.py +0 -0
  236. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/findimports.py +0 -0
  237. {omdev-0.0.0.dev310/omdev/ptk/apps → omdev-0.0.0.dev312/omdev/py/scripts}/__init__.py +0 -0
  238. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/scripts/bumpversion.py +0 -0
  239. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/scripts/execstat.py +0 -0
  240. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/scripts/importtrace.py +0 -0
  241. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/srcheaders.py +0 -0
  242. {omdev-0.0.0.dev310/omdev/py/scripts → omdev-0.0.0.dev312/omdev/py/tools}/__init__.py +0 -0
  243. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/tools/importscan.py +0 -0
  244. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/tools/mkrelimp.py +0 -0
  245. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/__init__.py +0 -0
  246. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/__main__.py +0 -0
  247. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/cexts.py +0 -0
  248. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/cli.py +0 -0
  249. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/configs.py +0 -0
  250. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/inject.py +0 -0
  251. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/pkg.py +0 -0
  252. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/reqs.py +0 -0
  253. {omdev-0.0.0.dev310/omdev/py/tools → omdev-0.0.0.dev312/omdev/pyproject/resources}/__init__.py +0 -0
  254. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/resources/docker-dev.sh +0 -0
  255. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/resources/python.sh +0 -0
  256. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/venvs.py +0 -0
  257. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/__init__.py +0 -0
  258. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/ci.py +0 -0
  259. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/interp.py +0 -0
  260. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/pyproject.py +0 -0
  261. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/slowcat.py +0 -0
  262. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/tmpexec.py +0 -0
  263. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tagstrings.py +0 -0
  264. {omdev-0.0.0.dev310/omdev/pyproject/resources → omdev-0.0.0.dev312/omdev/tokens}/__init__.py +0 -0
  265. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tokens/all.py +0 -0
  266. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tokens/tokenizert.py +0 -0
  267. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tokens/utils.py +0 -0
  268. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/__init__.py +0 -0
  269. {omdev-0.0.0.dev310/omdev/tokens → omdev-0.0.0.dev312/omdev/tools/antlr}/__init__.py +0 -0
  270. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/cloc.py +0 -0
  271. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/diff.py +0 -0
  272. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/doc.py +0 -0
  273. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/docker.py +0 -0
  274. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/git/__init__.py +0 -0
  275. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/git/__main__.py +0 -0
  276. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/git/consts.py +0 -0
  277. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/git/messages.py +0 -0
  278. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/intellij.py +0 -0
  279. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/__init__.py +0 -0
  280. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/__main__.py +0 -0
  281. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/cli.py +0 -0
  282. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/formats.py +0 -0
  283. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/io.py +0 -0
  284. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/parsing.py +0 -0
  285. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/processing.py +0 -0
  286. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/rendering.py +0 -0
  287. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/linehisto.py +0 -0
  288. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/mkenv.py +0 -0
  289. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/notebook.py +0 -0
  290. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/pawk/__init__.py +0 -0
  291. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/pawk/__main__.py +0 -0
  292. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/pawk/pawk.py +0 -0
  293. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/pip.py +0 -0
  294. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/prof.py +0 -0
  295. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/qr.py +0 -0
  296. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/shadow.py +0 -0
  297. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/sqlrepl.py +0 -0
  298. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev.egg-info/dependency_links.txt +0 -0
  299. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev.egg-info/entry_points.txt +0 -0
  300. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev.egg-info/top_level.txt +0 -0
  301. {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev310
3
+ Version: 0.0.0.dev312
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.dev310
15
+ Requires-Dist: omlish==0.0.0.dev312
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -0,0 +1,44 @@
1
+ # Overview
2
+
3
+ Development utilities and support code.
4
+
5
+ # Notable packages
6
+
7
+ - **[cli](cli)** - The codebase's all-in-one CLI. This is not installed as an entrypoint / command when this package is
8
+ itself installed - that is separated into the `omdev-cli` installable package so as to not pollute users' bin/
9
+ directories when depping this lib for its utility code.
10
+
11
+ - **[amalg](amalg)** - The [amalgamator](#amalgamation).
12
+
13
+ - **[pyproject](pyproject)** ([amalg](scripts/pyproject.py)) - python project management tool. wrangles but does not
14
+ replace tools like venv, pip, setuptools, and uv. this should grow to eat more and more of the Makefile. as it is
15
+ amalgamated it requires no installation and can just be dropped into other projects / repos.
16
+
17
+ - **[ci](ci)** ([amalg](scripts/ci.py)) - ci runner. given a [compose.yml](https://github.com/wrmsr/omlish/blob/master/docker/compose.yml)
18
+ and requirements.txt files, takes care of building and caching of containers and venvs and execution of required ci
19
+ commands. detects and [natively uses](ci/github/api/v2) github-action's caching system. unifies ci execution between
20
+ local dev and github runners.
21
+
22
+ - **[tools.json](tools/json)** (cli: `om j`) - a tool for json-like data, obviously in the vein of [jq](https://github.com/jqlang/jq)
23
+ but using the internal [jmespath](https://github.com/wrmsr/omlish/tree/master/omlish/specs/jmespath) engine. supports
24
+ [true streaming](https://github.com/wrmsr/omlish/blob/master/omlish/formats/json/stream) json input and output, as
25
+ well as [various other](tools/json/formats.py) non-streaming input formats.
26
+
27
+ - **[tools.git](tools/git)** (cli: `om git`) - a tool for various lazy git operations, including the one that (poorly)
28
+ writes all of these commit messages.
29
+
30
+ # Amalgamation
31
+
32
+ Amalgamation is the process of stitching together multiple python source files into a single self-contained python
33
+ script. ['lite'](https://github.com/wrmsr/omlish/blob/master/omlish#lite-code) code is written in a style conducive to
34
+ this.
35
+
36
+ # Local storage
37
+
38
+ Some of this code, when asked, will store things on the local filesystem. The only directories used (outside of ones
39
+ explicitly specified as command or function arguments) are managed in [home.paths](home/paths.py), and are the
40
+ following:
41
+
42
+ - `$OMLISH_HOME`, default of `~/.omlish` - persistent things like config and state.
43
+ - `$OMLISH_CACHE`, default of `~/.cache/omlish` - used for things like the local ci cache and
44
+ [various other](https://github.com/search?q=repo%3Awrmsr%2Fomlish+%22dcache.%22&type=code) cached data.
@@ -290,6 +290,18 @@
290
290
  }
291
291
  }
292
292
  },
293
+ {
294
+ "module": ".tools.antlr.__main__",
295
+ "attr": "_CLI_MODULE",
296
+ "file": "omdev/tools/antlr/__main__.py",
297
+ "line": 4,
298
+ "value": {
299
+ "$.cli.types.CliModule": {
300
+ "cmd_name": "antlr",
301
+ "mod_name": "omdev.tools.antlr.__main__"
302
+ }
303
+ }
304
+ },
293
305
  {
294
306
  "module": ".tools.cloc",
295
307
  "attr": "_CLI_MODULE",
@@ -1,8 +1,7 @@
1
1
  # ruff: noqa: F401
2
2
  # flake8: noqa: F401
3
3
 
4
- from prompt_toolkit import Application
5
- from prompt_toolkit import prompt
4
+ from prompt_toolkit.application import Application
6
5
  from prompt_toolkit.application import get_app
7
6
  from prompt_toolkit.application import get_app_session
8
7
  from prompt_toolkit.application import run_in_terminal
@@ -80,7 +79,9 @@ from prompt_toolkit.output import DummyOutput
80
79
  from prompt_toolkit.output import Output
81
80
  from prompt_toolkit.search import SearchDirection
82
81
  from prompt_toolkit.selection import SelectionType
82
+ from prompt_toolkit.shortcuts import confirm
83
83
  from prompt_toolkit.shortcuts import print_formatted_text
84
+ from prompt_toolkit.shortcuts import prompt
84
85
  from prompt_toolkit.styles import BaseStyle
85
86
  from prompt_toolkit.styles import DynamicStyle
86
87
  from prompt_toolkit.styles import Style
@@ -95,3 +96,5 @@ from prompt_toolkit.widgets.toolbars import FormattedTextToolbar
95
96
  from prompt_toolkit.widgets.toolbars import SearchToolbar
96
97
  from prompt_toolkit.widgets.toolbars import SystemToolbar
97
98
  from prompt_toolkit.widgets.toolbars import ValidationToolbar
99
+
100
+ from .confirm import strict_confirm
@@ -0,0 +1,54 @@
1
+ from prompt_toolkit.formatted_text import merge_formatted_text
2
+ from prompt_toolkit.key_binding import KeyBindings
3
+ from prompt_toolkit.key_binding import KeyPressEvent
4
+ from prompt_toolkit.shortcuts import PromptSession
5
+
6
+ from omlish import check
7
+
8
+
9
+ ##
10
+
11
+
12
+ def create_strict_confirm_session(
13
+ message: str,
14
+ suffix: str = ' (y/n) ',
15
+ ) -> PromptSession[str | bool]:
16
+ """Create a `PromptSession` object for the 'confirm' function."""
17
+
18
+ bindings = KeyBindings()
19
+
20
+ @bindings.add('y')
21
+ @bindings.add('Y')
22
+ def yes(event: KeyPressEvent) -> None:
23
+ session.default_buffer.text = 'y'
24
+ event.app.exit(result=True)
25
+
26
+ @bindings.add('n')
27
+ @bindings.add('N')
28
+ def no(event: KeyPressEvent) -> None:
29
+ session.default_buffer.text = 'n'
30
+ event.app.exit(result=False)
31
+
32
+ complete_message = merge_formatted_text([message, suffix])
33
+ session: PromptSession[str | bool] = PromptSession(
34
+ complete_message,
35
+ key_bindings=bindings,
36
+ )
37
+ return session
38
+
39
+
40
+ def strict_confirm(message: str = 'Confirm?', suffix: str = ' (y/n) ') -> bool:
41
+ """Display a confirmation prompt that returns True/False. Requires an explicit answer."""
42
+
43
+ while True:
44
+ session = create_strict_confirm_session(message, suffix)
45
+ ret = session.prompt()
46
+
47
+ if isinstance(ret, str):
48
+ check.empty(ret)
49
+
50
+ elif isinstance(ret, bool):
51
+ return ret
52
+
53
+ else:
54
+ raise TypeError(ret)
@@ -1,3 +1,8 @@
1
+ """
2
+ TODO:
3
+ - accept pre-parsed tokens
4
+ - provide live view in this pkg
5
+ """
1
6
  import itertools
2
7
  import typing as ta
3
8
 
@@ -36,6 +41,7 @@ class Markdown:
36
41
  def __init__(
37
42
  self,
38
43
  markup: str,
44
+ *,
39
45
  width: int | None = None,
40
46
  strip_trailing_lines: bool = True,
41
47
  ) -> None:
@@ -0,0 +1,11 @@
1
+ from ...cli import CliModule
2
+
3
+
4
+ # @omlish-manifest
5
+ _CLI_MODULE = CliModule('antlr', __name__)
6
+
7
+
8
+ if __name__ == '__main__':
9
+ from .cli import _main # noqa
10
+
11
+ _main()
@@ -0,0 +1,62 @@
1
+ import logging
2
+ import re
3
+ import subprocess
4
+ import sys
5
+
6
+ from omlish.argparse import all as ap
7
+ from omlish.logs import all as logs
8
+
9
+ from .consts import ANTLR_RUNTIME_PACKAGE
10
+ from .gen import GenPy
11
+ from .gen import get_jar_path
12
+
13
+
14
+ log = logging.getLogger(__name__)
15
+
16
+
17
+ ##
18
+
19
+
20
+ class Cli(ap.Cli):
21
+ @ap.cmd()
22
+ def jar(self) -> None:
23
+ print(get_jar_path())
24
+
25
+ @ap.cmd()
26
+ def latest(self) -> None:
27
+ o, _ = subprocess.Popen(
28
+ [
29
+ sys.executable,
30
+ '-m', 'pip',
31
+ 'index', 'versions',
32
+ ANTLR_RUNTIME_PACKAGE,
33
+ ],
34
+ stdout=subprocess.PIPE,
35
+ ).communicate()
36
+ tl = o.decode().splitlines()[0]
37
+ m = re.fullmatch(rf'{ANTLR_RUNTIME_PACKAGE} \((?P<version>[^)]+)\)', tl)
38
+ if m is None:
39
+ raise ValueError(f'Failed to parse version: {tl}')
40
+ v = m.groupdict()['version']
41
+ print(v)
42
+
43
+ #
44
+
45
+ @ap.cmd(
46
+ ap.arg('roots', nargs='+'),
47
+ )
48
+ def gen(self) -> None:
49
+ gp = GenPy(
50
+ self.args.roots,
51
+ )
52
+ gp.run()
53
+
54
+
55
+ def _main() -> None:
56
+ logs.configure_standard_logging(logging.INFO)
57
+ cli = Cli()
58
+ cli()
59
+
60
+
61
+ if __name__ == '__main__':
62
+ _main()
@@ -4,4 +4,4 @@ ANTLR_JAR_URL = f'https://www.antlr.org/download/{ANTLR_JAR_NAME}'
4
4
  ANTLR_RUNTIME_PACKAGE = 'antlr4-python3-runtime'
5
5
  ANTLR_GITHUB_REPO = 'antlr/antlr4'
6
6
 
7
- ANTLR_RUNTIME_VENDOR = 'omlish.antlr._runtime._all'
7
+ ANTLR_RUNTIME_VENDOR = 'omlish.text.antlr._runtime._all'
@@ -0,0 +1,187 @@
1
+ """
2
+ TODO:
3
+ - mtime cmp
4
+ - parallelism
5
+ """
6
+ import logging
7
+ import os.path
8
+ import re
9
+ import shutil
10
+ import subprocess
11
+ import typing as ta
12
+
13
+ from omlish import check
14
+ from omlish import lang
15
+ from omlish.os.paths import is_path_in_dir
16
+
17
+ from ...cache import data as dcache
18
+ from .consts import ANTLR_JAR_URL
19
+ from .consts import ANTLR_RUNTIME_VENDOR
20
+
21
+
22
+ log = logging.getLogger(__name__)
23
+
24
+
25
+ ##
26
+
27
+
28
+ ANTLR_JAR_CACHE = dcache.UrlSpec(ANTLR_JAR_URL)
29
+
30
+
31
+ @lang.cached_function
32
+ def get_jar_path() -> str:
33
+ return dcache.default().get(ANTLR_JAR_CACHE)
34
+
35
+
36
+ ##
37
+
38
+
39
+ def _find_dirs(*base_paths: str, filter: ta.Callable[[str], bool] = lambda _: True) -> ta.Sequence[str]: # noqa
40
+ return sorted(
41
+ os.path.join(dp, dn)
42
+ for base_path in base_paths
43
+ for dp, dns, fns in os.walk(base_path)
44
+ for dn in dns
45
+ if filter(dn)
46
+ )
47
+
48
+
49
+ def _find_files(*base_paths: str, filter: ta.Callable[[str], bool] = lambda _: True) -> ta.Sequence[str]: # noqa
50
+ return sorted(
51
+ os.path.join(dp, fn)
52
+ for base_path in base_paths
53
+ for dp, dns, fns in os.walk(base_path)
54
+ for fn in fns
55
+ if filter(fn)
56
+ )
57
+
58
+
59
+ class GenPy:
60
+ def __init__(
61
+ self,
62
+ root_dirs: str, # noqa
63
+ *,
64
+ out_subdir: str = '_antlr',
65
+ runtime_import: str = ANTLR_RUNTIME_VENDOR,
66
+ jar_path: str | None = None,
67
+ # parallelism: int | None = None,
68
+ ) -> None:
69
+ super().__init__()
70
+
71
+ check.non_empty_str(out_subdir)
72
+ check.arg(not os.path.isabs(out_subdir) and '.' not in out_subdir and '/' not in out_subdir)
73
+
74
+ self._root_dirs = frozenset(check.non_empty_str(rd) for rd in check.not_isinstance(root_dirs, str))
75
+ self._out_subdir = out_subdir
76
+ self._runtime_import = runtime_import
77
+ self._given_jar_path = jar_path
78
+
79
+ #
80
+
81
+ def _rmtree(self, tgt: str) -> None: # noqa
82
+ if not any(is_path_in_dir(rd, tgt) for rd in self._root_dirs):
83
+ raise RuntimeError(f'Refusing to delete {tgt!r} outside of {self._root_dirs!r}')
84
+ shutil.rmtree(tgt)
85
+
86
+ #
87
+
88
+ @lang.cached_function
89
+ def jar_path(self) -> str:
90
+ if (gjp := self._given_jar_path) is not None:
91
+ return gjp
92
+ return get_jar_path()
93
+
94
+ #
95
+
96
+ def process_g4(self, g4_file: str) -> None:
97
+ ap = os.path.abspath(g4_file)
98
+ check.state(os.path.isfile(ap))
99
+
100
+ od = os.path.join(os.path.dirname(ap), self._out_subdir)
101
+ os.makedirs(od, exist_ok=True)
102
+
103
+ log.info('Compiling grammar %s', g4_file)
104
+
105
+ try:
106
+ subprocess.check_call([
107
+ 'java',
108
+ '-jar', self.jar_path(),
109
+ '-Dlanguage=Python3',
110
+ '-visitor',
111
+ '-o', self._out_subdir,
112
+ os.path.basename(g4_file),
113
+ ], cwd=os.path.dirname(ap))
114
+
115
+ except Exception: # noqa
116
+ log.exception('Exception in grammar %s', g4_file)
117
+ raise
118
+
119
+ def process_py(self, py_file: str) -> None:
120
+ ap = os.path.abspath(py_file)
121
+ with open(ap) as f:
122
+ in_lines = list(f)
123
+
124
+ pfp = py_file.split(os.sep)
125
+ arp = ANTLR_RUNTIME_VENDOR.split('.')
126
+ if (cpl := lang.common_prefix_len(pfp, arp)) > 0:
127
+ pkg_depth = len(os.path.normpath(py_file).split(os.path.sep))
128
+ antlr_imp = '.'.join([*([''] * (pkg_depth - cpl)), *arp[cpl:]])
129
+ else:
130
+ antlr_imp = ANTLR_RUNTIME_VENDOR
131
+
132
+ out_lines = [
133
+ '# type: ignore\n',
134
+ '# ruff: noqa\n',
135
+ '# flake8: noqa\n',
136
+ ]
137
+
138
+ for l in in_lines:
139
+ l = re.sub(r'^(from antlr4)(.*)', rf'from {antlr_imp}\2', l)
140
+ out_lines.append(l)
141
+
142
+ with open(ap, 'w') as f:
143
+ f.write(''.join(out_lines))
144
+
145
+ def process_dir(self, dir: str) -> None: # noqa
146
+ log.info('Processing directory %s', dir)
147
+
148
+ ad = os.path.join(dir, self._out_subdir)
149
+ if os.path.exists(ad):
150
+ self._rmtree(ad)
151
+
152
+ for f in os.listdir(dir):
153
+ fp = os.path.join(dir, f)
154
+ if not os.path.isfile(fp) or not f.endswith('.g4'):
155
+ continue
156
+
157
+ self.process_g4(fp)
158
+
159
+ if not os.path.exists(ad):
160
+ return
161
+
162
+ ip = os.path.join(ad, '__init__.py')
163
+ check.state(not os.path.exists(ip))
164
+
165
+ for f in list(os.listdir(ad)):
166
+ fp = os.path.join(ad, f)
167
+ if not os.path.isfile(fp):
168
+ continue
169
+
170
+ if f.split('.')[-1] in ('interp', 'tokens'):
171
+ os.unlink(fp)
172
+
173
+ elif f != '__init__.py' and f.endswith('.py'):
174
+ self.process_py(fp)
175
+
176
+ with open(ip, 'w'):
177
+ pass
178
+
179
+ def run(self) -> None:
180
+ dns = _find_dirs(*self._root_dirs, filter=lambda dn: os.path.basename(dn) == '_antlr')
181
+ for dn in dns:
182
+ self._rmtree(dn)
183
+
184
+ fns = _find_files(*self._root_dirs, filter=lambda fn: fn.endswith('.g4'))
185
+ fds = {os.path.dirname(fn) for fn in fns}
186
+ for dn in sorted(fds):
187
+ self.process_dir(dn)
@@ -23,7 +23,6 @@ import dataclasses as dc
23
23
  import logging
24
24
  import os
25
25
  import re
26
- import sys
27
26
  import typing as ta
28
27
  import urllib.parse
29
28
 
@@ -380,6 +379,8 @@ class Cli(ap.Cli):
380
379
  )
381
380
  def update_submodule_branches(self) -> None:
382
381
  def run_submodule(submodule: str, cwd: str | None) -> None:
382
+ log.info('Updating submodule %s', submodule)
383
+
383
384
  submodule_path = submodule if cwd is None else os.path.join(cwd, submodule)
384
385
 
385
386
  # Get the HEAD branch from origin
@@ -401,21 +402,32 @@ class Cli(ap.Cli):
401
402
  subprocesses.check_call('git', 'checkout', head_branch, cwd=submodule_path)
402
403
  subprocesses.check_call('git', 'pull', cwd=submodule_path)
403
404
 
405
+ failed: set[str] = set()
406
+
404
407
  def run(cwd: str | None) -> None:
405
408
  submodules = subprocesses.check_output(
406
409
  'git', 'submodule', 'foreach', '-q', 'echo $name',
407
410
  cwd=cwd,
408
411
  ).decode().strip().splitlines()
409
412
 
410
- for submodule in submodules:
413
+ for submodule in sorted(submodules):
411
414
  try:
412
415
  run_submodule(submodule, cwd)
413
- except Exception as e:
416
+
417
+ except Exception: # noqa
418
+ failed.add(submodule)
419
+
414
420
  if self.args.on_error_resume_next:
415
- print(e, file=sys.stderr)
421
+ log.exception('Failed to update submodule %s', submodule)
416
422
  else:
417
423
  raise
418
424
 
425
+ if failed:
426
+ log.error(
427
+ 'The following submodules failed to update:\n%s',
428
+ '\n'.join([f' {f}' for f in failed]),
429
+ )
430
+
419
431
  if not self.args.dir:
420
432
  run(None)
421
433
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev310
3
+ Version: 0.0.0.dev312
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.dev310
15
+ Requires-Dist: omlish==0.0.0.dev312
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -26,9 +26,6 @@ omdev/amalg/srcfiles.py
26
26
  omdev/amalg/strip.py
27
27
  omdev/amalg/types.py
28
28
  omdev/amalg/typing.py
29
- omdev/antlr/__init__.py
30
- omdev/antlr/consts.py
31
- omdev/antlr/gen.py
32
29
  omdev/cache/__init__.py
33
30
  omdev/cache/compute/__init__.py
34
31
  omdev/cache/compute/cache.py
@@ -215,6 +212,7 @@ omdev/precheck/main.py
215
212
  omdev/precheck/manifests.py
216
213
  omdev/precheck/scripts.py
217
214
  omdev/ptk/__init__.py
215
+ omdev/ptk/confirm.py
218
216
  omdev/ptk/apps/__init__.py
219
217
  omdev/ptk/apps/ncdu.py
220
218
  omdev/ptk/markdown/LICENSE
@@ -276,6 +274,11 @@ omdev/tools/prof.py
276
274
  omdev/tools/qr.py
277
275
  omdev/tools/shadow.py
278
276
  omdev/tools/sqlrepl.py
277
+ omdev/tools/antlr/__init__.py
278
+ omdev/tools/antlr/__main__.py
279
+ omdev/tools/antlr/cli.py
280
+ omdev/tools/antlr/consts.py
281
+ omdev/tools/antlr/gen.py
279
282
  omdev/tools/git/__init__.py
280
283
  omdev/tools/git/__main__.py
281
284
  omdev/tools/git/cli.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev310
1
+ omlish==0.0.0.dev312
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.12'
15
- version = '0.0.0.dev310'
15
+ version = '0.0.0.dev312'
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.dev310',
25
+ 'omlish == 0.0.0.dev312',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
@@ -1,17 +0,0 @@
1
- # Overview
2
-
3
- Development utilities and support code.
4
-
5
- # Notable packages
6
-
7
- - **[cli](cli)** - The codebase's all-in-one CLI. This is not installed as an entrypoint / command when this package is
8
- itself installed - that is separated into the `omdev-cli` installable package so as to not pollute users' bin/
9
- directories when depping this lib for its utility code.
10
-
11
- - **[amalg](amalg)** - The [amalgamator](#amalgamation).
12
-
13
- # Amalgamation
14
-
15
- Amalgamation is the process of stitching together multiple python source files into a single self-contained python
16
- script. ['lite'](https://github.com/wrmsr/omlish/blob/master/omlish#lite-code) code is written in a style conducive to
17
- this.