omlish 0.0.0.dev21__tar.gz → 0.0.0.dev23__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 (310) hide show
  1. {omlish-0.0.0.dev21/omlish.egg-info → omlish-0.0.0.dev23}/PKG-INFO +13 -9
  2. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/__about__.py +17 -8
  3. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/asyncs/bridge.py +35 -19
  4. omlish-0.0.0.dev23/omlish/bootstrap/__init__.py +42 -0
  5. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/bootstrap/base.py +3 -1
  6. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/bootstrap/diag.py +51 -2
  7. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/bootstrap/main.py +2 -1
  8. omlish-0.0.0.dev23/omlish/bootstrap/marshal.py +18 -0
  9. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/check.py +123 -33
  10. omlish-0.0.0.dev23/omlish/concurrent/__init__.py +11 -0
  11. omlish-0.0.0.dev23/omlish/concurrent/executors.py +52 -0
  12. omlish-0.0.0.dev21/omlish/concurrent.py → omlish-0.0.0.dev23/omlish/concurrent/futures.py +0 -44
  13. omlish-0.0.0.dev23/omlish/concurrent/threadlets.py +91 -0
  14. omlish-0.0.0.dev23/omlish/diag/asts.py +132 -0
  15. omlish-0.0.0.dev23/omlish/diag/pycharm.py +80 -0
  16. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/docker.py +3 -0
  17. omlish-0.0.0.dev23/omlish/genmachine.py +58 -0
  18. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/functions.py +3 -0
  19. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/logs/__init__.py +4 -0
  20. omlish-0.0.0.dev23/omlish/logs/handlers.py +10 -0
  21. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/__init__.py +4 -0
  22. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/base64.py +4 -0
  23. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/primitives.py +6 -0
  24. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/standard.py +4 -0
  25. omlish-0.0.0.dev23/omlish/marshal/unions.py +101 -0
  26. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/matchfns.py +3 -3
  27. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/secrets/openssl.py +2 -2
  28. omlish-0.0.0.dev23/omlish/sql/__init__.py +27 -0
  29. omlish-0.0.0.dev23/omlish/sql/qualifiedname.py +82 -0
  30. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23/omlish.egg-info}/PKG-INFO +13 -9
  31. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish.egg-info/SOURCES.txt +11 -1
  32. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish.egg-info/requires.txt +11 -13
  33. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/pyproject.toml +13 -9
  34. omlish-0.0.0.dev21/omlish/bootstrap/__init__.py +0 -3
  35. omlish-0.0.0.dev21/omlish/sql/__init__.py +0 -9
  36. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/LICENSE +0 -0
  37. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/MANIFEST.in +0 -0
  38. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/README.rst +0 -0
  39. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/__init__.py +0 -0
  40. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/argparse.py +0 -0
  41. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/asyncs/__init__.py +0 -0
  42. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/asyncs/anyio.py +0 -0
  43. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/asyncs/asyncio.py +0 -0
  44. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/asyncs/asyncs.py +0 -0
  45. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/asyncs/flavors.py +0 -0
  46. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/asyncs/trio.py +0 -0
  47. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/asyncs/trio_asyncio.py +0 -0
  48. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/bootstrap/__main__.py +0 -0
  49. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/bootstrap/harness.py +0 -0
  50. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/bootstrap/sys.py +0 -0
  51. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/c3.py +0 -0
  52. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/cached.py +0 -0
  53. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/__init__.py +0 -0
  54. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/_abc.py +0 -0
  55. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/_io_abc.py +0 -0
  56. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/cache/__init__.py +0 -0
  57. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/cache/descriptor.py +0 -0
  58. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/cache/impl.py +0 -0
  59. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/cache/types.py +0 -0
  60. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/coerce.py +0 -0
  61. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/exceptions.py +0 -0
  62. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/frozen.py +0 -0
  63. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/identity.py +0 -0
  64. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/indexed.py +0 -0
  65. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/mappings.py +0 -0
  66. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/ordered.py +0 -0
  67. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/persistent.py +0 -0
  68. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/skiplist.py +0 -0
  69. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/sorted.py +0 -0
  70. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/treap.py +0 -0
  71. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/treapmap.py +0 -0
  72. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/unmodifiable.py +0 -0
  73. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/collections/utils.py +0 -0
  74. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/configs/__init__.py +0 -0
  75. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/configs/classes.py +0 -0
  76. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/configs/flattening.py +0 -0
  77. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/configs/strings.py +0 -0
  78. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/__init__.py +0 -0
  79. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/__init__.py +0 -0
  80. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/api.py +0 -0
  81. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/as_.py +0 -0
  82. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/copy.py +0 -0
  83. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/descriptors.py +0 -0
  84. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/exceptions.py +0 -0
  85. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/fields.py +0 -0
  86. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/frozen.py +0 -0
  87. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/hashing.py +0 -0
  88. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/init.py +0 -0
  89. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/internals.py +0 -0
  90. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/main.py +0 -0
  91. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/metaclass.py +0 -0
  92. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/metadata.py +0 -0
  93. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/order.py +0 -0
  94. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/params.py +0 -0
  95. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/processing.py +0 -0
  96. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/reflect.py +0 -0
  97. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/replace.py +0 -0
  98. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/repr.py +0 -0
  99. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/simple.py +0 -0
  100. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/slots.py +0 -0
  101. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/impl/utils.py +0 -0
  102. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dataclasses/utils.py +0 -0
  103. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/datetimes.py +0 -0
  104. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/defs.py +0 -0
  105. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/diag/__init__.py +0 -0
  106. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/diag/procfs.py +0 -0
  107. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/diag/procstats.py +0 -0
  108. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/diag/ps.py +0 -0
  109. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/diag/pydevd.py +0 -0
  110. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/diag/replserver/__init__.py +0 -0
  111. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/diag/replserver/__main__.py +0 -0
  112. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/diag/replserver/console.py +0 -0
  113. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/diag/replserver/server.py +0 -0
  114. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/diag/threads.py +0 -0
  115. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dispatch/__init__.py +0 -0
  116. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dispatch/_dispatch2.py +0 -0
  117. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dispatch/_dispatch3.py +0 -0
  118. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dispatch/dispatch.py +0 -0
  119. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dispatch/functions.py +0 -0
  120. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dispatch/methods.py +0 -0
  121. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/dynamic.py +0 -0
  122. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/fnpairs.py +0 -0
  123. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/formats/__init__.py +0 -0
  124. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/formats/dotenv.py +0 -0
  125. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/formats/json.py +0 -0
  126. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/formats/props.py +0 -0
  127. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/formats/yaml.py +0 -0
  128. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/graphs/__init__.py +0 -0
  129. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/graphs/dags.py +0 -0
  130. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/graphs/domination.py +0 -0
  131. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/graphs/dot/__init__.py +0 -0
  132. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/graphs/dot/items.py +0 -0
  133. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/graphs/dot/rendering.py +0 -0
  134. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/graphs/dot/utils.py +0 -0
  135. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/graphs/trees.py +0 -0
  136. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/http/__init__.py +0 -0
  137. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/http/asgi.py +0 -0
  138. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/http/collections.py +0 -0
  139. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/http/consts.py +0 -0
  140. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/http/cookies.py +0 -0
  141. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/http/dates.py +0 -0
  142. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/http/encodings.py +0 -0
  143. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/http/json.py +0 -0
  144. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/http/sessions.py +0 -0
  145. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/http/wsgi.py +0 -0
  146. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/__init__.py +0 -0
  147. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/binder.py +0 -0
  148. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/bindings.py +0 -0
  149. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/eagers.py +0 -0
  150. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/elements.py +0 -0
  151. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/exceptions.py +0 -0
  152. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/__init__.py +0 -0
  153. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/bindings.py +0 -0
  154. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/elements.py +0 -0
  155. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/injector.py +0 -0
  156. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/inspect.py +0 -0
  157. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/multis.py +0 -0
  158. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/origins.py +0 -0
  159. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/privates.py +0 -0
  160. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/providers.py +0 -0
  161. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/proxy.py +0 -0
  162. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/impl/scopes.py +0 -0
  163. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/injector.py +0 -0
  164. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/inspect.py +0 -0
  165. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/keys.py +0 -0
  166. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/listeners.py +0 -0
  167. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/managed.py +0 -0
  168. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/multis.py +0 -0
  169. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/origins.py +0 -0
  170. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/overrides.py +0 -0
  171. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/privates.py +0 -0
  172. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/providers.py +0 -0
  173. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/scopes.py +0 -0
  174. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/types.py +0 -0
  175. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/inject/utils.py +0 -0
  176. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/iterators.py +0 -0
  177. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/__init__.py +0 -0
  178. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/cached.py +0 -0
  179. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/classes/__init__.py +0 -0
  180. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/classes/abstract.py +0 -0
  181. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/classes/restrict.py +0 -0
  182. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/classes/simple.py +0 -0
  183. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/classes/virtual.py +0 -0
  184. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/clsdct.py +0 -0
  185. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/cmp.py +0 -0
  186. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/contextmanagers.py +0 -0
  187. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/descriptors.py +0 -0
  188. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/exceptions.py +0 -0
  189. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/imports.py +0 -0
  190. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/iterables.py +0 -0
  191. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/maybes.py +0 -0
  192. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/objects.py +0 -0
  193. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/resolving.py +0 -0
  194. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/strings.py +0 -0
  195. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/sys.py +0 -0
  196. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/timeouts.py +0 -0
  197. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lang/typing.py +0 -0
  198. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/libc.py +0 -0
  199. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lifecycles/__init__.py +0 -0
  200. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lifecycles/abstract.py +0 -0
  201. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lifecycles/base.py +0 -0
  202. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lifecycles/contextmanagers.py +0 -0
  203. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lifecycles/controller.py +0 -0
  204. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lifecycles/manager.py +0 -0
  205. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lifecycles/states.py +0 -0
  206. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lifecycles/transitions.py +0 -0
  207. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/__init__.py +0 -0
  208. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/cached.py +0 -0
  209. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/check.py +0 -0
  210. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/contextmanagers.py +0 -0
  211. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/json.py +0 -0
  212. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/logs.py +0 -0
  213. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/marshal.py +0 -0
  214. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/reflect.py +0 -0
  215. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/runtime.py +0 -0
  216. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/secrets.py +0 -0
  217. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/strings.py +0 -0
  218. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/lite/subprocesses.py +0 -0
  219. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/logs/_abc.py +0 -0
  220. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/logs/configs.py +0 -0
  221. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/logs/formatters.py +0 -0
  222. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/logs/noisy.py +0 -0
  223. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/logs/utils.py +0 -0
  224. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/any.py +0 -0
  225. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/base.py +0 -0
  226. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/dataclasses.py +0 -0
  227. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/datetimes.py +0 -0
  228. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/enums.py +0 -0
  229. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/exceptions.py +0 -0
  230. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/factories.py +0 -0
  231. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/forbidden.py +0 -0
  232. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/global_.py +0 -0
  233. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/helpers.py +0 -0
  234. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/iterables.py +0 -0
  235. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/mappings.py +0 -0
  236. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/maybes.py +0 -0
  237. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/naming.py +0 -0
  238. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/numbers.py +0 -0
  239. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/objects.py +0 -0
  240. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/optionals.py +0 -0
  241. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/polymorphism.py +0 -0
  242. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/registries.py +0 -0
  243. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/utils.py +0 -0
  244. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/uuids.py +0 -0
  245. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/marshal/values.py +0 -0
  246. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/math.py +0 -0
  247. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/multiprocessing.py +0 -0
  248. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/os.py +0 -0
  249. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/reflect/__init__.py +0 -0
  250. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/reflect/isinstance.py +0 -0
  251. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/reflect/ops.py +0 -0
  252. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/reflect/subst.py +0 -0
  253. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/reflect/types.py +0 -0
  254. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/runmodule.py +0 -0
  255. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/secrets/__init__.py +0 -0
  256. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/secrets/crypto.py +0 -0
  257. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/secrets/marshal.py +0 -0
  258. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/secrets/passwords.py +0 -0
  259. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/secrets/secrets.py +0 -0
  260. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/secrets/subprocesses.py +0 -0
  261. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/__init__.py +0 -0
  262. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/__init__.py +0 -0
  263. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/keywords/__init__.py +0 -0
  264. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/keywords/base.py +0 -0
  265. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/keywords/core.py +0 -0
  266. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/keywords/metadata.py +0 -0
  267. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/keywords/parse.py +0 -0
  268. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/keywords/render.py +0 -0
  269. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/keywords/validation.py +0 -0
  270. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/schemas/__init__.py +0 -0
  271. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/schemas/draft202012/__init__.py +0 -0
  272. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/__init__.py +0 -0
  273. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/specs/jsonschema/types.py +0 -0
  274. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/sql/_abc.py +0 -0
  275. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/sql/asyncs.py +0 -0
  276. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/sql/dbs.py +0 -0
  277. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/sql/duckdb.py +0 -0
  278. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/sql/exprs.py +0 -0
  279. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/sql/secrets.py +0 -0
  280. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/sql/sqlean.py +0 -0
  281. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/stats.py +0 -0
  282. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/sync.py +0 -0
  283. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/term.py +0 -0
  284. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/__init__.py +0 -0
  285. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/__init__.py +0 -0
  286. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/helpers.py +0 -0
  287. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/inject/__init__.py +0 -0
  288. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/inject/harness.py +0 -0
  289. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/marks.py +0 -0
  290. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/__init__.py +0 -0
  291. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/_registry.py +0 -0
  292. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/asyncs.py +0 -0
  293. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/depskip.py +0 -0
  294. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/logging.py +0 -0
  295. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/managermarks.py +0 -0
  296. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/pydevd.py +0 -0
  297. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/repeat.py +0 -0
  298. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/skips.py +0 -0
  299. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/spacing.py +0 -0
  300. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/switches.py +0 -0
  301. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/pytest/plugins/utils.py +0 -0
  302. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/testing/testing.py +0 -0
  303. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/text/__init__.py +0 -0
  304. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/text/delimit.py +0 -0
  305. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/text/glyphsplit.py +0 -0
  306. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/text/indent.py +0 -0
  307. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish/text/parts.py +0 -0
  308. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish.egg-info/dependency_links.txt +0 -0
  309. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/omlish.egg-info/top_level.txt +0 -0
  310. {omlish-0.0.0.dev21 → omlish-0.0.0.dev23}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev21
3
+ Version: 0.0.0.dev23
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -15,14 +15,17 @@ License-File: LICENSE
15
15
  Provides-Extra: all
16
16
  Requires-Dist: anyio~=4.4; extra == "all"
17
17
  Requires-Dist: sniffio~=1.3; extra == "all"
18
- Requires-Dist: greenlet~=3.0; python_version < "3.13" and extra == "all"
18
+ Requires-Dist: greenlet~=3.1; extra == "all"
19
19
  Requires-Dist: trio~=0.26; extra == "all"
20
- Requires-Dist: trio-asyncio~=0.15; python_version < "3.13" and extra == "all"
20
+ Requires-Dist: trio-asyncio~=0.15; extra == "all"
21
21
  Requires-Dist: lz4~=4.0; 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
+ Requires-Dist: asttokens~=2.4; extra == "all"
25
+ Requires-Dist: executing~=2.1; extra == "all"
24
26
  Requires-Dist: psutil~=6.0; extra == "all"
25
27
  Requires-Dist: orjson~=3.10; extra == "all"
28
+ Requires-Dist: ujson~=5.10; extra == "all"
26
29
  Requires-Dist: json5~=0.9; extra == "all"
27
30
  Requires-Dist: pyyaml~=5.0; extra == "all"
28
31
  Requires-Dist: cloudpickle~=3.0; extra == "all"
@@ -30,8 +33,7 @@ Requires-Dist: httpx[http2]~=0.27; extra == "all"
30
33
  Requires-Dist: jinja2~=3.1; extra == "all"
31
34
  Requires-Dist: wrapt~=1.14; extra == "all"
32
35
  Requires-Dist: cryptography~=43.0; extra == "all"
33
- Requires-Dist: sqlalchemy~=2.0; python_version ~= "3.13" and extra == "all"
34
- Requires-Dist: sqlalchemy[asyncio]~=2.0; python_version < "3.13" and extra == "all"
36
+ Requires-Dist: sqlalchemy[asyncio]~=2.0; extra == "all"
35
37
  Requires-Dist: pg8000~=1.31; extra == "all"
36
38
  Requires-Dist: pymysql~=1.1; extra == "all"
37
39
  Requires-Dist: aiomysql~=0.2; extra == "all"
@@ -43,17 +45,20 @@ Requires-Dist: pytest~=8.0; extra == "all"
43
45
  Provides-Extra: async
44
46
  Requires-Dist: anyio~=4.4; extra == "async"
45
47
  Requires-Dist: sniffio~=1.3; extra == "async"
46
- Requires-Dist: greenlet~=3.0; python_version < "3.13" and extra == "async"
48
+ Requires-Dist: greenlet~=3.1; extra == "async"
47
49
  Requires-Dist: trio~=0.26; extra == "async"
48
- Requires-Dist: trio-asyncio~=0.15; python_version < "3.13" and extra == "async"
50
+ Requires-Dist: trio-asyncio~=0.15; extra == "async"
49
51
  Provides-Extra: compression
50
52
  Requires-Dist: lz4~=4.0; extra == "compression"
51
53
  Requires-Dist: python-snappy~=0.7; python_version < "3.13" and extra == "compression"
52
54
  Requires-Dist: zstd~=1.5; extra == "compression"
53
55
  Provides-Extra: diag
56
+ Requires-Dist: asttokens~=2.4; extra == "diag"
57
+ Requires-Dist: executing~=2.1; extra == "diag"
54
58
  Requires-Dist: psutil~=6.0; extra == "diag"
55
59
  Provides-Extra: formats
56
60
  Requires-Dist: orjson~=3.10; extra == "formats"
61
+ Requires-Dist: ujson~=5.10; extra == "formats"
57
62
  Requires-Dist: json5~=0.9; extra == "formats"
58
63
  Requires-Dist: pyyaml~=5.0; extra == "formats"
59
64
  Requires-Dist: cloudpickle~=3.0; extra == "formats"
@@ -65,8 +70,7 @@ Requires-Dist: wrapt~=1.14; extra == "misc"
65
70
  Provides-Extra: secrets
66
71
  Requires-Dist: cryptography~=43.0; extra == "secrets"
67
72
  Provides-Extra: sql
68
- Requires-Dist: sqlalchemy~=2.0; python_version ~= "3.13" and extra == "sql"
69
- Requires-Dist: sqlalchemy[asyncio]~=2.0; python_version < "3.13" and extra == "sql"
73
+ Requires-Dist: sqlalchemy[asyncio]~=2.0; extra == "sql"
70
74
  Requires-Dist: pg8000~=1.31; extra == "sql"
71
75
  Requires-Dist: pymysql~=1.1; extra == "sql"
72
76
  Requires-Dist: aiomysql~=0.2; extra == "sql"
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev21'
2
- __revision__ = '4cb4af9e253f312d5f301449f08dfa7168234e07'
1
+ __version__ = '0.0.0.dev23'
2
+ __revision__ = '1d019b6879a9552ea31622e40f50d260d6b08824'
3
3
 
4
4
 
5
5
  #
@@ -33,10 +33,10 @@ class Project(ProjectBase):
33
33
  'anyio ~= 4.4',
34
34
  'sniffio ~= 1.3',
35
35
 
36
- 'greenlet ~= 3.0; python_version < "3.13"',
36
+ 'greenlet ~= 3.1',
37
37
 
38
38
  'trio ~= 0.26',
39
- 'trio-asyncio ~= 0.15; python_version < "3.13"',
39
+ 'trio-asyncio ~= 0.15',
40
40
  ],
41
41
 
42
42
  'compression': [
@@ -46,12 +46,15 @@ class Project(ProjectBase):
46
46
  ],
47
47
 
48
48
  'diag': [
49
+ 'asttokens ~= 2.4',
50
+ 'executing ~= 2.1',
51
+
49
52
  'psutil ~= 6.0',
50
53
  ],
51
54
 
52
55
  'formats': [
53
56
  'orjson ~= 3.10',
54
- # 'ujson ~= 5.10',
57
+ 'ujson ~= 5.10',
55
58
 
56
59
  'json5 ~= 0.9',
57
60
 
@@ -74,11 +77,14 @@ class Project(ProjectBase):
74
77
  ],
75
78
 
76
79
  'sql': [
77
- 'sqlalchemy ~= 2.0; python_version ~= "3.13"',
78
- 'sqlalchemy[asyncio] ~= 2.0; python_version < "3.13"',
80
+ 'sqlalchemy[asyncio] ~= 2.0',
79
81
 
80
82
  'pg8000 ~= 1.31',
83
+ # 'psycopg2 ~= 2.9',
84
+
81
85
  'pymysql ~= 1.1',
86
+ # 'mysql-connector-python ~= 9.0',
87
+ # 'mysqlclient ~= 2.2',
82
88
 
83
89
  'aiomysql ~= 0.2',
84
90
  'aiosqlite ~= 0.20',
@@ -108,7 +114,10 @@ class SetuptoolsBase:
108
114
  include_package_data = False
109
115
 
110
116
  find_packages = {
111
- 'exclude': ['*.tests', '*.tests.*'],
117
+ 'exclude': [
118
+ '*.tests',
119
+ '*.tests.*',
120
+ ],
112
121
  }
113
122
 
114
123
 
@@ -8,6 +8,9 @@ KEEP THE SPACE SHUTTLE FLYING.
8
8
 
9
9
  TODO:
10
10
  - reuse greenlet if nested somehow?
11
+
12
+ See:
13
+ - https://greenback.readthedocs.io/en/latest/
11
14
  """
12
15
  import itertools
13
16
  import sys
@@ -15,22 +18,21 @@ import types
15
18
  import typing as ta
16
19
  import weakref
17
20
 
21
+ from .. import check
18
22
  from .. import lang
23
+ from .. import sync
24
+ from ..concurrent import threadlets
19
25
  from .asyncs import sync_await
20
26
 
21
27
 
22
28
  if ta.TYPE_CHECKING:
23
29
  import asyncio
24
30
 
25
- import greenlet
26
-
27
31
  from . import anyio as aiu
28
32
 
29
33
  else:
30
34
  asyncio = lang.proxy_import('asyncio')
31
35
 
32
- greenlet = lang.proxy_import('greenlet')
33
-
34
36
  aiu = lang.proxy_import('.anyio', __package__)
35
37
 
36
38
 
@@ -56,6 +58,20 @@ def trivial_a_to_s(fn):
56
58
  # https://gist.github.com/snaury/202bf4f22c41ca34e56297bae5f33fef
57
59
 
58
60
 
61
+ _THREADLETS_IMPL = threadlets.GreenletThreadlets
62
+ # from ..concurrent.tests.real import RealThreadlets
63
+ # _THREADLETS_IMPL = RealThreadlets
64
+
65
+ _THREADLETS = sync.LazyFn(lambda: _THREADLETS_IMPL())
66
+
67
+
68
+ def _threadlets() -> threadlets.Threadlets:
69
+ return _THREADLETS.get()
70
+
71
+
72
+ #
73
+
74
+
59
75
  class BridgeAwaitRequiredError(Exception):
60
76
  pass
61
77
 
@@ -101,7 +117,7 @@ def _make_transition(seq: int, a_to_s: bool, obj: ta.Any) -> _BridgeTransition:
101
117
 
102
118
  _BRIDGED_TASKS: ta.MutableMapping[ta.Any, list[_BridgeTransition]] = weakref.WeakKeyDictionary()
103
119
 
104
- _BRIDGE_GREENLET_ATTR = f'__{__package__.replace(".", "__")}__bridge_greenlet__'
120
+ _BRIDGE_THREADLET_ATTR = f'__{__package__.replace(".", "__")}__bridge_threadlet__'
105
121
 
106
122
 
107
123
  def _push_transition(a_to_s: bool, l: list[_BridgeTransition], t: _BridgeTransition) -> _BridgeTransition:
@@ -129,9 +145,9 @@ def _get_transitions() -> list[_BridgeTransition]:
129
145
  else:
130
146
  l.extend(tl)
131
147
 
132
- g = greenlet.getcurrent()
148
+ g = _threadlets().get_current()
133
149
  try:
134
- gl = getattr(g, _BRIDGE_GREENLET_ATTR)
150
+ gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
135
151
  except AttributeError:
136
152
  pass
137
153
  else:
@@ -158,9 +174,9 @@ def is_in_bridge() -> bool:
158
174
  else:
159
175
  last_t = None
160
176
 
161
- g = greenlet.getcurrent()
177
+ g = _threadlets().get_current()
162
178
  try:
163
- gl = getattr(g, _BRIDGE_GREENLET_ATTR)
179
+ gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
164
180
  except AttributeError:
165
181
  last_g = None
166
182
  else:
@@ -194,13 +210,13 @@ def _safe_cancel_awaitable(awaitable: ta.Awaitable[ta.Any]) -> None:
194
210
 
195
211
 
196
212
  def s_to_a_await(awaitable: ta.Awaitable[T]) -> T:
197
- g = greenlet.getcurrent()
213
+ g = _threadlets().get_current()
198
214
 
199
- if not getattr(g, _BRIDGE_GREENLET_ATTR, False):
215
+ if not getattr(g.underlying, _BRIDGE_THREADLET_ATTR, False):
200
216
  _safe_cancel_awaitable(awaitable)
201
217
  raise MissingBridgeGreenletError
202
218
 
203
- return g.parent.switch(awaitable)
219
+ return check.not_none(g.parent).switch(awaitable)
204
220
 
205
221
 
206
222
  def s_to_a(fn, *, require_await=False):
@@ -210,7 +226,7 @@ def s_to_a(fn, *, require_await=False):
210
226
  try:
211
227
  return fn(*args, **kwargs)
212
228
  finally:
213
- if (gl2 := getattr(g, _BRIDGE_GREENLET_ATTR)) is not gl: # noqa
229
+ if (gl2 := getattr(g.underlying, _BRIDGE_THREADLET_ATTR)) is not gl: # noqa
214
230
  raise UnexpectedBridgeNestingError
215
231
  if (cur_g := _pop_transition(False, gl)) is not added_g: # noqa
216
232
  raise UnexpectedBridgeNestingError
@@ -219,8 +235,8 @@ def s_to_a(fn, *, require_await=False):
219
235
 
220
236
  seq = next(_BRIDGE_TRANSITIONS_SEQ)
221
237
 
222
- g = greenlet.greenlet(inner)
223
- setattr(g, _BRIDGE_GREENLET_ATTR, gl := []) # type: ignore
238
+ g = _threadlets().spawn(inner)
239
+ setattr(g.underlying, _BRIDGE_THREADLET_ATTR, gl := []) # type: ignore
224
240
  added_g = _push_transition(False, gl, _make_transition(seq, False, g))
225
241
 
226
242
  if (t := aiu.get_current_backend_task()) is not None:
@@ -270,11 +286,11 @@ def a_to_s(fn):
270
286
  else:
271
287
  added_t = None
272
288
 
273
- g = greenlet.getcurrent()
289
+ g = _threadlets().get_current()
274
290
  try:
275
- gl = getattr(g, _BRIDGE_GREENLET_ATTR)
291
+ gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
276
292
  except AttributeError:
277
- setattr(g, _BRIDGE_GREENLET_ATTR, gl := [])
293
+ setattr(g.underlying, _BRIDGE_THREADLET_ATTR, gl := [])
278
294
  added_g = _push_transition(True, gl, _make_transition(seq, True, g))
279
295
 
280
296
  try:
@@ -306,7 +322,7 @@ def a_to_s(fn):
306
322
  if (cur_t := _pop_transition(True, tl)) is not added_t: # noqa
307
323
  raise UnexpectedBridgeNestingError
308
324
 
309
- if (gl2 := getattr(g, _BRIDGE_GREENLET_ATTR)) is not gl: # noqa
325
+ if (gl2 := getattr(g.underlying, _BRIDGE_THREADLET_ATTR)) is not gl: # noqa
310
326
  raise UnexpectedBridgeNestingError
311
327
  if (cur_g := _pop_transition(True, gl)) is not added_g: # noqa
312
328
  raise UnexpectedBridgeNestingError
@@ -0,0 +1,42 @@
1
+ from .base import ( # noqa
2
+ Bootstrap,
3
+ ContextBootstrap,
4
+ SimpleBootstrap,
5
+ )
6
+
7
+ from .diag import ( # noqa
8
+ CheckBootstrap,
9
+ CprofileBootstrap,
10
+ PycharmBootstrap,
11
+ ThreadDumpBootstrap,
12
+ TimebombBootstrap,
13
+ )
14
+
15
+ from .harness import ( # noqa
16
+ bootstrap,
17
+ )
18
+
19
+ from .sys import ( # noqa
20
+ CwdBootstrap,
21
+ EnvBootstrap,
22
+ FaulthandlerBootstrap,
23
+ FdsBootstrap,
24
+ GcBootstrap,
25
+ GcDebugFlag,
26
+ ImportBootstrap,
27
+ LogBootstrap,
28
+ NiceBootstrap,
29
+ PidfileBootstrap,
30
+ PrctlBootstrap,
31
+ PrintPidBootstrap,
32
+ RlimitBootstrap,
33
+ SetuidBootstrap,
34
+ )
35
+
36
+
37
+ ##
38
+
39
+
40
+ from ..lang.imports import _register_conditional_import # noqa
41
+
42
+ _register_conditional_import('..marshal', '.marshal', __package__)
@@ -2,6 +2,8 @@ import abc
2
2
  import dataclasses as dc
3
3
  import typing as ta
4
4
 
5
+ from omlish import lang
6
+
5
7
 
6
8
  BootstrapConfigT = ta.TypeVar('BootstrapConfigT', bound='Bootstrap.Config')
7
9
 
@@ -9,7 +11,7 @@ BootstrapConfigT = ta.TypeVar('BootstrapConfigT', bound='Bootstrap.Config')
9
11
  ##
10
12
 
11
13
 
12
- class Bootstrap(abc.ABC, ta.Generic[BootstrapConfigT]):
14
+ class Bootstrap(abc.ABC, lang.PackageSealed, ta.Generic[BootstrapConfigT]):
13
15
  @dc.dataclass(frozen=True)
14
16
  class Config(abc.ABC): # noqa
15
17
  pass
@@ -5,28 +5,56 @@ import signal
5
5
  import sys
6
6
  import typing as ta
7
7
 
8
+ from .. import check
8
9
  from .. import lang
9
10
  from .base import Bootstrap
10
11
  from .base import ContextBootstrap
12
+ from .base import SimpleBootstrap
11
13
 
12
14
 
13
15
  if ta.TYPE_CHECKING:
14
16
  import cProfile # noqa
15
17
  import pstats
16
18
 
19
+ from ..diag import pycharm as diagpc
17
20
  from ..diag import threads as diagt
18
21
 
19
22
  else:
20
23
  cProfile = lang.proxy_import('cProfile') # noqa
21
24
  pstats = lang.proxy_import('pstats')
22
25
 
26
+ diagpc = lang.proxy_import('..diag.pycharm', __package__)
23
27
  diagt = lang.proxy_import('..diag.threads', __package__)
24
28
 
25
29
 
26
30
  ##
27
31
 
28
32
 
29
- class ProfilingBootstrap(ContextBootstrap['ProfilingBootstrap.Config']):
33
+ class CheckBootstrap(ContextBootstrap['CheckBootstrap.Config']):
34
+ @dc.dataclass(frozen=True)
35
+ class Config(Bootstrap.Config):
36
+ breakpoint: bool = False
37
+
38
+ @staticmethod
39
+ def _breakpoint(exc: Exception) -> None: # noqa
40
+ breakpoint() # noqa
41
+
42
+ @contextlib.contextmanager
43
+ def enter(self) -> ta.Iterator[None]:
44
+ if not self._config.breakpoint:
45
+ return
46
+
47
+ check.register_on_raise(CheckBootstrap._breakpoint)
48
+ try:
49
+ yield
50
+ finally:
51
+ check.unregister_on_raise(CheckBootstrap._breakpoint)
52
+
53
+
54
+ ##
55
+
56
+
57
+ class CprofileBootstrap(ContextBootstrap['CprofileBootstrap.Config']):
30
58
  @dc.dataclass(frozen=True)
31
59
  class Config(Bootstrap.Config):
32
60
  enable: bool = False
@@ -70,6 +98,7 @@ class ThreadDumpBootstrap(ContextBootstrap['ThreadDumpBootstrap.Config']):
70
98
  @dc.dataclass(frozen=True)
71
99
  class Config(Bootstrap.Config):
72
100
  interval_s: ta.Optional[float] = None
101
+ nodaemon: bool = False
73
102
 
74
103
  on_sigquit: bool = False
75
104
 
@@ -79,6 +108,7 @@ class ThreadDumpBootstrap(ContextBootstrap['ThreadDumpBootstrap.Config']):
79
108
  tdt = diagt.create_thread_dump_thread(
80
109
  interval_s=self._config.interval_s,
81
110
  start=True,
111
+ nodaemon=self._config.nodaemon,
82
112
  )
83
113
  else:
84
114
  tdt = None
@@ -97,7 +127,7 @@ class ThreadDumpBootstrap(ContextBootstrap['ThreadDumpBootstrap.Config']):
97
127
  yield
98
128
 
99
129
  finally:
100
- if tdt is not None:
130
+ if tdt is not None and not self._config.nodaemon:
101
131
  tdt.stop_nowait()
102
132
 
103
133
  if prev_sq.present:
@@ -126,3 +156,22 @@ class TimebombBootstrap(ContextBootstrap['TimebombBootstrap.Config']):
126
156
  yield
127
157
  finally:
128
158
  tbt.stop_nowait()
159
+
160
+
161
+ ##
162
+
163
+
164
+ class PycharmBootstrap(SimpleBootstrap['PycharmBootstrap.Config']):
165
+ @dc.dataclass(frozen=True)
166
+ class Config(Bootstrap.Config):
167
+ debug_host: ta.Optional[str] = None
168
+ debug_port: ta.Optional[int] = None
169
+ debug_version: ta.Optional[str] = None
170
+
171
+ def run(self) -> None:
172
+ if self._config.debug_port is not None:
173
+ diagpc.pycharm_remote_debugger_attach(
174
+ self._config.debug_host,
175
+ self._config.debug_port,
176
+ version=self._config.debug_version,
177
+ )
@@ -156,8 +156,9 @@ def _main() -> int:
156
156
  with bootstrap(*cfgs):
157
157
  tgt = args.target
158
158
 
159
+ sys.argv = [tgt, *(args.args or ())]
160
+
159
161
  if args.module:
160
- sys.argv = [tgt, *(args.args or ())]
161
162
  runpy._run_module_as_main(tgt) # type: ignore # noqa
162
163
 
163
164
  else:
@@ -0,0 +1,18 @@
1
+ from .. import lang
2
+ from .. import marshal as msh
3
+ from .base import Bootstrap
4
+ from .harness import BOOTSTRAP_TYPES_BY_NAME
5
+
6
+
7
+ @lang.cached_function
8
+ def _install_standard_marshalling() -> None:
9
+ cfgs_poly = msh.Polymorphism(
10
+ Bootstrap.Config,
11
+ [msh.Impl(b.Config, n) for n, b in BOOTSTRAP_TYPES_BY_NAME.items()],
12
+ )
13
+
14
+ msh.STANDARD_MARSHALER_FACTORIES[0:0] = [msh.PolymorphismMarshalerFactory(cfgs_poly)]
15
+ msh.STANDARD_UNMARSHALER_FACTORIES[0:0] = [msh.PolymorphismUnmarshalerFactory(cfgs_poly)]
16
+
17
+
18
+ _install_standard_marshalling()