omdev 0.0.0.dev315__tar.gz → 0.0.0.dev316__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 (308) hide show
  1. {omdev-0.0.0.dev315/omdev.egg-info → omdev-0.0.0.dev316}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/scripts/ci.py +177 -19
  3. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/scripts/interp.py +176 -19
  4. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/scripts/pyproject.py +176 -19
  5. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316/omdev.egg-info}/PKG-INFO +2 -2
  6. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev.egg-info/requires.txt +1 -1
  7. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/pyproject.toml +2 -2
  8. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/LICENSE +0 -0
  9. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/MANIFEST.in +0 -0
  10. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/README.md +0 -0
  11. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/.manifests.json +0 -0
  12. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/__about__.py +0 -0
  13. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/__init__.py +0 -0
  14. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/__init__.py +0 -0
  15. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/__main__.py +0 -0
  16. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/gen.py +0 -0
  17. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/imports.py +0 -0
  18. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/main.py +0 -0
  19. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/manifests.py +0 -0
  20. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/resources.py +0 -0
  21. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/srcfiles.py +0 -0
  22. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/strip.py +0 -0
  23. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/types.py +0 -0
  24. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/amalg/typing.py +0 -0
  25. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/__init__.py +0 -0
  26. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/compute/__init__.py +0 -0
  27. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/compute/cache.py +0 -0
  28. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/compute/contexts.py +0 -0
  29. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/compute/currents.py +0 -0
  30. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/compute/fns.py +0 -0
  31. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/compute/resolvers.py +0 -0
  32. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/compute/storage.py +0 -0
  33. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/compute/types.py +0 -0
  34. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/data/__init__.py +0 -0
  35. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/data/actions.py +0 -0
  36. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/data/cache.py +0 -0
  37. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/data/consts.py +0 -0
  38. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/data/defaults.py +0 -0
  39. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/data/manifests.py +0 -0
  40. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cache/data/specs.py +0 -0
  41. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cc/__init__.py +0 -0
  42. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cc/__main__.py +0 -0
  43. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cc/cdeps.py +0 -0
  44. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cc/cdeps.toml +0 -0
  45. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cc/cli.py +0 -0
  46. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/__init__.py +0 -0
  47. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_boilerplate.cc +0 -0
  48. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/LICENSE +0 -0
  49. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/__init__.py +0 -0
  50. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/build_ext.py +0 -0
  51. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  52. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  53. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/compilers/options.py +0 -0
  54. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  55. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/dir_util.py +0 -0
  56. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/errors.py +0 -0
  57. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/extension.py +0 -0
  58. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/file_util.py +0 -0
  59. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/modified.py +0 -0
  60. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/spawn.py +0 -0
  61. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/sysconfig.py +0 -0
  62. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/util.py +0 -0
  63. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/_distutils/version.py +0 -0
  64. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/build.py +0 -0
  65. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/cmake.py +0 -0
  66. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/importhook.py +0 -0
  67. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/magic.py +0 -0
  68. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cexts/scan.py +0 -0
  69. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/__init__.py +0 -0
  70. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/__main__.py +0 -0
  71. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/cache.py +0 -0
  72. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/ci.py +0 -0
  73. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/cli.py +0 -0
  74. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/compose.py +0 -0
  75. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/consts.py +0 -0
  76. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/__init__.py +0 -0
  77. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/buildcaching.py +0 -0
  78. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/cache.py +0 -0
  79. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  80. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/cacheserved/cache.py +0 -0
  81. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  82. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/cmds.py +0 -0
  83. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/dataserver.py +0 -0
  84. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/imagepulling.py +0 -0
  85. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/inject.py +0 -0
  86. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/packing.py +0 -0
  87. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/repositories.py +0 -0
  88. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/docker/utils.py +0 -0
  89. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/__init__.py +0 -0
  90. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/api/__init__.py +0 -0
  91. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/api/clients.py +0 -0
  92. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/api/v1/__init__.py +0 -0
  93. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/api/v1/api.py +0 -0
  94. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/api/v1/client.py +0 -0
  95. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/api/v2/__init__.py +0 -0
  96. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/api/v2/api.py +0 -0
  97. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/api/v2/azure.py +0 -0
  98. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/api/v2/client.py +0 -0
  99. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/bootstrap.py +0 -0
  100. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/cache.py +0 -0
  101. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/cli.py +0 -0
  102. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/env.py +0 -0
  103. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/github/inject.py +0 -0
  104. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/inject.py +0 -0
  105. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/requirements.py +0 -0
  106. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/shell.py +0 -0
  107. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ci/utils.py +0 -0
  108. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cli/__init__.py +0 -0
  109. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cli/__main__.py +0 -0
  110. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cli/_pathhack.py +0 -0
  111. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cli/clicli.py +0 -0
  112. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cli/install.py +0 -0
  113. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cli/main.py +0 -0
  114. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cli/managers.py +0 -0
  115. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cli/types.py +0 -0
  116. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/clipboard/__init__.py +0 -0
  117. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/clipboard/clipboard.py +0 -0
  118. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/clipboard/darwin_cf.py +0 -0
  119. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/clipboard/linux_x11.py +0 -0
  120. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cmake.py +0 -0
  121. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cmdlog/__init__.py +0 -0
  122. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cmdlog/__main__.py +0 -0
  123. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cmdlog/_cmdlog.py +0 -0
  124. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cmdlog/cli.py +0 -0
  125. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/cmdlog/cmdlog.py +0 -0
  126. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/dataserver/__init__.py +0 -0
  127. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/dataserver/handlers.py +0 -0
  128. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/dataserver/http.py +0 -0
  129. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/dataserver/routes.py +0 -0
  130. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/dataserver/server.py +0 -0
  131. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/dataserver/targets.py +0 -0
  132. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/git/__init__.py +0 -0
  133. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/git/magic.py +0 -0
  134. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/git/revisions.py +0 -0
  135. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/git/shallow.py +0 -0
  136. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/git/status.py +0 -0
  137. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/home/__init__.py +0 -0
  138. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/home/paths.py +0 -0
  139. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/home/secrets.py +0 -0
  140. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/home/shadow.py +0 -0
  141. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/imgur.py +0 -0
  142. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/__init__.py +0 -0
  143. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/__main__.py +0 -0
  144. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/cli.py +0 -0
  145. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/default.py +0 -0
  146. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/inject.py +0 -0
  147. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/inspect.py +0 -0
  148. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/providers/__init__.py +0 -0
  149. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/providers/base.py +0 -0
  150. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/providers/inject.py +0 -0
  151. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/providers/running.py +0 -0
  152. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/providers/standalone.py +0 -0
  153. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/providers/system.py +0 -0
  154. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/pyenv/__init__.py +0 -0
  155. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/pyenv/inject.py +0 -0
  156. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/pyenv/install.py +0 -0
  157. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/pyenv/provider.py +0 -0
  158. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/pyenv/pyenv.py +0 -0
  159. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/resolvers.py +0 -0
  160. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/types.py +0 -0
  161. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/uv/__init__.py +0 -0
  162. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/uv/inject.py +0 -0
  163. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/uv/provider.py +0 -0
  164. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/uv/uv.py +0 -0
  165. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/interp/venvs.py +0 -0
  166. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/magic/__init__.py +0 -0
  167. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/magic/__main__.py +0 -0
  168. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/magic/cli.py +0 -0
  169. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/magic/find.py +0 -0
  170. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/magic/magic.py +0 -0
  171. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/magic/prepare.py +0 -0
  172. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/magic/styles.py +0 -0
  173. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/manifests/__init__.py +0 -0
  174. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/manifests/__main__.py +0 -0
  175. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/manifests/build.py +0 -0
  176. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/manifests/dumping.py +0 -0
  177. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/manifests/main.py +0 -0
  178. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/mypy/__init__.py +0 -0
  179. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/mypy/debug.py +0 -0
  180. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/__init__.py +0 -0
  181. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/building.py +0 -0
  182. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/compression.py +0 -0
  183. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/data.py +0 -0
  184. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/datarefs.py +0 -0
  185. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/dataserver.py +0 -0
  186. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/loading.py +0 -0
  187. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/media.py +0 -0
  188. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/pack/__init__.py +0 -0
  189. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/pack/packing.py +0 -0
  190. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/pack/repositories.py +0 -0
  191. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/pack/unpacking.py +0 -0
  192. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/repositories.py +0 -0
  193. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/oci/tars.py +0 -0
  194. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/packaging/__init__.py +0 -0
  195. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/packaging/marshal.py +0 -0
  196. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/packaging/names.py +0 -0
  197. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/packaging/requires.py +0 -0
  198. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/packaging/revisions.py +0 -0
  199. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/packaging/specifiers.py +0 -0
  200. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/packaging/versions.py +0 -0
  201. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/packaging/wheelfile.py +0 -0
  202. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pip.py +0 -0
  203. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/precheck/__init__.py +0 -0
  204. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/precheck/__main__.py +0 -0
  205. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/precheck/base.py +0 -0
  206. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/precheck/caches.py +0 -0
  207. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/precheck/git.py +0 -0
  208. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/precheck/imports.py +0 -0
  209. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/precheck/lite.py +0 -0
  210. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/precheck/main.py +0 -0
  211. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/precheck/manifests.py +0 -0
  212. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/precheck/scripts.py +0 -0
  213. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/__init__.py +0 -0
  214. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/apps/__init__.py +0 -0
  215. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/apps/ncdu.py +0 -0
  216. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/confirm.py +0 -0
  217. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/markdown/LICENSE +0 -0
  218. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/markdown/__init__.py +0 -0
  219. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/markdown/__main__.py +0 -0
  220. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/markdown/border.py +0 -0
  221. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/markdown/cli.py +0 -0
  222. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/markdown/markdown.py +0 -0
  223. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/markdown/parser.py +0 -0
  224. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/markdown/styles.py +0 -0
  225. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/markdown/tags.py +0 -0
  226. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/ptk/markdown/utils.py +0 -0
  227. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/__init__.py +0 -0
  228. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/attrdocs.py +0 -0
  229. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/bracepy.py +0 -0
  230. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/classdot.py +0 -0
  231. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/docstrings/LICENSE +0 -0
  232. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/docstrings/__init__.py +0 -0
  233. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/docstrings/attrdoc.py +0 -0
  234. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/docstrings/common.py +0 -0
  235. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/docstrings/epydoc.py +0 -0
  236. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/docstrings/google.py +0 -0
  237. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/docstrings/numpydoc.py +0 -0
  238. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/docstrings/parser.py +0 -0
  239. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/docstrings/rest.py +0 -0
  240. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/findimports.py +0 -0
  241. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/scripts/__init__.py +0 -0
  242. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/scripts/bumpversion.py +0 -0
  243. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/scripts/execstat.py +0 -0
  244. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/scripts/importtrace.py +0 -0
  245. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/srcheaders.py +0 -0
  246. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/tools/__init__.py +0 -0
  247. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/tools/importscan.py +0 -0
  248. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/py/tools/mkrelimp.py +0 -0
  249. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/__init__.py +0 -0
  250. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/__main__.py +0 -0
  251. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/cexts.py +0 -0
  252. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/cli.py +0 -0
  253. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/configs.py +0 -0
  254. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/inject.py +0 -0
  255. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/pkg.py +0 -0
  256. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/reqs.py +0 -0
  257. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/resources/__init__.py +0 -0
  258. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/resources/docker-dev.sh +0 -0
  259. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/resources/python.sh +0 -0
  260. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/pyproject/venvs.py +0 -0
  261. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/scripts/__init__.py +0 -0
  262. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/scripts/slowcat.py +0 -0
  263. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/scripts/tmpexec.py +0 -0
  264. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tagstrings.py +0 -0
  265. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tokens/__init__.py +0 -0
  266. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tokens/all.py +0 -0
  267. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tokens/tokenizert.py +0 -0
  268. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tokens/utils.py +0 -0
  269. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/__init__.py +0 -0
  270. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/antlr/__init__.py +0 -0
  271. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/antlr/__main__.py +0 -0
  272. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/antlr/cli.py +0 -0
  273. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/antlr/consts.py +0 -0
  274. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/antlr/gen.py +0 -0
  275. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/cloc.py +0 -0
  276. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/diff.py +0 -0
  277. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/doc.py +0 -0
  278. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/docker.py +0 -0
  279. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/git/__init__.py +0 -0
  280. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/git/__main__.py +0 -0
  281. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/git/cli.py +0 -0
  282. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/git/consts.py +0 -0
  283. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/git/messages.py +0 -0
  284. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/intellij.py +0 -0
  285. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/json/__init__.py +0 -0
  286. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/json/__main__.py +0 -0
  287. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/json/cli.py +0 -0
  288. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/json/formats.py +0 -0
  289. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/json/io.py +0 -0
  290. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/json/parsing.py +0 -0
  291. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/json/processing.py +0 -0
  292. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/json/rendering.py +0 -0
  293. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/linehisto.py +0 -0
  294. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/mkenv.py +0 -0
  295. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/notebook.py +0 -0
  296. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/pawk/__init__.py +0 -0
  297. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/pawk/__main__.py +0 -0
  298. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/pawk/pawk.py +0 -0
  299. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/pip.py +0 -0
  300. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/prof.py +0 -0
  301. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/qr.py +0 -0
  302. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/shadow.py +0 -0
  303. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev/tools/sqlrepl.py +0 -0
  304. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev.egg-info/SOURCES.txt +0 -0
  305. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev.egg-info/dependency_links.txt +0 -0
  306. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev.egg-info/entry_points.txt +0 -0
  307. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/omdev.egg-info/top_level.txt +0 -0
  308. {omdev-0.0.0.dev315 → omdev-0.0.0.dev316}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev315
3
+ Version: 0.0.0.dev316
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev315
15
+ Requires-Dist: omlish==0.0.0.dev316
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -41,6 +41,7 @@ import gzip
41
41
  import hashlib
42
42
  import heapq
43
43
  import html
44
+ import http
44
45
  import http.client
45
46
  import http.server
46
47
  import inspect
@@ -98,6 +99,9 @@ CheckOnRaiseFn = ta.Callable[[Exception], None] # ta.TypeAlias
98
99
  CheckExceptionFactory = ta.Callable[..., Exception] # ta.TypeAlias
99
100
  CheckArgsRenderer = ta.Callable[..., ta.Optional[str]] # ta.TypeAlias
100
101
 
102
+ # ../../omlish/lite/maybes.py
103
+ U = ta.TypeVar('U')
104
+
101
105
  # ../../omlish/lite/timeouts.py
102
106
  TimeoutLike = ta.Union['Timeout', ta.Type['Timeout.DEFAULT'], ta.Iterable['TimeoutLike'], float, None] # ta.TypeAlias
103
107
 
@@ -122,7 +126,6 @@ ExitStackedT = ta.TypeVar('ExitStackedT', bound='ExitStacked')
122
126
  AsyncExitStackedT = ta.TypeVar('AsyncExitStackedT', bound='AsyncExitStacked')
123
127
 
124
128
  # ../../omlish/lite/inject.py
125
- U = ta.TypeVar('U')
126
129
  InjectorKeyCls = ta.Union[type, ta.NewType]
127
130
  InjectorProviderFn = ta.Callable[['Injector'], ta.Any]
128
131
  InjectorProviderFnMap = ta.Mapping['InjectorKey', 'InjectorProviderFn']
@@ -1145,7 +1148,13 @@ log = logging.getLogger(__name__)
1145
1148
  ##
1146
1149
 
1147
1150
 
1151
+ @functools.total_ordering
1148
1152
  class Maybe(ta.Generic[T]):
1153
+ class ValueNotPresentError(BaseException):
1154
+ pass
1155
+
1156
+ #
1157
+
1149
1158
  @property
1150
1159
  @abc.abstractmethod
1151
1160
  def present(self) -> bool:
@@ -1155,9 +1164,102 @@ class Maybe(ta.Generic[T]):
1155
1164
  def must(self) -> T:
1156
1165
  raise NotImplementedError
1157
1166
 
1167
+ #
1168
+
1169
+ @abc.abstractmethod
1170
+ def __repr__(self) -> str:
1171
+ raise NotImplementedError
1172
+
1173
+ @abc.abstractmethod
1174
+ def __hash__(self) -> int:
1175
+ raise NotImplementedError
1176
+
1177
+ @abc.abstractmethod
1178
+ def __eq__(self, other) -> bool:
1179
+ raise NotImplementedError
1180
+
1181
+ @abc.abstractmethod
1182
+ def __lt__(self, other) -> bool:
1183
+ raise NotImplementedError
1184
+
1185
+ #
1186
+
1187
+ @ta.final
1188
+ def __ne__(self, other):
1189
+ return not (self == other)
1190
+
1191
+ @ta.final
1192
+ def __iter__(self) -> ta.Iterator[T]:
1193
+ if self.present:
1194
+ yield self.must()
1195
+
1196
+ @ta.final
1197
+ def __bool__(self) -> ta.NoReturn:
1198
+ raise TypeError
1199
+
1200
+ #
1201
+
1202
+ @ta.final
1203
+ def if_present(self, consumer: ta.Callable[[T], None]) -> None:
1204
+ if self.present:
1205
+ consumer(self.must())
1206
+
1207
+ @ta.final
1208
+ def filter(self, predicate: ta.Callable[[T], bool]) -> 'Maybe[T]':
1209
+ if self.present and predicate(self.must()):
1210
+ return self
1211
+ else:
1212
+ return Maybe.empty()
1213
+
1214
+ @ta.final
1215
+ def map(self, mapper: ta.Callable[[T], U]) -> 'Maybe[U]':
1216
+ if self.present:
1217
+ return Maybe.just(mapper(self.must()))
1218
+ else:
1219
+ return Maybe.empty()
1220
+
1221
+ @ta.final
1222
+ def flat_map(self, mapper: ta.Callable[[T], 'Maybe[U]']) -> 'Maybe[U]':
1223
+ if self.present:
1224
+ if not isinstance(v := mapper(self.must()), Maybe):
1225
+ raise TypeError(v)
1226
+ return v
1227
+ else:
1228
+ return Maybe.empty()
1229
+
1230
+ @ta.final
1231
+ def or_else(self, other: ta.Union[T, U]) -> ta.Union[T, U]:
1232
+ if self.present:
1233
+ return self.must()
1234
+ else:
1235
+ return other
1236
+
1237
+ @ta.final
1238
+ def or_else_get(self, supplier: ta.Callable[[], ta.Union[T, U]]) -> ta.Union[T, U]:
1239
+ if self.present:
1240
+ return self.must()
1241
+ else:
1242
+ return supplier()
1243
+
1244
+ @ta.final
1245
+ def or_else_raise(self, exception_supplier: ta.Callable[[], Exception]) -> T:
1246
+ if self.present:
1247
+ return self.must()
1248
+ else:
1249
+ raise exception_supplier()
1250
+
1251
+ #
1252
+
1253
+ @classmethod
1254
+ def of_optional(cls, v: ta.Optional[T]) -> 'Maybe[T]':
1255
+ if v is not None:
1256
+ return cls.just(v)
1257
+ else:
1258
+ return cls.empty()
1259
+
1158
1260
  @classmethod
1159
1261
  def just(cls, v: T) -> 'Maybe[T]':
1160
- return tuple.__new__(_Maybe, (v,)) # noqa
1262
+ return _JustMaybe(v)
1161
1263
 
1162
1264
  _empty: ta.ClassVar['Maybe']
1163
1265
 
@@ -1166,36 +1268,79 @@ class Maybe(ta.Generic[T]):
1166
1268
  return Maybe._empty
1167
1269
 
1168
1270
 
1169
- class _Maybe(Maybe[T], tuple):
1170
- __slots__ = ()
1271
+ ##
1171
1272
 
1172
- def __init_subclass__(cls, **kwargs):
1173
- raise TypeError
1273
+
1274
+ class _Maybe(Maybe[T], abc.ABC):
1275
+ def __lt__(self, other):
1276
+ if not isinstance(other, _Maybe):
1277
+ return NotImplemented
1278
+ sp = self.present
1279
+ op = other.present
1280
+ if self.present and other.present:
1281
+ return self.must() < other.must()
1282
+ else:
1283
+ return op and not sp
1284
+
1285
+
1286
+ class _JustMaybe(_Maybe[T]):
1287
+ __slots__ = ('_v', '_hash')
1288
+
1289
+ def __init__(self, v: T) -> None:
1290
+ super().__init__()
1291
+
1292
+ self._v = v
1174
1293
 
1175
1294
  @property
1176
1295
  def present(self) -> bool:
1177
- return bool(self)
1296
+ return True
1178
1297
 
1179
1298
  def must(self) -> T:
1180
- if not self:
1181
- raise ValueError
1182
- return self[0]
1299
+ return self._v
1300
+
1301
+ #
1302
+
1303
+ def __repr__(self) -> str:
1304
+ return f'just({self._v!r})'
1305
+
1306
+ def __hash__(self) -> int:
1307
+ try:
1308
+ return self._hash # type: ignore[has-type]
1309
+ except AttributeError:
1310
+ pass
1311
+ h = self._hash = hash((_JustMaybe, self._v))
1312
+ return h
1183
1313
 
1314
+ def __eq__(self, other):
1315
+ return (
1316
+ self.__class__ is other.__class__ and
1317
+ self._v == other._v # noqa
1318
+ )
1184
1319
 
1185
- Maybe._empty = tuple.__new__(_Maybe, ()) # noqa
1186
1320
 
1321
+ class _EmptyMaybe(_Maybe[T]):
1322
+ __slots__ = ()
1187
1323
 
1188
- ##
1324
+ @property
1325
+ def present(self) -> bool:
1326
+ return False
1189
1327
 
1328
+ def must(self) -> T:
1329
+ raise Maybe.ValueNotPresentError
1190
1330
 
1191
- @functools.singledispatch
1192
- def as_maybe(obj: ta.Any) -> Maybe:
1193
- raise TypeError(obj)
1331
+ #
1194
1332
 
1333
+ def __repr__(self) -> str:
1334
+ return 'empty()'
1195
1335
 
1196
- @as_maybe.register
1197
- def _(obj: Maybe) -> Maybe:
1198
- return obj
1336
+ def __hash__(self) -> int:
1337
+ return hash(_EmptyMaybe)
1338
+
1339
+ def __eq__(self, other):
1340
+ return self.__class__ is other.__class__
1341
+
1342
+
1343
+ Maybe._empty = _EmptyMaybe() # noqa
1199
1344
 
1200
1345
 
1201
1346
  ########################################
@@ -1587,9 +1732,16 @@ class PredicateTimeout(Timeout):
1587
1732
  # ../../../omlish/logs/filters.py
1588
1733
 
1589
1734
 
1735
+ ##
1736
+
1737
+
1590
1738
  class TidLogFilter(logging.Filter):
1591
1739
  def filter(self, record):
1592
- record.tid = threading.get_native_id()
1740
+ # FIXME: handle better - missing from wasm and cosmos
1741
+ if hasattr(threading, 'get_native_id'):
1742
+ record.tid = threading.get_native_id()
1743
+ else:
1744
+ record.tid = '?'
1593
1745
  return True
1594
1746
 
1595
1747
 
@@ -1597,6 +1749,9 @@ class TidLogFilter(logging.Filter):
1597
1749
  # ../../../omlish/logs/proxy.py
1598
1750
 
1599
1751
 
1752
+ ##
1753
+
1754
+
1600
1755
  class ProxyLogFilterer(logging.Filterer):
1601
1756
  def __init__(self, underlying: logging.Filterer) -> None: # noqa
1602
1757
  self._underlying = underlying
@@ -5114,6 +5269,9 @@ TODO:
5114
5269
  """
5115
5270
 
5116
5271
 
5272
+ ##
5273
+
5274
+
5117
5275
  class JsonLogFormatter(logging.Formatter):
5118
5276
  KEYS: ta.Mapping[str, bool] = {
5119
5277
  'name': False,
@@ -71,6 +71,9 @@ CheckOnRaiseFn = ta.Callable[[Exception], None] # ta.TypeAlias
71
71
  CheckExceptionFactory = ta.Callable[..., Exception] # ta.TypeAlias
72
72
  CheckArgsRenderer = ta.Callable[..., ta.Optional[str]] # ta.TypeAlias
73
73
 
74
+ # ../../omlish/lite/maybes.py
75
+ U = ta.TypeVar('U')
76
+
74
77
  # ../../omlish/lite/timeouts.py
75
78
  TimeoutLike = ta.Union['Timeout', ta.Type['Timeout.DEFAULT'], ta.Iterable['TimeoutLike'], float, None] # ta.TypeAlias
76
79
 
@@ -86,7 +89,6 @@ ArgparseCmdFn = ta.Callable[[], ta.Optional[int]] # ta.TypeAlias
86
89
  AwaitableT = ta.TypeVar('AwaitableT', bound=ta.Awaitable)
87
90
 
88
91
  # ../../omlish/lite/inject.py
89
- U = ta.TypeVar('U')
90
92
  InjectorKeyCls = ta.Union[type, ta.NewType]
91
93
  InjectorProviderFn = ta.Callable[['Injector'], ta.Any]
92
94
  InjectorProviderFnMap = ta.Mapping['InjectorKey', 'InjectorProviderFn']
@@ -1088,7 +1090,13 @@ json_dumps_compact: ta.Callable[..., str] = functools.partial(json.dumps, **JSON
1088
1090
  ##
1089
1091
 
1090
1092
 
1093
+ @functools.total_ordering
1091
1094
  class Maybe(ta.Generic[T]):
1095
+ class ValueNotPresentError(BaseException):
1096
+ pass
1097
+
1098
+ #
1099
+
1092
1100
  @property
1093
1101
  @abc.abstractmethod
1094
1102
  def present(self) -> bool:
@@ -1098,9 +1106,102 @@ class Maybe(ta.Generic[T]):
1098
1106
  def must(self) -> T:
1099
1107
  raise NotImplementedError
1100
1108
 
1109
+ #
1110
+
1111
+ @abc.abstractmethod
1112
+ def __repr__(self) -> str:
1113
+ raise NotImplementedError
1114
+
1115
+ @abc.abstractmethod
1116
+ def __hash__(self) -> int:
1117
+ raise NotImplementedError
1118
+
1119
+ @abc.abstractmethod
1120
+ def __eq__(self, other) -> bool:
1121
+ raise NotImplementedError
1122
+
1123
+ @abc.abstractmethod
1124
+ def __lt__(self, other) -> bool:
1125
+ raise NotImplementedError
1126
+
1127
+ #
1128
+
1129
+ @ta.final
1130
+ def __ne__(self, other):
1131
+ return not (self == other)
1132
+
1133
+ @ta.final
1134
+ def __iter__(self) -> ta.Iterator[T]:
1135
+ if self.present:
1136
+ yield self.must()
1137
+
1138
+ @ta.final
1139
+ def __bool__(self) -> ta.NoReturn:
1140
+ raise TypeError
1141
+
1142
+ #
1143
+
1144
+ @ta.final
1145
+ def if_present(self, consumer: ta.Callable[[T], None]) -> None:
1146
+ if self.present:
1147
+ consumer(self.must())
1148
+
1149
+ @ta.final
1150
+ def filter(self, predicate: ta.Callable[[T], bool]) -> 'Maybe[T]':
1151
+ if self.present and predicate(self.must()):
1152
+ return self
1153
+ else:
1154
+ return Maybe.empty()
1155
+
1156
+ @ta.final
1157
+ def map(self, mapper: ta.Callable[[T], U]) -> 'Maybe[U]':
1158
+ if self.present:
1159
+ return Maybe.just(mapper(self.must()))
1160
+ else:
1161
+ return Maybe.empty()
1162
+
1163
+ @ta.final
1164
+ def flat_map(self, mapper: ta.Callable[[T], 'Maybe[U]']) -> 'Maybe[U]':
1165
+ if self.present:
1166
+ if not isinstance(v := mapper(self.must()), Maybe):
1167
+ raise TypeError(v)
1168
+ return v
1169
+ else:
1170
+ return Maybe.empty()
1171
+
1172
+ @ta.final
1173
+ def or_else(self, other: ta.Union[T, U]) -> ta.Union[T, U]:
1174
+ if self.present:
1175
+ return self.must()
1176
+ else:
1177
+ return other
1178
+
1179
+ @ta.final
1180
+ def or_else_get(self, supplier: ta.Callable[[], ta.Union[T, U]]) -> ta.Union[T, U]:
1181
+ if self.present:
1182
+ return self.must()
1183
+ else:
1184
+ return supplier()
1185
+
1186
+ @ta.final
1187
+ def or_else_raise(self, exception_supplier: ta.Callable[[], Exception]) -> T:
1188
+ if self.present:
1189
+ return self.must()
1190
+ else:
1191
+ raise exception_supplier()
1192
+
1193
+ #
1194
+
1195
+ @classmethod
1196
+ def of_optional(cls, v: ta.Optional[T]) -> 'Maybe[T]':
1197
+ if v is not None:
1198
+ return cls.just(v)
1199
+ else:
1200
+ return cls.empty()
1201
+
1101
1202
  @classmethod
1102
1203
  def just(cls, v: T) -> 'Maybe[T]':
1103
- return tuple.__new__(_Maybe, (v,)) # noqa
1204
+ return _JustMaybe(v)
1104
1205
 
1105
1206
  _empty: ta.ClassVar['Maybe']
1106
1207
 
@@ -1109,36 +1210,79 @@ class Maybe(ta.Generic[T]):
1109
1210
  return Maybe._empty
1110
1211
 
1111
1212
 
1112
- class _Maybe(Maybe[T], tuple):
1113
- __slots__ = ()
1213
+ ##
1214
+
1215
+
1216
+ class _Maybe(Maybe[T], abc.ABC):
1217
+ def __lt__(self, other):
1218
+ if not isinstance(other, _Maybe):
1219
+ return NotImplemented
1220
+ sp = self.present
1221
+ op = other.present
1222
+ if self.present and other.present:
1223
+ return self.must() < other.must()
1224
+ else:
1225
+ return op and not sp
1114
1226
 
1115
- def __init_subclass__(cls, **kwargs):
1116
- raise TypeError
1227
+
1228
+ class _JustMaybe(_Maybe[T]):
1229
+ __slots__ = ('_v', '_hash')
1230
+
1231
+ def __init__(self, v: T) -> None:
1232
+ super().__init__()
1233
+
1234
+ self._v = v
1117
1235
 
1118
1236
  @property
1119
1237
  def present(self) -> bool:
1120
- return bool(self)
1238
+ return True
1121
1239
 
1122
1240
  def must(self) -> T:
1123
- if not self:
1124
- raise ValueError
1125
- return self[0]
1241
+ return self._v
1126
1242
 
1243
+ #
1127
1244
 
1128
- Maybe._empty = tuple.__new__(_Maybe, ()) # noqa
1245
+ def __repr__(self) -> str:
1246
+ return f'just({self._v!r})'
1129
1247
 
1248
+ def __hash__(self) -> int:
1249
+ try:
1250
+ return self._hash # type: ignore[has-type]
1251
+ except AttributeError:
1252
+ pass
1253
+ h = self._hash = hash((_JustMaybe, self._v))
1254
+ return h
1130
1255
 
1131
- ##
1256
+ def __eq__(self, other):
1257
+ return (
1258
+ self.__class__ is other.__class__ and
1259
+ self._v == other._v # noqa
1260
+ )
1132
1261
 
1133
1262
 
1134
- @functools.singledispatch
1135
- def as_maybe(obj: ta.Any) -> Maybe:
1136
- raise TypeError(obj)
1263
+ class _EmptyMaybe(_Maybe[T]):
1264
+ __slots__ = ()
1137
1265
 
1266
+ @property
1267
+ def present(self) -> bool:
1268
+ return False
1269
+
1270
+ def must(self) -> T:
1271
+ raise Maybe.ValueNotPresentError
1272
+
1273
+ #
1274
+
1275
+ def __repr__(self) -> str:
1276
+ return 'empty()'
1277
+
1278
+ def __hash__(self) -> int:
1279
+ return hash(_EmptyMaybe)
1138
1280
 
1139
- @as_maybe.register
1140
- def _(obj: Maybe) -> Maybe:
1141
- return obj
1281
+ def __eq__(self, other):
1282
+ return self.__class__ is other.__class__
1283
+
1284
+
1285
+ Maybe._empty = _EmptyMaybe() # noqa
1142
1286
 
1143
1287
 
1144
1288
  ########################################
@@ -1530,9 +1674,16 @@ class PredicateTimeout(Timeout):
1530
1674
  # ../../../omlish/logs/filters.py
1531
1675
 
1532
1676
 
1677
+ ##
1678
+
1679
+
1533
1680
  class TidLogFilter(logging.Filter):
1534
1681
  def filter(self, record):
1535
- record.tid = threading.get_native_id()
1682
+ # FIXME: handle better - missing from wasm and cosmos
1683
+ if hasattr(threading, 'get_native_id'):
1684
+ record.tid = threading.get_native_id()
1685
+ else:
1686
+ record.tid = '?'
1536
1687
  return True
1537
1688
 
1538
1689
 
@@ -1540,6 +1691,9 @@ class TidLogFilter(logging.Filter):
1540
1691
  # ../../../omlish/logs/proxy.py
1541
1692
 
1542
1693
 
1694
+ ##
1695
+
1696
+
1543
1697
  class ProxyLogFilterer(logging.Filterer):
1544
1698
  def __init__(self, underlying: logging.Filterer) -> None: # noqa
1545
1699
  self._underlying = underlying
@@ -3579,6 +3733,9 @@ TODO:
3579
3733
  """
3580
3734
 
3581
3735
 
3736
+ ##
3737
+
3738
+
3582
3739
  class JsonLogFormatter(logging.Formatter):
3583
3740
  KEYS: ta.Mapping[str, bool] = {
3584
3741
  'name': False,