omdev 0.0.0.dev542__tar.gz → 0.0.0.dev543__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 (459) hide show
  1. {omdev-0.0.0.dev542/omdev.egg-info → omdev-0.0.0.dev543}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/ci.py +60 -27
  3. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/lib/io/pipelines.py +37 -9
  4. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/lib/io/streams.py +252 -57
  5. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543/omdev.egg-info}/PKG-INFO +2 -2
  6. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev.egg-info/requires.txt +1 -1
  7. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/pyproject.toml +2 -2
  8. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/LICENSE +0 -0
  9. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/MANIFEST.in +0 -0
  10. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/README.md +0 -0
  11. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/.omlish-manifests.json +0 -0
  12. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/README.md +0 -0
  13. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/__about__.py +0 -0
  14. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/__init__.py +0 -0
  15. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/__init__.py +0 -0
  16. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/__main__.py +0 -0
  17. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/cli/__init__.py +0 -0
  18. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/cli/main.py +0 -0
  19. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/gen/__init__.py +0 -0
  20. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/gen/gen.py +0 -0
  21. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/gen/imports.py +0 -0
  22. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/gen/manifests.py +0 -0
  23. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/gen/resources.py +0 -0
  24. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/gen/srcfiles.py +0 -0
  25. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/gen/strip.py +0 -0
  26. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/gen/types.py +0 -0
  27. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/gen/typing.py +0 -0
  28. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/info.py +0 -0
  29. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/amalg/sources.py +0 -0
  30. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/__init__.py +0 -0
  31. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/compute/__init__.py +0 -0
  32. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/compute/cache.py +0 -0
  33. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/compute/contexts.py +0 -0
  34. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/compute/currents.py +0 -0
  35. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/compute/fns.py +0 -0
  36. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/compute/resolvers.py +0 -0
  37. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/compute/storage.py +0 -0
  38. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/compute/types.py +0 -0
  39. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/data/__init__.py +0 -0
  40. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/data/actions.py +0 -0
  41. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/data/cache.py +0 -0
  42. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/data/consts.py +0 -0
  43. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/data/defaults.py +0 -0
  44. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/data/manifests.py +0 -0
  45. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cache/data/specs.py +0 -0
  46. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/capi/__init__.py +0 -0
  47. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/capi/darwin/__init__.py +0 -0
  48. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/capi/darwin/aps.py +0 -0
  49. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/capi/darwin/ax.py +0 -0
  50. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/capi/darwin/cf.py +0 -0
  51. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/capi/darwin/cg.py +0 -0
  52. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/capi/linux/__init__.py +0 -0
  53. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/capi/linux/x11.py +0 -0
  54. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cc/__init__.py +0 -0
  55. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cc/__main__.py +0 -0
  56. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cc/cdeps.py +0 -0
  57. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cc/cdeps.toml +0 -0
  58. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cc/cli.py +0 -0
  59. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cc/srclangs.py +0 -0
  60. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/__init__.py +0 -0
  61. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_boilerplate.cc +0 -0
  62. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/LICENSE +0 -0
  63. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/__init__.py +0 -0
  64. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/build_ext.py +0 -0
  65. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  66. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  67. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/compilers/options.py +0 -0
  68. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  69. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/dir_util.py +0 -0
  70. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/errors.py +0 -0
  71. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/extension.py +0 -0
  72. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/file_util.py +0 -0
  73. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/modified.py +0 -0
  74. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/spawn.py +0 -0
  75. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/sysconfig.py +0 -0
  76. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/util.py +0 -0
  77. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/_distutils/version.py +0 -0
  78. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/build.py +0 -0
  79. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/cmake.py +0 -0
  80. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/importhook.py +0 -0
  81. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/magic.py +0 -0
  82. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cexts/scan.py +0 -0
  83. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/__init__.py +0 -0
  84. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/__main__.py +0 -0
  85. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/cache.py +0 -0
  86. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/ci.py +0 -0
  87. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/cli.py +0 -0
  88. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/compose.py +0 -0
  89. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/consts.py +0 -0
  90. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/__init__.py +0 -0
  91. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/buildcaching.py +0 -0
  92. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/cache.py +0 -0
  93. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  94. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/cacheserved/cache.py +0 -0
  95. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  96. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/cmds.py +0 -0
  97. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/dataserver.py +0 -0
  98. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/imagepulling.py +0 -0
  99. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/inject.py +0 -0
  100. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/packing.py +0 -0
  101. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/repositories.py +0 -0
  102. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/docker/utils.py +0 -0
  103. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/__init__.py +0 -0
  104. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/api/__init__.py +0 -0
  105. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/api/clients.py +0 -0
  106. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/api/v1/__init__.py +0 -0
  107. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/api/v1/api.py +0 -0
  108. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/api/v1/client.py +0 -0
  109. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/api/v2/__init__.py +0 -0
  110. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/api/v2/api.py +0 -0
  111. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/api/v2/azure.py +0 -0
  112. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/api/v2/client.py +0 -0
  113. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/bootstrap.py +0 -0
  114. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/cache.py +0 -0
  115. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/cli.py +0 -0
  116. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/env.py +0 -0
  117. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/github/inject.py +0 -0
  118. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/inject.py +0 -0
  119. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/requirements.py +0 -0
  120. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/shell.py +0 -0
  121. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/ci/utils.py +0 -0
  122. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cli/__init__.py +0 -0
  123. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cli/__main__.py +0 -0
  124. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cli/_pathhack.py +0 -0
  125. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cli/clicli.py +0 -0
  126. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cli/install.py +0 -0
  127. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cli/main.py +0 -0
  128. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cli/managers.py +0 -0
  129. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cli/types.py +0 -0
  130. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/clipboard/__init__.py +0 -0
  131. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/clipboard/capi/__init__.py +0 -0
  132. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/clipboard/capi/darwin_cf.py +0 -0
  133. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/clipboard/capi/linux_x11.py +0 -0
  134. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/clipboard/commands.py +0 -0
  135. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/clipboard/platform.py +0 -0
  136. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/clipboard/types.py +0 -0
  137. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cmake.py +0 -0
  138. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cmdlog/__init__.py +0 -0
  139. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cmdlog/__main__.py +0 -0
  140. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cmdlog/_cmdlog.py +0 -0
  141. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cmdlog/cli.py +0 -0
  142. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/cmdlog/cmdlog.py +0 -0
  143. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataclasses/__init__.py +0 -0
  144. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataclasses/__main__.py +0 -0
  145. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataclasses/_dumping.py +0 -0
  146. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataclasses/_template.py +0 -0
  147. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataclasses/cli.py +0 -0
  148. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataclasses/codegen.py +0 -0
  149. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataclasses/dumping.py +0 -0
  150. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataserver/__init__.py +0 -0
  151. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataserver/handlers.py +0 -0
  152. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataserver/http.py +0 -0
  153. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataserver/routes.py +0 -0
  154. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataserver/server.py +0 -0
  155. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dataserver/targets.py +0 -0
  156. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/diffs/__init__.py +0 -0
  157. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/diffs/__main__.py +0 -0
  158. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/diffs/cli.py +0 -0
  159. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/diffs/parsing.py +0 -0
  160. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/diffs/rendering.py +0 -0
  161. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/diffs/types.py +0 -0
  162. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/__init__.py +0 -0
  163. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/__main__.py +0 -0
  164. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/cli.py +0 -0
  165. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/config.py +0 -0
  166. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/config.toml +0 -0
  167. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/content.py +0 -0
  168. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/gen.py +0 -0
  169. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/helpers.py +0 -0
  170. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/ops.py +0 -0
  171. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/rendering.py +0 -0
  172. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/.python-versions.json +0 -0
  173. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/configs/.gdbinit +0 -0
  174. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/configs/.tmux.conf +0 -0
  175. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/configs/.vimrc +0 -0
  176. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/depsets/python.toml +0 -0
  177. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/depsets/system.toml +0 -0
  178. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/depsets/x11.toml +0 -0
  179. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/apt.sh +0 -0
  180. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/docker.sh +0 -0
  181. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/firefox.sh +0 -0
  182. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/go.sh +0 -0
  183. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/jdk.sh +0 -0
  184. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/nvm.sh +0 -0
  185. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/pyenv.sh +0 -0
  186. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/rust.sh +0 -0
  187. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/sshd.sh +0 -0
  188. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/uv.sh +0 -0
  189. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/vcpkg.sh +0 -0
  190. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/fragments/zig.sh +0 -0
  191. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/dockerdev/resources/xu +0 -0
  192. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/git/__init__.py +0 -0
  193. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/git/magic.py +0 -0
  194. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/git/revisions.py +0 -0
  195. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/git/shallow.py +0 -0
  196. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/git/status.py +0 -0
  197. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/home/__init__.py +0 -0
  198. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/home/paths.py +0 -0
  199. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/home/secrets.py +0 -0
  200. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/home/shadow.py +0 -0
  201. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/imgur.py +0 -0
  202. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/intellij/__init__.py +0 -0
  203. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/intellij/cli.py +0 -0
  204. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/intellij/ides.py +0 -0
  205. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/intellij/open.py +0 -0
  206. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/__init__.py +0 -0
  207. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/__main__.py +0 -0
  208. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/cli.py +0 -0
  209. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/default.py +0 -0
  210. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/inject.py +0 -0
  211. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/inspect.py +0 -0
  212. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/providers/__init__.py +0 -0
  213. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/providers/base.py +0 -0
  214. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/providers/inject.py +0 -0
  215. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/providers/running.py +0 -0
  216. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/providers/standalone.py +0 -0
  217. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/providers/system.py +0 -0
  218. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/pyenv/__init__.py +0 -0
  219. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/pyenv/inject.py +0 -0
  220. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/pyenv/install.py +0 -0
  221. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/pyenv/provider.py +0 -0
  222. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/pyenv/pyenv.py +0 -0
  223. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/resolvers.py +0 -0
  224. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/types.py +0 -0
  225. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/uv/__init__.py +0 -0
  226. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/uv/inject.py +0 -0
  227. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/uv/provider.py +0 -0
  228. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/uv/uv.py +0 -0
  229. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/interp/venvs.py +0 -0
  230. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/__init__.py +0 -0
  231. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/messages/__init__.py +0 -0
  232. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/messages/base.py +0 -0
  233. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/messages/formats.py +0 -0
  234. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/messages/messages.py +0 -0
  235. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/messages/parsing.py +0 -0
  236. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/numerics/__init__.py +0 -0
  237. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/numerics/formats.py +0 -0
  238. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/numerics/numerics.py +0 -0
  239. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/numerics/types.py +0 -0
  240. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/protocol/LICENSE +0 -0
  241. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/protocol/__init__.py +0 -0
  242. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/protocol/consts.py +0 -0
  243. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/protocol/errors.py +0 -0
  244. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/protocol/message.py +0 -0
  245. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/protocol/nuh.py +0 -0
  246. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/protocol/parsing.py +0 -0
  247. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/protocol/rendering.py +0 -0
  248. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/protocol/tags.py +0 -0
  249. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/irc/protocol/utils.py +0 -0
  250. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/java/__init__.py +0 -0
  251. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/java/__main__.py +0 -0
  252. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/java/cli.py +0 -0
  253. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/java/pomgen.py +0 -0
  254. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/java/xml.py +0 -0
  255. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/magic/__init__.py +0 -0
  256. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/magic/__main__.py +0 -0
  257. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/magic/cli.py +0 -0
  258. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/magic/find.py +0 -0
  259. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/magic/magic.py +0 -0
  260. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/magic/prepare.py +0 -0
  261. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/magic/styles.py +0 -0
  262. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/manifests/__init__.py +0 -0
  263. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/manifests/__main__.py +0 -0
  264. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/manifests/_dumping.py +0 -0
  265. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/manifests/building.py +0 -0
  266. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/manifests/dumping.py +0 -0
  267. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/manifests/main.py +0 -0
  268. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/markdown/__init__.py +0 -0
  269. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/markdown/incparse.py +0 -0
  270. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/markdown/tokens.py +0 -0
  271. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/mypy/__init__.py +0 -0
  272. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/mypy/debug.py +0 -0
  273. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/mypy/report.py +0 -0
  274. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/__init__.py +0 -0
  275. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/building.py +0 -0
  276. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/compression.py +0 -0
  277. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/data.py +0 -0
  278. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/datarefs.py +0 -0
  279. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/dataserver.py +0 -0
  280. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/loading.py +0 -0
  281. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/media.py +0 -0
  282. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/pack/__init__.py +0 -0
  283. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/pack/packing.py +0 -0
  284. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/pack/repositories.py +0 -0
  285. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/pack/unpacking.py +0 -0
  286. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/repositories.py +0 -0
  287. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/oci/tars.py +0 -0
  288. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/packaging/__init__.py +0 -0
  289. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/packaging/marshal.py +0 -0
  290. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/packaging/names.py +0 -0
  291. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/packaging/requires.py +0 -0
  292. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/packaging/revisions.py +0 -0
  293. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/packaging/specifiers.py +0 -0
  294. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/packaging/versions.py +0 -0
  295. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/packaging/wheelfile.py +0 -0
  296. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pip.py +0 -0
  297. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/__init__.py +0 -0
  298. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/__main__.py +0 -0
  299. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/base.py +0 -0
  300. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/blanklines.py +0 -0
  301. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/caches.py +0 -0
  302. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/git.py +0 -0
  303. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/imports.py +0 -0
  304. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/lite.py +0 -0
  305. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/main.py +0 -0
  306. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/manifests.py +0 -0
  307. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/scripts.py +0 -0
  308. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/precheck/unicode.py +0 -0
  309. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/__init__.py +0 -0
  310. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/asts/__init__.py +0 -0
  311. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/asts/parents.py +0 -0
  312. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/asts/toplevel.py +0 -0
  313. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/asts/visitors.py +0 -0
  314. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/attrdocs.py +0 -0
  315. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/bracepy.py +0 -0
  316. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/classdot.py +0 -0
  317. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/docstrings/LICENSE +0 -0
  318. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/docstrings/__init__.py +0 -0
  319. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/docstrings/attrdoc.py +0 -0
  320. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/docstrings/common.py +0 -0
  321. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/docstrings/epydoc.py +0 -0
  322. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/docstrings/google.py +0 -0
  323. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/docstrings/numpydoc.py +0 -0
  324. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/docstrings/parser.py +0 -0
  325. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/docstrings/rest.py +0 -0
  326. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/findimports.py +0 -0
  327. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/reprs.py +0 -0
  328. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/scripts/__init__.py +0 -0
  329. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/scripts/bumpversion.py +0 -0
  330. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/scripts/execstat.py +0 -0
  331. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/scripts/importtrace.py +0 -0
  332. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/srcheaders.py +0 -0
  333. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/tokens/__init__.py +0 -0
  334. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/tokens/all.py +0 -0
  335. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/tokens/tokenizert.py +0 -0
  336. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/tokens/utils.py +0 -0
  337. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/tools/__init__.py +0 -0
  338. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/tools/importscan.py +0 -0
  339. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/tools/mkrelimp.py +0 -0
  340. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/py/tools/pipdepup.py +0 -0
  341. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/__init__.py +0 -0
  342. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/__main__.py +0 -0
  343. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/cli.py +0 -0
  344. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/configs.py +0 -0
  345. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/inject.py +0 -0
  346. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/pkg.py +0 -0
  347. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/reqs.py +0 -0
  348. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/resources/dockerdev.sh +0 -0
  349. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/resources/python.sh +0 -0
  350. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/tools/__init__.py +0 -0
  351. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/tools/aboutdeps.py +0 -0
  352. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/tools/buildrs.py +0 -0
  353. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/tools/pyversions.py +0 -0
  354. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/venvs.py +0 -0
  355. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/pyproject/versions.py +0 -0
  356. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/rs/__init__.py +0 -0
  357. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/__init__.py +0 -0
  358. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/interp.py +0 -0
  359. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/lib/__init__.py +0 -0
  360. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/lib/formats/__init__.py +0 -0
  361. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/lib/formats/goyaml.py +0 -0
  362. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/lib/inject.py +0 -0
  363. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/lib/io/__init__.py +0 -0
  364. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/lib/logs.py +0 -0
  365. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/lib/marshal.py +0 -0
  366. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/pyproject.py +0 -0
  367. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/slowcat.py +0 -0
  368. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/scripts/tmpexec.py +0 -0
  369. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tagstrings.py +0 -0
  370. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/__init__.py +0 -0
  371. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/cloc.py +0 -0
  372. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/diff.py +0 -0
  373. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/doc.py +0 -0
  374. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/docker.py +0 -0
  375. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/git/__init__.py +0 -0
  376. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/git/__main__.py +0 -0
  377. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/git/cli.py +0 -0
  378. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/git/cloning.py +0 -0
  379. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/git/consts.py +0 -0
  380. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/git/messages.py +0 -0
  381. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/json/__init__.py +0 -0
  382. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/json/__main__.py +0 -0
  383. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/json/cli.py +0 -0
  384. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/json/formats.py +0 -0
  385. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/json/io.py +0 -0
  386. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/json/parsing.py +0 -0
  387. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/json/processing.py +0 -0
  388. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/json/rendering.py +0 -0
  389. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/jsonview/__init__.py +0 -0
  390. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/jsonview/__main__.py +0 -0
  391. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/jsonview/cli.py +0 -0
  392. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  393. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/jsonview/resources/jsonview.html.j2 +0 -0
  394. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  395. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/linehisto.py +0 -0
  396. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/mkenv.py +0 -0
  397. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/notebook.py +0 -0
  398. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/pawk/README.md +0 -0
  399. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/pawk/__init__.py +0 -0
  400. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/pawk/__main__.py +0 -0
  401. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/pawk/pawk.py +0 -0
  402. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/pip.py +0 -0
  403. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/prof.py +0 -0
  404. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/qr.py +0 -0
  405. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/shadow.py +0 -0
  406. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/shell.py +0 -0
  407. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tools/sqlrepl.py +0 -0
  408. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/__init__.py +0 -0
  409. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/__init__.py +0 -0
  410. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/edit/__init__.py +0 -0
  411. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/edit/main.py +0 -0
  412. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/irc/__init__.py +0 -0
  413. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/irc/__main__.py +0 -0
  414. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/irc/app.py +0 -0
  415. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/irc/client.py +0 -0
  416. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/irc/commands.py +0 -0
  417. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/irc/main.py +0 -0
  418. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/markdown/__init__.py +0 -0
  419. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/markdown/__main__.py +0 -0
  420. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/apps/markdown/cli.py +0 -0
  421. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/__init__.py +0 -0
  422. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/console2.py +0 -0
  423. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/diff/LICENSE +0 -0
  424. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/diff/__init__.py +0 -0
  425. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/diff/__main__.py +0 -0
  426. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/diff/_compat.py +0 -0
  427. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/diff/cli.py +0 -0
  428. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/diff/renderables.py +0 -0
  429. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/diff/rendering.py +0 -0
  430. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/diff/underlinebar.py +0 -0
  431. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/markdown2.py +0 -0
  432. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/textual/__init__.py +0 -0
  433. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/textual/dark.py +0 -0
  434. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/textual/dump.py +0 -0
  435. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/rich/textual/themes.py +0 -0
  436. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/__init__.py +0 -0
  437. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/app2.py +0 -0
  438. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/autocomplete/LICENSE +0 -0
  439. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/autocomplete/__init__.py +0 -0
  440. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/autocomplete/matching.py +0 -0
  441. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/autocomplete/paths.py +0 -0
  442. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/autocomplete/widget.py +0 -0
  443. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/binding2.py +0 -0
  444. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/clipboard.py +0 -0
  445. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/debug/__init__.py +0 -0
  446. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/debug/dominfo.py +0 -0
  447. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/debug/screen.py +0 -0
  448. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/devtools.py +0 -0
  449. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/drivers2.py +0 -0
  450. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/logging2.py +0 -0
  451. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/render2.py +0 -0
  452. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/screen2.py +0 -0
  453. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/types.py +0 -0
  454. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev/tui/textual/widgets2.py +0 -0
  455. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev.egg-info/SOURCES.txt +0 -0
  456. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev.egg-info/dependency_links.txt +0 -0
  457. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev.egg-info/entry_points.txt +0 -0
  458. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/omdev.egg-info/top_level.txt +0 -0
  459. {omdev-0.0.0.dev542 → omdev-0.0.0.dev543}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev542
3
+ Version: 0.0.0.dev543
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omlish==0.0.0.dev542
17
+ Requires-Dist: omlish==0.0.0.dev543
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=26.3; extra == "all"
20
20
  Requires-Dist: pycparser~=3.0; extra == "all"
@@ -93,7 +93,7 @@ def __omlish_amalg__(): # noqa
93
93
  dict(path='github/env.py', sha1='c7a2389048f008f46f59f6bcc11e0d15655f2b1c'),
94
94
  dict(path='shell.py', sha1='a59e59b812394d0502837f4c198e1cf604f90227'),
95
95
  dict(path='../oci/compression.py', sha1='7d165bc51a77db13ff45927daecc42839cfd75ea'),
96
- dict(path='../../omlish/asyncs/asyncio/utils.py', sha1='1ab917e62b40dae3744ba2eb3d10c85ddffe08a4'),
96
+ dict(path='../../omlish/asyncs/asyncio/utils.py', sha1='a093aa6b49e25b3206f59b703b281d569c386838'),
97
97
  dict(path='../../omlish/docker/ports.py', sha1='a3202c69b85bc4f1034479df3400fddc86130e5c'),
98
98
  dict(path='../../omlish/http/urllib.py', sha1='25431c5bdc7dd5cbecfcb8c0bdffaabf8c1691b9'),
99
99
  dict(path='../../omlish/http/versions.py', sha1='5b1659b81eb197c6880fbe78684a1348595ec804'),
@@ -497,41 +497,74 @@ async def asyncio_wait_maybe_concurrent(
497
497
  ##
498
498
 
499
499
 
500
- @contextlib.asynccontextmanager
501
- async def asyncio_shielded_finally(
502
- fn: ta.Callable[[], ta.Awaitable[ta.Any]],
503
- *,
504
- timeout: ta.Optional[float] = 5,
505
- ) -> ta.AsyncIterator[None]:
506
- try:
507
- yield
500
+ async def _asyncio_await_finalizer_shielded(
501
+ awaitable: ta.Awaitable[ta.Any],
502
+ *,
503
+ timeout: ta.Optional[float] = None,
504
+ ) -> None:
505
+ task = asyncio.create_task(awaitable) # type: ignore # noqa
508
506
 
509
- finally:
510
- end_task = asyncio.create_task(fn()) # type: ignore # noqa
507
+ if timeout is None:
508
+ try:
509
+ await asyncio.shield(task)
510
+ except asyncio.CancelledError:
511
+ try:
512
+ await task
513
+ finally:
514
+ raise
515
+
516
+ else:
517
+ deadline = time.monotonic() + timeout
511
518
 
512
- if timeout is None:
519
+ def remaining() -> float:
520
+ return max(0., deadline - time.monotonic())
521
+
522
+ try:
523
+ await asyncio.wait_for(asyncio.shield(task), timeout=remaining())
524
+ except asyncio.CancelledError:
513
525
  try:
514
- await asyncio.shield(end_task)
526
+ await asyncio.wait_for(task, timeout=remaining())
527
+ finally:
528
+ raise
515
529
 
516
- except asyncio.CancelledError:
517
- try:
518
- await end_task
519
530
 
520
- finally:
521
- raise
531
+ @dc.dataclass()
532
+ class AsyncioShieldedFinallyCancelledError(asyncio.CancelledError):
533
+ cleanup_exc: BaseException
522
534
 
523
- else:
524
- dl = time.monotonic() + timeout
525
535
 
526
- try:
527
- await asyncio.wait_for(asyncio.shield(end_task), timeout=time.monotonic() - dl)
536
+ @contextlib.asynccontextmanager
537
+ async def asyncio_shielded_finally(
538
+ fn: ta.Callable[[], ta.Awaitable[ta.Any]],
539
+ *,
540
+ timeout: ta.Optional[float] = None,
541
+ ) -> ta.AsyncIterator[None]:
542
+ raised = False
528
543
 
529
- except asyncio.CancelledError:
530
- try:
531
- await asyncio.wait_for(end_task, timeout=time.monotonic() - dl)
544
+ try:
545
+ yield
532
546
 
533
- finally:
534
- raise
547
+ except asyncio.CancelledError as e:
548
+ raised = True
549
+ try:
550
+ await _asyncio_await_finalizer_shielded(fn(), timeout=timeout)
551
+ except BaseException as e2: # noqa
552
+ raise AsyncioShieldedFinallyCancelledError(e2) from e
553
+ else:
554
+ raise
555
+
556
+ except Exception as e: # noqa
557
+ raised = True
558
+ try:
559
+ await _asyncio_await_finalizer_shielded(fn(), timeout=timeout)
560
+ except BaseException as e2: # noqa
561
+ raise e2 from e
562
+ else:
563
+ raise
564
+
565
+ finally:
566
+ if not raised:
567
+ await _asyncio_await_finalizer_shielded(fn(), timeout=timeout)
535
568
 
536
569
 
537
570
  ########################################
@@ -61,7 +61,7 @@ def __omlish_amalg__(): # noqa
61
61
  dict(path='../../logs/contexts.py', sha1='1000a6d5ddfb642865ca532e34b1d50759781cf0'),
62
62
  dict(path='../../logs/utils.py', sha1='9b879044cbdc3172fd7282c7f2a4880b81261cdd'),
63
63
  dict(path='bytes/queues.py', sha1='ea3b53a155622376836ba9e3499b85220f37b1fd'),
64
- dict(path='handlers/flatmap.py', sha1='7c9957c9e5136d1fa8ca51997914b4e9a5065843'),
64
+ dict(path='handlers/flatmap.py', sha1='118478ac94449a9a0b5ba44f5f3e8a5d69bb6f65'),
65
65
  dict(path='../streams/direct.py', sha1='b01937212493e9a41644ac4e366e4cbab10332ce'),
66
66
  dict(path='../streams/scanning.py', sha1='00522802dff772689be66151430754d4f9706dbc'),
67
67
  dict(path='../../logs/base.py', sha1='eaa2ce213235815e2f86c50df6c41cfe26a43ba2'),
@@ -71,7 +71,7 @@ def __omlish_amalg__(): # noqa
71
71
  dict(path='../../logs/std/loggers.py', sha1='dbdfc66188e6accb75d03454e43221d3fba0f011'),
72
72
  dict(path='bytes/decoders.py', sha1='6f6d8bc1adc6a5277543389814bc26ef63e34561'),
73
73
  dict(path='../../logs/modules.py', sha1='dd7d5f8e63fe8829dfb49460f3929ab64b68ee14'),
74
- dict(path='drivers/asyncio.py', sha1='59e80c4ac127e727676f17e956783f3aa39b4088'),
74
+ dict(path='drivers/asyncio.py', sha1='44e86ab5b903ea2780fc586aed267f72d501d21f'),
75
75
  dict(path='_amalg.py', sha1='14b67747b1e3b3c1483050a7948a29888d732ed9'),
76
76
  ],
77
77
  )
@@ -5521,12 +5521,13 @@ class FlatMapIoPipelineHandlers(NamespaceClass):
5521
5521
  )
5522
5522
 
5523
5523
  @classmethod
5524
- def _add_drop_filters(
5524
+ def add_filters(
5525
5525
  cls,
5526
5526
  fn: FlatMapIoPipelineHandlerFn,
5527
5527
  *,
5528
5528
  filter_type: ta.Optional[ta.Union[type, ta.Tuple[type, ...]]] = None,
5529
5529
  filter: ta.Optional[IoPipelineHandlerFn[ta.Any, bool]] = None, # noqa
5530
+ not_must_propagate: bool = False,
5530
5531
  ) -> FlatMapIoPipelineHandlerFn:
5531
5532
  if filter is not None:
5532
5533
  fn = FlatMapIoPipelineHandlerFns.filter(filter, fn)
@@ -5534,10 +5535,13 @@ class FlatMapIoPipelineHandlers(NamespaceClass):
5534
5535
  if filter_type is not None:
5535
5536
  fn = FlatMapIoPipelineHandlerFns.filter_type(filter_type, fn)
5536
5537
 
5537
- fn = FlatMapIoPipelineHandlerFns.filter(cls._NOT_MUST_PROPAGATE, fn)
5538
+ if not_must_propagate:
5539
+ fn = FlatMapIoPipelineHandlerFns.filter(cls._NOT_MUST_PROPAGATE, fn)
5538
5540
 
5539
5541
  return fn
5540
5542
 
5543
+ #
5544
+
5541
5545
  @classmethod
5542
5546
  def drop(
5543
5547
  cls,
@@ -5548,10 +5552,33 @@ class FlatMapIoPipelineHandlers(NamespaceClass):
5548
5552
  ) -> IoPipelineHandler:
5549
5553
  return cls.new(
5550
5554
  direction,
5551
- cls._add_drop_filters(
5555
+ cls.add_filters(
5552
5556
  FlatMapIoPipelineHandlerFns.drop(),
5553
5557
  filter=filter,
5554
5558
  filter_type=filter_type,
5559
+ not_must_propagate=True,
5560
+ ),
5561
+ )
5562
+
5563
+ @classmethod
5564
+ def apply_and_drop(
5565
+ cls,
5566
+ direction: IoPipelineDirectionOrDuplex,
5567
+ fn: IoPipelineHandlerFn[ta.Any, None],
5568
+ *,
5569
+ filter_type: ta.Optional[ta.Union[type, ta.Tuple[type, ...]]] = None,
5570
+ filter: ta.Optional[IoPipelineHandlerFn[ta.Any, bool]] = None, # noqa
5571
+ ) -> IoPipelineHandler:
5572
+ return cls.new(
5573
+ direction,
5574
+ cls.add_filters(
5575
+ FlatMapIoPipelineHandlerFns.compose(
5576
+ FlatMapIoPipelineHandlerFns.apply(fn),
5577
+ FlatMapIoPipelineHandlerFns.drop(),
5578
+ ),
5579
+ filter=filter,
5580
+ filter_type=filter_type,
5581
+ not_must_propagate=True,
5555
5582
  ),
5556
5583
  )
5557
5584
 
@@ -5564,13 +5591,14 @@ class FlatMapIoPipelineHandlers(NamespaceClass):
5564
5591
  ) -> IoPipelineHandler:
5565
5592
  return cls.new(
5566
5593
  'inbound',
5567
- cls._add_drop_filters(
5594
+ cls.add_filters(
5568
5595
  FlatMapIoPipelineHandlerFns.compose(
5569
5596
  FlatMapIoPipelineHandlerFns.feed_out(),
5570
5597
  FlatMapIoPipelineHandlerFns.drop(),
5571
5598
  ),
5572
5599
  filter=filter,
5573
5600
  filter_type=filter_type,
5601
+ not_must_propagate=True,
5574
5602
  ),
5575
5603
  )
5576
5604
 
@@ -8169,14 +8197,14 @@ class AsyncioStreamIoPipelineDriver(Abstract):
8169
8197
  fut.set_exception(e)
8170
8198
  raise
8171
8199
 
8172
- async def feed_in(self, *msgs: ta.Any) -> None:
8200
+ def enqueue_waitable(self, *msgs: ta.Any) -> 'asyncio.Future[None]':
8173
8201
  check.state(not self._shutdown_event.is_set())
8174
8202
 
8175
8203
  fut: asyncio.Future[None] = asyncio.Future()
8176
8204
  self._command_queue.put_nowait(AsyncioStreamIoPipelineDriver._FeedInCommand(msgs, fut=fut))
8177
- await fut
8205
+ return fut
8178
8206
 
8179
- def feed_in_nowait(self, *msgs: ta.Any) -> None:
8207
+ def enqueue(self, *msgs: ta.Any) -> None:
8180
8208
  check.state(not self._shutdown_event.is_set())
8181
8209
 
8182
8210
  self._command_queue.put_nowait(AsyncioStreamIoPipelineDriver._FeedInCommand(msgs))
@@ -9,7 +9,6 @@
9
9
  import abc
10
10
  import io
11
11
  import sys
12
- import time
13
12
  import typing as ta
14
13
 
15
14
 
@@ -33,7 +32,7 @@ def __omlish_amalg__(): # noqa
33
32
  dict(path='utils.py', sha1='eb08fa1d56284b078f973eea6796747b9bbdffdf'),
34
33
  dict(path='direct.py', sha1='b01937212493e9a41644ac4e366e4cbab10332ce'),
35
34
  dict(path='scanning.py', sha1='00522802dff772689be66151430754d4f9706dbc'),
36
- dict(path='adapters.py', sha1='f38f33ef312c68ecda06ddee928e679fc86bd49e'),
35
+ dict(path='adapters.py', sha1='c86a3999392fbc2ed76c0c319277b3f903b31e4c'),
37
36
  dict(path='linear.py', sha1='82d8d806abd708e8d471f32cb49813be150bcf6a'),
38
37
  dict(path='segmented.py', sha1='025cdf30e582a5a2b923e1859fbb4d3f367b811c'),
39
38
  dict(path='_amalg.py', sha1='9c88a055447d7b37da1b356e6a1e00b7c4a9a3cb'),
@@ -53,6 +52,12 @@ BytesLike = ta.Union[bytes, bytearray, memoryview] # ta.TypeAlias
53
52
  # utils.py
54
53
  CanByteStreamBuffer = ta.Union[BytesLike, 'ByteStreamBufferLike'] # ta.TypeAlias
55
54
 
55
+ # adapters.py
56
+ BytesOrAwaitableBytes = ta.TypeVar('BytesOrAwaitableBytes', bound=ta.Union[bytes, ta.Awaitable[bytes]])
57
+ BytesOrAwaitableBytes_co = ta.TypeVar('BytesOrAwaitableBytes_co', bound=ta.Union[bytes, ta.Awaitable[bytes]], covariant=True) # noqa
58
+ BoolOrAwaitableBool = ta.TypeVar('BoolOrAwaitableBool', bound=ta.Union[bool, ta.Awaitable[bool]])
59
+ BoolOrAwaitableBool_co = ta.TypeVar('BoolOrAwaitableBool_co', bound=ta.Union[bool, ta.Awaitable[bool]], covariant=True)
60
+
56
61
 
57
62
  ########################################
58
63
  # ../errors.py
@@ -1513,112 +1518,302 @@ class ScanningByteStreamBuffer(BaseByteStreamBufferLike, MutableByteStreamBuffer
1513
1518
  ##
1514
1519
 
1515
1520
 
1516
- class ByteStreamBufferReaderAdapter:
1521
+ BaseByteStreamBufferBytesReaderAdapterPolicy = ta.Literal[ # ta.TypeAlias # omlish-amalg-typing-no-move
1522
+ 'raise',
1523
+ 'return_partial',
1524
+ 'fill',
1525
+ ]
1526
+
1527
+
1528
+ class BaseByteStreamBufferBytesReaderAdapter(Abstract, ta.Generic[BytesOrAwaitableBytes, BoolOrAwaitableBool]):
1517
1529
  """
1518
- Adapter: ByteStreamBuffer -> file-like reader methods (`read1`, `read`, `readall`).
1530
+ Adapter: ByteStreamBuffer -> file-like buffered reader methods (`read1`, `read`).
1519
1531
 
1520
1532
  This adapter is policy-driven for how it behaves when insufficient bytes are available. The core buffer is
1521
1533
  intentionally non-blocking; blocking behavior (if desired) must be provided via a `fill` callback that supplies more
1522
1534
  bytes into the buffer.
1523
1535
 
1524
1536
  `policy`:
1525
- - 'raise': raise NeedMoreDataByteStreamBufferError if fewer than `n` bytes are available (for n >= 0).
1537
+ - 'raise': raise `NeedMoreDataByteStreamBufferError` if fewer than `n` bytes are available (for `n >= 0`).
1526
1538
  - 'return_partial': return whatever is available (possibly b'') up to `n`.
1527
- - 'block': repeatedly call `fill()` until satisfied or until `fill()` signals EOF.
1539
+ - 'fill': repeatedly call `fill()` until satisfied or until `fill()` signals EOF - effectively blocking mode.
1528
1540
 
1529
1541
  `fill`:
1530
- - Callable that writes more bytes into the underlying MutableByteStreamBuffer and returns:
1531
- * True -> made progress / more data may be available
1532
- * False -> EOF / no more data will arrive
1533
- - Only used when policy == 'block'.
1542
+ - Callable that writes more bytes into the underlying buffer.
1534
1543
 
1535
1544
  This adapter exists for interop with legacy code that expects file-like objects, but the core design remains
1536
1545
  independent from `io` and blocking semantics.
1537
1546
  """
1538
1547
 
1548
+ DEFAULT_POLICY: ta.Final = 'raise'
1549
+
1550
+ class Filler(ta.Protocol[BoolOrAwaitableBool_co]):
1551
+ def __call__(self, n: int, single: bool) -> BoolOrAwaitableBool_co:
1552
+ """
1553
+ Called when more data needs to be written into the underlying buffer.
1554
+
1555
+ - If `n > 0` then at least `n` bytes are requested - extra bytes will be buffered.
1556
+ - If `single` then the user has requested that at most one underlying read operation should be performed.
1557
+ - If `n < 1` and `single` then any amount of data is requested.
1558
+ - If `n < 1` and not `single` then all remaining data is requested.
1559
+
1560
+ Returns `True` if it made progress or more data may be available, or `False` if no more data will arrive.
1561
+
1562
+ If not `single` returning `True` then at least 1 new byte mut have been written to the buffer (otherwise
1563
+ it would infinite loop).
1564
+
1565
+ This function may or may not sleep / loop / block / etc. as it sees fit.
1566
+ """
1567
+
1539
1568
  def __init__(
1540
1569
  self,
1541
1570
  buf: ByteStreamBuffer,
1542
1571
  *,
1543
- policy: ta.Literal['raise', 'return_partial', 'block'] = 'raise',
1544
- fill: ta.Optional[ta.Callable[[], bool]] = None,
1545
- block_sleep: ta.Union[ta.Callable[[], None], float, None] = None,
1572
+ policy: ta.Optional[BaseByteStreamBufferBytesReaderAdapterPolicy] = None,
1573
+ fill: ta.Optional[Filler[BoolOrAwaitableBool]] = None,
1546
1574
  ) -> None:
1547
1575
  super().__init__()
1548
1576
 
1549
1577
  self._buf = buf
1578
+ if fill is not None:
1579
+ if policy is None:
1580
+ policy = 'fill'
1581
+ elif policy != 'fill':
1582
+ raise ValueError('fill callback only valid with policy=fill')
1583
+ elif policy is None:
1584
+ policy = self.DEFAULT_POLICY
1550
1585
  self._policy = policy
1551
1586
  self._fill = fill
1552
- self._block_sleep = block_sleep
1553
1587
 
1554
- if self._policy == 'block' and self._fill is None:
1555
- raise ValueError('policy=block requires fill')
1588
+ #
1589
+
1590
+ class RawBytesReader(ta.Protocol[BytesOrAwaitableBytes_co]):
1591
+ def read1(self, n: ta.Any) -> BytesOrAwaitableBytes_co: ...
1592
+
1593
+ class BytesReader(RawBytesReader[BytesOrAwaitableBytes_co], ta.Protocol[BytesOrAwaitableBytes_co]):
1594
+ def read(self, n: ta.Any) -> BytesOrAwaitableBytes_co: ...
1595
+
1596
+ @classmethod
1597
+ @abc.abstractmethod
1598
+ def wrap(
1599
+ cls,
1600
+ obj: RawBytesReader[BytesOrAwaitableBytes],
1601
+ buf: MutableByteStreamBuffer,
1602
+ *,
1603
+ policy: ta.Optional[BaseByteStreamBufferBytesReaderAdapterPolicy] = None,
1604
+ ) -> 'BaseByteStreamBufferBytesReaderAdapter[BytesOrAwaitableBytes, BoolOrAwaitableBool]':
1605
+ raise NotImplementedError
1606
+
1607
+ #
1608
+
1609
+ @abc.abstractmethod
1610
+ def read1(self, n: int = -1, /) -> BytesOrAwaitableBytes:
1611
+ raise NotImplementedError
1612
+
1613
+ def _inner_read(self, n: int) -> ta.Union[bytes, ta.Literal['fill']]:
1614
+ buf = self._buf
1615
+ if (ln := len(buf)) >= n:
1616
+ return buf.split_to(n).tobytes()
1617
+
1618
+ pol = self._policy
1619
+ if pol == 'return_partial':
1620
+ if not ln:
1621
+ return b''
1622
+ return buf.split_to(ln).tobytes()
1623
+
1624
+ elif pol == 'raise':
1625
+ raise NeedMoreDataByteStreamBufferError
1626
+
1627
+ elif pol == 'fill':
1628
+ return 'fill'
1556
1629
 
1557
- def _on_block(self) -> None:
1558
- if (bs := self._block_sleep) is None:
1559
- return
1560
- elif callable(bs):
1561
- bs()
1562
1630
  else:
1563
- time.sleep(bs)
1631
+ raise RuntimeError(f'invalid policy: {pol!r}')
1632
+
1633
+ @abc.abstractmethod
1634
+ def read(self, n: int = -1, /) -> BytesOrAwaitableBytes:
1635
+ raise NotImplementedError
1636
+
1637
+
1638
+ #
1639
+
1640
+
1641
+ class ByteStreamBufferBytesReaderAdapter(BaseByteStreamBufferBytesReaderAdapter[bytes, bool]):
1642
+ @classmethod
1643
+ def wrap(
1644
+ cls,
1645
+ obj: BaseByteStreamBufferBytesReaderAdapter.RawBytesReader[bytes],
1646
+ buf: MutableByteStreamBuffer,
1647
+ *,
1648
+ policy: ta.Optional[BaseByteStreamBufferBytesReaderAdapterPolicy] = None,
1649
+ ) -> 'BaseByteStreamBufferBytesReaderAdapter[bytes, bool]':
1650
+ if not hasattr(obj, 'read1'):
1651
+ raise TypeError(obj)
1652
+
1653
+ elif hasattr(obj, 'read'):
1654
+ def br_fill(n: int, single: bool) -> bool:
1655
+ if single:
1656
+ b = obj.read1(n)
1657
+ else:
1658
+ b = obj.read(n)
1659
+ if not b:
1660
+ return False
1661
+ buf.write(b)
1662
+ return True
1663
+
1664
+ fill = br_fill
1665
+
1666
+ else:
1667
+ def rbr_fill(n: int, single: bool) -> bool:
1668
+ b = obj.read1(n)
1669
+ if not b:
1670
+ return False
1671
+ buf.write(b)
1672
+ return True
1673
+
1674
+ fill = rbr_fill
1675
+
1676
+ return cls(
1677
+ buf,
1678
+ policy=policy,
1679
+ fill=fill,
1680
+ )
1564
1681
 
1565
1682
  def read1(self, n: int = -1, /) -> bytes:
1566
- return self.read(n)
1683
+ if not n:
1684
+ return b''
1567
1685
 
1568
- def read(self, n: int = -1, /) -> bytes:
1569
1686
  buf = self._buf
1687
+ if not (ln := len(buf)):
1688
+ if (fill := self._fill) is None:
1689
+ return b''
1570
1690
 
1571
- if n is None or n < 0:
1572
- return self.readall()
1691
+ fill(n, True)
1692
+ ln = len(buf)
1693
+
1694
+ if not ln:
1695
+ return b''
1696
+
1697
+ return buf.split_to(min(n, ln) if n > 0 else ln).tobytes()
1698
+
1699
+ def read(self, n: int = -1, /) -> bytes:
1700
+ if n < 0:
1701
+ if (fill := self._fill) is not None:
1702
+ while fill(-1, False):
1703
+ pass
1704
+
1705
+ buf = self._buf
1706
+ return buf.split_to(len(buf)).tobytes()
1573
1707
 
1574
1708
  if not n:
1575
1709
  return b''
1576
1710
 
1711
+ buf = self._buf
1577
1712
  while True:
1578
- ln = len(buf)
1579
- if ln >= n:
1580
- v = buf.split_to(n)
1581
- return v.tobytes()
1713
+ if (out := self._inner_read(n)) != 'fill':
1714
+ return out
1582
1715
 
1583
- if self._policy == 'return_partial':
1584
- if not ln:
1716
+ ln = len(buf)
1717
+ if not self._fill(n - ln, False): # type: ignore[misc]
1718
+ # EOF
1719
+ if not (ln := len(buf)):
1585
1720
  return b''
1586
- v = buf.split_to(ln)
1587
- return v.tobytes()
1721
+ return buf.split_to(ln).tobytes()
1588
1722
 
1589
- if self._policy == 'raise':
1590
- raise NeedMoreDataByteStreamBufferError
1723
+ if len(buf) == ln:
1724
+ raise RuntimeError('fill did not produce data')
1591
1725
 
1592
- # block
1593
- if not ta.cast('ta.Callable[[], bool]', self._fill)():
1594
- # EOF
1595
- if not ln:
1596
- return b''
1597
- v = buf.split_to(ln)
1598
- return v.tobytes()
1599
1726
 
1600
- self._on_block()
1727
+ #
1728
+
1729
+
1730
+ class ByteStreamBufferAsyncBytesReaderAdapter(BaseByteStreamBufferBytesReaderAdapter[ta.Awaitable[bytes], ta.Awaitable[bool]]): # noqa
1731
+ @classmethod
1732
+ def wrap(
1733
+ cls,
1734
+ obj: BaseByteStreamBufferBytesReaderAdapter.RawBytesReader[ta.Awaitable[bytes]],
1735
+ buf: MutableByteStreamBuffer,
1736
+ *,
1737
+ policy: ta.Optional[BaseByteStreamBufferBytesReaderAdapterPolicy] = None,
1738
+ ) -> 'BaseByteStreamBufferBytesReaderAdapter[ta.Awaitable[bytes], ta.Awaitable[bool]]':
1739
+ if not hasattr(obj, 'read1'):
1740
+ raise TypeError(obj)
1741
+
1742
+ elif hasattr(obj, 'read'):
1743
+ async def br_fill(n: int, single: bool) -> bool:
1744
+ if single:
1745
+ b = await obj.read1(n)
1746
+ else:
1747
+ b = await obj.read(n)
1748
+ if not b:
1749
+ return False
1750
+ buf.write(b)
1751
+ return True
1752
+
1753
+ fill = br_fill
1754
+
1755
+ else:
1756
+ async def rbr_fill(n: int, single: bool) -> bool:
1757
+ b = await obj.read1(n)
1758
+ if not b:
1759
+ return False
1760
+ buf.write(b)
1761
+ return True
1762
+
1763
+ fill = rbr_fill
1764
+
1765
+ return cls(
1766
+ buf,
1767
+ policy=policy,
1768
+ fill=fill,
1769
+ )
1770
+
1771
+ async def read1(self, n: int = -1, /) -> bytes:
1772
+ if not n:
1773
+ return b''
1601
1774
 
1602
- def readall(self) -> bytes:
1603
1775
  buf = self._buf
1604
- parts: ta.List[bytes] = []
1776
+ if not (ln := len(buf)):
1777
+ if (fill := self._fill) is None:
1778
+ return b''
1779
+
1780
+ await fill(n, True)
1781
+ ln = len(buf)
1782
+
1783
+ if not ln:
1784
+ return b''
1785
+
1786
+ return buf.split_to(min(n, ln) if n > 0 else ln).tobytes()
1787
+
1788
+ async def read(self, n: int = -1, /) -> bytes:
1789
+ if n < 0:
1790
+ if (fill := self._fill) is not None:
1791
+ while await fill(-1, False):
1792
+ pass
1605
1793
 
1794
+ buf = self._buf
1795
+ return buf.split_to(len(buf)).tobytes()
1796
+
1797
+ if not n:
1798
+ return b''
1799
+
1800
+ buf = self._buf
1606
1801
  while True:
1802
+ if (out := self._inner_read(n)) != 'fill':
1803
+ return out
1804
+
1607
1805
  ln = len(buf)
1608
- if ln:
1609
- v = buf.split_to(ln)
1610
- parts.append(v.tobytes())
1611
- continue
1806
+ if not await self._fill(n - ln, False): # type: ignore[misc]
1807
+ # EOF
1808
+ if not (ln := len(buf)):
1809
+ return b''
1810
+ return buf.split_to(ln).tobytes()
1612
1811
 
1613
- if self._policy == 'block':
1614
- if not ta.cast('ta.Callable[[], bool]', self._fill)():
1615
- break
1616
- self._on_block()
1617
- continue
1812
+ if len(buf) == ln:
1813
+ raise RuntimeError('fill did not produce data')
1618
1814
 
1619
- break
1620
1815
 
1621
- return b''.join(parts)
1816
+ ##
1622
1817
 
1623
1818
 
1624
1819
  class ByteStreamBufferWriterAdapter:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev542
3
+ Version: 0.0.0.dev543
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omlish==0.0.0.dev542
17
+ Requires-Dist: omlish==0.0.0.dev543
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=26.3; extra == "all"
20
20
  Requires-Dist: pycparser~=3.0; extra == "all"
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev542
1
+ omlish==0.0.0.dev543
2
2
 
3
3
  [all]
4
4
  black~=26.3
@@ -13,7 +13,7 @@ urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = 'BSD-3-Clause'
14
14
  readme = 'README.md'
15
15
  requires-python = '>=3.13'
16
- version = '0.0.0.dev542'
16
+ version = '0.0.0.dev543'
17
17
  classifiers = [
18
18
  'Development Status :: 2 - Pre-Alpha',
19
19
  'Intended Audience :: Developers',
@@ -24,7 +24,7 @@ classifiers = [
24
24
  ]
25
25
  description = 'omdev'
26
26
  dependencies = [
27
- 'omlish == 0.0.0.dev542',
27
+ 'omlish == 0.0.0.dev543',
28
28
  ]
29
29
 
30
30
  [project.optional-dependencies]
File without changes
File without changes
File without changes