omlish 0.0.0.dev39__tar.gz → 0.0.0.dev41__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 (340) hide show
  1. {omlish-0.0.0.dev39/omlish.egg-info → omlish-0.0.0.dev41}/PKG-INFO +13 -11
  2. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/__about__.py +7 -4
  3. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/argparse.py +2 -2
  4. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/bootstrap/base.py +1 -1
  5. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/c3.py +6 -3
  6. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/check.py +33 -23
  7. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/concurrent/threadlets.py +1 -1
  8. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/pycharm.py +2 -2
  9. omlish-0.0.0.dev41/omlish/docker/__init__.py +27 -0
  10. omlish-0.0.0.dev41/omlish/docker/cli.py +101 -0
  11. omlish-0.0.0.dev41/omlish/docker/compose.py +51 -0
  12. omlish-0.0.0.dev41/omlish/docker/helpers.py +48 -0
  13. omlish-0.0.0.dev41/omlish/docker/hub.py +75 -0
  14. omlish-0.0.0.dev41/omlish/docker/manifests.py +166 -0
  15. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/__init__.py +1 -0
  16. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/strings.py +25 -37
  17. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/keywords/base.py +5 -5
  18. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/keywords/core.py +1 -2
  19. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/keywords/metadata.py +1 -2
  20. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/keywords/parse.py +3 -4
  21. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/keywords/validation.py +1 -2
  22. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/__init__.py +2 -4
  23. omlish-0.0.0.dev41/omlish/testing/pytest/marks.py +18 -0
  24. omlish-0.0.0.dev39/omlish/testing/pytest/marks.py → omlish-0.0.0.dev41/omlish/testing/pytest/skip.py +5 -20
  25. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41/omlish.egg-info}/PKG-INFO +13 -11
  26. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish.egg-info/SOURCES.txt +7 -1
  27. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish.egg-info/requires.txt +6 -4
  28. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/pyproject.toml +6 -4
  29. omlish-0.0.0.dev39/omlish/docker.py +0 -270
  30. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/LICENSE +0 -0
  31. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/MANIFEST.in +0 -0
  32. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/README.rst +0 -0
  33. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/.manifests.json +0 -0
  34. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/__init__.py +0 -0
  35. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/asyncs/__init__.py +0 -0
  36. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/asyncs/anyio.py +0 -0
  37. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/asyncs/asyncio.py +0 -0
  38. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/asyncs/asyncs.py +0 -0
  39. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/asyncs/bridge.py +0 -0
  40. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/asyncs/flavors.py +0 -0
  41. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/asyncs/trio.py +0 -0
  42. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/asyncs/trio_asyncio.py +0 -0
  43. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/bootstrap/__init__.py +0 -0
  44. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/bootstrap/__main__.py +0 -0
  45. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/bootstrap/diag.py +0 -0
  46. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/bootstrap/harness.py +0 -0
  47. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/bootstrap/main.py +0 -0
  48. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/bootstrap/marshal.py +0 -0
  49. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/bootstrap/sys.py +0 -0
  50. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/cached.py +0 -0
  51. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/__init__.py +0 -0
  52. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/_abc.py +0 -0
  53. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/_io_abc.py +0 -0
  54. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/cache/__init__.py +0 -0
  55. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/cache/descriptor.py +0 -0
  56. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/cache/impl.py +0 -0
  57. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/cache/types.py +0 -0
  58. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/coerce.py +0 -0
  59. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/exceptions.py +0 -0
  60. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/frozen.py +0 -0
  61. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/identity.py +0 -0
  62. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/indexed.py +0 -0
  63. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/mappings.py +0 -0
  64. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/ordered.py +0 -0
  65. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/persistent.py +0 -0
  66. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/skiplist.py +0 -0
  67. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/sorted.py +0 -0
  68. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/treap.py +0 -0
  69. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/treapmap.py +0 -0
  70. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/unmodifiable.py +0 -0
  71. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/collections/utils.py +0 -0
  72. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/concurrent/__init__.py +0 -0
  73. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/concurrent/executors.py +0 -0
  74. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/concurrent/futures.py +0 -0
  75. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/configs/__init__.py +0 -0
  76. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/configs/classes.py +0 -0
  77. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/configs/flattening.py +0 -0
  78. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/configs/strings.py +0 -0
  79. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/__init__.py +0 -0
  80. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/LICENSE +0 -0
  81. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/__init__.py +0 -0
  82. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/api.py +0 -0
  83. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/as_.py +0 -0
  84. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/copy.py +0 -0
  85. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/descriptors.py +0 -0
  86. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/exceptions.py +0 -0
  87. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/fields.py +0 -0
  88. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/frozen.py +0 -0
  89. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/hashing.py +0 -0
  90. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/init.py +0 -0
  91. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/internals.py +0 -0
  92. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/main.py +0 -0
  93. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/metaclass.py +0 -0
  94. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/metadata.py +0 -0
  95. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/order.py +0 -0
  96. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/params.py +0 -0
  97. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/processing.py +0 -0
  98. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/reflect.py +0 -0
  99. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/replace.py +0 -0
  100. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/repr.py +0 -0
  101. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/simple.py +0 -0
  102. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/slots.py +0 -0
  103. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/impl/utils.py +0 -0
  104. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dataclasses/utils.py +0 -0
  105. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/datetimes.py +0 -0
  106. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/defs.py +0 -0
  107. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/__init__.py +0 -0
  108. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/asts.py +0 -0
  109. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/procfs.py +0 -0
  110. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/procstats.py +0 -0
  111. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/ps.py +0 -0
  112. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/pydevd.py +0 -0
  113. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/replserver/__init__.py +0 -0
  114. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/replserver/__main__.py +0 -0
  115. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/replserver/console.py +0 -0
  116. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/replserver/server.py +0 -0
  117. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/diag/threads.py +0 -0
  118. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dispatch/__init__.py +0 -0
  119. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dispatch/_dispatch2.py +0 -0
  120. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dispatch/_dispatch3.py +0 -0
  121. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dispatch/dispatch.py +0 -0
  122. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dispatch/functions.py +0 -0
  123. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dispatch/methods.py +0 -0
  124. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/dynamic.py +0 -0
  125. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/fnpairs.py +0 -0
  126. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/fnpipes.py +0 -0
  127. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/formats/__init__.py +0 -0
  128. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/formats/dotenv.py +0 -0
  129. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/formats/json.py +0 -0
  130. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/formats/props.py +0 -0
  131. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/formats/yaml.py +0 -0
  132. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/genmachine.py +0 -0
  133. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/graphs/__init__.py +0 -0
  134. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/graphs/dags.py +0 -0
  135. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/graphs/domination.py +0 -0
  136. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/graphs/dot/__init__.py +0 -0
  137. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/graphs/dot/items.py +0 -0
  138. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/graphs/dot/make.py +0 -0
  139. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/graphs/dot/rendering.py +0 -0
  140. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/graphs/dot/utils.py +0 -0
  141. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/graphs/trees.py +0 -0
  142. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/http/__init__.py +0 -0
  143. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/http/asgi.py +0 -0
  144. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/http/collections.py +0 -0
  145. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/http/consts.py +0 -0
  146. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/http/cookies.py +0 -0
  147. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/http/dates.py +0 -0
  148. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/http/encodings.py +0 -0
  149. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/http/json.py +0 -0
  150. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/http/sessions.py +0 -0
  151. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/http/wsgi.py +0 -0
  152. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/__init__.py +0 -0
  153. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/binder.py +0 -0
  154. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/bindings.py +0 -0
  155. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/eagers.py +0 -0
  156. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/elements.py +0 -0
  157. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/exceptions.py +0 -0
  158. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/__init__.py +0 -0
  159. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/bindings.py +0 -0
  160. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/elements.py +0 -0
  161. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/injector.py +0 -0
  162. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/inspect.py +0 -0
  163. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/multis.py +0 -0
  164. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/origins.py +0 -0
  165. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/privates.py +0 -0
  166. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/providers.py +0 -0
  167. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/proxy.py +0 -0
  168. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/impl/scopes.py +0 -0
  169. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/injector.py +0 -0
  170. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/inspect.py +0 -0
  171. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/keys.py +0 -0
  172. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/listeners.py +0 -0
  173. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/managed.py +0 -0
  174. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/multis.py +0 -0
  175. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/origins.py +0 -0
  176. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/overrides.py +0 -0
  177. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/privates.py +0 -0
  178. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/providers.py +0 -0
  179. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/scopes.py +0 -0
  180. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/types.py +0 -0
  181. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/inject/utils.py +0 -0
  182. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/iterators.py +0 -0
  183. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/cached.py +0 -0
  184. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/classes/__init__.py +0 -0
  185. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/classes/abstract.py +0 -0
  186. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/classes/restrict.py +0 -0
  187. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/classes/simple.py +0 -0
  188. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/classes/virtual.py +0 -0
  189. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/clsdct.py +0 -0
  190. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/cmp.py +0 -0
  191. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/contextmanagers.py +0 -0
  192. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/datetimes.py +0 -0
  193. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/descriptors.py +0 -0
  194. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/exceptions.py +0 -0
  195. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/functions.py +0 -0
  196. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/imports.py +0 -0
  197. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/iterables.py +0 -0
  198. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/maybes.py +0 -0
  199. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/objects.py +0 -0
  200. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/resolving.py +0 -0
  201. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/resources.py +0 -0
  202. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/sys.py +0 -0
  203. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/timeouts.py +0 -0
  204. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lang/typing.py +0 -0
  205. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/libc.py +0 -0
  206. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lifecycles/__init__.py +0 -0
  207. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lifecycles/abstract.py +0 -0
  208. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lifecycles/base.py +0 -0
  209. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lifecycles/contextmanagers.py +0 -0
  210. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lifecycles/controller.py +0 -0
  211. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lifecycles/manager.py +0 -0
  212. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lifecycles/states.py +0 -0
  213. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lifecycles/transitions.py +0 -0
  214. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/__init__.py +0 -0
  215. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/cached.py +0 -0
  216. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/check.py +0 -0
  217. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/contextmanagers.py +0 -0
  218. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/json.py +0 -0
  219. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/logs.py +0 -0
  220. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/marshal.py +0 -0
  221. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/reflect.py +0 -0
  222. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/runtime.py +0 -0
  223. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/secrets.py +0 -0
  224. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/strings.py +0 -0
  225. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/lite/subprocesses.py +0 -0
  226. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/logs/__init__.py +0 -0
  227. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/logs/_abc.py +0 -0
  228. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/logs/configs.py +0 -0
  229. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/logs/formatters.py +0 -0
  230. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/logs/handlers.py +0 -0
  231. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/logs/noisy.py +0 -0
  232. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/logs/utils.py +0 -0
  233. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/__init__.py +0 -0
  234. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/any.py +0 -0
  235. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/base.py +0 -0
  236. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/base64.py +0 -0
  237. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/dataclasses.py +0 -0
  238. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/datetimes.py +0 -0
  239. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/enums.py +0 -0
  240. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/exceptions.py +0 -0
  241. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/factories.py +0 -0
  242. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/forbidden.py +0 -0
  243. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/global_.py +0 -0
  244. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/helpers.py +0 -0
  245. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/iterables.py +0 -0
  246. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/mappings.py +0 -0
  247. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/maybes.py +0 -0
  248. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/naming.py +0 -0
  249. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/numbers.py +0 -0
  250. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/objects.py +0 -0
  251. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/optionals.py +0 -0
  252. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/polymorphism.py +0 -0
  253. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/primitives.py +0 -0
  254. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/registries.py +0 -0
  255. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/standard.py +0 -0
  256. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/unions.py +0 -0
  257. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/utils.py +0 -0
  258. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/uuids.py +0 -0
  259. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/marshal/values.py +0 -0
  260. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/matchfns.py +0 -0
  261. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/math/__init__.py +0 -0
  262. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/math/bits.py +0 -0
  263. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/math/floats.py +0 -0
  264. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/math/stats.py +0 -0
  265. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/multiprocessing.py +0 -0
  266. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/os.py +0 -0
  267. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/reflect/__init__.py +0 -0
  268. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/reflect/isinstance.py +0 -0
  269. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/reflect/ops.py +0 -0
  270. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/reflect/subst.py +0 -0
  271. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/reflect/types.py +0 -0
  272. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/runmodule.py +0 -0
  273. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/secrets/__init__.py +0 -0
  274. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/secrets/crypto.py +0 -0
  275. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/secrets/marshal.py +0 -0
  276. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/secrets/openssl.py +0 -0
  277. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/secrets/passwords.py +0 -0
  278. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/secrets/secrets.py +0 -0
  279. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/secrets/subprocesses.py +0 -0
  280. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/__init__.py +0 -0
  281. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonrpc/__init__.py +0 -0
  282. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonrpc/errors.py +0 -0
  283. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonrpc/marshal.py +0 -0
  284. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonrpc/types.py +0 -0
  285. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/__init__.py +0 -0
  286. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/keywords/__init__.py +0 -0
  287. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/keywords/render.py +0 -0
  288. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/__init__.py +0 -0
  289. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/__init__.py +0 -0
  290. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/metaschema.json +0 -0
  291. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/__init__.py +0 -0
  292. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/applicator.json +0 -0
  293. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/content.json +0 -0
  294. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/core.json +0 -0
  295. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format-annotation.json +0 -0
  296. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format-assertion.json +0 -0
  297. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format.json +0 -0
  298. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/meta-data.json +0 -0
  299. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/unevaluated.json +0 -0
  300. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/validation.json +0 -0
  301. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/specs/jsonschema/types.py +0 -0
  302. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sql/__init__.py +0 -0
  303. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sql/_abc.py +0 -0
  304. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sql/alchemy/__init__.py +0 -0
  305. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sql/alchemy/asyncs.py +0 -0
  306. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sql/alchemy/duckdb.py +0 -0
  307. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sql/alchemy/exprs.py +0 -0
  308. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sql/alchemy/secrets.py +0 -0
  309. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sql/alchemy/sqlean.py +0 -0
  310. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sql/dbs.py +0 -0
  311. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sql/qualifiedname.py +0 -0
  312. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/sync.py +0 -0
  313. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/term.py +0 -0
  314. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/__init__.py +0 -0
  315. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/helpers.py +0 -0
  316. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/inject/__init__.py +0 -0
  317. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/inject/harness.py +0 -0
  318. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/__init__.py +0 -0
  319. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/_registry.py +0 -0
  320. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/asyncs.py +0 -0
  321. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/depskip.py +0 -0
  322. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/logging.py +0 -0
  323. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/managermarks.py +0 -0
  324. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/pydevd.py +0 -0
  325. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/repeat.py +0 -0
  326. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/skips.py +0 -0
  327. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/spacing.py +0 -0
  328. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/switches.py +0 -0
  329. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/pytest/plugins/utils.py +0 -0
  330. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/testing/testing.py +0 -0
  331. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/text/__init__.py +0 -0
  332. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/text/asdl.py +0 -0
  333. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/text/delimit.py +0 -0
  334. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/text/glyphsplit.py +0 -0
  335. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/text/indent.py +0 -0
  336. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish/text/parts.py +0 -0
  337. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish.egg-info/dependency_links.txt +0 -0
  338. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish.egg-info/entry_points.txt +0 -0
  339. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/omlish.egg-info/top_level.txt +0 -0
  340. {omlish-0.0.0.dev39 → omlish-0.0.0.dev41}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev39
3
+ Version: 0.0.0.dev41
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -18,7 +18,7 @@ Requires-Dist: sniffio~=1.3; extra == "all"
18
18
  Requires-Dist: greenlet~=3.1; extra == "all"
19
19
  Requires-Dist: trio~=0.26; extra == "all"
20
20
  Requires-Dist: trio-asyncio~=0.15; extra == "all"
21
- Requires-Dist: lz4~=4.0; extra == "all"
21
+ Requires-Dist: lz4~=4.3; extra == "all"
22
22
  Requires-Dist: python-snappy~=0.7; python_version < "3.13" and extra == "all"
23
23
  Requires-Dist: zstd~=1.5; extra == "all"
24
24
  Requires-Dist: asttokens~=2.4; extra == "all"
@@ -39,6 +39,7 @@ Requires-Dist: pymysql~=1.1; extra == "all"
39
39
  Requires-Dist: aiomysql~=0.2; extra == "all"
40
40
  Requires-Dist: aiosqlite~=0.20; extra == "all"
41
41
  Requires-Dist: asyncpg~=0.29; python_version < "3.13" and extra == "all"
42
+ Requires-Dist: apsw~=3.46; extra == "all"
42
43
  Requires-Dist: sqlean.py~=3.45; python_version < "3.13" and extra == "all"
43
44
  Requires-Dist: duckdb~=1.1; extra == "all"
44
45
  Requires-Dist: pytest~=8.0; extra == "all"
@@ -49,7 +50,7 @@ Requires-Dist: greenlet~=3.1; extra == "async"
49
50
  Requires-Dist: trio~=0.26; extra == "async"
50
51
  Requires-Dist: trio-asyncio~=0.15; extra == "async"
51
52
  Provides-Extra: compress
52
- Requires-Dist: lz4~=4.0; extra == "compress"
53
+ Requires-Dist: lz4~=4.3; extra == "compress"
53
54
  Requires-Dist: python-snappy~=0.7; python_version < "3.13" and extra == "compress"
54
55
  Requires-Dist: zstd~=1.5; extra == "compress"
55
56
  Provides-Extra: diag
@@ -71,13 +72,14 @@ Provides-Extra: secrets
71
72
  Requires-Dist: cryptography~=43.0; extra == "secrets"
72
73
  Provides-Extra: sqlalchemy
73
74
  Requires-Dist: sqlalchemy[asyncio]~=2.0; extra == "sqlalchemy"
74
- Provides-Extra: sqlalchemy-drivers
75
- Requires-Dist: pg8000~=1.31; extra == "sqlalchemy-drivers"
76
- Requires-Dist: pymysql~=1.1; extra == "sqlalchemy-drivers"
77
- Requires-Dist: aiomysql~=0.2; extra == "sqlalchemy-drivers"
78
- Requires-Dist: aiosqlite~=0.20; extra == "sqlalchemy-drivers"
79
- Requires-Dist: asyncpg~=0.29; python_version < "3.13" and extra == "sqlalchemy-drivers"
80
- Requires-Dist: sqlean.py~=3.45; python_version < "3.13" and extra == "sqlalchemy-drivers"
81
- Requires-Dist: duckdb~=1.1; extra == "sqlalchemy-drivers"
75
+ Provides-Extra: sqldrivers
76
+ Requires-Dist: pg8000~=1.31; extra == "sqldrivers"
77
+ Requires-Dist: pymysql~=1.1; extra == "sqldrivers"
78
+ Requires-Dist: aiomysql~=0.2; extra == "sqldrivers"
79
+ Requires-Dist: aiosqlite~=0.20; extra == "sqldrivers"
80
+ Requires-Dist: asyncpg~=0.29; python_version < "3.13" and extra == "sqldrivers"
81
+ Requires-Dist: apsw~=3.46; extra == "sqldrivers"
82
+ Requires-Dist: sqlean.py~=3.45; python_version < "3.13" and extra == "sqldrivers"
83
+ Requires-Dist: duckdb~=1.1; extra == "sqldrivers"
82
84
  Provides-Extra: testing
83
85
  Requires-Dist: pytest~=8.0; extra == "testing"
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev39'
2
- __revision__ = 'a18b6ac9698db2d5d932d6055a4828fd9f6c5848-dirty'
1
+ __version__ = '0.0.0.dev41'
2
+ __revision__ = '9666ba3a1c40b95074dfcacd1c0c87ca5e267d6f'
3
3
 
4
4
 
5
5
  #
@@ -40,7 +40,8 @@ class Project(ProjectBase):
40
40
  ],
41
41
 
42
42
  'compress': [
43
- 'lz4 ~= 4.0',
43
+ 'lz4 ~= 4.3',
44
+ # 'lz4 @ git+https://github.com/wrmsr/python-lz4@wrmsr_20240830_GIL_NOT_USED'
44
45
 
45
46
  'python-snappy ~= 0.7; python_version < "3.13"',
46
47
 
@@ -83,7 +84,7 @@ class Project(ProjectBase):
83
84
  'sqlalchemy[asyncio] ~= 2.0',
84
85
  ],
85
86
 
86
- 'sqlalchemy-drivers': [
87
+ 'sqldrivers': [
87
88
  'pg8000 ~= 1.31',
88
89
  # 'psycopg2 ~= 2.9',
89
90
  # 'psycopg ~= 3.2',
@@ -96,6 +97,8 @@ class Project(ProjectBase):
96
97
  'aiosqlite ~= 0.20',
97
98
  'asyncpg ~= 0.29; python_version < "3.13"',
98
99
 
100
+ 'apsw ~= 3.46',
101
+
99
102
  'sqlean.py ~= 3.45; python_version < "3.13"',
100
103
 
101
104
  'duckdb ~= 1.1',
@@ -73,7 +73,7 @@ class Command:
73
73
 
74
74
  def __post_init__(self) -> None:
75
75
  check.isinstance(self.name, str)
76
- check.not_in('-', self.name)
76
+ check.not_in('_', self.name)
77
77
  check.not_empty(self.name)
78
78
 
79
79
  check.callable(self.fn)
@@ -103,7 +103,7 @@ def command(
103
103
 
104
104
  def inner(fn):
105
105
  return Command(
106
- (name if name is not None else fn.__name__).replace('-', '_'),
106
+ (name if name is not None else fn.__name__).replace('_', '-'),
107
107
  fn,
108
108
  args,
109
109
  parent=parent,
@@ -2,7 +2,7 @@ import abc
2
2
  import dataclasses as dc
3
3
  import typing as ta
4
4
 
5
- from omlish import lang
5
+ from .. import lang
6
6
 
7
7
 
8
8
  BootstrapConfigT = ta.TypeVar('BootstrapConfigT', bound='Bootstrap.Config')
@@ -43,7 +43,8 @@ T = ta.TypeVar('T')
43
43
 
44
44
 
45
45
  def merge(seqs: ta.MutableSequence[list[T]]) -> list[T]:
46
- """Merges MROs in *sequences* to a single MRO using the C3 algorithm.
46
+ """
47
+ Merges MROs in *sequences* to a single MRO using the C3 algorithm.
47
48
 
48
49
  Adapted from https://www.python.org/download/releases/2.3/mro/.
49
50
  """
@@ -78,7 +79,8 @@ def mro(
78
79
  get_bases: ta.Callable[[T], ta.Sequence[T]] = operator.attrgetter('__bases__'),
79
80
  is_subclass: ta.Callable[[T, T], bool] = issubclass, # type: ignore
80
81
  ) -> list[T]:
81
- """Computes the method resolution order using extended C3 linearization.
82
+ """
83
+ Computes the method resolution order using extended C3 linearization.
82
84
 
83
85
  If no *abcs* are given, the algorithm works exactly like the built-in C3 linearization used for method resolution.
84
86
 
@@ -128,7 +130,8 @@ def compose_mro(
128
130
  is_subclass: ta.Callable[[T, T], bool] = issubclass, # type: ignore
129
131
  get_subclasses: ta.Callable[[T], ta.Iterable[T]] = operator.methodcaller('__subclasses__'),
130
132
  ) -> list[T]:
131
- """Calculates the method resolution order for a given class *cls*.
133
+ """
134
+ Calculates the method resolution order for a given class *cls*.
132
135
 
133
136
  Includes relevant abstract base classes (with their respective bases) from the *types* list. Uses a modified C3
134
137
  linearization algorithm.
@@ -44,41 +44,49 @@ def unregister_on_raise(fn: OnRaiseFn) -> None:
44
44
  #
45
45
 
46
46
 
47
- _render_args: ta.Callable[..., str | None] | None = None
47
+ _ARGS_RENDERER: ta.Callable[..., str | None] | None = None
48
48
 
49
49
 
50
- def enable_args_rendering() -> bool:
51
- global _render_args
52
- if _render_args is not None:
50
+ def _try_enable_args_rendering() -> bool:
51
+ global _ARGS_RENDERER
52
+ if _ARGS_RENDERER is not None:
53
53
  return True
54
54
 
55
- with _CONFIG_LOCK:
56
- if _render_args is not None:
57
- return True # type: ignore
55
+ try:
56
+ from .diag.asts import ArgsRenderer
58
57
 
59
- try:
60
- from .diag.asts import ArgsRenderer
58
+ ArgsRenderer.smoketest()
61
59
 
62
- ArgsRenderer.smoketest()
60
+ except Exception: # noqa
61
+ return False
63
62
 
64
- except Exception: # noqa
65
- return False
63
+ def _real_render_args(fmt: str, *args: ta.Any) -> str | None:
64
+ ra = ArgsRenderer(back=3).render_args(*args)
65
+ if ra is None:
66
+ return None
66
67
 
67
- def _real_render_args(fmt: str, *args: ta.Any) -> str | None:
68
- ra = ArgsRenderer(back=3).render_args(*args)
69
- if ra is None:
70
- return None
68
+ return fmt % tuple(str(a) for a in ra)
71
69
 
72
- return fmt % tuple(str(a) for a in ra)
70
+ _ARGS_RENDERER = _real_render_args
71
+ return True
73
72
 
74
- _render_args = _real_render_args
75
- return True
76
73
 
74
+ _TRIED_ENABLED_ARGS_RENDERING: bool | None = None
77
75
 
78
- enable_args_rendering()
79
76
 
77
+ def try_enable_args_rendering() -> bool:
78
+ global _TRIED_ENABLED_ARGS_RENDERING
79
+ if _TRIED_ENABLED_ARGS_RENDERING is not None:
80
+ return _TRIED_ENABLED_ARGS_RENDERING
80
81
 
81
- #
82
+ with _CONFIG_LOCK:
83
+ if _TRIED_ENABLED_ARGS_RENDERING is None:
84
+ _TRIED_ENABLED_ARGS_RENDERING = _try_enable_args_rendering()
85
+
86
+ return _TRIED_ENABLED_ARGS_RENDERING
87
+
88
+
89
+ ##
82
90
 
83
91
 
84
92
  def _default_exception_factory(exc_cls: type[Exception], *args, **kwargs) -> Exception:
@@ -111,8 +119,8 @@ def _raise(
111
119
  if message is None:
112
120
  message = default_message
113
121
 
114
- if render_fmt is not None and _render_args is not None:
115
- rendered_args = _render_args(render_fmt, *ak.args)
122
+ if render_fmt is not None and _ARGS_RENDERER is not None:
123
+ rendered_args = _ARGS_RENDERER(render_fmt, *ak.args)
116
124
  if rendered_args is not None:
117
125
  message = f'{message} : {rendered_args}'
118
126
 
@@ -124,6 +132,8 @@ def _raise(
124
132
  **ak.kwargs,
125
133
  )
126
134
 
135
+ try_enable_args_rendering()
136
+
127
137
  for fn in _ON_RAISE:
128
138
  fn(exc)
129
139
 
@@ -7,7 +7,7 @@ import abc
7
7
  import dataclasses as dc
8
8
  import typing as ta
9
9
 
10
- from omlish import lang
10
+ from .. import lang
11
11
 
12
12
 
13
13
  if ta.TYPE_CHECKING:
@@ -9,9 +9,9 @@ from .. import lang
9
9
 
10
10
 
11
11
  if ta.TYPE_CHECKING:
12
- docker = lang.proxy_import('omlish.docker')
12
+ docker = lang.proxy_import('..docker')
13
13
  else:
14
- from omlish import docker
14
+ from .. import docker
15
15
 
16
16
 
17
17
  ##
@@ -0,0 +1,27 @@
1
+ from .cli import ( # noqa
2
+ Inspect,
3
+ Port,
4
+ PsItem,
5
+ cli_inspect,
6
+ cli_ps,
7
+ has_cli,
8
+ parse_port,
9
+ )
10
+
11
+ from .compose import ( # noqa
12
+ ComposeConfig,
13
+ get_compose_port,
14
+ )
15
+
16
+ from .helpers import ( # noqa
17
+ DOCKER_FOR_MAC_HOSTNAME,
18
+ DOCKER_HOST_PLATFORM_KEY,
19
+ get_docker_host_platform,
20
+ is_likely_in_docker,
21
+ timebomb_payload,
22
+ )
23
+
24
+ from .hub import ( # noqa
25
+ HubRepoInfo,
26
+ get_hub_repo_info,
27
+ )
@@ -0,0 +1,101 @@
1
+ """
2
+ TODO:
3
+ - https://github.com/mag37/dockcheck/blob/3d122f2b868eb53a25a3014f0f6bd499390a3a29/dockcheck.sh
4
+ - https://github.com/regclient/regclient
5
+ - https://stackoverflow.com/questions/71409458/how-to-download-docker-image-using-http-api-using-docker-hub-credentials
6
+ - https://stackoverflow.com/questions/55386202/how-can-i-use-the-docker-registry-api-to-pull-information-about-a-container-get
7
+ - https://ops.tips/blog/inspecting-docker-image-without-pull/
8
+ """ # noqa
9
+ import datetime
10
+ import re
11
+ import subprocess
12
+ import typing as ta
13
+
14
+ from .. import check
15
+ from .. import dataclasses as dc
16
+ from .. import lang
17
+ from .. import marshal as msh
18
+ from ..formats import json
19
+
20
+
21
+ @dc.dataclass(frozen=True)
22
+ @msh.update_object_metadata(field_naming=msh.Naming.CAMEL, unknown_field='x')
23
+ @msh.update_fields_metadata(['id'], name='ID')
24
+ class PsItem(lang.Final):
25
+ command: str
26
+ created_at: datetime.datetime
27
+ id: str
28
+ image: str
29
+ labels: str
30
+ local_volumes: str
31
+ mounts: str
32
+ names: str
33
+ networks: str
34
+ ports: str
35
+ running_for: str
36
+ size: str
37
+ state: str
38
+ status: str
39
+
40
+ x: ta.Mapping[str, ta.Any] | None = None
41
+
42
+
43
+ class Port(ta.NamedTuple):
44
+ ip: str
45
+ from_port: int
46
+ to_port: int
47
+ proto: str
48
+
49
+
50
+ _PORT_PAT = re.compile(r'(?P<ip>[^:]+):(?P<from_port>\d+)->(?P<to_port>\d+)/(?P<proto>\w+)')
51
+
52
+
53
+ def parse_port(s: str) -> Port:
54
+ # '0.0.0.0:35221->22/tcp, 0.0.0.0:35220->8000/tcp'
55
+ m = check.not_none(_PORT_PAT.fullmatch(s))
56
+ return Port(
57
+ m.group('ip'),
58
+ int(m.group('from_port')),
59
+ int(m.group('to_port')),
60
+ m.group('proto'),
61
+ )
62
+
63
+
64
+ def cli_ps() -> list[PsItem]:
65
+ o = subprocess.check_output([
66
+ 'docker',
67
+ 'ps',
68
+ '--no-trunc',
69
+ '--format', '{{json .}}',
70
+ ])
71
+
72
+ ret: list[PsItem] = []
73
+ for l in o.decode().splitlines():
74
+ d = json.loads(l)
75
+ pi = msh.unmarshal(d, PsItem)
76
+ ret.append(pi)
77
+
78
+ return ret
79
+
80
+
81
+ @dc.dataclass(frozen=True)
82
+ @msh.update_object_metadata(field_naming=msh.Naming.CAMEL, unknown_field='x')
83
+ class Inspect(lang.Final):
84
+ id: str
85
+ created: datetime.datetime
86
+
87
+ x: ta.Mapping[str, ta.Any] | None = None
88
+
89
+
90
+ def cli_inspect(ids: list[str]) -> list[Inspect]:
91
+ o = subprocess.check_output(['docker', 'inspect', *ids])
92
+ return msh.unmarshal(json.loads(o.decode()), list[Inspect])
93
+
94
+
95
+ def has_cli() -> bool:
96
+ try:
97
+ proc = subprocess.run(['docker', '--version']) # noqa
98
+ except (FileNotFoundError, subprocess.CalledProcessError):
99
+ return False
100
+ else:
101
+ return not proc.returncode
@@ -0,0 +1,51 @@
1
+ """
2
+ TODO:
3
+ - merged compose configs: https://github.com/wrmsr/bane/blob/27647abdcfb323b73e6982a5c318c7029496b203/core/dev/docker/compose.go#L38
4
+ """ # noqa
5
+ import typing as ta
6
+
7
+ from .. import check
8
+ from .. import lang
9
+
10
+
11
+ if ta.TYPE_CHECKING:
12
+ import yaml
13
+ else:
14
+ yaml = lang.proxy_import('yaml')
15
+
16
+
17
+ class ComposeConfig:
18
+ def __init__(
19
+ self,
20
+ prefix: str,
21
+ *,
22
+ file_path: str | None = None,
23
+ ) -> None:
24
+ super().__init__()
25
+
26
+ self._prefix = prefix
27
+ self._file_path = file_path
28
+
29
+ @lang.cached_function
30
+ def get_config(self) -> ta.Mapping[str, ta.Any]:
31
+ with open(check.not_none(self._file_path)) as f:
32
+ buf = f.read()
33
+ return yaml.safe_load(buf)
34
+
35
+ @lang.cached_function
36
+ def get_services(self) -> ta.Mapping[str, ta.Any]:
37
+ ret = {}
38
+ for n, c in self.get_config()['services'].items():
39
+ check.state(n.startswith(self._prefix))
40
+ ret[n[len(self._prefix):]] = c
41
+
42
+ return ret
43
+
44
+
45
+ def get_compose_port(cfg: ta.Mapping[str, ta.Any], default: int) -> int:
46
+ return check.single(
47
+ int(l)
48
+ for p in cfg['ports']
49
+ for l, r in [p.split(':')]
50
+ if int(r) == default
51
+ )
@@ -0,0 +1,48 @@
1
+ import os
2
+ import re
3
+ import shlex
4
+ import sys
5
+
6
+
7
+ ##
8
+
9
+
10
+ _DEFAULT_TIMEBOMB_NAME = '-'.join([*__name__.split('.'), 'timebomb'])
11
+
12
+
13
+ def timebomb_payload(delay_s: float, name: str = _DEFAULT_TIMEBOMB_NAME) -> str:
14
+ return (
15
+ '('
16
+ f'echo {shlex.quote(name)} && '
17
+ f'sleep {delay_s:g} && '
18
+ 'sh -c \'killall5 -9 -o $PPID -o $$ ; kill 1\''
19
+ ') &'
20
+ )
21
+
22
+
23
+ ##
24
+
25
+
26
+ DOCKER_FOR_MAC_HOSTNAME = 'docker.for.mac.localhost'
27
+
28
+
29
+ _LIKELY_IN_DOCKER_PATTERN = re.compile(r'^overlay / .*/docker/')
30
+
31
+
32
+ def is_likely_in_docker() -> bool:
33
+ if getattr(sys, 'platform') != 'linux':
34
+ return False
35
+ with open('/proc/mounts') as f:
36
+ ls = f.readlines()
37
+ return any(_LIKELY_IN_DOCKER_PATTERN.match(l) for l in ls)
38
+
39
+
40
+ ##
41
+
42
+
43
+ # Set by pyproject, docker-dev script
44
+ DOCKER_HOST_PLATFORM_KEY = 'DOCKER_HOST_PLATFORM'
45
+
46
+
47
+ def get_docker_host_platform() -> str | None:
48
+ return os.environ.get(DOCKER_HOST_PLATFORM_KEY)
@@ -0,0 +1,75 @@
1
+ import typing as ta
2
+ import urllib.request
3
+
4
+ from .. import dataclasses as dc
5
+ from ..formats import json
6
+
7
+
8
+ @dc.dataclass(frozen=True)
9
+ class HubRepoInfo:
10
+ repo: str
11
+ tags: ta.Mapping[str, ta.Any]
12
+ latest_manifests: ta.Mapping[str, ta.Any]
13
+
14
+
15
+ def get_hub_repo_info(
16
+ repo: str,
17
+ *,
18
+ auth_url: str = 'https://auth.docker.io/',
19
+ api_url: str = 'https://registry-1.docker.io/v2/',
20
+ ) -> HubRepoInfo:
21
+ """
22
+ https://stackoverflow.com/a/39376254
23
+
24
+ ==
25
+
26
+ repo=library/nginx
27
+ token=$(
28
+ curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" \
29
+ | jq -r '.token' \
30
+ )
31
+ curl -H "Authorization: Bearer $token" -s "https://registry-1.docker.io/v2/${repo}/tags/list" | jq
32
+ curl \
33
+ -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
34
+ -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \
35
+ -H "Authorization: Bearer $token" \
36
+ -s "https://registry-1.docker.io/v2/${repo}/manifests/latest" \
37
+ | jq .
38
+ """
39
+
40
+ auth_url = auth_url.rstrip('/')
41
+ api_url = api_url.rstrip('/')
42
+
43
+ #
44
+
45
+ def req_json(url: str, **kwargs: ta.Any) -> ta.Any:
46
+ with urllib.request.urlopen(urllib.request.Request(url, **kwargs)) as resp: # noqa
47
+ return json.loads(resp.read().decode('utf-8'))
48
+
49
+ #
50
+
51
+ token_dct = req_json(f'{auth_url}/token?service=registry.docker.io&scope=repository:{repo}:pull')
52
+ token = token_dct['token']
53
+
54
+ req_hdrs = {'Authorization': f'Bearer {token}'}
55
+
56
+ #
57
+
58
+ tags_dct = req_json(
59
+ f'{api_url}/{repo}/tags/list',
60
+ headers=req_hdrs,
61
+ )
62
+
63
+ latest_mani_dct = req_json(
64
+ f'{api_url}/{repo}/manifests/latest',
65
+ headers={
66
+ **req_hdrs,
67
+ 'Accept': 'application/vnd.docker.distribution.manifest.v2+json',
68
+ },
69
+ )
70
+
71
+ return HubRepoInfo(
72
+ repo,
73
+ tags_dct,
74
+ latest_mani_dct,
75
+ )