omdev 0.0.29__tar.gz → 0.0.30__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 (520) hide show
  1. {omdev-0.0.29/omdev.egg-info → omdev-0.0.30}/PKG-INFO +6 -6
  2. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataclasses/_dumping.py +69 -18
  3. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataclasses/codegen.py +0 -5
  4. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/config.toml +7 -0
  5. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/gen.py +1 -1
  6. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/.python-versions.json +4 -4
  7. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/depsets/python.toml +5 -0
  8. {omdev-0.0.29 → omdev-0.0.30}/omdev/manifests/_dumping.py +72 -19
  9. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/ci.py +781 -216
  10. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/interp.py +47 -19
  11. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/lib/formats/goyaml.py +557 -122
  12. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/lib/inject.py +29 -7
  13. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/lib/io/pipelines.py +3 -3
  14. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/lib/io/streambufs.py +3 -3
  15. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/lib/marshal.py +69 -18
  16. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/pidfiles.py +111 -32
  17. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/pyproject.py +137 -37
  18. {omdev-0.0.29 → omdev-0.0.30/omdev.egg-info}/PKG-INFO +6 -6
  19. {omdev-0.0.29 → omdev-0.0.30}/omdev.egg-info/requires.txt +5 -5
  20. {omdev-0.0.29 → omdev-0.0.30}/pyproject.toml +6 -6
  21. {omdev-0.0.29 → omdev-0.0.30}/LICENSE +0 -0
  22. {omdev-0.0.29 → omdev-0.0.30}/MANIFEST.in +0 -0
  23. {omdev-0.0.29 → omdev-0.0.30}/README.md +0 -0
  24. {omdev-0.0.29 → omdev-0.0.30}/omdev/.om-manifests.json +0 -0
  25. {omdev-0.0.29 → omdev-0.0.30}/omdev/README.md +0 -0
  26. {omdev-0.0.29 → omdev-0.0.30}/omdev/__about__.py +0 -0
  27. {omdev-0.0.29 → omdev-0.0.30}/omdev/__init__.py +0 -0
  28. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/__init__.py +0 -0
  29. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/__main__.py +0 -0
  30. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/cli/__init__.py +0 -0
  31. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/cli/main.py +0 -0
  32. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/gen/__init__.py +0 -0
  33. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/gen/gen.py +0 -0
  34. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/gen/imports.py +0 -0
  35. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/gen/manifests.py +0 -0
  36. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/gen/resources.py +0 -0
  37. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/gen/srcfiles.py +0 -0
  38. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/gen/strip.py +0 -0
  39. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/gen/types.py +0 -0
  40. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/gen/typing.py +0 -0
  41. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/info.py +0 -0
  42. {omdev-0.0.29 → omdev-0.0.30}/omdev/amalg/sources.py +0 -0
  43. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/__init__.py +0 -0
  44. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/compute/__init__.py +0 -0
  45. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/compute/cache.py +0 -0
  46. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/compute/contexts.py +0 -0
  47. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/compute/currents.py +0 -0
  48. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/compute/fns.py +0 -0
  49. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/compute/resolvers.py +0 -0
  50. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/compute/storage.py +0 -0
  51. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/compute/types.py +0 -0
  52. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/data/__init__.py +0 -0
  53. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/data/actions.py +0 -0
  54. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/data/cache.py +0 -0
  55. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/data/consts.py +0 -0
  56. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/data/defaults.py +0 -0
  57. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/data/manifests.py +0 -0
  58. {omdev-0.0.29 → omdev-0.0.30}/omdev/cache/data/specs.py +0 -0
  59. {omdev-0.0.29 → omdev-0.0.30}/omdev/capi/__init__.py +0 -0
  60. {omdev-0.0.29 → omdev-0.0.30}/omdev/capi/darwin/__init__.py +0 -0
  61. {omdev-0.0.29 → omdev-0.0.30}/omdev/capi/darwin/aps.py +0 -0
  62. {omdev-0.0.29 → omdev-0.0.30}/omdev/capi/darwin/ax.py +0 -0
  63. {omdev-0.0.29 → omdev-0.0.30}/omdev/capi/darwin/cf.py +0 -0
  64. {omdev-0.0.29 → omdev-0.0.30}/omdev/capi/darwin/cg.py +0 -0
  65. {omdev-0.0.29 → omdev-0.0.30}/omdev/capi/linux/__init__.py +0 -0
  66. {omdev-0.0.29 → omdev-0.0.30}/omdev/capi/linux/x11.py +0 -0
  67. {omdev-0.0.29 → omdev-0.0.30}/omdev/cc/__init__.py +0 -0
  68. {omdev-0.0.29 → omdev-0.0.30}/omdev/cc/__main__.py +0 -0
  69. {omdev-0.0.29 → omdev-0.0.30}/omdev/cc/cdeps.py +0 -0
  70. {omdev-0.0.29 → omdev-0.0.30}/omdev/cc/cdeps.toml +0 -0
  71. {omdev-0.0.29 → omdev-0.0.30}/omdev/cc/cli.py +0 -0
  72. {omdev-0.0.29 → omdev-0.0.30}/omdev/cc/srclangs.py +0 -0
  73. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/__init__.py +0 -0
  74. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_boilerplate.cc +0 -0
  75. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/LICENSE +0 -0
  76. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/__init__.py +0 -0
  77. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/build_ext.py +0 -0
  78. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  79. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  80. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/compilers/options.py +0 -0
  81. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  82. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/dir_util.py +0 -0
  83. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/errors.py +0 -0
  84. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/extension.py +0 -0
  85. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/file_util.py +0 -0
  86. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/modified.py +0 -0
  87. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/spawn.py +0 -0
  88. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/sysconfig.py +0 -0
  89. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/util.py +0 -0
  90. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/_distutils/version.py +0 -0
  91. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/build.py +0 -0
  92. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/cmake.py +0 -0
  93. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/importhook.py +0 -0
  94. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/magic.py +0 -0
  95. {omdev-0.0.29 → omdev-0.0.30}/omdev/cexts/scan.py +0 -0
  96. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/__init__.py +0 -0
  97. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/__main__.py +0 -0
  98. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/cache.py +0 -0
  99. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/ci.py +0 -0
  100. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/cli.py +0 -0
  101. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/compose.py +0 -0
  102. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/consts.py +0 -0
  103. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/__init__.py +0 -0
  104. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/buildcaching.py +0 -0
  105. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/cache.py +0 -0
  106. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  107. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/cacheserved/cache.py +0 -0
  108. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  109. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/cmds.py +0 -0
  110. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/dataserver.py +0 -0
  111. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/imagepulling.py +0 -0
  112. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/inject.py +0 -0
  113. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/packing.py +0 -0
  114. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/repositories.py +0 -0
  115. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/docker/utils.py +0 -0
  116. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/__init__.py +0 -0
  117. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/api/__init__.py +0 -0
  118. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/api/clients.py +0 -0
  119. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/api/v1/__init__.py +0 -0
  120. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/api/v1/api.py +0 -0
  121. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/api/v1/client.py +0 -0
  122. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/api/v2/__init__.py +0 -0
  123. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/api/v2/api.py +0 -0
  124. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/api/v2/azure.py +0 -0
  125. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/api/v2/client.py +0 -0
  126. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/bootstrap.py +0 -0
  127. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/cache.py +0 -0
  128. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/cli.py +0 -0
  129. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/env.py +0 -0
  130. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/github/inject.py +0 -0
  131. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/inject.py +0 -0
  132. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/requirements.py +0 -0
  133. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/shell.py +0 -0
  134. {omdev-0.0.29 → omdev-0.0.30}/omdev/ci/utils.py +0 -0
  135. {omdev-0.0.29 → omdev-0.0.30}/omdev/cli/__init__.py +0 -0
  136. {omdev-0.0.29 → omdev-0.0.30}/omdev/cli/__main__.py +0 -0
  137. {omdev-0.0.29 → omdev-0.0.30}/omdev/cli/_pathhack.py +0 -0
  138. {omdev-0.0.29 → omdev-0.0.30}/omdev/cli/clicli.py +0 -0
  139. {omdev-0.0.29 → omdev-0.0.30}/omdev/cli/install.py +0 -0
  140. {omdev-0.0.29 → omdev-0.0.30}/omdev/cli/main.py +0 -0
  141. {omdev-0.0.29 → omdev-0.0.30}/omdev/cli/managers.py +0 -0
  142. {omdev-0.0.29 → omdev-0.0.30}/omdev/cli/types.py +0 -0
  143. {omdev-0.0.29 → omdev-0.0.30}/omdev/clipboard/__init__.py +0 -0
  144. {omdev-0.0.29 → omdev-0.0.30}/omdev/clipboard/capi/__init__.py +0 -0
  145. {omdev-0.0.29 → omdev-0.0.30}/omdev/clipboard/capi/darwin_cf.py +0 -0
  146. {omdev-0.0.29 → omdev-0.0.30}/omdev/clipboard/capi/linux_x11.py +0 -0
  147. {omdev-0.0.29 → omdev-0.0.30}/omdev/clipboard/commands.py +0 -0
  148. {omdev-0.0.29 → omdev-0.0.30}/omdev/clipboard/platform.py +0 -0
  149. {omdev-0.0.29 → omdev-0.0.30}/omdev/clipboard/types.py +0 -0
  150. {omdev-0.0.29 → omdev-0.0.30}/omdev/cmake.py +0 -0
  151. {omdev-0.0.29 → omdev-0.0.30}/omdev/cmdlog/__init__.py +0 -0
  152. {omdev-0.0.29 → omdev-0.0.30}/omdev/cmdlog/__main__.py +0 -0
  153. {omdev-0.0.29 → omdev-0.0.30}/omdev/cmdlog/_cmdlog.py +0 -0
  154. {omdev-0.0.29 → omdev-0.0.30}/omdev/cmdlog/cli.py +0 -0
  155. {omdev-0.0.29 → omdev-0.0.30}/omdev/cmdlog/cmdlog.py +0 -0
  156. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataclasses/__init__.py +0 -0
  157. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataclasses/__main__.py +0 -0
  158. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataclasses/_template.py +0 -0
  159. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataclasses/cli.py +0 -0
  160. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataclasses/dumping.py +0 -0
  161. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataserver/__init__.py +0 -0
  162. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataserver/handlers.py +0 -0
  163. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataserver/http.py +0 -0
  164. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataserver/routes.py +0 -0
  165. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataserver/server.py +0 -0
  166. {omdev-0.0.29 → omdev-0.0.30}/omdev/dataserver/targets.py +0 -0
  167. {omdev-0.0.29 → omdev-0.0.30}/omdev/diffs/__init__.py +0 -0
  168. {omdev-0.0.29 → omdev-0.0.30}/omdev/diffs/__main__.py +0 -0
  169. {omdev-0.0.29 → omdev-0.0.30}/omdev/diffs/cli.py +0 -0
  170. {omdev-0.0.29 → omdev-0.0.30}/omdev/diffs/parsing.py +0 -0
  171. {omdev-0.0.29 → omdev-0.0.30}/omdev/diffs/rendering.py +0 -0
  172. {omdev-0.0.29 → omdev-0.0.30}/omdev/diffs/types.py +0 -0
  173. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/__init__.py +0 -0
  174. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/__main__.py +0 -0
  175. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/build.py +0 -0
  176. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/cli.py +0 -0
  177. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/config.py +0 -0
  178. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/content.py +0 -0
  179. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/helpers.py +0 -0
  180. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/ops.py +0 -0
  181. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/rendering.py +0 -0
  182. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/configs/.gdbinit +0 -0
  183. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/configs/.sqliterc +0 -0
  184. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/configs/.tmux.conf +0 -0
  185. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/configs/.vimrc +0 -0
  186. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/depsets/system.toml +0 -0
  187. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/depsets/x11.toml +0 -0
  188. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/apt.sh +0 -0
  189. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/chgrp.sh +0 -0
  190. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/docker.sh +0 -0
  191. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/firefox.sh +0 -0
  192. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/go.sh +0 -0
  193. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/jdk.sh +0 -0
  194. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/man.sh +0 -0
  195. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/nvm.sh +0 -0
  196. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/pyenv.sh +0 -0
  197. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/rbenv.sh +0 -0
  198. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/rust.sh +0 -0
  199. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/sshd.sh +0 -0
  200. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/user.sh +0 -0
  201. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/uv.sh +0 -0
  202. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/vcpkg.sh +0 -0
  203. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/workdir.sh +0 -0
  204. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/fragments/zig.sh +0 -0
  205. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/scripts/install-claude +0 -0
  206. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/scripts/install-codex +0 -0
  207. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/scripts/install-pi +0 -0
  208. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/scripts/run-dbus +0 -0
  209. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/resources/shift-uid.sh +0 -0
  210. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/run.py +0 -0
  211. {omdev-0.0.29 → omdev-0.0.30}/omdev/dockerdev/utils.py +0 -0
  212. {omdev-0.0.29 → omdev-0.0.30}/omdev/git/__init__.py +0 -0
  213. {omdev-0.0.29 → omdev-0.0.30}/omdev/git/magic.py +0 -0
  214. {omdev-0.0.29 → omdev-0.0.30}/omdev/git/revisions.py +0 -0
  215. {omdev-0.0.29 → omdev-0.0.30}/omdev/git/shallow.py +0 -0
  216. {omdev-0.0.29 → omdev-0.0.30}/omdev/git/status.py +0 -0
  217. {omdev-0.0.29 → omdev-0.0.30}/omdev/home/__init__.py +0 -0
  218. {omdev-0.0.29 → omdev-0.0.30}/omdev/home/__main__.py +0 -0
  219. {omdev-0.0.29 → omdev-0.0.30}/omdev/home/cli.py +0 -0
  220. {omdev-0.0.29 → omdev-0.0.30}/omdev/home/paths.py +0 -0
  221. {omdev-0.0.29 → omdev-0.0.30}/omdev/home/secrets.py +0 -0
  222. {omdev-0.0.29 → omdev-0.0.30}/omdev/home/shadow.py +0 -0
  223. {omdev-0.0.29 → omdev-0.0.30}/omdev/imgur.py +0 -0
  224. {omdev-0.0.29 → omdev-0.0.30}/omdev/intellij/__init__.py +0 -0
  225. {omdev-0.0.29 → omdev-0.0.30}/omdev/intellij/cli.py +0 -0
  226. {omdev-0.0.29 → omdev-0.0.30}/omdev/intellij/ides.py +0 -0
  227. {omdev-0.0.29 → omdev-0.0.30}/omdev/intellij/open.py +0 -0
  228. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/__init__.py +0 -0
  229. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/__main__.py +0 -0
  230. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/cli.py +0 -0
  231. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/default.py +0 -0
  232. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/inject.py +0 -0
  233. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/inspect.py +0 -0
  234. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/providers/__init__.py +0 -0
  235. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/providers/base.py +0 -0
  236. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/providers/inject.py +0 -0
  237. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/providers/running.py +0 -0
  238. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/providers/standalone.py +0 -0
  239. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/providers/system.py +0 -0
  240. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/pyenv/__init__.py +0 -0
  241. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/pyenv/inject.py +0 -0
  242. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/pyenv/install.py +0 -0
  243. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/pyenv/provider.py +0 -0
  244. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/pyenv/pyenv.py +0 -0
  245. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/resolvers.py +0 -0
  246. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/types.py +0 -0
  247. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/uv/__init__.py +0 -0
  248. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/uv/inject.py +0 -0
  249. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/uv/provider.py +0 -0
  250. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/uv/uv.py +0 -0
  251. {omdev-0.0.29 → omdev-0.0.30}/omdev/interp/venvs.py +0 -0
  252. {omdev-0.0.29 → omdev-0.0.30}/omdev/java/__init__.py +0 -0
  253. {omdev-0.0.29 → omdev-0.0.30}/omdev/java/__main__.py +0 -0
  254. {omdev-0.0.29 → omdev-0.0.30}/omdev/java/cli.py +0 -0
  255. {omdev-0.0.29 → omdev-0.0.30}/omdev/java/pomgen.py +0 -0
  256. {omdev-0.0.29 → omdev-0.0.30}/omdev/java/utils.py +0 -0
  257. {omdev-0.0.29 → omdev-0.0.30}/omdev/java/xml.py +0 -0
  258. {omdev-0.0.29 → omdev-0.0.30}/omdev/magic/__init__.py +0 -0
  259. {omdev-0.0.29 → omdev-0.0.30}/omdev/magic/__main__.py +0 -0
  260. {omdev-0.0.29 → omdev-0.0.30}/omdev/magic/cli.py +0 -0
  261. {omdev-0.0.29 → omdev-0.0.30}/omdev/magic/find.py +0 -0
  262. {omdev-0.0.29 → omdev-0.0.30}/omdev/magic/magic.py +0 -0
  263. {omdev-0.0.29 → omdev-0.0.30}/omdev/magic/prepare.py +0 -0
  264. {omdev-0.0.29 → omdev-0.0.30}/omdev/magic/styles.py +0 -0
  265. {omdev-0.0.29 → omdev-0.0.30}/omdev/manifests/__init__.py +0 -0
  266. {omdev-0.0.29 → omdev-0.0.30}/omdev/manifests/__main__.py +0 -0
  267. {omdev-0.0.29 → omdev-0.0.30}/omdev/manifests/building.py +0 -0
  268. {omdev-0.0.29 → omdev-0.0.30}/omdev/manifests/dumping.py +0 -0
  269. {omdev-0.0.29 → omdev-0.0.30}/omdev/manifests/main.py +0 -0
  270. {omdev-0.0.29 → omdev-0.0.30}/omdev/markdown/__init__.py +0 -0
  271. {omdev-0.0.29 → omdev-0.0.30}/omdev/markdown/incparse.py +0 -0
  272. {omdev-0.0.29 → omdev-0.0.30}/omdev/markdown/tokens.py +0 -0
  273. {omdev-0.0.29 → omdev-0.0.30}/omdev/mypy/__init__.py +0 -0
  274. {omdev-0.0.29 → omdev-0.0.30}/omdev/mypy/debug.py +0 -0
  275. {omdev-0.0.29 → omdev-0.0.30}/omdev/mypy/report.py +0 -0
  276. {omdev-0.0.29 → omdev-0.0.30}/omdev/packaging/__init__.py +0 -0
  277. {omdev-0.0.29 → omdev-0.0.30}/omdev/packaging/marshal.py +0 -0
  278. {omdev-0.0.29 → omdev-0.0.30}/omdev/packaging/names.py +0 -0
  279. {omdev-0.0.29 → omdev-0.0.30}/omdev/packaging/requires.py +0 -0
  280. {omdev-0.0.29 → omdev-0.0.30}/omdev/packaging/revisions.py +0 -0
  281. {omdev-0.0.29 → omdev-0.0.30}/omdev/packaging/specifiers.py +0 -0
  282. {omdev-0.0.29 → omdev-0.0.30}/omdev/packaging/versions.py +0 -0
  283. {omdev-0.0.29 → omdev-0.0.30}/omdev/packaging/wheelfile.py +0 -0
  284. {omdev-0.0.29 → omdev-0.0.30}/omdev/pip.py +0 -0
  285. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/__init__.py +0 -0
  286. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/__main__.py +0 -0
  287. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/base.py +0 -0
  288. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/blanklines.py +0 -0
  289. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/caches.py +0 -0
  290. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/git.py +0 -0
  291. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/imports.py +0 -0
  292. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/lite.py +0 -0
  293. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/main.py +0 -0
  294. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/manifests.py +0 -0
  295. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/scripts.py +0 -0
  296. {omdev-0.0.29 → omdev-0.0.30}/omdev/precheck/unicode.py +0 -0
  297. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/__init__.py +0 -0
  298. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/asts/__init__.py +0 -0
  299. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/asts/parents.py +0 -0
  300. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/asts/toplevel.py +0 -0
  301. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/asts/visitors.py +0 -0
  302. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/attrdocs.py +0 -0
  303. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/bracepy.py +0 -0
  304. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/classdot.py +0 -0
  305. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/docstrings/LICENSE +0 -0
  306. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/docstrings/__init__.py +0 -0
  307. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/docstrings/attrdoc.py +0 -0
  308. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/docstrings/common.py +0 -0
  309. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/docstrings/epydoc.py +0 -0
  310. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/docstrings/google.py +0 -0
  311. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/docstrings/numpydoc.py +0 -0
  312. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/docstrings/parser.py +0 -0
  313. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/docstrings/rest.py +0 -0
  314. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/findimports.py +0 -0
  315. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/reprs.py +0 -0
  316. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/scripts/__init__.py +0 -0
  317. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/scripts/bumpversion.py +0 -0
  318. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/scripts/importtrace.py +0 -0
  319. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/srcheaders.py +0 -0
  320. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/tokens/__init__.py +0 -0
  321. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/tokens/all.py +0 -0
  322. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/tokens/tokenizert.py +0 -0
  323. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/tokens/utils.py +0 -0
  324. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/tools/__init__.py +0 -0
  325. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/tools/fixdocstrings.py +0 -0
  326. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/tools/importscan.py +0 -0
  327. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/tools/mkrelimp.py +0 -0
  328. {omdev-0.0.29 → omdev-0.0.30}/omdev/py/tools/pipdepup.py +0 -0
  329. {omdev-0.0.29 → omdev-0.0.30}/omdev/py.typed +0 -0
  330. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/__init__.py +0 -0
  331. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/__main__.py +0 -0
  332. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/cli.py +0 -0
  333. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/configs.py +0 -0
  334. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/inject.py +0 -0
  335. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/pkg.py +0 -0
  336. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/reqs.py +0 -0
  337. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/resources/dockerdev.sh +0 -0
  338. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/resources/python.sh +0 -0
  339. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/tools/__init__.py +0 -0
  340. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/tools/aboutdeps.py +0 -0
  341. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/tools/buildrs.py +0 -0
  342. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/tools/pyversions.py +0 -0
  343. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/venvs.py +0 -0
  344. {omdev-0.0.29 → omdev-0.0.30}/omdev/pyproject/versions.py +0 -0
  345. {omdev-0.0.29 → omdev-0.0.30}/omdev/rs/__init__.py +0 -0
  346. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/__init__.py +0 -0
  347. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/lib/__init__.py +0 -0
  348. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/lib/formats/__init__.py +0 -0
  349. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/lib/io/__init__.py +0 -0
  350. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/lib/logs.py +0 -0
  351. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/slowcat.py +0 -0
  352. {omdev-0.0.29 → omdev-0.0.30}/omdev/scripts/tmpexec.py +0 -0
  353. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/__init__.py +0 -0
  354. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/__init__.py +0 -0
  355. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/messages/__init__.py +0 -0
  356. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/messages/base.py +0 -0
  357. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/messages/formats.py +0 -0
  358. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/messages/messages.py +0 -0
  359. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/messages/parsing.py +0 -0
  360. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/numerics/__init__.py +0 -0
  361. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/numerics/formats.py +0 -0
  362. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/numerics/numerics.py +0 -0
  363. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/numerics/types.py +0 -0
  364. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/protocol/LICENSE +0 -0
  365. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/protocol/__init__.py +0 -0
  366. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/protocol/consts.py +0 -0
  367. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/protocol/errors.py +0 -0
  368. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/protocol/message.py +0 -0
  369. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/protocol/nuh.py +0 -0
  370. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/protocol/parsing.py +0 -0
  371. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/protocol/rendering.py +0 -0
  372. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/protocol/tags.py +0 -0
  373. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/irc/protocol/utils.py +0 -0
  374. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/__init__.py +0 -0
  375. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/__init__.py +0 -0
  376. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/__main__.py +0 -0
  377. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/analysis.py +0 -0
  378. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/cli.py +0 -0
  379. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/config.py +0 -0
  380. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/errors.py +0 -0
  381. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/generator.py +0 -0
  382. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/ir.py +0 -0
  383. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/names.py +0 -0
  384. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/rendering.py +0 -0
  385. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/transforms.py +0 -0
  386. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/jsonschema/codegen/typing.py +0 -0
  387. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/__init__.py +0 -0
  388. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/building.py +0 -0
  389. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/compression.py +0 -0
  390. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/data.py +0 -0
  391. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/datarefs.py +0 -0
  392. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/dataserver.py +0 -0
  393. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/loading.py +0 -0
  394. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/media.py +0 -0
  395. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/pack/__init__.py +0 -0
  396. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/pack/packing.py +0 -0
  397. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/pack/repositories.py +0 -0
  398. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/pack/unpacking.py +0 -0
  399. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/repositories.py +0 -0
  400. {omdev-0.0.29 → omdev-0.0.30}/omdev/specs/oci/tars.py +0 -0
  401. {omdev-0.0.29 → omdev-0.0.30}/omdev/tagstrings.py +0 -0
  402. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/__init__.py +0 -0
  403. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/cloc.py +0 -0
  404. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/diff.py +0 -0
  405. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/doc.py +0 -0
  406. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/docker.py +0 -0
  407. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/git/__init__.py +0 -0
  408. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/git/__main__.py +0 -0
  409. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/git/cli.py +0 -0
  410. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/git/cloning.py +0 -0
  411. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/git/consts.py +0 -0
  412. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/git/messages.py +0 -0
  413. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/json/__init__.py +0 -0
  414. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/json/__main__.py +0 -0
  415. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/json/cli.py +0 -0
  416. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/json/formats.py +0 -0
  417. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/json/io.py +0 -0
  418. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/json/parsing.py +0 -0
  419. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/json/processing.py +0 -0
  420. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/json/rendering.py +0 -0
  421. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/jsonview/__init__.py +0 -0
  422. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/jsonview/__main__.py +0 -0
  423. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/jsonview/cli.py +0 -0
  424. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  425. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/jsonview/resources/jsonview.html.j2 +0 -0
  426. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  427. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/linehisto.py +0 -0
  428. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/mkenv.py +0 -0
  429. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/notebook.py +0 -0
  430. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/ocr.py +0 -0
  431. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/pawk/README.md +0 -0
  432. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/pawk/__init__.py +0 -0
  433. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/pawk/__main__.py +0 -0
  434. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/pawk/pawk.py +0 -0
  435. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/pip.py +0 -0
  436. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/prof.py +0 -0
  437. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/qr.py +0 -0
  438. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/shadow.py +0 -0
  439. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/shell.py +0 -0
  440. {omdev-0.0.29 → omdev-0.0.30}/omdev/tools/sqlrepl.py +0 -0
  441. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/__init__.py +0 -0
  442. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/__init__.py +0 -0
  443. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/edit/__init__.py +0 -0
  444. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/edit/main.py +0 -0
  445. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/irc/__init__.py +0 -0
  446. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/irc/__main__.py +0 -0
  447. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/irc/app.py +0 -0
  448. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/irc/client.py +0 -0
  449. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/irc/commands.py +0 -0
  450. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/irc/main.py +0 -0
  451. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/jtree/LICENSE +0 -0
  452. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/jtree/__init__.py +0 -0
  453. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/jtree/__main__.py +0 -0
  454. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/jtree/app.py +0 -0
  455. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/jtree/cli.py +0 -0
  456. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/jtree/styles/layout.tcss +0 -0
  457. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/jtree/utils.py +0 -0
  458. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/jtree/widgets.py +0 -0
  459. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/markdown/__init__.py +0 -0
  460. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/markdown/__main__.py +0 -0
  461. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/apps/markdown/cli.py +0 -0
  462. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/__init__.py +0 -0
  463. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/console2.py +0 -0
  464. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/diff/LICENSE +0 -0
  465. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/diff/__init__.py +0 -0
  466. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/diff/__main__.py +0 -0
  467. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/diff/_compat.py +0 -0
  468. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/diff/cli.py +0 -0
  469. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/diff/renderables.py +0 -0
  470. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/diff/rendering.py +0 -0
  471. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/diff/underlinebar.py +0 -0
  472. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/markdown2.py +0 -0
  473. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/textual/__init__.py +0 -0
  474. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/textual/dark.py +0 -0
  475. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/textual/dump.py +0 -0
  476. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/textual/themes.py +0 -0
  477. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/rich/trirule.py +0 -0
  478. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/__init__.py +0 -0
  479. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/actionmenu.py +0 -0
  480. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/LICENSE +0 -0
  481. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/__init__.py +0 -0
  482. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/client.py +0 -0
  483. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/previews/__init__.py +0 -0
  484. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/previews/borders.py +0 -0
  485. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/previews/colors.py +0 -0
  486. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/previews/colors.tcss +0 -0
  487. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/previews/easing.py +0 -0
  488. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/previews/easing.tcss +0 -0
  489. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/previews/keys.py +0 -0
  490. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/protocol.py +0 -0
  491. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/redirect_output.py +0 -0
  492. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/renderables.py +0 -0
  493. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/server.py +0 -0
  494. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/service.py +0 -0
  495. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/tools/__init__.py +0 -0
  496. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/altdevtools/tools/diagnose.py +0 -0
  497. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/app2.py +0 -0
  498. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/autocomplete/LICENSE +0 -0
  499. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/autocomplete/__init__.py +0 -0
  500. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/autocomplete/matching.py +0 -0
  501. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/autocomplete/paths.py +0 -0
  502. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/autocomplete/widget.py +0 -0
  503. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/binding2.py +0 -0
  504. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/clipboard.py +0 -0
  505. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/debug/__init__.py +0 -0
  506. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/debug/dominfo.py +0 -0
  507. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/debug/screen.py +0 -0
  508. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/devtools.py +0 -0
  509. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/dom2.py +0 -0
  510. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/drivers2.py +0 -0
  511. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/logging2.py +0 -0
  512. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/render2.py +0 -0
  513. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/screen2.py +0 -0
  514. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/types.py +0 -0
  515. {omdev-0.0.29 → omdev-0.0.30}/omdev/tui/textual/widgets2.py +0 -0
  516. {omdev-0.0.29 → omdev-0.0.30}/omdev.egg-info/SOURCES.txt +0 -0
  517. {omdev-0.0.29 → omdev-0.0.30}/omdev.egg-info/dependency_links.txt +0 -0
  518. {omdev-0.0.29 → omdev-0.0.30}/omdev.egg-info/entry_points.txt +0 -0
  519. {omdev-0.0.29 → omdev-0.0.30}/omdev.egg-info/top_level.txt +0 -0
  520. {omdev-0.0.29 → omdev-0.0.30}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.29
3
+ Version: 0.0.30
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -13,10 +13,10 @@ Classifier: Programming Language :: Python :: 3.14
13
13
  Requires-Python: >=3.14
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
- Requires-Dist: omcore==0.0.29
16
+ Requires-Dist: omcore==0.0.30
17
17
  Provides-Extra: all
18
- Requires-Dist: ominfra==0.0.29; extra == "all"
19
- Requires-Dist: omllm==0.0.29; extra == "all"
18
+ Requires-Dist: ominfra==0.0.30; extra == "all"
19
+ Requires-Dist: omllm==0.0.30; extra == "all"
20
20
  Requires-Dist: black~=26.5; extra == "all"
21
21
  Requires-Dist: pycparser~=3.0; extra == "all"
22
22
  Requires-Dist: pcpp~=1.30; extra == "all"
@@ -35,9 +35,9 @@ Requires-Dist: textual~=8.2; extra == "all"
35
35
  Requires-Dist: textual-dev~=1.8; extra == "all"
36
36
  Requires-Dist: textual-speedups~=0.2; extra == "all"
37
37
  Provides-Extra: ominfra
38
- Requires-Dist: ominfra==0.0.29; extra == "ominfra"
38
+ Requires-Dist: ominfra==0.0.30; extra == "ominfra"
39
39
  Provides-Extra: omllm
40
- Requires-Dist: omllm==0.0.29; extra == "omllm"
40
+ Requires-Dist: omllm==0.0.30; extra == "omllm"
41
41
  Provides-Extra: black
42
42
  Requires-Dist: black~=26.5; extra == "black"
43
43
  Provides-Extra: c
@@ -42,10 +42,10 @@ def __om_amalg__(): # noqa
42
42
  dict(path='../../omcore/lite/check.py', sha1='62b9ccea94c4f7bcef97e7adae8674b8cb11d4af'),
43
43
  dict(path='../../omcore/lite/io.py', sha1='a60d94f0bdbb2b1541d363c301314682d1686240'),
44
44
  dict(path='../../omcore/lite/objects.py', sha1='9566bbf3530fd71fcc56321485216b592fae21e9'),
45
- dict(path='../../omcore/lite/reflect.py', sha1='c4fec44bf144e9d93293c996af06f6c65fc5e63d'),
46
- dict(path='../../omcore/lite/strings.py', sha1='89631bb5cfd6496176db71ab3abd58b89872068b'),
45
+ dict(path='../../omcore/lite/reflect.py', sha1='fab4ef6f45f278ce7bffcd811cd170b40db107a8'),
46
+ dict(path='../../omcore/lite/strings.py', sha1='b31b8e4b0e4fec4562ea3fa602e4ef2475e5fe7c'),
47
47
  dict(path='../../omcore/lite/json.py', sha1='01124e62093ebd4078602f16df0ec04cb724a612'),
48
- dict(path='../../omcore/lite/marshal.py', sha1='94561fd6c1adc06d87a62cc9750290ac263fc824'),
48
+ dict(path='../../omcore/lite/marshal.py', sha1='9b3f4ff802344313147f412f8f028922afc52b2f'),
49
49
  dict(path='dumping.py', sha1='f385a4502d279cf76e4a2bd69efac82881117e57'),
50
50
  ],
51
51
  )
@@ -911,7 +911,8 @@ def is_generic_alias(obj: ta.Any, *, origin: ta.Any = None) -> bool:
911
911
  )
912
912
 
913
913
 
914
- is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
914
+ # ta.get_origin returns the collections.abc class, never the typing alias.
915
+ is_callable_alias = functools.partial(is_generic_alias, origin=ta.get_origin(ta.Callable[..., ta.Any]))
915
916
 
916
917
 
917
918
  ##
@@ -1015,10 +1016,10 @@ def is_dunder(name: str) -> bool:
1015
1016
 
1016
1017
  def is_sunder(name: str) -> bool:
1017
1018
  return (
1019
+ len(name) > 2 and
1018
1020
  name[0] == name[-1] == '_' and
1019
1021
  name[1:2] != '_' and
1020
- name[-2:-1] != '_' and
1021
- len(name) > 2
1022
+ name[-2:-1] != '_'
1022
1023
  )
1023
1024
 
1024
1025
 
@@ -1032,22 +1033,25 @@ def strip_with_newline(s: str) -> str:
1032
1033
 
1033
1034
 
1034
1035
  @ta.overload
1035
- def split_keep_delimiter(s: str, d: str) -> str: ...
1036
+ def split_keep_delimiter(s: str, d: str) -> ta.List[str]: ...
1036
1037
 
1037
1038
 
1038
1039
  @ta.overload
1039
- def split_keep_delimiter(s: bytes, d: bytes) -> bytes: ...
1040
+ def split_keep_delimiter(s: bytes, d: bytes) -> ta.List[bytes]: ...
1040
1041
 
1041
1042
 
1042
1043
  def split_keep_delimiter(s, d):
1044
+ if not d:
1045
+ raise ValueError(d)
1046
+ dl = len(d)
1043
1047
  ps = []
1044
1048
  i = 0
1045
1049
  while i < len(s):
1046
1050
  if (n := s.find(d, i)) < i:
1047
1051
  ps.append(s[i:])
1048
1052
  break
1049
- ps.append(s[i:n + 1])
1050
- i = n + 1
1053
+ ps.append(s[i:n + dl])
1054
+ i = n + dl
1051
1055
  return ps
1052
1056
 
1053
1057
 
@@ -1312,12 +1316,27 @@ class PrimitiveUnionObjMarshaler(ObjMarshaler):
1312
1316
  raise TypeError(o)
1313
1317
 
1314
1318
  def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
1319
+ if self._x is not None:
1320
+ # The non-primitive member must be tried first - its marshaled form may itself be one of the union's
1321
+ # primitive types (e.g. Union[str, Decimal] wires Decimal as a str), which primitive-first dispatch would
1322
+ # shadow entirely. Such wire values are inherently ambiguous - the non-primitive parse is accepted only
1323
+ # when it faithfully round-trips back to the wire value, so lenient member unmarshalers (e.g. a Sequence
1324
+ # member iterating a str) don't capture values belonging to a primitive member.
1325
+ try:
1326
+ v = self._x.unmarshal(o, ctx)
1327
+ except Exception: # noqa
1328
+ pass
1329
+ else:
1330
+ if not isinstance(o, self._pt):
1331
+ return v
1332
+ try:
1333
+ if self._x.marshal(v, ctx) == o:
1334
+ return v
1335
+ except Exception: # noqa
1336
+ pass
1315
1337
  if isinstance(o, self._pt):
1316
1338
  return o
1317
- elif self._x is not None:
1318
- return self._x.unmarshal(o, ctx)
1319
- else:
1320
- raise TypeError(o)
1339
+ raise TypeError(o)
1321
1340
 
1322
1341
 
1323
1342
  class LiteralObjMarshaler(ObjMarshaler):
@@ -1704,7 +1723,7 @@ class ObjMarshalerManagerImpl(ObjMarshalerManager):
1704
1723
  self._registered_obj_marshalers = registered_obj_marshalers
1705
1724
 
1706
1725
  self._lock = threading.RLock()
1707
- self._marshalers: ta.Dict[ta.Any, ObjMarshaler] = dict(_DEFAULT_OBJ_MARSHALERS)
1726
+ self._derived_obj_marshalers: ta.Dict[ta.Any, ObjMarshaler] = {}
1708
1727
  self._proxies: ta.Dict[ta.Any, ProxyObjMarshaler] = {}
1709
1728
 
1710
1729
  #
@@ -1713,6 +1732,20 @@ class ObjMarshalerManagerImpl(ObjMarshalerManager):
1713
1732
  def _is_abstract(cls, ty: type) -> bool:
1714
1733
  return abc.ABC in ty.__bases__ or Abstract in ty.__bases__
1715
1734
 
1735
+ @classmethod
1736
+ def _get_field_type_hints(cls, ty: type) -> ta.Optional[ta.Mapping[str, ta.Any]]:
1737
+ """
1738
+ Best-effort resolution of string / forward-ref field annotations (`from __future__ import annotations` modules,
1739
+ self-referential fields) against their defining modules' namespaces, mro-aware. Returns None on failure (e.g.
1740
+ TYPE_CHECKING-only names, classes exec'd into namespaces absent from sys.modules) - callers fall back to the
1741
+ raw annotations, preserving behavior for already-evaluated ones.
1742
+ """
1743
+
1744
+ try:
1745
+ return ta.get_type_hints(ty)
1746
+ except Exception: # noqa
1747
+ return None
1748
+
1716
1749
  #
1717
1750
 
1718
1751
  def make_obj_marshaler(
@@ -1761,29 +1794,38 @@ class ObjMarshalerManagerImpl(ObjMarshalerManager):
1761
1794
  return EnumObjMarshaler(ty)
1762
1795
 
1763
1796
  if dc.is_dataclass(ty):
1797
+ hints = self._get_field_type_hints(ty) or {}
1764
1798
  return FieldsObjMarshaler(
1765
1799
  ty,
1766
1800
  [
1767
1801
  FieldsObjMarshaler.Field(
1768
1802
  att=f.name,
1769
1803
  key=check.non_empty_str(fk),
1770
- m=rec(f.type),
1804
+ m=rec(hints.get(f.name, f.type)),
1771
1805
  omit_if_none=check.isinstance(f.metadata.get(OBJ_MARSHALER_OMIT_IF_NONE, False), bool),
1772
1806
  )
1773
1807
  for f in dc.fields(ty)
1808
+ # init=False fields are excluded from both directions - unmarshal passes every key as a ctor
1809
+ # kwarg, so marshaling them would produce round-trip-asymmetric output.
1810
+ if f.init
1774
1811
  if (fk := f.metadata.get(OBJ_MARSHALER_FIELD_KEY, f.name)) is not None
1775
1812
  ],
1776
1813
  non_strict=non_strict_fields,
1777
1814
  )
1778
1815
 
1779
1816
  if issubclass(ty, tuple) and hasattr(ty, '_fields'):
1817
+ hints = self._get_field_type_hints(ty) or {}
1780
1818
  return FieldsObjMarshaler(
1781
1819
  ty,
1782
1820
  [
1783
1821
  FieldsObjMarshaler.Field(
1784
1822
  att=p.name,
1785
1823
  key=p.name,
1786
- m=rec(p.annotation),
1824
+ # Untyped collections.namedtuple fields have empty annotations - marshal them dynamically.
1825
+ m=rec(hints.get(
1826
+ p.name,
1827
+ p.annotation if p.annotation is not inspect.Parameter.empty else ta.Any,
1828
+ )),
1787
1829
  )
1788
1830
  for p in inspect.signature(ty).parameters.values()
1789
1831
  ],
@@ -1874,12 +1916,21 @@ class ObjMarshalerManagerImpl(ObjMarshalerManager):
1874
1916
  **kwargs: ta.Any,
1875
1917
  ) -> ObjMarshaler:
1876
1918
  with self._lock:
1919
+ ck = (ty, tuple(sorted(kwargs.items())))
1877
1920
  if not no_cache:
1921
+ # Explicitly set marshalers (and the defaults) are authoritative regardless of construction kwargs.
1878
1922
  try:
1879
1923
  return self._obj_marshalers[ty]
1880
1924
  except KeyError:
1881
1925
  pass
1882
1926
 
1927
+ # Derived marshalers are cached under their construction kwargs - a strict marshaler must not be
1928
+ # returned for a non-strict request, nor vice versa.
1929
+ try:
1930
+ return self._derived_obj_marshalers[ck]
1931
+ except KeyError:
1932
+ pass
1933
+
1883
1934
  try:
1884
1935
  return self._proxies[ty]
1885
1936
  except KeyError:
@@ -1900,7 +1951,7 @@ class ObjMarshalerManagerImpl(ObjMarshalerManager):
1900
1951
  p._m = m # noqa
1901
1952
 
1902
1953
  if not no_cache:
1903
- self._obj_marshalers[ty] = m
1954
+ self._derived_obj_marshalers[ck] = m
1904
1955
  return m
1905
1956
 
1906
1957
  def make_context(self, opts: ta.Optional[ObjMarshalOptions]) -> 'ObjMarshalContext':
@@ -245,11 +245,6 @@ class DataclassCodeGen:
245
245
  if not _is_generated_py_file(gen_file_path):
246
246
  raise RuntimeError(f'Refusing to overwrite non-generated file: {gen_file_path!r}')
247
247
 
248
- if not output.dumped:
249
- if not self._dry_run:
250
- os.unlink(gen_file_path)
251
- return
252
-
253
248
  #
254
249
 
255
250
  lines = [
@@ -27,9 +27,16 @@ rbenv_versions = [
27
27
  ]
28
28
 
29
29
  uv_python_versions = [
30
+ '3.8',
31
+ '3.9',
32
+ '3.10',
33
+ '3.11',
34
+ '3.12',
30
35
  '3.13',
31
36
  '3.14',
32
37
  '3.14+freethreaded',
38
+ '3.15',
39
+ '3.15+freethreaded',
33
40
  ]
34
41
 
35
42
  pyenv_version_keys = [
@@ -49,7 +49,7 @@ def gen_ops(cfg: Config) -> ta.Sequence[Op]:
49
49
  Env([
50
50
  ('LANG', 'en_US.UTF-8'),
51
51
  ('LANGUAGE', 'en_US:en'),
52
- ('LC_ALL', 'en_US.UTF-8'),
52
+ ('LC_COLLATE', 'C'),
53
53
  ]),
54
54
  ]))
55
55
 
@@ -12,8 +12,8 @@
12
12
  "14d": "3.14.6d",
13
13
  "14t": "3.14.6t",
14
14
  "14dt": "3.14.6dt",
15
- "15": "3.15.0b3",
16
- "15d": "3.15.0b3d",
17
- "15t": "3.15.0b3t",
18
- "15dt": "3.15.0b3dt"
15
+ "15": "3.15.0b4",
16
+ "15d": "3.15.0b4d",
17
+ "15t": "3.15.0b4t",
18
+ "15dt": "3.15.0b4dt"
19
19
  }
@@ -3,18 +3,23 @@ deps = [
3
3
  'gdb',
4
4
  'lcov',
5
5
  'libbz2-dev',
6
+ 'libexpat1-dev',
6
7
  'libffi-dev',
7
8
  'libgdbm-compat-dev',
8
9
  'libgdbm-dev',
9
10
  'liblzma-dev',
10
11
  'libncurses5-dev',
12
+ 'libnsl-dev',
13
+ 'libreadline-dev',
11
14
  'libreadline6-dev',
12
15
  'libsqlite3-dev',
13
16
  'libssl-dev',
17
+ 'libzstd-dev',
14
18
  'lzma',
15
19
  'lzma-dev',
16
20
  'pkg-config',
17
21
  'tk-dev',
18
22
  'uuid-dev',
23
+ 'xz-utils',
19
24
  'zlib1g-dev',
20
25
  ]
@@ -38,12 +38,12 @@ def __om_amalg__(): # noqa
38
38
  return dict(
39
39
  src_files=[
40
40
  dict(path='../../omcore/lite/abstract.py', sha1='a2fc3f3697fa8de5247761e9d554e70176f37aac'),
41
- dict(path='../../omcore/lite/cached.py', sha1='0c33cf961ac8f0727284303c7a30c5ea98f714f2'),
41
+ dict(path='../../omcore/lite/cached.py', sha1='4f5466ce20a485428519e284b2a388a9ef8e4786'),
42
42
  dict(path='../../omcore/lite/check.py', sha1='62b9ccea94c4f7bcef97e7adae8674b8cb11d4af'),
43
43
  dict(path='../../omcore/lite/objects.py', sha1='9566bbf3530fd71fcc56321485216b592fae21e9'),
44
- dict(path='../../omcore/lite/reflect.py', sha1='c4fec44bf144e9d93293c996af06f6c65fc5e63d'),
45
- dict(path='../../omcore/lite/strings.py', sha1='89631bb5cfd6496176db71ab3abd58b89872068b'),
46
- dict(path='../../omcore/lite/marshal.py', sha1='94561fd6c1adc06d87a62cc9750290ac263fc824'),
44
+ dict(path='../../omcore/lite/reflect.py', sha1='fab4ef6f45f278ce7bffcd811cd170b40db107a8'),
45
+ dict(path='../../omcore/lite/strings.py', sha1='b31b8e4b0e4fec4562ea3fa602e4ef2475e5fe7c'),
46
+ dict(path='../../omcore/lite/marshal.py', sha1='9b3f4ff802344313147f412f8f028922afc52b2f'),
47
47
  dict(path='dumping.py', sha1='4837c54c1019dcb85fbfaa8086f5efb98025358a'),
48
48
  ],
49
49
  )
@@ -233,6 +233,8 @@ class _AbstractCachedNullary:
233
233
  raise TypeError
234
234
 
235
235
  def __get__(self, instance, owner=None): # noqa
236
+ if instance is None:
237
+ return self
236
238
  bound = instance.__dict__[self._fn.__name__] = self.__class__(self._fn.__get__(instance, owner))
237
239
  return bound
238
240
 
@@ -1007,7 +1009,8 @@ def is_generic_alias(obj: ta.Any, *, origin: ta.Any = None) -> bool:
1007
1009
  )
1008
1010
 
1009
1011
 
1010
- is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
1012
+ # ta.get_origin returns the collections.abc class, never the typing alias.
1013
+ is_callable_alias = functools.partial(is_generic_alias, origin=ta.get_origin(ta.Callable[..., ta.Any]))
1011
1014
 
1012
1015
 
1013
1016
  ##
@@ -1111,10 +1114,10 @@ def is_dunder(name: str) -> bool:
1111
1114
 
1112
1115
  def is_sunder(name: str) -> bool:
1113
1116
  return (
1117
+ len(name) > 2 and
1114
1118
  name[0] == name[-1] == '_' and
1115
1119
  name[1:2] != '_' and
1116
- name[-2:-1] != '_' and
1117
- len(name) > 2
1120
+ name[-2:-1] != '_'
1118
1121
  )
1119
1122
 
1120
1123
 
@@ -1128,22 +1131,25 @@ def strip_with_newline(s: str) -> str:
1128
1131
 
1129
1132
 
1130
1133
  @ta.overload
1131
- def split_keep_delimiter(s: str, d: str) -> str: ...
1134
+ def split_keep_delimiter(s: str, d: str) -> ta.List[str]: ...
1132
1135
 
1133
1136
 
1134
1137
  @ta.overload
1135
- def split_keep_delimiter(s: bytes, d: bytes) -> bytes: ...
1138
+ def split_keep_delimiter(s: bytes, d: bytes) -> ta.List[bytes]: ...
1136
1139
 
1137
1140
 
1138
1141
  def split_keep_delimiter(s, d):
1142
+ if not d:
1143
+ raise ValueError(d)
1144
+ dl = len(d)
1139
1145
  ps = []
1140
1146
  i = 0
1141
1147
  while i < len(s):
1142
1148
  if (n := s.find(d, i)) < i:
1143
1149
  ps.append(s[i:])
1144
1150
  break
1145
- ps.append(s[i:n + 1])
1146
- i = n + 1
1151
+ ps.append(s[i:n + dl])
1152
+ i = n + dl
1147
1153
  return ps
1148
1154
 
1149
1155
 
@@ -1315,12 +1321,27 @@ class PrimitiveUnionObjMarshaler(ObjMarshaler):
1315
1321
  raise TypeError(o)
1316
1322
 
1317
1323
  def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
1324
+ if self._x is not None:
1325
+ # The non-primitive member must be tried first - its marshaled form may itself be one of the union's
1326
+ # primitive types (e.g. Union[str, Decimal] wires Decimal as a str), which primitive-first dispatch would
1327
+ # shadow entirely. Such wire values are inherently ambiguous - the non-primitive parse is accepted only
1328
+ # when it faithfully round-trips back to the wire value, so lenient member unmarshalers (e.g. a Sequence
1329
+ # member iterating a str) don't capture values belonging to a primitive member.
1330
+ try:
1331
+ v = self._x.unmarshal(o, ctx)
1332
+ except Exception: # noqa
1333
+ pass
1334
+ else:
1335
+ if not isinstance(o, self._pt):
1336
+ return v
1337
+ try:
1338
+ if self._x.marshal(v, ctx) == o:
1339
+ return v
1340
+ except Exception: # noqa
1341
+ pass
1318
1342
  if isinstance(o, self._pt):
1319
1343
  return o
1320
- elif self._x is not None:
1321
- return self._x.unmarshal(o, ctx)
1322
- else:
1323
- raise TypeError(o)
1344
+ raise TypeError(o)
1324
1345
 
1325
1346
 
1326
1347
  class LiteralObjMarshaler(ObjMarshaler):
@@ -1707,7 +1728,7 @@ class ObjMarshalerManagerImpl(ObjMarshalerManager):
1707
1728
  self._registered_obj_marshalers = registered_obj_marshalers
1708
1729
 
1709
1730
  self._lock = threading.RLock()
1710
- self._marshalers: ta.Dict[ta.Any, ObjMarshaler] = dict(_DEFAULT_OBJ_MARSHALERS)
1731
+ self._derived_obj_marshalers: ta.Dict[ta.Any, ObjMarshaler] = {}
1711
1732
  self._proxies: ta.Dict[ta.Any, ProxyObjMarshaler] = {}
1712
1733
 
1713
1734
  #
@@ -1716,6 +1737,20 @@ class ObjMarshalerManagerImpl(ObjMarshalerManager):
1716
1737
  def _is_abstract(cls, ty: type) -> bool:
1717
1738
  return abc.ABC in ty.__bases__ or Abstract in ty.__bases__
1718
1739
 
1740
+ @classmethod
1741
+ def _get_field_type_hints(cls, ty: type) -> ta.Optional[ta.Mapping[str, ta.Any]]:
1742
+ """
1743
+ Best-effort resolution of string / forward-ref field annotations (`from __future__ import annotations` modules,
1744
+ self-referential fields) against their defining modules' namespaces, mro-aware. Returns None on failure (e.g.
1745
+ TYPE_CHECKING-only names, classes exec'd into namespaces absent from sys.modules) - callers fall back to the
1746
+ raw annotations, preserving behavior for already-evaluated ones.
1747
+ """
1748
+
1749
+ try:
1750
+ return ta.get_type_hints(ty)
1751
+ except Exception: # noqa
1752
+ return None
1753
+
1719
1754
  #
1720
1755
 
1721
1756
  def make_obj_marshaler(
@@ -1764,29 +1799,38 @@ class ObjMarshalerManagerImpl(ObjMarshalerManager):
1764
1799
  return EnumObjMarshaler(ty)
1765
1800
 
1766
1801
  if dc.is_dataclass(ty):
1802
+ hints = self._get_field_type_hints(ty) or {}
1767
1803
  return FieldsObjMarshaler(
1768
1804
  ty,
1769
1805
  [
1770
1806
  FieldsObjMarshaler.Field(
1771
1807
  att=f.name,
1772
1808
  key=check.non_empty_str(fk),
1773
- m=rec(f.type),
1809
+ m=rec(hints.get(f.name, f.type)),
1774
1810
  omit_if_none=check.isinstance(f.metadata.get(OBJ_MARSHALER_OMIT_IF_NONE, False), bool),
1775
1811
  )
1776
1812
  for f in dc.fields(ty)
1813
+ # init=False fields are excluded from both directions - unmarshal passes every key as a ctor
1814
+ # kwarg, so marshaling them would produce round-trip-asymmetric output.
1815
+ if f.init
1777
1816
  if (fk := f.metadata.get(OBJ_MARSHALER_FIELD_KEY, f.name)) is not None
1778
1817
  ],
1779
1818
  non_strict=non_strict_fields,
1780
1819
  )
1781
1820
 
1782
1821
  if issubclass(ty, tuple) and hasattr(ty, '_fields'):
1822
+ hints = self._get_field_type_hints(ty) or {}
1783
1823
  return FieldsObjMarshaler(
1784
1824
  ty,
1785
1825
  [
1786
1826
  FieldsObjMarshaler.Field(
1787
1827
  att=p.name,
1788
1828
  key=p.name,
1789
- m=rec(p.annotation),
1829
+ # Untyped collections.namedtuple fields have empty annotations - marshal them dynamically.
1830
+ m=rec(hints.get(
1831
+ p.name,
1832
+ p.annotation if p.annotation is not inspect.Parameter.empty else ta.Any,
1833
+ )),
1790
1834
  )
1791
1835
  for p in inspect.signature(ty).parameters.values()
1792
1836
  ],
@@ -1877,12 +1921,21 @@ class ObjMarshalerManagerImpl(ObjMarshalerManager):
1877
1921
  **kwargs: ta.Any,
1878
1922
  ) -> ObjMarshaler:
1879
1923
  with self._lock:
1924
+ ck = (ty, tuple(sorted(kwargs.items())))
1880
1925
  if not no_cache:
1926
+ # Explicitly set marshalers (and the defaults) are authoritative regardless of construction kwargs.
1881
1927
  try:
1882
1928
  return self._obj_marshalers[ty]
1883
1929
  except KeyError:
1884
1930
  pass
1885
1931
 
1932
+ # Derived marshalers are cached under their construction kwargs - a strict marshaler must not be
1933
+ # returned for a non-strict request, nor vice versa.
1934
+ try:
1935
+ return self._derived_obj_marshalers[ck]
1936
+ except KeyError:
1937
+ pass
1938
+
1886
1939
  try:
1887
1940
  return self._proxies[ty]
1888
1941
  except KeyError:
@@ -1903,7 +1956,7 @@ class ObjMarshalerManagerImpl(ObjMarshalerManager):
1903
1956
  p._m = m # noqa
1904
1957
 
1905
1958
  if not no_cache:
1906
- self._obj_marshalers[ty] = m
1959
+ self._derived_obj_marshalers[ck] = m
1907
1960
  return m
1908
1961
 
1909
1962
  def make_context(self, opts: ta.Optional[ObjMarshalOptions]) -> 'ObjMarshalContext':