omdev 0.0.0.dev402__tar.gz → 0.0.0.dev404__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 (335) hide show
  1. {omdev-0.0.0.dev402/omdev.egg-info → omdev-0.0.0.dev404}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/.manifests.json +1 -1
  3. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cli/types.py +1 -0
  4. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/manifests/_dumping.py +44 -28
  5. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/scripts/execstat.py +16 -3
  6. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/scripts/ci.py +44 -27
  7. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/scripts/interp.py +21 -4
  8. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/scripts/pyproject.py +54 -27
  9. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/git/messages.py +1 -1
  10. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404/omdev.egg-info}/PKG-INFO +2 -2
  11. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev.egg-info/requires.txt +1 -1
  12. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/pyproject.toml +2 -2
  13. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/LICENSE +0 -0
  14. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/MANIFEST.in +0 -0
  15. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/README.md +0 -0
  16. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/__about__.py +0 -0
  17. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/__init__.py +0 -0
  18. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/__init__.py +0 -0
  19. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/__main__.py +0 -0
  20. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/gen.py +0 -0
  21. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/imports.py +0 -0
  22. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/main.py +0 -0
  23. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/manifests.py +0 -0
  24. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/resources.py +0 -0
  25. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/srcfiles.py +0 -0
  26. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/strip.py +0 -0
  27. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/types.py +0 -0
  28. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/amalg/typing.py +0 -0
  29. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/__init__.py +0 -0
  30. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/compute/__init__.py +0 -0
  31. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/compute/cache.py +0 -0
  32. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/compute/contexts.py +0 -0
  33. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/compute/currents.py +0 -0
  34. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/compute/fns.py +0 -0
  35. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/compute/resolvers.py +0 -0
  36. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/compute/storage.py +0 -0
  37. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/compute/types.py +0 -0
  38. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/data/__init__.py +0 -0
  39. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/data/actions.py +0 -0
  40. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/data/cache.py +0 -0
  41. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/data/consts.py +0 -0
  42. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/data/defaults.py +0 -0
  43. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/data/manifests.py +0 -0
  44. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cache/data/specs.py +0 -0
  45. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/capi/__init__.py +0 -0
  46. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/capi/darwin/__init__.py +0 -0
  47. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/capi/darwin/aps.py +0 -0
  48. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/capi/darwin/ax.py +0 -0
  49. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/capi/darwin/cf.py +0 -0
  50. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/capi/darwin/cg.py +0 -0
  51. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/capi/linux/__init__.py +0 -0
  52. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/capi/linux/x11.py +0 -0
  53. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cc/__init__.py +0 -0
  54. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cc/__main__.py +0 -0
  55. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cc/cdeps.py +0 -0
  56. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cc/cdeps.toml +0 -0
  57. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cc/cli.py +0 -0
  58. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cc/srclangs.py +0 -0
  59. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/__init__.py +0 -0
  60. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_boilerplate.cc +0 -0
  61. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/LICENSE +0 -0
  62. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/__init__.py +0 -0
  63. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/build_ext.py +0 -0
  64. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  65. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  66. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/compilers/options.py +0 -0
  67. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  68. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/dir_util.py +0 -0
  69. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/errors.py +0 -0
  70. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/extension.py +0 -0
  71. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/file_util.py +0 -0
  72. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/modified.py +0 -0
  73. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/spawn.py +0 -0
  74. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/sysconfig.py +0 -0
  75. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/util.py +0 -0
  76. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/_distutils/version.py +0 -0
  77. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/build.py +0 -0
  78. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/cmake.py +0 -0
  79. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/importhook.py +0 -0
  80. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/magic.py +0 -0
  81. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cexts/scan.py +0 -0
  82. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/__init__.py +0 -0
  83. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/__main__.py +0 -0
  84. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/cache.py +0 -0
  85. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/ci.py +0 -0
  86. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/cli.py +0 -0
  87. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/compose.py +0 -0
  88. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/consts.py +0 -0
  89. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/__init__.py +0 -0
  90. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/buildcaching.py +0 -0
  91. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/cache.py +0 -0
  92. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  93. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/cacheserved/cache.py +0 -0
  94. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  95. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/cmds.py +0 -0
  96. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/dataserver.py +0 -0
  97. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/imagepulling.py +0 -0
  98. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/inject.py +0 -0
  99. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/packing.py +0 -0
  100. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/repositories.py +0 -0
  101. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/docker/utils.py +0 -0
  102. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/__init__.py +0 -0
  103. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/api/__init__.py +0 -0
  104. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/api/clients.py +0 -0
  105. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/api/v1/__init__.py +0 -0
  106. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/api/v1/api.py +0 -0
  107. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/api/v1/client.py +0 -0
  108. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/api/v2/__init__.py +0 -0
  109. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/api/v2/api.py +0 -0
  110. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/api/v2/azure.py +0 -0
  111. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/api/v2/client.py +0 -0
  112. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/bootstrap.py +0 -0
  113. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/cache.py +0 -0
  114. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/cli.py +0 -0
  115. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/env.py +0 -0
  116. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/github/inject.py +0 -0
  117. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/inject.py +0 -0
  118. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/requirements.py +0 -0
  119. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/shell.py +0 -0
  120. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ci/utils.py +0 -0
  121. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cli/__init__.py +0 -0
  122. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cli/__main__.py +0 -0
  123. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cli/_pathhack.py +0 -0
  124. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cli/clicli.py +0 -0
  125. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cli/install.py +0 -0
  126. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cli/main.py +0 -0
  127. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cli/managers.py +0 -0
  128. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/clipboard/__init__.py +0 -0
  129. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/clipboard/clipboard.py +0 -0
  130. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/clipboard/darwin_cf.py +0 -0
  131. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/clipboard/linux_x11.py +0 -0
  132. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cmake.py +0 -0
  133. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cmdlog/__init__.py +0 -0
  134. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cmdlog/__main__.py +0 -0
  135. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cmdlog/_cmdlog.py +0 -0
  136. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cmdlog/cli.py +0 -0
  137. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/cmdlog/cmdlog.py +0 -0
  138. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/dataclasses/__init__.py +0 -0
  139. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/dataclasses/__main__.py +0 -0
  140. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/dataclasses/cli.py +0 -0
  141. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/dataclasses/codegen.py +0 -0
  142. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/dataserver/__init__.py +0 -0
  143. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/dataserver/handlers.py +0 -0
  144. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/dataserver/http.py +0 -0
  145. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/dataserver/routes.py +0 -0
  146. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/dataserver/server.py +0 -0
  147. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/dataserver/targets.py +0 -0
  148. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/git/__init__.py +0 -0
  149. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/git/magic.py +0 -0
  150. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/git/revisions.py +0 -0
  151. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/git/shallow.py +0 -0
  152. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/git/status.py +0 -0
  153. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/home/__init__.py +0 -0
  154. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/home/paths.py +0 -0
  155. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/home/secrets.py +0 -0
  156. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/home/shadow.py +0 -0
  157. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/imgur.py +0 -0
  158. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/intellij/__init__.py +0 -0
  159. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/intellij/cli.py +0 -0
  160. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/intellij/ides.py +0 -0
  161. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/intellij/open.py +0 -0
  162. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/__init__.py +0 -0
  163. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/__main__.py +0 -0
  164. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/cli.py +0 -0
  165. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/default.py +0 -0
  166. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/inject.py +0 -0
  167. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/inspect.py +0 -0
  168. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/providers/__init__.py +0 -0
  169. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/providers/base.py +0 -0
  170. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/providers/inject.py +0 -0
  171. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/providers/running.py +0 -0
  172. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/providers/standalone.py +0 -0
  173. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/providers/system.py +0 -0
  174. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/pyenv/__init__.py +0 -0
  175. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/pyenv/inject.py +0 -0
  176. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/pyenv/install.py +0 -0
  177. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/pyenv/provider.py +0 -0
  178. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/pyenv/pyenv.py +0 -0
  179. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/resolvers.py +0 -0
  180. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/types.py +0 -0
  181. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/uv/__init__.py +0 -0
  182. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/uv/inject.py +0 -0
  183. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/uv/provider.py +0 -0
  184. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/uv/uv.py +0 -0
  185. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/interp/venvs.py +0 -0
  186. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/magic/__init__.py +0 -0
  187. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/magic/__main__.py +0 -0
  188. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/magic/cli.py +0 -0
  189. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/magic/find.py +0 -0
  190. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/magic/magic.py +0 -0
  191. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/magic/prepare.py +0 -0
  192. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/magic/styles.py +0 -0
  193. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/manifests/__init__.py +0 -0
  194. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/manifests/__main__.py +0 -0
  195. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/manifests/building.py +0 -0
  196. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/manifests/dumping.py +0 -0
  197. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/manifests/main.py +0 -0
  198. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/mypy/__init__.py +0 -0
  199. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/mypy/debug.py +0 -0
  200. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/mypy/report.py +0 -0
  201. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/__init__.py +0 -0
  202. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/building.py +0 -0
  203. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/compression.py +0 -0
  204. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/data.py +0 -0
  205. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/datarefs.py +0 -0
  206. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/dataserver.py +0 -0
  207. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/loading.py +0 -0
  208. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/media.py +0 -0
  209. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/pack/__init__.py +0 -0
  210. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/pack/packing.py +0 -0
  211. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/pack/repositories.py +0 -0
  212. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/pack/unpacking.py +0 -0
  213. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/repositories.py +0 -0
  214. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/oci/tars.py +0 -0
  215. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/packaging/__init__.py +0 -0
  216. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/packaging/marshal.py +0 -0
  217. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/packaging/names.py +0 -0
  218. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/packaging/requires.py +0 -0
  219. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/packaging/revisions.py +0 -0
  220. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/packaging/specifiers.py +0 -0
  221. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/packaging/versions.py +0 -0
  222. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/packaging/wheelfile.py +0 -0
  223. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pip.py +0 -0
  224. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/__init__.py +0 -0
  225. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/__main__.py +0 -0
  226. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/base.py +0 -0
  227. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/caches.py +0 -0
  228. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/git.py +0 -0
  229. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/imports.py +0 -0
  230. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/lite.py +0 -0
  231. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/main.py +0 -0
  232. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/manifests.py +0 -0
  233. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/scripts.py +0 -0
  234. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/precheck/unicode.py +0 -0
  235. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/__init__.py +0 -0
  236. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/apps/__init__.py +0 -0
  237. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/apps/ncdu.py +0 -0
  238. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/confirm.py +0 -0
  239. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/markdown/LICENSE +0 -0
  240. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/markdown/__init__.py +0 -0
  241. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/markdown/__main__.py +0 -0
  242. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/markdown/border.py +0 -0
  243. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/markdown/cli.py +0 -0
  244. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/markdown/markdown.py +0 -0
  245. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/markdown/parser.py +0 -0
  246. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/markdown/styles.py +0 -0
  247. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/markdown/tags.py +0 -0
  248. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/ptk/markdown/utils.py +0 -0
  249. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/__init__.py +0 -0
  250. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/attrdocs.py +0 -0
  251. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/bracepy.py +0 -0
  252. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/classdot.py +0 -0
  253. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/docstrings/LICENSE +0 -0
  254. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/docstrings/__init__.py +0 -0
  255. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/docstrings/attrdoc.py +0 -0
  256. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/docstrings/common.py +0 -0
  257. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/docstrings/epydoc.py +0 -0
  258. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/docstrings/google.py +0 -0
  259. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/docstrings/numpydoc.py +0 -0
  260. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/docstrings/parser.py +0 -0
  261. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/docstrings/rest.py +0 -0
  262. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/findimports.py +0 -0
  263. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/scripts/__init__.py +0 -0
  264. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/scripts/bumpversion.py +0 -0
  265. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/scripts/importtrace.py +0 -0
  266. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/srcheaders.py +0 -0
  267. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/tools/__init__.py +0 -0
  268. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/tools/importscan.py +0 -0
  269. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/py/tools/mkrelimp.py +0 -0
  270. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/__init__.py +0 -0
  271. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/__main__.py +0 -0
  272. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/cexts.py +0 -0
  273. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/cli.py +0 -0
  274. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/configs.py +0 -0
  275. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/inject.py +0 -0
  276. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/pkg.py +0 -0
  277. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/reqs.py +0 -0
  278. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/resources/__init__.py +0 -0
  279. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/resources/docker-dev.sh +0 -0
  280. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/resources/python.sh +0 -0
  281. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/pyproject/venvs.py +0 -0
  282. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/scripts/__init__.py +0 -0
  283. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/scripts/slowcat.py +0 -0
  284. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/scripts/tmpexec.py +0 -0
  285. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tagstrings.py +0 -0
  286. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tokens/__init__.py +0 -0
  287. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tokens/all.py +0 -0
  288. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tokens/tokenizert.py +0 -0
  289. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tokens/utils.py +0 -0
  290. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/__init__.py +0 -0
  291. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/antlr/__init__.py +0 -0
  292. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/antlr/__main__.py +0 -0
  293. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/antlr/cli.py +0 -0
  294. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/antlr/consts.py +0 -0
  295. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/antlr/gen.py +0 -0
  296. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/cloc.py +0 -0
  297. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/diff.py +0 -0
  298. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/doc.py +0 -0
  299. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/docker.py +0 -0
  300. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/git/__init__.py +0 -0
  301. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/git/__main__.py +0 -0
  302. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/git/cli.py +0 -0
  303. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/git/cloning.py +0 -0
  304. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/git/consts.py +0 -0
  305. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/json/__init__.py +0 -0
  306. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/json/__main__.py +0 -0
  307. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/json/cli.py +0 -0
  308. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/json/formats.py +0 -0
  309. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/json/io.py +0 -0
  310. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/json/parsing.py +0 -0
  311. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/json/processing.py +0 -0
  312. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/json/rendering.py +0 -0
  313. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/jsonview/__init__.py +0 -0
  314. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/jsonview/__main__.py +0 -0
  315. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/jsonview/cli.py +0 -0
  316. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/jsonview/resources/__init__.py +0 -0
  317. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  318. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  319. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/linehisto.py +0 -0
  320. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/mkenv.py +0 -0
  321. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/notebook.py +0 -0
  322. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/pawk/__init__.py +0 -0
  323. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/pawk/__main__.py +0 -0
  324. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/pawk/pawk.py +0 -0
  325. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/pip.py +0 -0
  326. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/prof.py +0 -0
  327. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/qr.py +0 -0
  328. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/shadow.py +0 -0
  329. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/shell.py +0 -0
  330. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev/tools/sqlrepl.py +0 -0
  331. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev.egg-info/SOURCES.txt +0 -0
  332. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev.egg-info/dependency_links.txt +0 -0
  333. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev.egg-info/entry_points.txt +0 -0
  334. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/omdev.egg-info/top_level.txt +0 -0
  335. {omdev-0.0.0.dev402 → omdev-0.0.0.dev404}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev402
3
+ Version: 0.0.0.dev404
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.dev402
17
+ Requires-Dist: omlish==0.0.0.dev404
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.1; extra == "all"
20
20
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -236,7 +236,7 @@
236
236
  "module": ".py.scripts.execstat",
237
237
  "attr": "_CLI_MODULE",
238
238
  "file": "omdev/py/scripts/execstat.py",
239
- "line": 84,
239
+ "line": 86,
240
240
  "value": {
241
241
  "$.cli.types.CliModule": {
242
242
  "cmd_name": "py/execstat",
@@ -1,4 +1,5 @@
1
1
  # ruff: noqa: UP007 UP045
2
+ # @omlish-lite
2
3
  import dataclasses as dc
3
4
  import typing as ta
4
5
 
@@ -610,24 +610,40 @@ _GENERIC_ALIAS_TYPES = (
610
610
  )
611
611
 
612
612
 
613
- def is_generic_alias(obj, *, origin: ta.Any = None) -> bool:
613
+ def is_generic_alias(obj: ta.Any, *, origin: ta.Any = None) -> bool:
614
614
  return (
615
615
  isinstance(obj, _GENERIC_ALIAS_TYPES) and
616
616
  (origin is None or ta.get_origin(obj) is origin)
617
617
  )
618
618
 
619
619
 
620
- is_union_alias = functools.partial(is_generic_alias, origin=ta.Union)
621
620
  is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
622
621
 
623
622
 
624
623
  ##
625
624
 
626
625
 
626
+ _UNION_ALIAS_ORIGINS = frozenset([
627
+ ta.get_origin(ta.Optional[int]),
628
+ *(
629
+ [
630
+ ta.get_origin(int | None),
631
+ ta.get_origin(getattr(ta, 'TypeVar')('_T') | None),
632
+ ] if sys.version_info >= (3, 10) else ()
633
+ ),
634
+ ])
635
+
636
+
637
+ def is_union_alias(obj: ta.Any) -> bool:
638
+ return ta.get_origin(obj) in _UNION_ALIAS_ORIGINS
639
+
640
+
641
+ #
642
+
643
+
627
644
  def is_optional_alias(spec: ta.Any) -> bool:
628
645
  return (
629
- isinstance(spec, _GENERIC_ALIAS_TYPES) and # noqa
630
- ta.get_origin(spec) is ta.Union and
646
+ is_union_alias(spec) and
631
647
  len(ta.get_args(spec)) == 2 and
632
648
  any(a in (None, type(None)) for a in ta.get_args(spec))
633
649
  )
@@ -1304,32 +1320,32 @@ class ObjMarshalerManager:
1304
1320
  [e] = ta.get_args(ty)
1305
1321
  return IterableObjMarshaler(st, rec(e))
1306
1322
 
1307
- if is_union_alias(ty):
1308
- uts = frozenset(ta.get_args(ty))
1309
- if None in uts or type(None) in uts:
1310
- is_opt = True
1311
- uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
1312
- else:
1313
- is_opt = False
1323
+ if is_union_alias(ty):
1324
+ uts = frozenset(ta.get_args(ty))
1325
+ if None in uts or type(None) in uts:
1326
+ is_opt = True
1327
+ uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
1328
+ else:
1329
+ is_opt = False
1314
1330
 
1315
- um: ObjMarshaler
1316
- if not uts:
1317
- raise TypeError(ty)
1318
- elif len(uts) == 1:
1319
- um = rec(check.single(uts))
1331
+ um: ObjMarshaler
1332
+ if not uts:
1333
+ raise TypeError(ty)
1334
+ elif len(uts) == 1:
1335
+ um = rec(check.single(uts))
1336
+ else:
1337
+ pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
1338
+ np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
1339
+ if not np_uts:
1340
+ um = PrimitiveUnionObjMarshaler(pt)
1341
+ elif len(np_uts) == 1:
1342
+ um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
1320
1343
  else:
1321
- pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
1322
- np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
1323
- if not np_uts:
1324
- um = PrimitiveUnionObjMarshaler(pt)
1325
- elif len(np_uts) == 1:
1326
- um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
1327
- else:
1328
- raise TypeError(ty)
1329
-
1330
- if is_opt:
1331
- um = OptionalObjMarshaler(um)
1332
- return um
1344
+ raise TypeError(ty)
1345
+
1346
+ if is_opt:
1347
+ um = OptionalObjMarshaler(um)
1348
+ return um
1333
1349
 
1334
1350
  raise TypeError(ty)
1335
1351
 
@@ -3,9 +3,11 @@
3
3
  import argparse
4
4
  import inspect
5
5
  import json
6
+ import os.path
6
7
  import statistics
7
8
  import subprocess
8
9
  import sys
10
+ import tempfile
9
11
 
10
12
 
11
13
  ##
@@ -102,6 +104,8 @@ def _main() -> None:
102
104
 
103
105
  parser.add_argument('-P', '--precision', type=int, default=3)
104
106
 
107
+ parser.add_argument('--out-dir')
108
+
105
109
  parser.add_argument('-x', '--exe')
106
110
 
107
111
  args = parser.parse_args()
@@ -116,8 +120,13 @@ def _main() -> None:
116
120
  if (exe := args.exe) is None:
117
121
  exe = sys.executable
118
122
 
123
+ if (out_dir := args.out_dir) is None:
124
+ out_dir = tempfile.mkdtemp()
125
+
119
126
  results = []
120
127
  for i in range(n):
128
+ out_file = os.path.join(out_dir, f'{str(i).zfill(len(str(n)))}.json')
129
+
121
130
  run_kw = dict(
122
131
  src=args.src,
123
132
  setup=args.setup,
@@ -133,11 +142,15 @@ def _main() -> None:
133
142
  payload = '\n'.join([
134
143
  inspect.getsource(_run),
135
144
  f'dct = _run(**{run_kw!r})',
136
- 'import json',
137
- 'print(json.dumps(dct))',
145
+ f'import json',
146
+ f'with open({out_file!r}, "w") as f:', # noqa
147
+ f' print(f.write(json.dumps(dct)))',
138
148
  ])
139
149
 
140
- result = json.loads(subprocess.check_output([exe, '-c', payload]))
150
+ subprocess.check_call([exe, '-c', payload])
151
+
152
+ with open(out_file) as f:
153
+ result = json.load(f)
141
154
 
142
155
  results.append(result)
143
156
 
@@ -1433,24 +1433,40 @@ _GENERIC_ALIAS_TYPES = (
1433
1433
  )
1434
1434
 
1435
1435
 
1436
- def is_generic_alias(obj, *, origin: ta.Any = None) -> bool:
1436
+ def is_generic_alias(obj: ta.Any, *, origin: ta.Any = None) -> bool:
1437
1437
  return (
1438
1438
  isinstance(obj, _GENERIC_ALIAS_TYPES) and
1439
1439
  (origin is None or ta.get_origin(obj) is origin)
1440
1440
  )
1441
1441
 
1442
1442
 
1443
- is_union_alias = functools.partial(is_generic_alias, origin=ta.Union)
1444
1443
  is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
1445
1444
 
1446
1445
 
1447
1446
  ##
1448
1447
 
1449
1448
 
1449
+ _UNION_ALIAS_ORIGINS = frozenset([
1450
+ ta.get_origin(ta.Optional[int]),
1451
+ *(
1452
+ [
1453
+ ta.get_origin(int | None),
1454
+ ta.get_origin(getattr(ta, 'TypeVar')('_T') | None),
1455
+ ] if sys.version_info >= (3, 10) else ()
1456
+ ),
1457
+ ])
1458
+
1459
+
1460
+ def is_union_alias(obj: ta.Any) -> bool:
1461
+ return ta.get_origin(obj) in _UNION_ALIAS_ORIGINS
1462
+
1463
+
1464
+ #
1465
+
1466
+
1450
1467
  def is_optional_alias(spec: ta.Any) -> bool:
1451
1468
  return (
1452
- isinstance(spec, _GENERIC_ALIAS_TYPES) and # noqa
1453
- ta.get_origin(spec) is ta.Union and
1469
+ is_union_alias(spec) and
1454
1470
  len(ta.get_args(spec)) == 2 and
1455
1471
  any(a in (None, type(None)) for a in ta.get_args(spec))
1456
1472
  )
@@ -2830,6 +2846,7 @@ def _get_argparse_arg_ann_kwargs(ann: ta.Any) -> ta.Mapping[str, ta.Any]:
2830
2846
  class _ArgparseCliAnnotationBox:
2831
2847
  def __init__(self, annotations: ta.Mapping[str, ta.Any]) -> None:
2832
2848
  super().__init__()
2849
+
2833
2850
  self.__annotations__ = annotations # type: ignore
2834
2851
 
2835
2852
 
@@ -5269,32 +5286,32 @@ class ObjMarshalerManager:
5269
5286
  [e] = ta.get_args(ty)
5270
5287
  return IterableObjMarshaler(st, rec(e))
5271
5288
 
5272
- if is_union_alias(ty):
5273
- uts = frozenset(ta.get_args(ty))
5274
- if None in uts or type(None) in uts:
5275
- is_opt = True
5276
- uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
5277
- else:
5278
- is_opt = False
5289
+ if is_union_alias(ty):
5290
+ uts = frozenset(ta.get_args(ty))
5291
+ if None in uts or type(None) in uts:
5292
+ is_opt = True
5293
+ uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
5294
+ else:
5295
+ is_opt = False
5279
5296
 
5280
- um: ObjMarshaler
5281
- if not uts:
5282
- raise TypeError(ty)
5283
- elif len(uts) == 1:
5284
- um = rec(check.single(uts))
5297
+ um: ObjMarshaler
5298
+ if not uts:
5299
+ raise TypeError(ty)
5300
+ elif len(uts) == 1:
5301
+ um = rec(check.single(uts))
5302
+ else:
5303
+ pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
5304
+ np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
5305
+ if not np_uts:
5306
+ um = PrimitiveUnionObjMarshaler(pt)
5307
+ elif len(np_uts) == 1:
5308
+ um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
5285
5309
  else:
5286
- pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
5287
- np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
5288
- if not np_uts:
5289
- um = PrimitiveUnionObjMarshaler(pt)
5290
- elif len(np_uts) == 1:
5291
- um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
5292
- else:
5293
- raise TypeError(ty)
5310
+ raise TypeError(ty)
5294
5311
 
5295
- if is_opt:
5296
- um = OptionalObjMarshaler(um)
5297
- return um
5312
+ if is_opt:
5313
+ um = OptionalObjMarshaler(um)
5314
+ return um
5298
5315
 
5299
5316
  raise TypeError(ty)
5300
5317
 
@@ -1301,24 +1301,40 @@ _GENERIC_ALIAS_TYPES = (
1301
1301
  )
1302
1302
 
1303
1303
 
1304
- def is_generic_alias(obj, *, origin: ta.Any = None) -> bool:
1304
+ def is_generic_alias(obj: ta.Any, *, origin: ta.Any = None) -> bool:
1305
1305
  return (
1306
1306
  isinstance(obj, _GENERIC_ALIAS_TYPES) and
1307
1307
  (origin is None or ta.get_origin(obj) is origin)
1308
1308
  )
1309
1309
 
1310
1310
 
1311
- is_union_alias = functools.partial(is_generic_alias, origin=ta.Union)
1312
1311
  is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
1313
1312
 
1314
1313
 
1315
1314
  ##
1316
1315
 
1317
1316
 
1317
+ _UNION_ALIAS_ORIGINS = frozenset([
1318
+ ta.get_origin(ta.Optional[int]),
1319
+ *(
1320
+ [
1321
+ ta.get_origin(int | None),
1322
+ ta.get_origin(getattr(ta, 'TypeVar')('_T') | None),
1323
+ ] if sys.version_info >= (3, 10) else ()
1324
+ ),
1325
+ ])
1326
+
1327
+
1328
+ def is_union_alias(obj: ta.Any) -> bool:
1329
+ return ta.get_origin(obj) in _UNION_ALIAS_ORIGINS
1330
+
1331
+
1332
+ #
1333
+
1334
+
1318
1335
  def is_optional_alias(spec: ta.Any) -> bool:
1319
1336
  return (
1320
- isinstance(spec, _GENERIC_ALIAS_TYPES) and # noqa
1321
- ta.get_origin(spec) is ta.Union and
1337
+ is_union_alias(spec) and
1322
1338
  len(ta.get_args(spec)) == 2 and
1323
1339
  any(a in (None, type(None)) for a in ta.get_args(spec))
1324
1340
  )
@@ -2441,6 +2457,7 @@ def _get_argparse_arg_ann_kwargs(ann: ta.Any) -> ta.Mapping[str, ta.Any]:
2441
2457
  class _ArgparseCliAnnotationBox:
2442
2458
  def __init__(self, annotations: ta.Mapping[str, ta.Any]) -> None:
2443
2459
  super().__init__()
2460
+
2444
2461
  self.__annotations__ = annotations # type: ignore
2445
2462
 
2446
2463
 
@@ -2731,24 +2731,40 @@ _GENERIC_ALIAS_TYPES = (
2731
2731
  )
2732
2732
 
2733
2733
 
2734
- def is_generic_alias(obj, *, origin: ta.Any = None) -> bool:
2734
+ def is_generic_alias(obj: ta.Any, *, origin: ta.Any = None) -> bool:
2735
2735
  return (
2736
2736
  isinstance(obj, _GENERIC_ALIAS_TYPES) and
2737
2737
  (origin is None or ta.get_origin(obj) is origin)
2738
2738
  )
2739
2739
 
2740
2740
 
2741
- is_union_alias = functools.partial(is_generic_alias, origin=ta.Union)
2742
2741
  is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
2743
2742
 
2744
2743
 
2745
2744
  ##
2746
2745
 
2747
2746
 
2747
+ _UNION_ALIAS_ORIGINS = frozenset([
2748
+ ta.get_origin(ta.Optional[int]),
2749
+ *(
2750
+ [
2751
+ ta.get_origin(int | None),
2752
+ ta.get_origin(getattr(ta, 'TypeVar')('_T') | None),
2753
+ ] if sys.version_info >= (3, 10) else ()
2754
+ ),
2755
+ ])
2756
+
2757
+
2758
+ def is_union_alias(obj: ta.Any) -> bool:
2759
+ return ta.get_origin(obj) in _UNION_ALIAS_ORIGINS
2760
+
2761
+
2762
+ #
2763
+
2764
+
2748
2765
  def is_optional_alias(spec: ta.Any) -> bool:
2749
2766
  return (
2750
- isinstance(spec, _GENERIC_ALIAS_TYPES) and # noqa
2751
- ta.get_origin(spec) is ta.Union and
2767
+ is_union_alias(spec) and
2752
2768
  len(ta.get_args(spec)) == 2 and
2753
2769
  any(a in (None, type(None)) for a in ta.get_args(spec))
2754
2770
  )
@@ -3151,6 +3167,16 @@ class Func3(ta.Generic[A0, A1, A2, T]):
3151
3167
  return self.fn(a0, a1, a2)
3152
3168
 
3153
3169
 
3170
+ ##
3171
+
3172
+
3173
+ _TYPING_ANNOTATIONS_ATTR = '__annotate__' if sys.version_info >= (3, 14) else '__annotations__'
3174
+
3175
+
3176
+ def typing_annotations_attr() -> str:
3177
+ return _TYPING_ANNOTATIONS_ATTR
3178
+
3179
+
3154
3180
  ########################################
3155
3181
  # ../../../omlish/logs/filters.py
3156
3182
 
@@ -4233,6 +4259,7 @@ def _get_argparse_arg_ann_kwargs(ann: ta.Any) -> ta.Mapping[str, ta.Any]:
4233
4259
  class _ArgparseCliAnnotationBox:
4234
4260
  def __init__(self, annotations: ta.Mapping[str, ta.Any]) -> None:
4235
4261
  super().__init__()
4262
+
4236
4263
  self.__annotations__ = annotations # type: ignore
4237
4264
 
4238
4265
 
@@ -6024,32 +6051,32 @@ class ObjMarshalerManager:
6024
6051
  [e] = ta.get_args(ty)
6025
6052
  return IterableObjMarshaler(st, rec(e))
6026
6053
 
6027
- if is_union_alias(ty):
6028
- uts = frozenset(ta.get_args(ty))
6029
- if None in uts or type(None) in uts:
6030
- is_opt = True
6031
- uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
6032
- else:
6033
- is_opt = False
6054
+ if is_union_alias(ty):
6055
+ uts = frozenset(ta.get_args(ty))
6056
+ if None in uts or type(None) in uts:
6057
+ is_opt = True
6058
+ uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
6059
+ else:
6060
+ is_opt = False
6034
6061
 
6035
- um: ObjMarshaler
6036
- if not uts:
6037
- raise TypeError(ty)
6038
- elif len(uts) == 1:
6039
- um = rec(check.single(uts))
6062
+ um: ObjMarshaler
6063
+ if not uts:
6064
+ raise TypeError(ty)
6065
+ elif len(uts) == 1:
6066
+ um = rec(check.single(uts))
6067
+ else:
6068
+ pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
6069
+ np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
6070
+ if not np_uts:
6071
+ um = PrimitiveUnionObjMarshaler(pt)
6072
+ elif len(np_uts) == 1:
6073
+ um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
6040
6074
  else:
6041
- pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
6042
- np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
6043
- if not np_uts:
6044
- um = PrimitiveUnionObjMarshaler(pt)
6045
- elif len(np_uts) == 1:
6046
- um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
6047
- else:
6048
- raise TypeError(ty)
6075
+ raise TypeError(ty)
6049
6076
 
6050
- if is_opt:
6051
- um = OptionalObjMarshaler(um)
6052
- return um
6077
+ if is_opt:
6078
+ um = OptionalObjMarshaler(um)
6079
+ return um
6053
6080
 
6054
6081
  raise TypeError(ty)
6055
6082
 
@@ -55,7 +55,7 @@ class StaticGitMessageGeneratorManifest(StaticModAttrManifest, GitMessageGenerat
55
55
  @cached.function
56
56
  def load_message_generator_manifests() -> ta.Sequence[GitMessageGeneratorManifest]:
57
57
  ldr = manifest_globals.GlobalManifestLoader.instance()
58
- pkgs = ldr.scan_or_discover_packages(fallback_root_dir=os.getcwd())
58
+ pkgs = ldr.scan_or_discover_packages(fallback_root_dir=os.getcwd()) # FIXME
59
59
  mfs = ldr.load(*pkgs, only=[GitMessageGeneratorManifest])
60
60
  return [mf.value() for mf in mfs]
61
61
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev402
3
+ Version: 0.0.0.dev404
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.dev402
17
+ Requires-Dist: omlish==0.0.0.dev404
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.1; extra == "all"
20
20
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev402
1
+ omlish==0.0.0.dev404
2
2
 
3
3
  [all]
4
4
  black~=25.1
@@ -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.dev402'
16
+ version = '0.0.0.dev404'
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.dev402',
27
+ 'omlish == 0.0.0.dev404',
28
28
  ]
29
29
 
30
30
  [project.optional-dependencies]
File without changes
File without changes
File without changes