omlish 0.0.0.dev20__tar.gz → 0.0.0.dev22__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 (304) hide show
  1. {omlish-0.0.0.dev20/omlish.egg-info → omlish-0.0.0.dev22}/PKG-INFO +13 -9
  2. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/__about__.py +9 -7
  3. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/asyncs/bridge.py +32 -19
  4. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/bootstrap/diag.py +3 -1
  5. omlish-0.0.0.dev22/omlish/concurrent/__init__.py +11 -0
  6. omlish-0.0.0.dev22/omlish/concurrent/executors.py +52 -0
  7. omlish-0.0.0.dev20/omlish/concurrent.py → omlish-0.0.0.dev22/omlish/concurrent/futures.py +0 -44
  8. omlish-0.0.0.dev22/omlish/concurrent/threadlets.py +91 -0
  9. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/fields.py +51 -0
  10. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/frozen.py +38 -0
  11. omlish-0.0.0.dev22/omlish/dataclasses/impl/main.py +89 -0
  12. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/processing.py +10 -2
  13. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/classes/simple.py +3 -0
  14. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/clsdct.py +2 -0
  15. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/contextmanagers.py +41 -0
  16. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/descriptors.py +6 -0
  17. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/functions.py +3 -0
  18. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/objects.py +4 -0
  19. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/resolving.py +9 -0
  20. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/marshal.py +4 -2
  21. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/logs/__init__.py +4 -0
  22. omlish-0.0.0.dev22/omlish/logs/handlers.py +10 -0
  23. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/multiprocessing.py +4 -4
  24. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/secrets/openssl.py +2 -2
  25. omlish-0.0.0.dev22/omlish/specs/jsonschema/types.py +21 -0
  26. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22/omlish.egg-info}/PKG-INFO +13 -9
  27. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish.egg-info/SOURCES.txt +5 -1
  28. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish.egg-info/requires.txt +11 -13
  29. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/pyproject.toml +13 -9
  30. omlish-0.0.0.dev20/omlish/dataclasses/impl/main.py +0 -153
  31. omlish-0.0.0.dev20/omlish/specs/jsonschema/types.py +0 -10
  32. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/LICENSE +0 -0
  33. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/MANIFEST.in +0 -0
  34. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/README.rst +0 -0
  35. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/__init__.py +0 -0
  36. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/argparse.py +0 -0
  37. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/asyncs/__init__.py +0 -0
  38. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/asyncs/anyio.py +0 -0
  39. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/asyncs/asyncio.py +0 -0
  40. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/asyncs/asyncs.py +0 -0
  41. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/asyncs/flavors.py +0 -0
  42. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/asyncs/trio.py +0 -0
  43. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/asyncs/trio_asyncio.py +0 -0
  44. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/bootstrap/__init__.py +0 -0
  45. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/bootstrap/__main__.py +0 -0
  46. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/bootstrap/base.py +0 -0
  47. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/bootstrap/harness.py +0 -0
  48. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/bootstrap/main.py +0 -0
  49. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/bootstrap/sys.py +0 -0
  50. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/c3.py +0 -0
  51. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/cached.py +0 -0
  52. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/check.py +0 -0
  53. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/__init__.py +0 -0
  54. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/_abc.py +0 -0
  55. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/_io_abc.py +0 -0
  56. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/cache/__init__.py +0 -0
  57. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/cache/descriptor.py +0 -0
  58. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/cache/impl.py +0 -0
  59. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/cache/types.py +0 -0
  60. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/coerce.py +0 -0
  61. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/exceptions.py +0 -0
  62. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/frozen.py +0 -0
  63. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/identity.py +0 -0
  64. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/indexed.py +0 -0
  65. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/mappings.py +0 -0
  66. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/ordered.py +0 -0
  67. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/persistent.py +0 -0
  68. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/skiplist.py +0 -0
  69. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/sorted.py +0 -0
  70. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/treap.py +0 -0
  71. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/treapmap.py +0 -0
  72. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/unmodifiable.py +0 -0
  73. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/collections/utils.py +0 -0
  74. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/configs/__init__.py +0 -0
  75. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/configs/classes.py +0 -0
  76. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/configs/flattening.py +0 -0
  77. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/configs/strings.py +0 -0
  78. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/__init__.py +0 -0
  79. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/__init__.py +0 -0
  80. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/api.py +0 -0
  81. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/as_.py +0 -0
  82. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/copy.py +0 -0
  83. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/descriptors.py +0 -0
  84. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/exceptions.py +0 -0
  85. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/hashing.py +0 -0
  86. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/init.py +0 -0
  87. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/internals.py +0 -0
  88. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/metaclass.py +0 -0
  89. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/metadata.py +0 -0
  90. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/order.py +0 -0
  91. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/params.py +0 -0
  92. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/reflect.py +0 -0
  93. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/replace.py +0 -0
  94. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/repr.py +0 -0
  95. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/simple.py +0 -0
  96. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/slots.py +0 -0
  97. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/impl/utils.py +0 -0
  98. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dataclasses/utils.py +0 -0
  99. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/datetimes.py +0 -0
  100. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/defs.py +0 -0
  101. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/diag/__init__.py +0 -0
  102. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/diag/procfs.py +0 -0
  103. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/diag/procstats.py +0 -0
  104. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/diag/ps.py +0 -0
  105. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/diag/pydevd.py +0 -0
  106. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/diag/replserver/__init__.py +0 -0
  107. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/diag/replserver/__main__.py +0 -0
  108. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/diag/replserver/console.py +0 -0
  109. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/diag/replserver/server.py +0 -0
  110. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/diag/threads.py +0 -0
  111. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dispatch/__init__.py +0 -0
  112. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dispatch/_dispatch2.py +0 -0
  113. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dispatch/_dispatch3.py +0 -0
  114. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dispatch/dispatch.py +0 -0
  115. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dispatch/functions.py +0 -0
  116. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dispatch/methods.py +0 -0
  117. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/docker.py +0 -0
  118. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/dynamic.py +0 -0
  119. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/fnpairs.py +0 -0
  120. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/formats/__init__.py +0 -0
  121. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/formats/dotenv.py +0 -0
  122. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/formats/json.py +0 -0
  123. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/formats/props.py +0 -0
  124. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/formats/yaml.py +0 -0
  125. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/graphs/__init__.py +0 -0
  126. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/graphs/dags.py +0 -0
  127. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/graphs/domination.py +0 -0
  128. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/graphs/dot/__init__.py +0 -0
  129. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/graphs/dot/items.py +0 -0
  130. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/graphs/dot/rendering.py +0 -0
  131. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/graphs/dot/utils.py +0 -0
  132. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/graphs/trees.py +0 -0
  133. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/http/__init__.py +0 -0
  134. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/http/asgi.py +0 -0
  135. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/http/collections.py +0 -0
  136. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/http/consts.py +0 -0
  137. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/http/cookies.py +0 -0
  138. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/http/dates.py +0 -0
  139. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/http/encodings.py +0 -0
  140. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/http/json.py +0 -0
  141. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/http/sessions.py +0 -0
  142. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/http/wsgi.py +0 -0
  143. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/__init__.py +0 -0
  144. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/binder.py +0 -0
  145. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/bindings.py +0 -0
  146. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/eagers.py +0 -0
  147. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/elements.py +0 -0
  148. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/exceptions.py +0 -0
  149. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/__init__.py +0 -0
  150. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/bindings.py +0 -0
  151. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/elements.py +0 -0
  152. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/injector.py +0 -0
  153. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/inspect.py +0 -0
  154. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/multis.py +0 -0
  155. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/origins.py +0 -0
  156. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/privates.py +0 -0
  157. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/providers.py +0 -0
  158. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/proxy.py +0 -0
  159. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/impl/scopes.py +0 -0
  160. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/injector.py +0 -0
  161. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/inspect.py +0 -0
  162. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/keys.py +0 -0
  163. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/listeners.py +0 -0
  164. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/managed.py +0 -0
  165. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/multis.py +0 -0
  166. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/origins.py +0 -0
  167. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/overrides.py +0 -0
  168. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/privates.py +0 -0
  169. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/providers.py +0 -0
  170. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/scopes.py +0 -0
  171. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/types.py +0 -0
  172. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/inject/utils.py +0 -0
  173. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/iterators.py +0 -0
  174. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/__init__.py +0 -0
  175. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/cached.py +0 -0
  176. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/classes/__init__.py +0 -0
  177. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/classes/abstract.py +0 -0
  178. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/classes/restrict.py +0 -0
  179. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/classes/virtual.py +0 -0
  180. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/cmp.py +0 -0
  181. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/exceptions.py +0 -0
  182. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/imports.py +0 -0
  183. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/iterables.py +0 -0
  184. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/maybes.py +0 -0
  185. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/strings.py +0 -0
  186. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/sys.py +0 -0
  187. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/timeouts.py +0 -0
  188. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lang/typing.py +0 -0
  189. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/libc.py +0 -0
  190. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lifecycles/__init__.py +0 -0
  191. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lifecycles/abstract.py +0 -0
  192. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lifecycles/base.py +0 -0
  193. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lifecycles/contextmanagers.py +0 -0
  194. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lifecycles/controller.py +0 -0
  195. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lifecycles/manager.py +0 -0
  196. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lifecycles/states.py +0 -0
  197. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lifecycles/transitions.py +0 -0
  198. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/__init__.py +0 -0
  199. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/cached.py +0 -0
  200. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/check.py +0 -0
  201. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/contextmanagers.py +0 -0
  202. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/json.py +0 -0
  203. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/logs.py +0 -0
  204. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/reflect.py +0 -0
  205. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/runtime.py +0 -0
  206. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/secrets.py +0 -0
  207. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/strings.py +0 -0
  208. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/lite/subprocesses.py +0 -0
  209. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/logs/_abc.py +0 -0
  210. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/logs/configs.py +0 -0
  211. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/logs/formatters.py +0 -0
  212. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/logs/noisy.py +0 -0
  213. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/logs/utils.py +0 -0
  214. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/__init__.py +0 -0
  215. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/any.py +0 -0
  216. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/base.py +0 -0
  217. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/base64.py +0 -0
  218. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/dataclasses.py +0 -0
  219. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/datetimes.py +0 -0
  220. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/enums.py +0 -0
  221. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/exceptions.py +0 -0
  222. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/factories.py +0 -0
  223. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/forbidden.py +0 -0
  224. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/global_.py +0 -0
  225. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/helpers.py +0 -0
  226. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/iterables.py +0 -0
  227. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/mappings.py +0 -0
  228. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/maybes.py +0 -0
  229. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/naming.py +0 -0
  230. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/numbers.py +0 -0
  231. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/objects.py +0 -0
  232. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/optionals.py +0 -0
  233. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/polymorphism.py +0 -0
  234. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/primitives.py +0 -0
  235. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/registries.py +0 -0
  236. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/standard.py +0 -0
  237. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/utils.py +0 -0
  238. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/uuids.py +0 -0
  239. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/marshal/values.py +0 -0
  240. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/matchfns.py +0 -0
  241. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/math.py +0 -0
  242. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/os.py +0 -0
  243. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/reflect/__init__.py +0 -0
  244. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/reflect/isinstance.py +0 -0
  245. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/reflect/ops.py +0 -0
  246. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/reflect/subst.py +0 -0
  247. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/reflect/types.py +0 -0
  248. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/runmodule.py +0 -0
  249. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/secrets/__init__.py +0 -0
  250. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/secrets/crypto.py +0 -0
  251. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/secrets/marshal.py +0 -0
  252. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/secrets/passwords.py +0 -0
  253. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/secrets/secrets.py +0 -0
  254. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/secrets/subprocesses.py +0 -0
  255. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/__init__.py +0 -0
  256. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/__init__.py +0 -0
  257. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/keywords/__init__.py +0 -0
  258. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/keywords/base.py +0 -0
  259. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/keywords/core.py +0 -0
  260. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/keywords/metadata.py +0 -0
  261. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/keywords/parse.py +0 -0
  262. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/keywords/render.py +0 -0
  263. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/keywords/validation.py +0 -0
  264. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/schemas/__init__.py +0 -0
  265. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/schemas/draft202012/__init__.py +0 -0
  266. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/__init__.py +0 -0
  267. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/sql/__init__.py +0 -0
  268. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/sql/_abc.py +0 -0
  269. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/sql/asyncs.py +0 -0
  270. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/sql/dbs.py +0 -0
  271. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/sql/duckdb.py +0 -0
  272. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/sql/exprs.py +0 -0
  273. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/sql/secrets.py +0 -0
  274. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/sql/sqlean.py +0 -0
  275. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/stats.py +0 -0
  276. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/sync.py +0 -0
  277. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/term.py +0 -0
  278. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/__init__.py +0 -0
  279. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/__init__.py +0 -0
  280. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/helpers.py +0 -0
  281. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/inject/__init__.py +0 -0
  282. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/inject/harness.py +0 -0
  283. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/marks.py +0 -0
  284. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/__init__.py +0 -0
  285. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/_registry.py +0 -0
  286. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/asyncs.py +0 -0
  287. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/depskip.py +0 -0
  288. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/logging.py +0 -0
  289. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/managermarks.py +0 -0
  290. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/pydevd.py +0 -0
  291. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/repeat.py +0 -0
  292. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/skips.py +0 -0
  293. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/spacing.py +0 -0
  294. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/switches.py +0 -0
  295. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/pytest/plugins/utils.py +0 -0
  296. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/testing/testing.py +0 -0
  297. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/text/__init__.py +0 -0
  298. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/text/delimit.py +0 -0
  299. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/text/glyphsplit.py +0 -0
  300. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/text/indent.py +0 -0
  301. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish/text/parts.py +0 -0
  302. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish.egg-info/dependency_links.txt +0 -0
  303. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/omlish.egg-info/top_level.txt +0 -0
  304. {omlish-0.0.0.dev20 → omlish-0.0.0.dev22}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev20
3
+ Version: 0.0.0.dev22
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.dev20'
2
- __revision__ = '56a3421b375112818e306f2c17d467c7aac1d26b'
1
+ __version__ = '0.0.0.dev22'
2
+ __revision__ = '3d902899000237758f62e46319a8da3bccd2d447'
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,8 +77,7 @@ 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',
81
83
  'pymysql ~= 1.1',
@@ -15,22 +15,21 @@ import types
15
15
  import typing as ta
16
16
  import weakref
17
17
 
18
+ from .. import check
18
19
  from .. import lang
20
+ from .. import sync
21
+ from ..concurrent import threadlets
19
22
  from .asyncs import sync_await
20
23
 
21
24
 
22
25
  if ta.TYPE_CHECKING:
23
26
  import asyncio
24
27
 
25
- import greenlet
26
-
27
28
  from . import anyio as aiu
28
29
 
29
30
  else:
30
31
  asyncio = lang.proxy_import('asyncio')
31
32
 
32
- greenlet = lang.proxy_import('greenlet')
33
-
34
33
  aiu = lang.proxy_import('.anyio', __package__)
35
34
 
36
35
 
@@ -56,6 +55,20 @@ def trivial_a_to_s(fn):
56
55
  # https://gist.github.com/snaury/202bf4f22c41ca34e56297bae5f33fef
57
56
 
58
57
 
58
+ _THREADLETS_IMPL = threadlets.GreenletThreadlets
59
+ # from ..concurrent.tests.real import RealThreadlets
60
+ # _THREADLETS_IMPL = RealThreadlets
61
+
62
+ _THREADLETS = sync.LazyFn(lambda: _THREADLETS_IMPL())
63
+
64
+
65
+ def _threadlets() -> threadlets.Threadlets:
66
+ return _THREADLETS.get()
67
+
68
+
69
+ #
70
+
71
+
59
72
  class BridgeAwaitRequiredError(Exception):
60
73
  pass
61
74
 
@@ -101,7 +114,7 @@ def _make_transition(seq: int, a_to_s: bool, obj: ta.Any) -> _BridgeTransition:
101
114
 
102
115
  _BRIDGED_TASKS: ta.MutableMapping[ta.Any, list[_BridgeTransition]] = weakref.WeakKeyDictionary()
103
116
 
104
- _BRIDGE_GREENLET_ATTR = f'__{__package__.replace(".", "__")}__bridge_greenlet__'
117
+ _BRIDGE_THREADLET_ATTR = f'__{__package__.replace(".", "__")}__bridge_threadlet__'
105
118
 
106
119
 
107
120
  def _push_transition(a_to_s: bool, l: list[_BridgeTransition], t: _BridgeTransition) -> _BridgeTransition:
@@ -129,9 +142,9 @@ def _get_transitions() -> list[_BridgeTransition]:
129
142
  else:
130
143
  l.extend(tl)
131
144
 
132
- g = greenlet.getcurrent()
145
+ g = _threadlets().get_current()
133
146
  try:
134
- gl = getattr(g, _BRIDGE_GREENLET_ATTR)
147
+ gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
135
148
  except AttributeError:
136
149
  pass
137
150
  else:
@@ -158,9 +171,9 @@ def is_in_bridge() -> bool:
158
171
  else:
159
172
  last_t = None
160
173
 
161
- g = greenlet.getcurrent()
174
+ g = _threadlets().get_current()
162
175
  try:
163
- gl = getattr(g, _BRIDGE_GREENLET_ATTR)
176
+ gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
164
177
  except AttributeError:
165
178
  last_g = None
166
179
  else:
@@ -194,13 +207,13 @@ def _safe_cancel_awaitable(awaitable: ta.Awaitable[ta.Any]) -> None:
194
207
 
195
208
 
196
209
  def s_to_a_await(awaitable: ta.Awaitable[T]) -> T:
197
- g = greenlet.getcurrent()
210
+ g = _threadlets().get_current()
198
211
 
199
- if not getattr(g, _BRIDGE_GREENLET_ATTR, False):
212
+ if not getattr(g.underlying, _BRIDGE_THREADLET_ATTR, False):
200
213
  _safe_cancel_awaitable(awaitable)
201
214
  raise MissingBridgeGreenletError
202
215
 
203
- return g.parent.switch(awaitable)
216
+ return check.not_none(g.parent).switch(awaitable)
204
217
 
205
218
 
206
219
  def s_to_a(fn, *, require_await=False):
@@ -210,7 +223,7 @@ def s_to_a(fn, *, require_await=False):
210
223
  try:
211
224
  return fn(*args, **kwargs)
212
225
  finally:
213
- if (gl2 := getattr(g, _BRIDGE_GREENLET_ATTR)) is not gl: # noqa
226
+ if (gl2 := getattr(g.underlying, _BRIDGE_THREADLET_ATTR)) is not gl: # noqa
214
227
  raise UnexpectedBridgeNestingError
215
228
  if (cur_g := _pop_transition(False, gl)) is not added_g: # noqa
216
229
  raise UnexpectedBridgeNestingError
@@ -219,8 +232,8 @@ def s_to_a(fn, *, require_await=False):
219
232
 
220
233
  seq = next(_BRIDGE_TRANSITIONS_SEQ)
221
234
 
222
- g = greenlet.greenlet(inner)
223
- setattr(g, _BRIDGE_GREENLET_ATTR, gl := []) # type: ignore
235
+ g = _threadlets().spawn(inner)
236
+ setattr(g.underlying, _BRIDGE_THREADLET_ATTR, gl := []) # type: ignore
224
237
  added_g = _push_transition(False, gl, _make_transition(seq, False, g))
225
238
 
226
239
  if (t := aiu.get_current_backend_task()) is not None:
@@ -270,11 +283,11 @@ def a_to_s(fn):
270
283
  else:
271
284
  added_t = None
272
285
 
273
- g = greenlet.getcurrent()
286
+ g = _threadlets().get_current()
274
287
  try:
275
- gl = getattr(g, _BRIDGE_GREENLET_ATTR)
288
+ gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
276
289
  except AttributeError:
277
- setattr(g, _BRIDGE_GREENLET_ATTR, gl := [])
290
+ setattr(g.underlying, _BRIDGE_THREADLET_ATTR, gl := [])
278
291
  added_g = _push_transition(True, gl, _make_transition(seq, True, g))
279
292
 
280
293
  try:
@@ -306,7 +319,7 @@ def a_to_s(fn):
306
319
  if (cur_t := _pop_transition(True, tl)) is not added_t: # noqa
307
320
  raise UnexpectedBridgeNestingError
308
321
 
309
- if (gl2 := getattr(g, _BRIDGE_GREENLET_ATTR)) is not gl: # noqa
322
+ if (gl2 := getattr(g.underlying, _BRIDGE_THREADLET_ATTR)) is not gl: # noqa
310
323
  raise UnexpectedBridgeNestingError
311
324
  if (cur_g := _pop_transition(True, gl)) is not added_g: # noqa
312
325
  raise UnexpectedBridgeNestingError
@@ -70,6 +70,7 @@ class ThreadDumpBootstrap(ContextBootstrap['ThreadDumpBootstrap.Config']):
70
70
  @dc.dataclass(frozen=True)
71
71
  class Config(Bootstrap.Config):
72
72
  interval_s: ta.Optional[float] = None
73
+ nodaemon: bool = False
73
74
 
74
75
  on_sigquit: bool = False
75
76
 
@@ -79,6 +80,7 @@ class ThreadDumpBootstrap(ContextBootstrap['ThreadDumpBootstrap.Config']):
79
80
  tdt = diagt.create_thread_dump_thread(
80
81
  interval_s=self._config.interval_s,
81
82
  start=True,
83
+ nodaemon=self._config.nodaemon,
82
84
  )
83
85
  else:
84
86
  tdt = None
@@ -97,7 +99,7 @@ class ThreadDumpBootstrap(ContextBootstrap['ThreadDumpBootstrap.Config']):
97
99
  yield
98
100
 
99
101
  finally:
100
- if tdt is not None:
102
+ if tdt is not None and not self._config.nodaemon:
101
103
  tdt.stop_nowait()
102
104
 
103
105
  if prev_sq.present:
@@ -0,0 +1,11 @@
1
+ from .executors import ( # noqa
2
+ ImmediateExecutor,
3
+ new_executor,
4
+ )
5
+
6
+ from .futures import ( # noqa
7
+ FutureError,
8
+ FutureTimeoutError,
9
+ wait_futures,
10
+ wait_dependent_futures,
11
+ )
@@ -0,0 +1,52 @@
1
+ import concurrent.futures as cf
2
+ import contextlib
3
+ import typing as ta
4
+
5
+
6
+ T = ta.TypeVar('T')
7
+ P = ta.ParamSpec('P')
8
+
9
+
10
+ class ImmediateExecutor(cf.Executor):
11
+
12
+ def __init__(self, *, immediate_exceptions: bool = False) -> None:
13
+ super().__init__()
14
+ self._immediate_exceptions = immediate_exceptions
15
+
16
+ def submit(
17
+ self,
18
+ fn: ta.Callable[P, T],
19
+ /,
20
+ *args: P.args,
21
+ **kwargs: P.kwargs,
22
+ ) -> cf.Future[T]:
23
+ future: ta.Any = cf.Future()
24
+ try:
25
+ result = fn(*args, **kwargs)
26
+ future.set_result(result)
27
+ except Exception as e:
28
+ if self._immediate_exceptions:
29
+ raise
30
+ future.set_exception(e)
31
+ return future
32
+
33
+
34
+ @contextlib.contextmanager
35
+ def new_executor(
36
+ max_workers: int | None = None,
37
+ cls: type[cf.Executor] = cf.ThreadPoolExecutor,
38
+ *,
39
+ immediate_exceptions: bool = False,
40
+ **kwargs: ta.Any,
41
+ ) -> ta.Generator[cf.Executor, None, None]:
42
+ if max_workers == 0:
43
+ yield ImmediateExecutor(
44
+ immediate_exceptions=immediate_exceptions,
45
+ )
46
+
47
+ else:
48
+ with cls( # type: ignore
49
+ max_workers,
50
+ **kwargs,
51
+ ) as exe:
52
+ yield exe
@@ -1,11 +1,9 @@
1
1
  import concurrent.futures as cf
2
- import contextlib
3
2
  import time
4
3
  import typing as ta
5
4
 
6
5
 
7
6
  T = ta.TypeVar('T')
8
- P = ta.ParamSpec('P')
9
7
 
10
8
 
11
9
  ##
@@ -137,45 +135,3 @@ def wait_dependent_futures(
137
135
 
138
136
  futs_by_fn = {fn: fut for fut, fn in fns_by_fut.items()}
139
137
  return futs_by_fn
140
-
141
-
142
- ##
143
-
144
-
145
- class ImmediateExecutor(cf.Executor):
146
-
147
- def __init__(self, *, immediate_exceptions: bool = False) -> None:
148
- super().__init__()
149
- self._immediate_exceptions = immediate_exceptions
150
-
151
- def submit(self, fn: ta.Callable[P, T], /, *args: P.args, **kwargs: P.kwargs) -> cf.Future[T]:
152
- future: ta.Any = cf.Future()
153
- try:
154
- result = fn(*args, **kwargs)
155
- future.set_result(result)
156
- except Exception as e:
157
- if self._immediate_exceptions:
158
- raise
159
- future.set_exception(e)
160
- return future
161
-
162
-
163
- @contextlib.contextmanager
164
- def new_executor(
165
- max_workers: int | None = None,
166
- cls: type[cf.Executor] = cf.ThreadPoolExecutor,
167
- *,
168
- immediate_exceptions: bool = False,
169
- **kwargs: ta.Any,
170
- ) -> ta.Generator[cf.Executor, None, None]:
171
- if max_workers == 0:
172
- yield ImmediateExecutor(
173
- immediate_exceptions=immediate_exceptions,
174
- )
175
-
176
- else:
177
- with cls( # type: ignore
178
- max_workers,
179
- **kwargs,
180
- ) as exe:
181
- yield exe
@@ -0,0 +1,91 @@
1
+ import abc
2
+ import dataclasses as dc
3
+ import typing as ta
4
+
5
+ from omlish import lang
6
+
7
+
8
+ if ta.TYPE_CHECKING:
9
+ import greenlet
10
+ else:
11
+ greenlet = lang.proxy_import('greenlet')
12
+
13
+
14
+ ##
15
+
16
+
17
+ class Threadlet(abc.ABC):
18
+ """Not safe to identity-key - use `underlying`."""
19
+
20
+ def __hash__(self):
21
+ raise TypeError('use `underlying`')
22
+
23
+ def __eq__(self, other):
24
+ raise TypeError('use `underlying`')
25
+
26
+ @property
27
+ @abc.abstractmethod
28
+ def underlying(self) -> ta.Any:
29
+ raise NotImplementedError
30
+
31
+ @property
32
+ @abc.abstractmethod
33
+ def parent(self) -> ta.Optional['Threadlet']:
34
+ raise NotImplementedError
35
+
36
+ @property
37
+ @abc.abstractmethod
38
+ def dead(self) -> bool:
39
+ raise NotImplementedError
40
+
41
+ @abc.abstractmethod
42
+ def switch(self, *args: ta.Any, **kwargs: ta.Any) -> ta.Any:
43
+ raise NotImplementedError
44
+
45
+ @abc.abstractmethod
46
+ def throw(self, ex: Exception) -> ta.Any:
47
+ raise NotImplementedError
48
+
49
+
50
+ class Threadlets(abc.ABC):
51
+ @abc.abstractmethod
52
+ def spawn(self, fn: ta.Callable[[], None]) -> Threadlet:
53
+ raise NotImplementedError
54
+
55
+ @abc.abstractmethod
56
+ def get_current(self) -> Threadlet:
57
+ raise NotImplementedError
58
+
59
+
60
+ ##
61
+
62
+
63
+ @dc.dataclass(frozen=True)
64
+ class GreenletThreadlet(Threadlet):
65
+ g: 'greenlet.greenlet'
66
+
67
+ @property
68
+ def underlying(self) -> 'greenlet.greenlet':
69
+ return self.g
70
+
71
+ @property
72
+ def parent(self) -> ta.Optional['GreenletThreadlet']:
73
+ return GreenletThreadlet(self.g.parent)
74
+
75
+ @property
76
+ def dead(self) -> bool:
77
+ return self.g.dead
78
+
79
+ def switch(self, *args: ta.Any, **kwargs: ta.Any) -> ta.Any:
80
+ return self.g.switch(*args, **kwargs)
81
+
82
+ def throw(self, ex: Exception) -> ta.Any:
83
+ return self.g.throw(ex)
84
+
85
+
86
+ class GreenletThreadlets(Threadlets):
87
+ def spawn(self, fn: ta.Callable[[], None]) -> Threadlet:
88
+ return GreenletThreadlet(greenlet.greenlet(fn))
89
+
90
+ def get_current(self) -> Threadlet:
91
+ return GreenletThreadlet(greenlet.getcurrent())
@@ -4,10 +4,13 @@ import typing as ta
4
4
 
5
5
  from ... import check as check_
6
6
  from ... import lang
7
+ from .internals import FIELDS_ATTR
7
8
  from .internals import FieldType
8
9
  from .internals import is_classvar
9
10
  from .internals import is_initvar
11
+ from .internals import is_kw_only
10
12
  from .params import get_field_extras
13
+ from .processing import Processor
11
14
 
12
15
 
13
16
  if ta.TYPE_CHECKING:
@@ -19,6 +22,9 @@ else:
19
22
  MISSING = dc.MISSING
20
23
 
21
24
 
25
+ ##
26
+
27
+
22
28
  def field_type(f: dc.Field) -> FieldType:
23
29
  if (ft := getattr(f, '_field_type')) is not None:
24
30
  return FieldType(ft)
@@ -30,6 +36,51 @@ def has_default(f: dc.Field) -> bool:
30
36
  return not (f.default is MISSING and f.default_factory is MISSING)
31
37
 
32
38
 
39
+ ##
40
+
41
+
42
+ class FieldsProcessor(Processor):
43
+ def _process(self) -> None:
44
+ cls = self._info.cls
45
+ fields: dict[str, dc.Field] = {}
46
+
47
+ for b in cls.__mro__[-1:0:-1]:
48
+ base_fields = getattr(b, FIELDS_ATTR, None)
49
+ if base_fields is not None:
50
+ for f in base_fields.values():
51
+ fields[f.name] = f
52
+
53
+ cls_fields: list[dc.Field] = []
54
+
55
+ kw_only = self._info.params.kw_only
56
+ kw_only_seen = False
57
+ for name, ann in self._info.cls_annotations.items():
58
+ if is_kw_only(cls, ann):
59
+ if kw_only_seen:
60
+ raise TypeError(f'{name!r} is KW_ONLY, but KW_ONLY has already been specified')
61
+ kw_only_seen = True
62
+ kw_only = True
63
+ else:
64
+ cls_fields.append(preprocess_field(cls, name, ann, kw_only))
65
+
66
+ for f in cls_fields:
67
+ fields[f.name] = f
68
+ if isinstance(getattr(cls, f.name, None), dc.Field):
69
+ if f.default is MISSING:
70
+ delattr(cls, f.name)
71
+ else:
72
+ setattr(cls, f.name, f.default)
73
+
74
+ for name, value in cls.__dict__.items():
75
+ if isinstance(value, dc.Field) and name not in self._info.cls_annotations:
76
+ raise TypeError(f'{name!r} is a field but has no type annotation')
77
+
78
+ setattr(cls, FIELDS_ATTR, fields)
79
+
80
+
81
+ ##
82
+
83
+
33
84
  def preprocess_field(
34
85
  cls: type,
35
86
  a_name: str,
@@ -1,12 +1,47 @@
1
1
  import dataclasses as dc
2
2
  import typing as ta
3
3
 
4
+ from ... import lang
5
+ from .internals import FIELDS_ATTR
6
+ from .internals import PARAMS_ATTR
4
7
  from .processing import Processor
8
+ from .reflect import ClassInfo
5
9
  from .utils import Namespace
6
10
  from .utils import create_fn
7
11
  from .utils import set_new_attribute
8
12
 
9
13
 
14
+ if ta.TYPE_CHECKING:
15
+ from . import metaclass
16
+ else:
17
+ metaclass = lang.proxy_import('.metaclass', __package__)
18
+
19
+
20
+ def check_frozen_bases(info: ClassInfo) -> None:
21
+ mc_base = getattr(metaclass, 'Data', None)
22
+ all_frozen_bases = None
23
+ any_frozen_base = False
24
+ has_dataclass_bases = False
25
+ for b in info.cls.__mro__[-1:0:-1]:
26
+ if b is mc_base:
27
+ continue
28
+ base_fields = getattr(b, FIELDS_ATTR, None)
29
+ if base_fields is not None:
30
+ has_dataclass_bases = True
31
+ if all_frozen_bases is None:
32
+ all_frozen_bases = True
33
+ current_frozen = getattr(b, PARAMS_ATTR).frozen
34
+ all_frozen_bases = all_frozen_bases and current_frozen
35
+ any_frozen_base = any_frozen_base or current_frozen
36
+
37
+ if has_dataclass_bases:
38
+ if any_frozen_base and not info.params.frozen:
39
+ raise TypeError('cannot inherit non-frozen dataclass from a frozen one')
40
+
41
+ if all_frozen_bases is False and info.params.frozen:
42
+ raise TypeError('cannot inherit frozen dataclass from a non-frozen one')
43
+
44
+
10
45
  def frozen_get_del_attr(
11
46
  cls: type,
12
47
  fields: ta.Sequence[dc.Field],
@@ -46,6 +81,9 @@ def frozen_get_del_attr(
46
81
 
47
82
 
48
83
  class FrozenProcessor(Processor):
84
+ def check(self) -> None:
85
+ check_frozen_bases(self._info)
86
+
49
87
  def _process(self) -> None:
50
88
  if not self._info.params.frozen:
51
89
  return