omdev 0.0.0.dev315__tar.gz → 0.0.0.dev317__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.dev317}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/scripts/ci.py +179 -19
  3. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/scripts/interp.py +178 -19
  4. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/scripts/pyproject.py +178 -19
  5. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317/omdev.egg-info}/PKG-INFO +2 -2
  6. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev.egg-info/requires.txt +1 -1
  7. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/pyproject.toml +2 -2
  8. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/LICENSE +0 -0
  9. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/MANIFEST.in +0 -0
  10. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/README.md +0 -0
  11. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/.manifests.json +0 -0
  12. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/__about__.py +0 -0
  13. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/__init__.py +0 -0
  14. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/__init__.py +0 -0
  15. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/__main__.py +0 -0
  16. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/gen.py +0 -0
  17. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/imports.py +0 -0
  18. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/main.py +0 -0
  19. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/manifests.py +0 -0
  20. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/resources.py +0 -0
  21. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/srcfiles.py +0 -0
  22. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/strip.py +0 -0
  23. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/types.py +0 -0
  24. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/amalg/typing.py +0 -0
  25. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/__init__.py +0 -0
  26. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/compute/__init__.py +0 -0
  27. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/compute/cache.py +0 -0
  28. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/compute/contexts.py +0 -0
  29. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/compute/currents.py +0 -0
  30. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/compute/fns.py +0 -0
  31. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/compute/resolvers.py +0 -0
  32. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/compute/storage.py +0 -0
  33. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/compute/types.py +0 -0
  34. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/data/__init__.py +0 -0
  35. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/data/actions.py +0 -0
  36. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/data/cache.py +0 -0
  37. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/data/consts.py +0 -0
  38. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/data/defaults.py +0 -0
  39. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/data/manifests.py +0 -0
  40. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cache/data/specs.py +0 -0
  41. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cc/__init__.py +0 -0
  42. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cc/__main__.py +0 -0
  43. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cc/cdeps.py +0 -0
  44. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cc/cdeps.toml +0 -0
  45. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cc/cli.py +0 -0
  46. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/__init__.py +0 -0
  47. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_boilerplate.cc +0 -0
  48. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/LICENSE +0 -0
  49. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/__init__.py +0 -0
  50. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/build_ext.py +0 -0
  51. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  52. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  53. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/compilers/options.py +0 -0
  54. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  55. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/dir_util.py +0 -0
  56. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/errors.py +0 -0
  57. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/extension.py +0 -0
  58. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/file_util.py +0 -0
  59. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/modified.py +0 -0
  60. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/spawn.py +0 -0
  61. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/sysconfig.py +0 -0
  62. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/util.py +0 -0
  63. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/_distutils/version.py +0 -0
  64. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/build.py +0 -0
  65. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/cmake.py +0 -0
  66. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/importhook.py +0 -0
  67. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/magic.py +0 -0
  68. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cexts/scan.py +0 -0
  69. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/__init__.py +0 -0
  70. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/__main__.py +0 -0
  71. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/cache.py +0 -0
  72. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/ci.py +0 -0
  73. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/cli.py +0 -0
  74. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/compose.py +0 -0
  75. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/consts.py +0 -0
  76. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/__init__.py +0 -0
  77. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/buildcaching.py +0 -0
  78. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/cache.py +0 -0
  79. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  80. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/cacheserved/cache.py +0 -0
  81. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  82. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/cmds.py +0 -0
  83. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/dataserver.py +0 -0
  84. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/imagepulling.py +0 -0
  85. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/inject.py +0 -0
  86. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/packing.py +0 -0
  87. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/repositories.py +0 -0
  88. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/docker/utils.py +0 -0
  89. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/__init__.py +0 -0
  90. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/api/__init__.py +0 -0
  91. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/api/clients.py +0 -0
  92. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/api/v1/__init__.py +0 -0
  93. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/api/v1/api.py +0 -0
  94. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/api/v1/client.py +0 -0
  95. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/api/v2/__init__.py +0 -0
  96. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/api/v2/api.py +0 -0
  97. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/api/v2/azure.py +0 -0
  98. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/api/v2/client.py +0 -0
  99. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/bootstrap.py +0 -0
  100. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/cache.py +0 -0
  101. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/cli.py +0 -0
  102. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/env.py +0 -0
  103. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/github/inject.py +0 -0
  104. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/inject.py +0 -0
  105. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/requirements.py +0 -0
  106. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/shell.py +0 -0
  107. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ci/utils.py +0 -0
  108. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cli/__init__.py +0 -0
  109. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cli/__main__.py +0 -0
  110. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cli/_pathhack.py +0 -0
  111. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cli/clicli.py +0 -0
  112. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cli/install.py +0 -0
  113. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cli/main.py +0 -0
  114. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cli/managers.py +0 -0
  115. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cli/types.py +0 -0
  116. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/clipboard/__init__.py +0 -0
  117. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/clipboard/clipboard.py +0 -0
  118. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/clipboard/darwin_cf.py +0 -0
  119. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/clipboard/linux_x11.py +0 -0
  120. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cmake.py +0 -0
  121. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cmdlog/__init__.py +0 -0
  122. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cmdlog/__main__.py +0 -0
  123. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cmdlog/_cmdlog.py +0 -0
  124. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cmdlog/cli.py +0 -0
  125. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/cmdlog/cmdlog.py +0 -0
  126. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/dataserver/__init__.py +0 -0
  127. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/dataserver/handlers.py +0 -0
  128. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/dataserver/http.py +0 -0
  129. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/dataserver/routes.py +0 -0
  130. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/dataserver/server.py +0 -0
  131. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/dataserver/targets.py +0 -0
  132. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/git/__init__.py +0 -0
  133. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/git/magic.py +0 -0
  134. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/git/revisions.py +0 -0
  135. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/git/shallow.py +0 -0
  136. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/git/status.py +0 -0
  137. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/home/__init__.py +0 -0
  138. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/home/paths.py +0 -0
  139. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/home/secrets.py +0 -0
  140. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/home/shadow.py +0 -0
  141. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/imgur.py +0 -0
  142. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/__init__.py +0 -0
  143. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/__main__.py +0 -0
  144. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/cli.py +0 -0
  145. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/default.py +0 -0
  146. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/inject.py +0 -0
  147. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/inspect.py +0 -0
  148. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/providers/__init__.py +0 -0
  149. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/providers/base.py +0 -0
  150. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/providers/inject.py +0 -0
  151. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/providers/running.py +0 -0
  152. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/providers/standalone.py +0 -0
  153. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/providers/system.py +0 -0
  154. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/pyenv/__init__.py +0 -0
  155. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/pyenv/inject.py +0 -0
  156. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/pyenv/install.py +0 -0
  157. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/pyenv/provider.py +0 -0
  158. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/pyenv/pyenv.py +0 -0
  159. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/resolvers.py +0 -0
  160. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/types.py +0 -0
  161. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/uv/__init__.py +0 -0
  162. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/uv/inject.py +0 -0
  163. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/uv/provider.py +0 -0
  164. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/uv/uv.py +0 -0
  165. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/interp/venvs.py +0 -0
  166. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/magic/__init__.py +0 -0
  167. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/magic/__main__.py +0 -0
  168. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/magic/cli.py +0 -0
  169. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/magic/find.py +0 -0
  170. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/magic/magic.py +0 -0
  171. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/magic/prepare.py +0 -0
  172. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/magic/styles.py +0 -0
  173. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/manifests/__init__.py +0 -0
  174. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/manifests/__main__.py +0 -0
  175. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/manifests/build.py +0 -0
  176. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/manifests/dumping.py +0 -0
  177. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/manifests/main.py +0 -0
  178. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/mypy/__init__.py +0 -0
  179. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/mypy/debug.py +0 -0
  180. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/__init__.py +0 -0
  181. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/building.py +0 -0
  182. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/compression.py +0 -0
  183. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/data.py +0 -0
  184. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/datarefs.py +0 -0
  185. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/dataserver.py +0 -0
  186. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/loading.py +0 -0
  187. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/media.py +0 -0
  188. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/pack/__init__.py +0 -0
  189. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/pack/packing.py +0 -0
  190. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/pack/repositories.py +0 -0
  191. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/pack/unpacking.py +0 -0
  192. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/repositories.py +0 -0
  193. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/oci/tars.py +0 -0
  194. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/packaging/__init__.py +0 -0
  195. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/packaging/marshal.py +0 -0
  196. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/packaging/names.py +0 -0
  197. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/packaging/requires.py +0 -0
  198. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/packaging/revisions.py +0 -0
  199. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/packaging/specifiers.py +0 -0
  200. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/packaging/versions.py +0 -0
  201. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/packaging/wheelfile.py +0 -0
  202. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pip.py +0 -0
  203. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/precheck/__init__.py +0 -0
  204. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/precheck/__main__.py +0 -0
  205. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/precheck/base.py +0 -0
  206. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/precheck/caches.py +0 -0
  207. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/precheck/git.py +0 -0
  208. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/precheck/imports.py +0 -0
  209. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/precheck/lite.py +0 -0
  210. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/precheck/main.py +0 -0
  211. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/precheck/manifests.py +0 -0
  212. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/precheck/scripts.py +0 -0
  213. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/__init__.py +0 -0
  214. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/apps/__init__.py +0 -0
  215. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/apps/ncdu.py +0 -0
  216. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/confirm.py +0 -0
  217. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/markdown/LICENSE +0 -0
  218. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/markdown/__init__.py +0 -0
  219. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/markdown/__main__.py +0 -0
  220. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/markdown/border.py +0 -0
  221. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/markdown/cli.py +0 -0
  222. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/markdown/markdown.py +0 -0
  223. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/markdown/parser.py +0 -0
  224. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/markdown/styles.py +0 -0
  225. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/markdown/tags.py +0 -0
  226. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/ptk/markdown/utils.py +0 -0
  227. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/__init__.py +0 -0
  228. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/attrdocs.py +0 -0
  229. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/bracepy.py +0 -0
  230. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/classdot.py +0 -0
  231. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/docstrings/LICENSE +0 -0
  232. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/docstrings/__init__.py +0 -0
  233. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/docstrings/attrdoc.py +0 -0
  234. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/docstrings/common.py +0 -0
  235. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/docstrings/epydoc.py +0 -0
  236. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/docstrings/google.py +0 -0
  237. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/docstrings/numpydoc.py +0 -0
  238. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/docstrings/parser.py +0 -0
  239. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/docstrings/rest.py +0 -0
  240. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/findimports.py +0 -0
  241. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/scripts/__init__.py +0 -0
  242. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/scripts/bumpversion.py +0 -0
  243. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/scripts/execstat.py +0 -0
  244. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/scripts/importtrace.py +0 -0
  245. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/srcheaders.py +0 -0
  246. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/tools/__init__.py +0 -0
  247. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/tools/importscan.py +0 -0
  248. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/py/tools/mkrelimp.py +0 -0
  249. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/__init__.py +0 -0
  250. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/__main__.py +0 -0
  251. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/cexts.py +0 -0
  252. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/cli.py +0 -0
  253. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/configs.py +0 -0
  254. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/inject.py +0 -0
  255. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/pkg.py +0 -0
  256. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/reqs.py +0 -0
  257. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/resources/__init__.py +0 -0
  258. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/resources/docker-dev.sh +0 -0
  259. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/resources/python.sh +0 -0
  260. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/pyproject/venvs.py +0 -0
  261. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/scripts/__init__.py +0 -0
  262. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/scripts/slowcat.py +0 -0
  263. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/scripts/tmpexec.py +0 -0
  264. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tagstrings.py +0 -0
  265. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tokens/__init__.py +0 -0
  266. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tokens/all.py +0 -0
  267. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tokens/tokenizert.py +0 -0
  268. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tokens/utils.py +0 -0
  269. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/__init__.py +0 -0
  270. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/antlr/__init__.py +0 -0
  271. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/antlr/__main__.py +0 -0
  272. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/antlr/cli.py +0 -0
  273. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/antlr/consts.py +0 -0
  274. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/antlr/gen.py +0 -0
  275. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/cloc.py +0 -0
  276. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/diff.py +0 -0
  277. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/doc.py +0 -0
  278. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/docker.py +0 -0
  279. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/git/__init__.py +0 -0
  280. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/git/__main__.py +0 -0
  281. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/git/cli.py +0 -0
  282. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/git/consts.py +0 -0
  283. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/git/messages.py +0 -0
  284. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/intellij.py +0 -0
  285. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/json/__init__.py +0 -0
  286. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/json/__main__.py +0 -0
  287. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/json/cli.py +0 -0
  288. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/json/formats.py +0 -0
  289. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/json/io.py +0 -0
  290. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/json/parsing.py +0 -0
  291. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/json/processing.py +0 -0
  292. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/json/rendering.py +0 -0
  293. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/linehisto.py +0 -0
  294. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/mkenv.py +0 -0
  295. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/notebook.py +0 -0
  296. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/pawk/__init__.py +0 -0
  297. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/pawk/__main__.py +0 -0
  298. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/pawk/pawk.py +0 -0
  299. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/pip.py +0 -0
  300. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/prof.py +0 -0
  301. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/qr.py +0 -0
  302. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/shadow.py +0 -0
  303. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev/tools/sqlrepl.py +0 -0
  304. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev.egg-info/SOURCES.txt +0 -0
  305. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev.egg-info/dependency_links.txt +0 -0
  306. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev.egg-info/entry_points.txt +0 -0
  307. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/omdev.egg-info/top_level.txt +0 -0
  308. {omdev-0.0.0.dev315 → omdev-0.0.0.dev317}/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.dev317
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.dev317
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,81 @@ 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
1183
1300
 
1301
+ #
1184
1302
 
1185
- Maybe._empty = tuple.__new__(_Maybe, ()) # noqa
1303
+ def __repr__(self) -> str:
1304
+ return f'just({self._v!r})'
1186
1305
 
1306
+ _hash: int
1187
1307
 
1188
- ##
1308
+ def __hash__(self) -> int:
1309
+ try:
1310
+ return self._hash
1311
+ except AttributeError:
1312
+ pass
1313
+ h = self._hash = hash((_JustMaybe, self._v))
1314
+ return h
1189
1315
 
1316
+ def __eq__(self, other):
1317
+ return (
1318
+ self.__class__ is other.__class__ and
1319
+ self._v == other._v # noqa
1320
+ )
1190
1321
 
1191
- @functools.singledispatch
1192
- def as_maybe(obj: ta.Any) -> Maybe:
1193
- raise TypeError(obj)
1194
1322
 
1323
+ class _EmptyMaybe(_Maybe[T]):
1324
+ __slots__ = ()
1325
+
1326
+ @property
1327
+ def present(self) -> bool:
1328
+ return False
1329
+
1330
+ def must(self) -> T:
1331
+ raise Maybe.ValueNotPresentError
1332
+
1333
+ #
1334
+
1335
+ def __repr__(self) -> str:
1336
+ return 'empty()'
1195
1337
 
1196
- @as_maybe.register
1197
- def _(obj: Maybe) -> Maybe:
1198
- return obj
1338
+ def __hash__(self) -> int:
1339
+ return hash(_EmptyMaybe)
1340
+
1341
+ def __eq__(self, other):
1342
+ return self.__class__ is other.__class__
1343
+
1344
+
1345
+ Maybe._empty = _EmptyMaybe() # noqa
1199
1346
 
1200
1347
 
1201
1348
  ########################################
@@ -1587,9 +1734,16 @@ class PredicateTimeout(Timeout):
1587
1734
  # ../../../omlish/logs/filters.py
1588
1735
 
1589
1736
 
1737
+ ##
1738
+
1739
+
1590
1740
  class TidLogFilter(logging.Filter):
1591
1741
  def filter(self, record):
1592
- record.tid = threading.get_native_id()
1742
+ # FIXME: handle better - missing from wasm and cosmos
1743
+ if hasattr(threading, 'get_native_id'):
1744
+ record.tid = threading.get_native_id()
1745
+ else:
1746
+ record.tid = '?'
1593
1747
  return True
1594
1748
 
1595
1749
 
@@ -1597,6 +1751,9 @@ class TidLogFilter(logging.Filter):
1597
1751
  # ../../../omlish/logs/proxy.py
1598
1752
 
1599
1753
 
1754
+ ##
1755
+
1756
+
1600
1757
  class ProxyLogFilterer(logging.Filterer):
1601
1758
  def __init__(self, underlying: logging.Filterer) -> None: # noqa
1602
1759
  self._underlying = underlying
@@ -5114,6 +5271,9 @@ TODO:
5114
5271
  """
5115
5272
 
5116
5273
 
5274
+ ##
5275
+
5276
+
5117
5277
  class JsonLogFormatter(logging.Formatter):
5118
5278
  KEYS: ta.Mapping[str, bool] = {
5119
5279
  '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,81 @@ class Maybe(ta.Generic[T]):
1109
1210
  return Maybe._empty
1110
1211
 
1111
1212
 
1112
- class _Maybe(Maybe[T], tuple):
1113
- __slots__ = ()
1213
+ ##
1114
1214
 
1115
- def __init_subclass__(cls, **kwargs):
1116
- raise TypeError
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
1226
+
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
1242
+
1243
+ #
1126
1244
 
1245
+ def __repr__(self) -> str:
1246
+ return f'just({self._v!r})'
1127
1247
 
1128
- Maybe._empty = tuple.__new__(_Maybe, ()) # noqa
1248
+ _hash: int
1129
1249
 
1250
+ def __hash__(self) -> int:
1251
+ try:
1252
+ return self._hash
1253
+ except AttributeError:
1254
+ pass
1255
+ h = self._hash = hash((_JustMaybe, self._v))
1256
+ return h
1130
1257
 
1131
- ##
1258
+ def __eq__(self, other):
1259
+ return (
1260
+ self.__class__ is other.__class__ and
1261
+ self._v == other._v # noqa
1262
+ )
1132
1263
 
1133
1264
 
1134
- @functools.singledispatch
1135
- def as_maybe(obj: ta.Any) -> Maybe:
1136
- raise TypeError(obj)
1265
+ class _EmptyMaybe(_Maybe[T]):
1266
+ __slots__ = ()
1137
1267
 
1268
+ @property
1269
+ def present(self) -> bool:
1270
+ return False
1271
+
1272
+ def must(self) -> T:
1273
+ raise Maybe.ValueNotPresentError
1274
+
1275
+ #
1276
+
1277
+ def __repr__(self) -> str:
1278
+ return 'empty()'
1279
+
1280
+ def __hash__(self) -> int:
1281
+ return hash(_EmptyMaybe)
1138
1282
 
1139
- @as_maybe.register
1140
- def _(obj: Maybe) -> Maybe:
1141
- return obj
1283
+ def __eq__(self, other):
1284
+ return self.__class__ is other.__class__
1285
+
1286
+
1287
+ Maybe._empty = _EmptyMaybe() # noqa
1142
1288
 
1143
1289
 
1144
1290
  ########################################
@@ -1530,9 +1676,16 @@ class PredicateTimeout(Timeout):
1530
1676
  # ../../../omlish/logs/filters.py
1531
1677
 
1532
1678
 
1679
+ ##
1680
+
1681
+
1533
1682
  class TidLogFilter(logging.Filter):
1534
1683
  def filter(self, record):
1535
- record.tid = threading.get_native_id()
1684
+ # FIXME: handle better - missing from wasm and cosmos
1685
+ if hasattr(threading, 'get_native_id'):
1686
+ record.tid = threading.get_native_id()
1687
+ else:
1688
+ record.tid = '?'
1536
1689
  return True
1537
1690
 
1538
1691
 
@@ -1540,6 +1693,9 @@ class TidLogFilter(logging.Filter):
1540
1693
  # ../../../omlish/logs/proxy.py
1541
1694
 
1542
1695
 
1696
+ ##
1697
+
1698
+
1543
1699
  class ProxyLogFilterer(logging.Filterer):
1544
1700
  def __init__(self, underlying: logging.Filterer) -> None: # noqa
1545
1701
  self._underlying = underlying
@@ -3579,6 +3735,9 @@ TODO:
3579
3735
  """
3580
3736
 
3581
3737
 
3738
+ ##
3739
+
3740
+
3582
3741
  class JsonLogFormatter(logging.Formatter):
3583
3742
  KEYS: ta.Mapping[str, bool] = {
3584
3743
  'name': False,