omlish 0.0.0.dev20__tar.gz → 0.0.0.dev21__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 (300) hide show
  1. {omlish-0.0.0.dev20/omlish.egg-info → omlish-0.0.0.dev21}/PKG-INFO +1 -1
  2. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/__about__.py +2 -2
  3. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/fields.py +51 -0
  4. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/frozen.py +38 -0
  5. omlish-0.0.0.dev21/omlish/dataclasses/impl/main.py +89 -0
  6. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/processing.py +10 -2
  7. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/classes/simple.py +3 -0
  8. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/clsdct.py +2 -0
  9. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/contextmanagers.py +41 -0
  10. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/descriptors.py +6 -0
  11. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/objects.py +4 -0
  12. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/resolving.py +9 -0
  13. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/marshal.py +4 -2
  14. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/multiprocessing.py +4 -4
  15. omlish-0.0.0.dev21/omlish/specs/jsonschema/types.py +21 -0
  16. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21/omlish.egg-info}/PKG-INFO +1 -1
  17. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/pyproject.toml +1 -1
  18. omlish-0.0.0.dev20/omlish/dataclasses/impl/main.py +0 -153
  19. omlish-0.0.0.dev20/omlish/specs/jsonschema/types.py +0 -10
  20. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/LICENSE +0 -0
  21. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/MANIFEST.in +0 -0
  22. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/README.rst +0 -0
  23. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/__init__.py +0 -0
  24. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/argparse.py +0 -0
  25. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/asyncs/__init__.py +0 -0
  26. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/asyncs/anyio.py +0 -0
  27. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/asyncs/asyncio.py +0 -0
  28. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/asyncs/asyncs.py +0 -0
  29. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/asyncs/bridge.py +0 -0
  30. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/asyncs/flavors.py +0 -0
  31. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/asyncs/trio.py +0 -0
  32. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/asyncs/trio_asyncio.py +0 -0
  33. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/bootstrap/__init__.py +0 -0
  34. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/bootstrap/__main__.py +0 -0
  35. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/bootstrap/base.py +0 -0
  36. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/bootstrap/diag.py +0 -0
  37. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/bootstrap/harness.py +0 -0
  38. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/bootstrap/main.py +0 -0
  39. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/bootstrap/sys.py +0 -0
  40. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/c3.py +0 -0
  41. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/cached.py +0 -0
  42. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/check.py +0 -0
  43. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/__init__.py +0 -0
  44. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/_abc.py +0 -0
  45. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/_io_abc.py +0 -0
  46. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/cache/__init__.py +0 -0
  47. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/cache/descriptor.py +0 -0
  48. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/cache/impl.py +0 -0
  49. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/cache/types.py +0 -0
  50. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/coerce.py +0 -0
  51. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/exceptions.py +0 -0
  52. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/frozen.py +0 -0
  53. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/identity.py +0 -0
  54. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/indexed.py +0 -0
  55. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/mappings.py +0 -0
  56. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/ordered.py +0 -0
  57. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/persistent.py +0 -0
  58. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/skiplist.py +0 -0
  59. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/sorted.py +0 -0
  60. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/treap.py +0 -0
  61. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/treapmap.py +0 -0
  62. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/unmodifiable.py +0 -0
  63. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/collections/utils.py +0 -0
  64. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/concurrent.py +0 -0
  65. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/configs/__init__.py +0 -0
  66. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/configs/classes.py +0 -0
  67. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/configs/flattening.py +0 -0
  68. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/configs/strings.py +0 -0
  69. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/__init__.py +0 -0
  70. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/__init__.py +0 -0
  71. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/api.py +0 -0
  72. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/as_.py +0 -0
  73. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/copy.py +0 -0
  74. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/descriptors.py +0 -0
  75. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/exceptions.py +0 -0
  76. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/hashing.py +0 -0
  77. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/init.py +0 -0
  78. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/internals.py +0 -0
  79. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/metaclass.py +0 -0
  80. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/metadata.py +0 -0
  81. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/order.py +0 -0
  82. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/params.py +0 -0
  83. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/reflect.py +0 -0
  84. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/replace.py +0 -0
  85. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/repr.py +0 -0
  86. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/simple.py +0 -0
  87. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/slots.py +0 -0
  88. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/impl/utils.py +0 -0
  89. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dataclasses/utils.py +0 -0
  90. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/datetimes.py +0 -0
  91. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/defs.py +0 -0
  92. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/diag/__init__.py +0 -0
  93. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/diag/procfs.py +0 -0
  94. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/diag/procstats.py +0 -0
  95. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/diag/ps.py +0 -0
  96. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/diag/pydevd.py +0 -0
  97. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/diag/replserver/__init__.py +0 -0
  98. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/diag/replserver/__main__.py +0 -0
  99. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/diag/replserver/console.py +0 -0
  100. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/diag/replserver/server.py +0 -0
  101. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/diag/threads.py +0 -0
  102. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dispatch/__init__.py +0 -0
  103. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dispatch/_dispatch2.py +0 -0
  104. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dispatch/_dispatch3.py +0 -0
  105. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dispatch/dispatch.py +0 -0
  106. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dispatch/functions.py +0 -0
  107. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dispatch/methods.py +0 -0
  108. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/docker.py +0 -0
  109. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/dynamic.py +0 -0
  110. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/fnpairs.py +0 -0
  111. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/formats/__init__.py +0 -0
  112. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/formats/dotenv.py +0 -0
  113. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/formats/json.py +0 -0
  114. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/formats/props.py +0 -0
  115. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/formats/yaml.py +0 -0
  116. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/graphs/__init__.py +0 -0
  117. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/graphs/dags.py +0 -0
  118. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/graphs/domination.py +0 -0
  119. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/graphs/dot/__init__.py +0 -0
  120. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/graphs/dot/items.py +0 -0
  121. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/graphs/dot/rendering.py +0 -0
  122. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/graphs/dot/utils.py +0 -0
  123. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/graphs/trees.py +0 -0
  124. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/http/__init__.py +0 -0
  125. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/http/asgi.py +0 -0
  126. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/http/collections.py +0 -0
  127. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/http/consts.py +0 -0
  128. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/http/cookies.py +0 -0
  129. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/http/dates.py +0 -0
  130. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/http/encodings.py +0 -0
  131. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/http/json.py +0 -0
  132. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/http/sessions.py +0 -0
  133. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/http/wsgi.py +0 -0
  134. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/__init__.py +0 -0
  135. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/binder.py +0 -0
  136. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/bindings.py +0 -0
  137. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/eagers.py +0 -0
  138. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/elements.py +0 -0
  139. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/exceptions.py +0 -0
  140. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/__init__.py +0 -0
  141. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/bindings.py +0 -0
  142. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/elements.py +0 -0
  143. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/injector.py +0 -0
  144. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/inspect.py +0 -0
  145. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/multis.py +0 -0
  146. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/origins.py +0 -0
  147. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/privates.py +0 -0
  148. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/providers.py +0 -0
  149. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/proxy.py +0 -0
  150. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/impl/scopes.py +0 -0
  151. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/injector.py +0 -0
  152. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/inspect.py +0 -0
  153. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/keys.py +0 -0
  154. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/listeners.py +0 -0
  155. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/managed.py +0 -0
  156. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/multis.py +0 -0
  157. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/origins.py +0 -0
  158. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/overrides.py +0 -0
  159. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/privates.py +0 -0
  160. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/providers.py +0 -0
  161. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/scopes.py +0 -0
  162. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/types.py +0 -0
  163. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/inject/utils.py +0 -0
  164. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/iterators.py +0 -0
  165. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/__init__.py +0 -0
  166. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/cached.py +0 -0
  167. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/classes/__init__.py +0 -0
  168. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/classes/abstract.py +0 -0
  169. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/classes/restrict.py +0 -0
  170. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/classes/virtual.py +0 -0
  171. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/cmp.py +0 -0
  172. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/exceptions.py +0 -0
  173. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/functions.py +0 -0
  174. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/imports.py +0 -0
  175. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/iterables.py +0 -0
  176. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/maybes.py +0 -0
  177. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/strings.py +0 -0
  178. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/sys.py +0 -0
  179. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/timeouts.py +0 -0
  180. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lang/typing.py +0 -0
  181. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/libc.py +0 -0
  182. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lifecycles/__init__.py +0 -0
  183. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lifecycles/abstract.py +0 -0
  184. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lifecycles/base.py +0 -0
  185. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lifecycles/contextmanagers.py +0 -0
  186. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lifecycles/controller.py +0 -0
  187. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lifecycles/manager.py +0 -0
  188. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lifecycles/states.py +0 -0
  189. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lifecycles/transitions.py +0 -0
  190. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/__init__.py +0 -0
  191. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/cached.py +0 -0
  192. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/check.py +0 -0
  193. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/contextmanagers.py +0 -0
  194. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/json.py +0 -0
  195. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/logs.py +0 -0
  196. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/reflect.py +0 -0
  197. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/runtime.py +0 -0
  198. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/secrets.py +0 -0
  199. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/strings.py +0 -0
  200. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/lite/subprocesses.py +0 -0
  201. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/logs/__init__.py +0 -0
  202. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/logs/_abc.py +0 -0
  203. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/logs/configs.py +0 -0
  204. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/logs/formatters.py +0 -0
  205. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/logs/noisy.py +0 -0
  206. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/logs/utils.py +0 -0
  207. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/__init__.py +0 -0
  208. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/any.py +0 -0
  209. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/base.py +0 -0
  210. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/base64.py +0 -0
  211. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/dataclasses.py +0 -0
  212. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/datetimes.py +0 -0
  213. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/enums.py +0 -0
  214. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/exceptions.py +0 -0
  215. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/factories.py +0 -0
  216. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/forbidden.py +0 -0
  217. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/global_.py +0 -0
  218. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/helpers.py +0 -0
  219. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/iterables.py +0 -0
  220. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/mappings.py +0 -0
  221. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/maybes.py +0 -0
  222. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/naming.py +0 -0
  223. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/numbers.py +0 -0
  224. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/objects.py +0 -0
  225. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/optionals.py +0 -0
  226. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/polymorphism.py +0 -0
  227. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/primitives.py +0 -0
  228. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/registries.py +0 -0
  229. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/standard.py +0 -0
  230. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/utils.py +0 -0
  231. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/uuids.py +0 -0
  232. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/marshal/values.py +0 -0
  233. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/matchfns.py +0 -0
  234. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/math.py +0 -0
  235. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/os.py +0 -0
  236. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/reflect/__init__.py +0 -0
  237. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/reflect/isinstance.py +0 -0
  238. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/reflect/ops.py +0 -0
  239. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/reflect/subst.py +0 -0
  240. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/reflect/types.py +0 -0
  241. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/runmodule.py +0 -0
  242. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/secrets/__init__.py +0 -0
  243. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/secrets/crypto.py +0 -0
  244. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/secrets/marshal.py +0 -0
  245. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/secrets/openssl.py +0 -0
  246. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/secrets/passwords.py +0 -0
  247. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/secrets/secrets.py +0 -0
  248. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/secrets/subprocesses.py +0 -0
  249. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/__init__.py +0 -0
  250. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/__init__.py +0 -0
  251. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/keywords/__init__.py +0 -0
  252. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/keywords/base.py +0 -0
  253. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/keywords/core.py +0 -0
  254. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/keywords/metadata.py +0 -0
  255. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/keywords/parse.py +0 -0
  256. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/keywords/render.py +0 -0
  257. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/keywords/validation.py +0 -0
  258. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/schemas/__init__.py +0 -0
  259. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/schemas/draft202012/__init__.py +0 -0
  260. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/__init__.py +0 -0
  261. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/sql/__init__.py +0 -0
  262. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/sql/_abc.py +0 -0
  263. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/sql/asyncs.py +0 -0
  264. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/sql/dbs.py +0 -0
  265. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/sql/duckdb.py +0 -0
  266. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/sql/exprs.py +0 -0
  267. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/sql/secrets.py +0 -0
  268. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/sql/sqlean.py +0 -0
  269. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/stats.py +0 -0
  270. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/sync.py +0 -0
  271. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/term.py +0 -0
  272. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/__init__.py +0 -0
  273. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/__init__.py +0 -0
  274. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/helpers.py +0 -0
  275. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/inject/__init__.py +0 -0
  276. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/inject/harness.py +0 -0
  277. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/marks.py +0 -0
  278. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/__init__.py +0 -0
  279. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/_registry.py +0 -0
  280. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/asyncs.py +0 -0
  281. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/depskip.py +0 -0
  282. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/logging.py +0 -0
  283. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/managermarks.py +0 -0
  284. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/pydevd.py +0 -0
  285. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/repeat.py +0 -0
  286. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/skips.py +0 -0
  287. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/spacing.py +0 -0
  288. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/switches.py +0 -0
  289. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/pytest/plugins/utils.py +0 -0
  290. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/testing/testing.py +0 -0
  291. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/text/__init__.py +0 -0
  292. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/text/delimit.py +0 -0
  293. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/text/glyphsplit.py +0 -0
  294. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/text/indent.py +0 -0
  295. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish/text/parts.py +0 -0
  296. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish.egg-info/SOURCES.txt +0 -0
  297. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish.egg-info/dependency_links.txt +0 -0
  298. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish.egg-info/requires.txt +0 -0
  299. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/omlish.egg-info/top_level.txt +0 -0
  300. {omlish-0.0.0.dev20 → omlish-0.0.0.dev21}/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.dev21
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev20'
2
- __revision__ = '56a3421b375112818e306f2c17d467c7aac1d26b'
1
+ __version__ = '0.0.0.dev21'
2
+ __revision__ = '4cb4af9e253f312d5f301449f08dfa7168234e07'
3
3
 
4
4
 
5
5
  #
@@ -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
@@ -0,0 +1,89 @@
1
+ import abc
2
+ import dataclasses as dc
3
+ import typing as ta
4
+
5
+ from ... import check
6
+ from ... import lang
7
+ from .copy import CopyProcessor
8
+ from .fields import FieldsProcessor
9
+ from .frozen import FrozenProcessor
10
+ from .hashing import HashProcessor
11
+ from .init import InitProcessor
12
+ from .internals import FIELDS_ATTR
13
+ from .internals import PARAMS_ATTR
14
+ from .internals import Params
15
+ from .order import OrderProcessor
16
+ from .params import ParamsExtras
17
+ from .processing import Processor
18
+ from .reflect import ClassInfo
19
+ from .replace import ReplaceProcessor
20
+ from .repr import ReprProcessor
21
+ from .simple import DocProcessor
22
+ from .simple import EqProcessor
23
+ from .simple import MatchArgsProcessor
24
+ from .simple import OverridesProcessor
25
+ from .slots import add_slots
26
+
27
+
28
+ MISSING = dc.MISSING
29
+
30
+
31
+ class MainProcessor:
32
+ def __init__(self, cls: type) -> None:
33
+ super().__init__()
34
+
35
+ self._cls = check.isinstance(cls, type)
36
+ self._info = info = ClassInfo(cls, _constructing=True)
37
+
38
+ check.not_in(FIELDS_ATTR, cls.__dict__)
39
+ check.is_(check.isinstance(cls.__dict__[PARAMS_ATTR], Params), info.params)
40
+ check.is_(check.isinstance(check.not_none(info.cls_metadata)[ParamsExtras], ParamsExtras), info.params_extras) # noqa
41
+
42
+ def _check_params(self) -> None:
43
+ if self._info.params.order and not self._info.params.eq:
44
+ raise ValueError('eq must be true if order is true')
45
+
46
+ @lang.cached_function
47
+ def _transform_slots(self) -> None:
48
+ if self._info.params.weakref_slot and not self._info.params.slots:
49
+ raise TypeError('weakref_slot is True but slots is False')
50
+ if not self._info.params.slots:
51
+ return
52
+ self._cls = add_slots(self._cls, self._info.params.frozen, self._info.params.weakref_slot)
53
+
54
+ PROCESSOR_TYPES: ta.ClassVar[ta.Sequence[type[Processor]]] = [
55
+ FieldsProcessor,
56
+ InitProcessor,
57
+ OverridesProcessor,
58
+ ReprProcessor,
59
+ EqProcessor,
60
+ OrderProcessor,
61
+ FrozenProcessor,
62
+ HashProcessor,
63
+ DocProcessor,
64
+ MatchArgsProcessor,
65
+ ReplaceProcessor,
66
+ CopyProcessor,
67
+ ]
68
+
69
+ @lang.cached_function
70
+ def process(self) -> type:
71
+ self._check_params()
72
+
73
+ ps = [pcls(self._info) for pcls in self.PROCESSOR_TYPES]
74
+
75
+ for p in ps:
76
+ p.check()
77
+
78
+ for p in ps:
79
+ p.process()
80
+
81
+ self._transform_slots()
82
+
83
+ abc.update_abstractmethods(self._cls) # noqa
84
+
85
+ return self._cls
86
+
87
+
88
+ def process_class(cls: type) -> type:
89
+ return MainProcessor(cls).process()
@@ -1,13 +1,21 @@
1
+ import typing as ta
2
+
1
3
  from ... import lang
2
- from .reflect import ClassInfo
4
+
5
+
6
+ if ta.TYPE_CHECKING:
7
+ from .reflect import ClassInfo
3
8
 
4
9
 
5
10
  class Processor(lang.Abstract):
6
- def __init__(self, info: ClassInfo) -> None:
11
+ def __init__(self, info: 'ClassInfo') -> None:
7
12
  super().__init__()
8
13
  self._cls = info.cls
9
14
  self._info = info
10
15
 
16
+ def check(self) -> None:
17
+ pass
18
+
11
19
  @lang.cached_function
12
20
  def process(self) -> None:
13
21
  self._process()
@@ -45,15 +45,18 @@ class _MarkerMeta(abc.ABCMeta):
45
45
 
46
46
  def __new__(mcls, name, bases, namespace):
47
47
  global _MARKER_NAMESPACE_KEYS
48
+
48
49
  if _MARKER_NAMESPACE_KEYS is None:
49
50
  if not (namespace.get('__module__') == __name__ and name == 'Marker'):
50
51
  raise RuntimeError
51
52
  _MARKER_NAMESPACE_KEYS = set(namespace)
53
+
52
54
  else:
53
55
  if set(namespace) - _MARKER_NAMESPACE_KEYS:
54
56
  raise TypeError('Markers must not include contents. Did you mean to use Namespace?')
55
57
  if Final not in bases:
56
58
  bases += (Final,)
59
+
57
60
  return super().__new__(mcls, name, bases, namespace)
58
61
 
59
62
  def __instancecheck__(self, instance):
@@ -55,8 +55,10 @@ class ClassDctFn:
55
55
  except KeyError:
56
56
  f = sys._getframe(self._offset) # noqa
57
57
  cls_dct = _skip_cls_dct_frames(f).f_locals
58
+
58
59
  if not is_possibly_cls_dct(cls_dct):
59
60
  raise TypeError(cls_dct)
61
+
60
62
  return self._fn(cls_dct, *args, **kwargs)
61
63
 
62
64
 
@@ -227,6 +227,47 @@ class ExitStacked:
227
227
  return superfn(exc_type, exc_val, exc_tb)
228
228
 
229
229
 
230
+ class AsyncExitStacked:
231
+
232
+ @property
233
+ def _exit_stack(self) -> contextlib.AsyncExitStack:
234
+ try:
235
+ return self.__exit_stack # type: ignore
236
+ except AttributeError:
237
+ es = self.__exit_stack = contextlib.AsyncExitStack()
238
+ return es
239
+
240
+ async def _enter_async_context(self, context_manager: ta.AsyncContextManager[T]) -> T:
241
+ return await self._exit_stack.enter_async_context(ta.cast(ta.AsyncContextManager, context_manager))
242
+
243
+ def _enter_context(self, context_manager: ta.ContextManager[T]) -> T:
244
+ return self._exit_stack.enter_context(ta.cast(ta.ContextManager, context_manager))
245
+
246
+ async def __aenter__(self) -> ta.Self:
247
+ try:
248
+ superfn = super().__aenter__ # type: ignore
249
+ except AttributeError:
250
+ ret = self
251
+ else:
252
+ ret = await superfn()
253
+ await self._exit_stack.__aenter__()
254
+ return ret
255
+
256
+ async def __aexit__(
257
+ self,
258
+ exc_type: type[BaseException] | None,
259
+ exc_val: BaseException | None,
260
+ exc_tb: types.TracebackType | None,
261
+ ) -> bool | None:
262
+ await self._exit_stack.__aexit__(exc_type, exc_val, exc_tb)
263
+ try:
264
+ superfn = super().__aexit__ # type: ignore
265
+ except AttributeError:
266
+ return None
267
+ else:
268
+ return await superfn(exc_type, exc_val, exc_tb)
269
+
270
+
230
271
  ##
231
272
 
232
273
 
@@ -37,8 +37,10 @@ def _has_method_descriptor(obj: ta.Any) -> bool:
37
37
  while True:
38
38
  if is_method_descriptor(obj):
39
39
  return True
40
+
40
41
  elif isinstance(obj, functools.partial):
41
42
  obj = obj.func
43
+
42
44
  else:
43
45
  try:
44
46
  obj = getattr(obj, '__wrapped__')
@@ -65,6 +67,7 @@ def unwrap_func_with_partials(fn: ta.Callable) -> tuple[ta.Callable, list[functo
65
67
  while True:
66
68
  if is_method_descriptor(fn) or isinstance(fn, types.MethodType):
67
69
  fn = fn.__func__ # type: ignore
70
+
68
71
  elif hasattr(fn, '__wrapped__'):
69
72
  nxt = fn.__wrapped__
70
73
  if not callable(nxt):
@@ -72,13 +75,16 @@ def unwrap_func_with_partials(fn: ta.Callable) -> tuple[ta.Callable, list[functo
72
75
  if nxt is fn:
73
76
  raise TypeError(fn)
74
77
  fn = nxt
78
+
75
79
  # NOTE: __wrapped__ takes precedence - a partial might point to a bound Method when the important information is
76
80
  # still the unbound func. see _decorator_descriptor for an example of this.
77
81
  elif isinstance(fn, functools.partial):
78
82
  ps.append(fn)
79
83
  fn = fn.func
84
+
80
85
  else:
81
86
  break
87
+
82
88
  return fn, ps
83
89
 
84
90
 
@@ -105,20 +105,24 @@ def build_mro_dict(
105
105
  ) -> ta.Mapping[str, ta.Any]:
106
106
  if owner_cls is None:
107
107
  owner_cls = instance_cls
108
+
108
109
  mro = instance_cls.__mro__[-2::-1]
109
110
  try:
110
111
  pos = mro.index(owner_cls)
111
112
  except ValueError:
112
113
  raise TypeError(f'Owner class {owner_cls} not in mro of instance class {instance_cls}') from None
114
+
113
115
  dct: dict[str, ta.Any] = {}
114
116
  if not bottom_up_key_order:
115
117
  for cur_cls in mro[:pos + 1][::-1]:
116
118
  for k, v in cur_cls.__dict__.items():
117
119
  if k not in dct:
118
120
  dct[k] = v
121
+
119
122
  else:
120
123
  for cur_cls in mro[:pos + 1]:
121
124
  dct.update(cur_cls.__dict__)
125
+
122
126
  return dct
123
127
 
124
128
 
@@ -10,37 +10,46 @@ class ResolvableClassNameError(NameError):
10
10
  def get_cls_fqcn(cls: type, *, nocheck: bool = False) -> str:
11
11
  if not isinstance(cls, type):
12
12
  raise TypeError(cls)
13
+
13
14
  mn = cls.__module__
14
15
  if set(mn) - set(string.ascii_lowercase + string.digits + '_.'):
15
16
  raise ResolvableClassNameError(cls)
17
+
16
18
  qn = cls.__qualname__
17
19
  if not all(qp[0].isupper() for qp in qn.split('.')) or (set(qn) - set(string.ascii_letters + string.digits + '.')):
18
20
  raise ResolvableClassNameError(cls)
21
+
19
22
  fqcn = '.'.join([cls.__module__, cls.__qualname__])
20
23
  if not nocheck:
21
24
  if get_fqcn_cls(fqcn, nocheck=True) is not cls:
22
25
  raise ResolvableClassNameError(cls, fqcn)
26
+
23
27
  return fqcn
24
28
 
25
29
 
26
30
  def get_fqcn_cls(fqcn: str, *, nocheck: bool = False) -> type:
27
31
  if not isinstance(fqcn, str) or not fqcn:
28
32
  raise TypeError(fqcn)
33
+
29
34
  parts = fqcn.split('.')
30
35
  pos = next(i for i, p in enumerate(parts) if p[0].isupper())
31
36
  mps, qps = parts[:pos], parts[pos:]
32
37
  mod = importlib.import_module('.'.join(mps))
38
+
33
39
  o: ta.Any = mod
34
40
  for qp in qps:
35
41
  o = getattr(o, qp)
36
42
  if not isinstance(o, type):
37
43
  raise TypeError(o)
44
+
38
45
  cls = o
39
46
  if not isinstance(cls, type):
40
47
  raise TypeError(cls)
48
+
41
49
  if not nocheck:
42
50
  if not get_cls_fqcn(cls, nocheck=True) == fqcn:
43
51
  raise ResolvableClassNameError(cls, fqcn)
52
+
44
53
  return o
45
54
 
46
55
 
@@ -232,8 +232,10 @@ _OBJ_MARSHALER_GENERIC_MAPPING_TYPES: ta.Dict[ta.Any, type] = {
232
232
 
233
233
  _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES: ta.Dict[ta.Any, type] = {
234
234
  **{t: t for t in (list, tuple, set, frozenset)},
235
- **{t: frozenset for t in (collections.abc.Set, collections.abc.MutableSet)},
236
- **{t: tuple for t in (collections.abc.Sequence, collections.abc.MutableSequence)},
235
+ collections.abc.Set: frozenset,
236
+ collections.abc.MutableSet: set,
237
+ collections.abc.Sequence: tuple,
238
+ collections.abc.MutableSequence: list,
237
239
  }
238
240
 
239
241
 
@@ -47,19 +47,19 @@ class DummyValueProxy(ValueProxy[T]):
47
47
 
48
48
  @dc.dataclass(frozen=True, kw_only=True)
49
49
  class SpawnExtras:
50
- fds: ta.AbstractSet[int] | None = None
50
+ pass_fds: ta.AbstractSet[int] | None = None
51
51
  deathsig: int | None = None
52
52
 
53
53
 
54
54
  class ExtrasSpawnPosixPopen(mp.popen_spawn_posix.Popen):
55
55
  def __init__(self, process_obj: 'ExtrasSpawnProcess', *, extras: SpawnExtras) -> None:
56
56
  self.__extras = extras
57
- self.__extra_fds = extras.fds
57
+ self.__pass_fds = extras.pass_fds
58
58
  super().__init__(process_obj)
59
59
 
60
60
  def _launch(self, process_obj: 'ExtrasSpawnProcess') -> None:
61
- if self.__extra_fds:
62
- for fd in self.__extra_fds:
61
+ if self.__pass_fds:
62
+ for fd in self.__pass_fds:
63
63
  self.duplicate_for_child(fd)
64
64
  self._extra_fds = None
65
65
 
@@ -0,0 +1,21 @@
1
+ import enum
2
+ import typing as ta
3
+
4
+
5
+ class JsonType(enum.Enum):
6
+ NULL = enum.auto()
7
+ BOOLEAN = enum.auto()
8
+ OBJECT = enum.auto()
9
+ ARRAY = enum.auto()
10
+ NUMBER = enum.auto()
11
+ STRING = enum.auto()
12
+
13
+
14
+ TYPE_SETS_BY_JSON_TYPE: ta.Mapping[JsonType, ta.AbstractSet[type]] = {
15
+ JsonType.NULL: {type(None)},
16
+ JsonType.BOOLEAN: {bool},
17
+ JsonType.OBJECT: {dict},
18
+ JsonType.ARRAY: {list},
19
+ JsonType.NUMBER: {int, float},
20
+ JsonType.STRING: {str},
21
+ }
@@ -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.dev21
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ authors = [
12
12
  urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = {text = 'BSD-3-Clause'}
14
14
  requires-python = '~=3.12'
15
- version = '0.0.0.dev20'
15
+ version = '0.0.0.dev21'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
@@ -1,153 +0,0 @@
1
- import abc
2
- import dataclasses as dc
3
- import typing as ta
4
-
5
- from ... import check
6
- from ... import lang
7
- from .copy import CopyProcessor
8
- from .fields import preprocess_field
9
- from .frozen import FrozenProcessor
10
- from .hashing import HashProcessor
11
- from .init import InitProcessor
12
- from .internals import FIELDS_ATTR
13
- from .internals import PARAMS_ATTR
14
- from .internals import Params
15
- from .internals import is_kw_only
16
- from .order import OrderProcessor
17
- from .params import ParamsExtras
18
- from .processing import Processor
19
- from .reflect import ClassInfo
20
- from .replace import ReplaceProcessor
21
- from .repr import ReprProcessor
22
- from .simple import DocProcessor
23
- from .simple import EqProcessor
24
- from .simple import MatchArgsProcessor
25
- from .simple import OverridesProcessor
26
- from .slots import add_slots
27
-
28
-
29
- if ta.TYPE_CHECKING:
30
- from . import metaclass
31
- else:
32
- metaclass = lang.proxy_import('.metaclass', __package__)
33
-
34
-
35
- MISSING = dc.MISSING
36
-
37
-
38
- class MainProcessor:
39
- def __init__(self, cls: type) -> None:
40
- super().__init__()
41
-
42
- self._cls = check.isinstance(cls, type)
43
- self._info = info = ClassInfo(cls, _constructing=True)
44
-
45
- check.not_in(FIELDS_ATTR, cls.__dict__)
46
- check.is_(check.isinstance(cls.__dict__[PARAMS_ATTR], Params), info.params)
47
- check.is_(check.isinstance(check.not_none(info.cls_metadata)[ParamsExtras], ParamsExtras), info.params_extras) # noqa
48
-
49
- def _check_params(self) -> None:
50
- if self._info.params.order and not self._info.params.eq:
51
- raise ValueError('eq must be true if order is true')
52
-
53
- def _check_frozen_bases(self) -> None:
54
- mc_base = getattr(metaclass, 'Data', None)
55
- all_frozen_bases = None
56
- any_frozen_base = False
57
- has_dataclass_bases = False
58
- for b in self._cls.__mro__[-1:0:-1]:
59
- if b is mc_base:
60
- continue
61
- base_fields = getattr(b, FIELDS_ATTR, None)
62
- if base_fields is not None:
63
- has_dataclass_bases = True
64
- if all_frozen_bases is None:
65
- all_frozen_bases = True
66
- current_frozen = getattr(b, PARAMS_ATTR).frozen
67
- all_frozen_bases = all_frozen_bases and current_frozen
68
- any_frozen_base = any_frozen_base or current_frozen
69
-
70
- if has_dataclass_bases:
71
- if any_frozen_base and not self._info.params.frozen:
72
- raise TypeError('cannot inherit non-frozen dataclass from a frozen one')
73
-
74
- if all_frozen_bases is False and self._info.params.frozen:
75
- raise TypeError('cannot inherit frozen dataclass from a non-frozen one')
76
-
77
- @lang.cached_function
78
- def _process_fields(self) -> None:
79
- fields: dict[str, dc.Field] = {}
80
-
81
- for b in self._cls.__mro__[-1:0:-1]:
82
- base_fields = getattr(b, FIELDS_ATTR, None)
83
- if base_fields is not None:
84
- for f in base_fields.values():
85
- fields[f.name] = f
86
-
87
- cls_fields: list[dc.Field] = []
88
-
89
- kw_only = self._info.params.kw_only
90
- kw_only_seen = False
91
- for name, ann in self._info.cls_annotations.items():
92
- if is_kw_only(self._cls, ann):
93
- if kw_only_seen:
94
- raise TypeError(f'{name!r} is KW_ONLY, but KW_ONLY has already been specified')
95
- kw_only_seen = True
96
- kw_only = True
97
- else:
98
- cls_fields.append(preprocess_field(self._cls, name, ann, kw_only))
99
-
100
- for f in cls_fields:
101
- fields[f.name] = f
102
- if isinstance(getattr(self._cls, f.name, None), dc.Field):
103
- if f.default is MISSING:
104
- delattr(self._cls, f.name)
105
- else:
106
- setattr(self._cls, f.name, f.default)
107
-
108
- for name, value in self._cls.__dict__.items():
109
- if isinstance(value, dc.Field) and name not in self._info.cls_annotations:
110
- raise TypeError(f'{name!r} is a field but has no type annotation')
111
-
112
- setattr(self._cls, FIELDS_ATTR, fields)
113
-
114
- @lang.cached_function
115
- def _transform_slots(self) -> None:
116
- if self._info.params.weakref_slot and not self._info.params.slots:
117
- raise TypeError('weakref_slot is True but slots is False')
118
- if not self._info.params.slots:
119
- return
120
- self._cls = add_slots(self._cls, self._info.params.frozen, self._info.params.weakref_slot)
121
-
122
- @lang.cached_function
123
- def process(self) -> type:
124
- self._check_params()
125
- self._check_frozen_bases()
126
-
127
- self._process_fields()
128
-
129
- pcls: type[Processor]
130
- for pcls in [
131
- InitProcessor,
132
- OverridesProcessor,
133
- ReprProcessor,
134
- EqProcessor,
135
- OrderProcessor,
136
- FrozenProcessor,
137
- HashProcessor,
138
- DocProcessor,
139
- MatchArgsProcessor,
140
- ReplaceProcessor,
141
- CopyProcessor,
142
- ]:
143
- pcls(self._info).process()
144
-
145
- self._transform_slots()
146
-
147
- abc.update_abstractmethods(self._cls) # noqa
148
-
149
- return self._cls
150
-
151
-
152
- def process_class(cls: type) -> type:
153
- return MainProcessor(cls).process()