omlish 0.0.0.dev33__tar.gz → 0.0.0.dev35__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 (333) hide show
  1. {omlish-0.0.0.dev33/omlish.egg-info → omlish-0.0.0.dev35}/PKG-INFO +1 -1
  2. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/__about__.py +2 -2
  3. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/bootstrap/marshal.py +1 -4
  4. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/api.py +1 -1
  5. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/fields.py +8 -1
  6. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/params.py +1 -1
  7. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/__init__.py +1 -0
  8. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/cached.py +7 -0
  9. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/classes/simple.py +3 -0
  10. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/__init__.py +8 -0
  11. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/base.py +2 -1
  12. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/dataclasses.py +11 -0
  13. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/maybes.py +4 -0
  14. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/objects.py +37 -0
  15. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/unions.py +6 -2
  16. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/secrets/marshal.py +1 -4
  17. omlish-0.0.0.dev35/omlish/specs/jsonrpc/__init__.py +28 -0
  18. omlish-0.0.0.dev35/omlish/specs/jsonrpc/errors.py +20 -0
  19. omlish-0.0.0.dev35/omlish/specs/jsonrpc/marshal.py +59 -0
  20. omlish-0.0.0.dev35/omlish/specs/jsonrpc/types.py +93 -0
  21. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35/omlish.egg-info}/PKG-INFO +1 -1
  22. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish.egg-info/SOURCES.txt +4 -0
  23. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/pyproject.toml +1 -1
  24. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/LICENSE +0 -0
  25. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/MANIFEST.in +0 -0
  26. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/README.rst +0 -0
  27. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/.manifests.json +0 -0
  28. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/__init__.py +0 -0
  29. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/argparse.py +0 -0
  30. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/asyncs/__init__.py +0 -0
  31. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/asyncs/anyio.py +0 -0
  32. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/asyncs/asyncio.py +0 -0
  33. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/asyncs/asyncs.py +0 -0
  34. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/asyncs/bridge.py +0 -0
  35. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/asyncs/flavors.py +0 -0
  36. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/asyncs/trio.py +0 -0
  37. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/asyncs/trio_asyncio.py +0 -0
  38. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/bootstrap/__init__.py +0 -0
  39. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/bootstrap/__main__.py +0 -0
  40. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/bootstrap/base.py +0 -0
  41. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/bootstrap/diag.py +0 -0
  42. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/bootstrap/harness.py +0 -0
  43. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/bootstrap/main.py +0 -0
  44. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/bootstrap/sys.py +0 -0
  45. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/c3.py +0 -0
  46. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/cached.py +0 -0
  47. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/check.py +0 -0
  48. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/__init__.py +0 -0
  49. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/_abc.py +0 -0
  50. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/_io_abc.py +0 -0
  51. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/cache/__init__.py +0 -0
  52. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/cache/descriptor.py +0 -0
  53. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/cache/impl.py +0 -0
  54. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/cache/types.py +0 -0
  55. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/coerce.py +0 -0
  56. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/exceptions.py +0 -0
  57. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/frozen.py +0 -0
  58. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/identity.py +0 -0
  59. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/indexed.py +0 -0
  60. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/mappings.py +0 -0
  61. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/ordered.py +0 -0
  62. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/persistent.py +0 -0
  63. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/skiplist.py +0 -0
  64. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/sorted.py +0 -0
  65. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/treap.py +0 -0
  66. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/treapmap.py +0 -0
  67. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/unmodifiable.py +0 -0
  68. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/collections/utils.py +0 -0
  69. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/concurrent/__init__.py +0 -0
  70. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/concurrent/executors.py +0 -0
  71. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/concurrent/futures.py +0 -0
  72. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/concurrent/threadlets.py +0 -0
  73. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/configs/__init__.py +0 -0
  74. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/configs/classes.py +0 -0
  75. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/configs/flattening.py +0 -0
  76. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/configs/strings.py +0 -0
  77. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/__init__.py +0 -0
  78. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/LICENSE +0 -0
  79. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/__init__.py +0 -0
  80. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/as_.py +0 -0
  81. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/copy.py +0 -0
  82. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/descriptors.py +0 -0
  83. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/exceptions.py +0 -0
  84. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/frozen.py +0 -0
  85. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/hashing.py +0 -0
  86. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/init.py +0 -0
  87. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/internals.py +0 -0
  88. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/main.py +0 -0
  89. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/metaclass.py +0 -0
  90. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/metadata.py +0 -0
  91. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/order.py +0 -0
  92. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/processing.py +0 -0
  93. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/reflect.py +0 -0
  94. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/replace.py +0 -0
  95. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/repr.py +0 -0
  96. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/simple.py +0 -0
  97. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/slots.py +0 -0
  98. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/impl/utils.py +0 -0
  99. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dataclasses/utils.py +0 -0
  100. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/datetimes.py +0 -0
  101. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/defs.py +0 -0
  102. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/__init__.py +0 -0
  103. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/asts.py +0 -0
  104. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/procfs.py +0 -0
  105. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/procstats.py +0 -0
  106. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/ps.py +0 -0
  107. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/pycharm.py +0 -0
  108. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/pydevd.py +0 -0
  109. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/replserver/__init__.py +0 -0
  110. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/replserver/__main__.py +0 -0
  111. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/replserver/console.py +0 -0
  112. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/replserver/server.py +0 -0
  113. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/diag/threads.py +0 -0
  114. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dispatch/__init__.py +0 -0
  115. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dispatch/_dispatch2.py +0 -0
  116. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dispatch/_dispatch3.py +0 -0
  117. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dispatch/dispatch.py +0 -0
  118. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dispatch/functions.py +0 -0
  119. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dispatch/methods.py +0 -0
  120. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/docker.py +0 -0
  121. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/dynamic.py +0 -0
  122. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/fnpairs.py +0 -0
  123. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/fnpipes.py +0 -0
  124. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/formats/__init__.py +0 -0
  125. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/formats/dotenv.py +0 -0
  126. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/formats/json.py +0 -0
  127. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/formats/props.py +0 -0
  128. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/formats/yaml.py +0 -0
  129. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/genmachine.py +0 -0
  130. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/graphs/__init__.py +0 -0
  131. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/graphs/dags.py +0 -0
  132. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/graphs/domination.py +0 -0
  133. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/graphs/dot/__init__.py +0 -0
  134. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/graphs/dot/items.py +0 -0
  135. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/graphs/dot/make.py +0 -0
  136. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/graphs/dot/rendering.py +0 -0
  137. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/graphs/dot/utils.py +0 -0
  138. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/graphs/trees.py +0 -0
  139. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/http/__init__.py +0 -0
  140. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/http/asgi.py +0 -0
  141. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/http/collections.py +0 -0
  142. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/http/consts.py +0 -0
  143. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/http/cookies.py +0 -0
  144. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/http/dates.py +0 -0
  145. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/http/encodings.py +0 -0
  146. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/http/json.py +0 -0
  147. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/http/sessions.py +0 -0
  148. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/http/wsgi.py +0 -0
  149. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/__init__.py +0 -0
  150. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/binder.py +0 -0
  151. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/bindings.py +0 -0
  152. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/eagers.py +0 -0
  153. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/elements.py +0 -0
  154. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/exceptions.py +0 -0
  155. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/__init__.py +0 -0
  156. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/bindings.py +0 -0
  157. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/elements.py +0 -0
  158. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/injector.py +0 -0
  159. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/inspect.py +0 -0
  160. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/multis.py +0 -0
  161. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/origins.py +0 -0
  162. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/privates.py +0 -0
  163. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/providers.py +0 -0
  164. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/proxy.py +0 -0
  165. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/impl/scopes.py +0 -0
  166. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/injector.py +0 -0
  167. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/inspect.py +0 -0
  168. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/keys.py +0 -0
  169. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/listeners.py +0 -0
  170. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/managed.py +0 -0
  171. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/multis.py +0 -0
  172. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/origins.py +0 -0
  173. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/overrides.py +0 -0
  174. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/privates.py +0 -0
  175. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/providers.py +0 -0
  176. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/scopes.py +0 -0
  177. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/types.py +0 -0
  178. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/inject/utils.py +0 -0
  179. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/iterators.py +0 -0
  180. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/classes/__init__.py +0 -0
  181. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/classes/abstract.py +0 -0
  182. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/classes/restrict.py +0 -0
  183. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/classes/virtual.py +0 -0
  184. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/clsdct.py +0 -0
  185. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/cmp.py +0 -0
  186. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/contextmanagers.py +0 -0
  187. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/datetimes.py +0 -0
  188. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/descriptors.py +0 -0
  189. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/exceptions.py +0 -0
  190. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/functions.py +0 -0
  191. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/imports.py +0 -0
  192. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/iterables.py +0 -0
  193. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/maybes.py +0 -0
  194. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/objects.py +0 -0
  195. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/resolving.py +0 -0
  196. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/resources.py +0 -0
  197. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/strings.py +0 -0
  198. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/sys.py +0 -0
  199. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/timeouts.py +0 -0
  200. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lang/typing.py +0 -0
  201. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/libc.py +0 -0
  202. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lifecycles/__init__.py +0 -0
  203. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lifecycles/abstract.py +0 -0
  204. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lifecycles/base.py +0 -0
  205. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lifecycles/contextmanagers.py +0 -0
  206. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lifecycles/controller.py +0 -0
  207. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lifecycles/manager.py +0 -0
  208. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lifecycles/states.py +0 -0
  209. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lifecycles/transitions.py +0 -0
  210. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/__init__.py +0 -0
  211. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/cached.py +0 -0
  212. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/check.py +0 -0
  213. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/contextmanagers.py +0 -0
  214. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/json.py +0 -0
  215. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/logs.py +0 -0
  216. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/marshal.py +0 -0
  217. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/reflect.py +0 -0
  218. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/runtime.py +0 -0
  219. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/secrets.py +0 -0
  220. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/strings.py +0 -0
  221. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/lite/subprocesses.py +0 -0
  222. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/logs/__init__.py +0 -0
  223. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/logs/_abc.py +0 -0
  224. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/logs/configs.py +0 -0
  225. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/logs/formatters.py +0 -0
  226. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/logs/handlers.py +0 -0
  227. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/logs/noisy.py +0 -0
  228. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/logs/utils.py +0 -0
  229. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/any.py +0 -0
  230. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/base64.py +0 -0
  231. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/datetimes.py +0 -0
  232. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/enums.py +0 -0
  233. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/exceptions.py +0 -0
  234. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/factories.py +0 -0
  235. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/forbidden.py +0 -0
  236. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/global_.py +0 -0
  237. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/helpers.py +0 -0
  238. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/iterables.py +0 -0
  239. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/mappings.py +0 -0
  240. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/naming.py +0 -0
  241. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/numbers.py +0 -0
  242. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/optionals.py +0 -0
  243. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/polymorphism.py +0 -0
  244. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/primitives.py +0 -0
  245. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/registries.py +0 -0
  246. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/standard.py +0 -0
  247. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/utils.py +0 -0
  248. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/uuids.py +0 -0
  249. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/marshal/values.py +0 -0
  250. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/matchfns.py +0 -0
  251. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/math/__init__.py +0 -0
  252. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/math/bits.py +0 -0
  253. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/math/floats.py +0 -0
  254. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/math/stats.py +0 -0
  255. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/multiprocessing.py +0 -0
  256. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/os.py +0 -0
  257. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/reflect/__init__.py +0 -0
  258. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/reflect/isinstance.py +0 -0
  259. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/reflect/ops.py +0 -0
  260. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/reflect/subst.py +0 -0
  261. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/reflect/types.py +0 -0
  262. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/runmodule.py +0 -0
  263. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/secrets/__init__.py +0 -0
  264. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/secrets/crypto.py +0 -0
  265. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/secrets/openssl.py +0 -0
  266. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/secrets/passwords.py +0 -0
  267. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/secrets/secrets.py +0 -0
  268. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/secrets/subprocesses.py +0 -0
  269. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/__init__.py +0 -0
  270. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/__init__.py +0 -0
  271. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/keywords/__init__.py +0 -0
  272. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/keywords/base.py +0 -0
  273. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/keywords/core.py +0 -0
  274. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/keywords/metadata.py +0 -0
  275. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/keywords/parse.py +0 -0
  276. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/keywords/render.py +0 -0
  277. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/keywords/validation.py +0 -0
  278. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/__init__.py +0 -0
  279. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/__init__.py +0 -0
  280. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/metaschema.json +0 -0
  281. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/__init__.py +0 -0
  282. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/applicator.json +0 -0
  283. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/content.json +0 -0
  284. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/core.json +0 -0
  285. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format-annotation.json +0 -0
  286. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format-assertion.json +0 -0
  287. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format.json +0 -0
  288. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/meta-data.json +0 -0
  289. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/unevaluated.json +0 -0
  290. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/validation.json +0 -0
  291. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/specs/jsonschema/types.py +0 -0
  292. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sql/__init__.py +0 -0
  293. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sql/_abc.py +0 -0
  294. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sql/alchemy/__init__.py +0 -0
  295. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sql/alchemy/asyncs.py +0 -0
  296. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sql/alchemy/duckdb.py +0 -0
  297. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sql/alchemy/exprs.py +0 -0
  298. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sql/alchemy/secrets.py +0 -0
  299. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sql/alchemy/sqlean.py +0 -0
  300. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sql/dbs.py +0 -0
  301. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sql/qualifiedname.py +0 -0
  302. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/sync.py +0 -0
  303. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/term.py +0 -0
  304. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/__init__.py +0 -0
  305. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/__init__.py +0 -0
  306. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/helpers.py +0 -0
  307. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/inject/__init__.py +0 -0
  308. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/inject/harness.py +0 -0
  309. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/marks.py +0 -0
  310. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/__init__.py +0 -0
  311. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/_registry.py +0 -0
  312. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/asyncs.py +0 -0
  313. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/depskip.py +0 -0
  314. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/logging.py +0 -0
  315. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/managermarks.py +0 -0
  316. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/pydevd.py +0 -0
  317. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/repeat.py +0 -0
  318. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/skips.py +0 -0
  319. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/spacing.py +0 -0
  320. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/switches.py +0 -0
  321. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/pytest/plugins/utils.py +0 -0
  322. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/testing/testing.py +0 -0
  323. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/text/__init__.py +0 -0
  324. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/text/asdl.py +0 -0
  325. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/text/delimit.py +0 -0
  326. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/text/glyphsplit.py +0 -0
  327. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/text/indent.py +0 -0
  328. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish/text/parts.py +0 -0
  329. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish.egg-info/dependency_links.txt +0 -0
  330. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish.egg-info/entry_points.txt +0 -0
  331. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish.egg-info/requires.txt +0 -0
  332. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/omlish.egg-info/top_level.txt +0 -0
  333. {omlish-0.0.0.dev33 → omlish-0.0.0.dev35}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev33
3
+ Version: 0.0.0.dev35
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev33'
2
- __revision__ = 'd7a0b08ef5d46a2402c157972b3b25f71ed628ca-dirty'
1
+ __version__ = '0.0.0.dev35'
2
+ __revision__ = '09ecafb4e40514a369e0a2cf2cfe90c5c317b186-dirty'
3
3
 
4
4
 
5
5
  #
@@ -4,7 +4,7 @@ from .base import Bootstrap
4
4
  from .harness import BOOTSTRAP_TYPES_BY_NAME
5
5
 
6
6
 
7
- @lang.cached_function
7
+ @lang.static_init
8
8
  def _install_standard_marshalling() -> None:
9
9
  cfgs_poly = msh.Polymorphism(
10
10
  Bootstrap.Config,
@@ -13,6 +13,3 @@ def _install_standard_marshalling() -> None:
13
13
 
14
14
  msh.STANDARD_MARSHALER_FACTORIES[0:0] = [msh.PolymorphismMarshalerFactory(cfgs_poly)]
15
15
  msh.STANDARD_UNMARSHALER_FACTORIES[0:0] = [msh.PolymorphismUnmarshalerFactory(cfgs_poly)]
16
-
17
-
18
- _install_standard_marshalling()
@@ -33,7 +33,7 @@ def field( # noqa
33
33
  derive: ta.Callable[..., ta.Any] | None = None,
34
34
  coerce: bool | ta.Callable[[ta.Any], ta.Any] | None = None,
35
35
  validate: ta.Callable[[ta.Any], bool] | None = None,
36
- check_type: bool | None = None,
36
+ check_type: bool | type | None = None,
37
37
  override: bool = False,
38
38
  repr_fn: ta.Callable[[ta.Any], str | None] | None = None,
39
39
  frozen: bool | None = None,
@@ -193,7 +193,14 @@ def field_init(
193
193
 
194
194
  if fx.check_type:
195
195
  cn = f'__dataclass_check_type__{f.name}__'
196
- locals[cn] = f.type
196
+ if isinstance(fx.check_type, type):
197
+ ct = fx.check_type
198
+ # FIXME:
199
+ # elif info.params_extras.generic_init:
200
+ # ct = info.generic_replaced_field_annotations[f.name]
201
+ else:
202
+ ct = f.type
203
+ locals[cn] = ct
197
204
  lines.append(
198
205
  f'if not __dataclass_builtins_isinstance__({value}, {cn}): '
199
206
  f'raise __dataclass_builtins_TypeError__({value}, {cn})',
@@ -45,7 +45,7 @@ class FieldExtras(lang.Final):
45
45
  derive: ta.Callable[..., ta.Any] | None = None # TODO
46
46
  coerce: bool | ta.Callable[[ta.Any], ta.Any] | None = None
47
47
  validate: ta.Callable[[ta.Any], bool] | None = None
48
- check_type: bool | None = None
48
+ check_type: bool | type | None = None
49
49
  override: bool = False
50
50
  repr_fn: ta.Callable[[ta.Any], str | None] | None = None
51
51
  frozen: bool | None = None # TODO
@@ -1,6 +1,7 @@
1
1
  from .cached import ( # noqa
2
2
  cached_function,
3
3
  cached_property,
4
+ static_init,
4
5
  )
5
6
 
6
7
  from .classes import ( # noqa
@@ -17,6 +17,7 @@ from .descriptors import unwrap_func_with_partials
17
17
 
18
18
  P = ta.ParamSpec('P')
19
19
  T = ta.TypeVar('T')
20
+ CallableT = ta.TypeVar('CallableT', bound=ta.Callable)
20
21
 
21
22
  _IGNORE = object()
22
23
 
@@ -217,6 +218,12 @@ def cached_function(fn=None, **kwargs): # noqa
217
218
  return _CachedFunctionDescriptor(fn, scope, opts=opts)
218
219
 
219
220
 
221
+ def static_init(fn: CallableT) -> CallableT:
222
+ fn = cached_function(fn)
223
+ fn()
224
+ return fn
225
+
226
+
220
227
  ##
221
228
 
222
229
 
@@ -68,6 +68,9 @@ class _MarkerMeta(abc.ABCMeta):
68
68
  class Marker(NotInstantiable, metaclass=_MarkerMeta):
69
69
  """A marker."""
70
70
 
71
+ def __bool__(self):
72
+ raise TypeError
73
+
71
74
 
72
75
  ##
73
76
 
@@ -88,6 +88,14 @@ from .standard import ( # noqa
88
88
  new_standard_unmarshaler_factory,
89
89
  )
90
90
 
91
+ from .unions import ( # noqa
92
+ PRIMITIVE_UNION_TYPES,
93
+ PrimitiveUnionMarshaler,
94
+ PrimitiveUnionMarshalerFactory,
95
+ PrimitiveUnionUnmarshaler,
96
+ PrimitiveUnionUnmarshalerFactory,
97
+ )
98
+
91
99
  from .values import ( # noqa
92
100
  Value,
93
101
  )
@@ -1,10 +1,11 @@
1
1
  """
2
2
  TODO:
3
- - mappings
4
3
  - redacted
5
4
  - strongly typed MarshalerFactory base class?
6
5
  - strongly typed Composite/Cached Marshaler/Unmarshaler factories - footgun
7
6
  - streaming? Start/EndObject, etc..
7
+ - lang.Marker - class name, handle type[Foo]
8
+ - can't disambiguate from str - can't coexist in bare union
8
9
 
9
10
  See:
10
11
  - https://github.com/python-attrs/cattrs
@@ -67,6 +67,7 @@ def get_field_infos(
67
67
  kw.update(
68
68
  metadata=fmd,
69
69
  omit_if=fmd.omit_if,
70
+ default=fmd.default,
70
71
  )
71
72
 
72
73
  if fmd.name is not None:
@@ -98,11 +99,14 @@ class DataclassMarshalerFactory(MarshalerFactory):
98
99
  def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
99
100
  ty = check.isinstance(rty, type)
100
101
  check.state(dc.is_dataclass(ty))
102
+
101
103
  dc_md = get_dataclass_metadata(ty)
104
+
102
105
  fields = [
103
106
  (fi, _make_field_obj(ctx, fi.type, fi.metadata.marshaler, fi.metadata.marshaler_factory))
104
107
  for fi in get_field_infos(ty, ctx.options)
105
108
  ]
109
+
106
110
  return ObjectMarshaler(
107
111
  fields,
108
112
  unknown_field=dc_md.unknown_field,
@@ -119,16 +123,23 @@ class DataclassUnmarshalerFactory(UnmarshalerFactory):
119
123
  def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
120
124
  ty = check.isinstance(rty, type)
121
125
  check.state(dc.is_dataclass(ty))
126
+
122
127
  dc_md = get_dataclass_metadata(ty)
128
+
123
129
  d: dict[str, tuple[FieldInfo, Unmarshaler]] = {}
130
+ defaults: dict[str, ta.Any] = {}
124
131
  for fi in get_field_infos(ty, ctx.options):
125
132
  tup = (fi, _make_field_obj(ctx, fi.type, fi.metadata.unmarshaler, fi.metadata.unmarshaler_factory))
126
133
  for un in fi.unmarshal_names:
127
134
  if un in d:
128
135
  raise KeyError(f'Duplicate fields for name {un!r}: {fi.name!r}, {d[un][0].name!r}')
129
136
  d[un] = tup
137
+ if fi.default.present:
138
+ defaults[fi.name] = fi.default.must()
139
+
130
140
  return ObjectUnmarshaler(
131
141
  ty,
132
142
  d,
133
143
  unknown_field=dc_md.unknown_field,
144
+ defaults=defaults,
134
145
  )
@@ -1,3 +1,7 @@
1
+ """
2
+ TODO:
3
+ - option to coordinate with objects and omit if empty / render unboxed
4
+ """
1
5
  import dataclasses as dc
2
6
  import typing as ta
3
7
 
@@ -3,12 +3,16 @@ TODO:
3
3
  - cfg naming
4
4
  - adapters for dataclasses / namedtuples / user objects (as confitured)
5
5
  - mro-merge ObjectMetadata
6
+ - key ordering override - like slice, -1 means last
7
+ - dedupe omit_if/default fields on Metadata/Info - FieldOptions prob
8
+ - impl merge, update helpers:update_fields_metadata
6
9
  """
7
10
  import collections.abc
8
11
  import typing as ta
9
12
 
10
13
  from .. import check
11
14
  from .. import dataclasses as dc
15
+ from .. import lang
12
16
  from .. import reflect as rfl
13
17
  from .base import MarshalContext
14
18
  from .base import Marshaler
@@ -29,6 +33,7 @@ class FieldMetadata:
29
33
  alts: ta.Iterable[str] | None = None
30
34
 
31
35
  omit_if: ta.Callable[[ta.Any], bool] | None = None
36
+ default: lang.Maybe[ta.Any] = dc.xfield(lang.empty(), check_type=lang.Maybe)
32
37
 
33
38
  marshaler: Marshaler | None = None
34
39
  marshaler_factory: MarshalerFactory | None = None
@@ -60,6 +65,7 @@ class FieldInfo:
60
65
  metadata: FieldMetadata = FieldMetadata()
61
66
 
62
67
  omit_if: ta.Callable[[ta.Any], bool] | None = None
68
+ default: lang.Maybe[ta.Any] = lang.empty()
63
69
 
64
70
 
65
71
  ##
@@ -68,6 +74,9 @@ class FieldInfo:
68
74
  @dc.dataclass(frozen=True)
69
75
  class ObjectMarshaler(Marshaler):
70
76
  fields: ta.Sequence[tuple[FieldInfo, Marshaler]]
77
+
78
+ _: dc.KW_ONLY
79
+
71
80
  unknown_field: str | None = None
72
81
 
73
82
  def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
@@ -91,6 +100,9 @@ class ObjectMarshaler(Marshaler):
91
100
  @dc.dataclass(frozen=True)
92
101
  class SimpleObjectMarshalerFactory(MarshalerFactory):
93
102
  dct: ta.Mapping[type, ta.Sequence[FieldInfo]]
103
+
104
+ _: dc.KW_ONLY
105
+
94
106
  unknown_field: str | None = None
95
107
 
96
108
  def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
@@ -98,11 +110,14 @@ class SimpleObjectMarshalerFactory(MarshalerFactory):
98
110
 
99
111
  def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
100
112
  ty = check.isinstance(rty, type)
113
+
101
114
  flds = self.dct[ty]
115
+
102
116
  fields = [
103
117
  (fi, ctx.make(fi.type))
104
118
  for fi in flds
105
119
  ]
120
+
106
121
  return ObjectMarshaler(
107
122
  fields,
108
123
  unknown_field=self.unknown_field,
@@ -116,10 +131,15 @@ class SimpleObjectMarshalerFactory(MarshalerFactory):
116
131
  class ObjectUnmarshaler(Unmarshaler):
117
132
  cls: type
118
133
  fields_by_unmarshal_name: ta.Mapping[str, tuple[FieldInfo, Unmarshaler]]
134
+
135
+ _: dc.KW_ONLY
136
+
119
137
  unknown_field: str | None = None
138
+ defaults: ta.Mapping[str, ta.Any] | None = None
120
139
 
121
140
  def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
122
141
  ma = check.isinstance(v, collections.abc.Mapping)
142
+
123
143
  u: ta.Any
124
144
  kw: dict[str, ta.Any] = {}
125
145
  ukf: dict[str, ta.Any] | None = None
@@ -144,12 +164,19 @@ class ObjectUnmarshaler(Unmarshaler):
144
164
 
145
165
  kw[fi.name] = u.unmarshal(ctx, mv)
146
166
 
167
+ if self.defaults:
168
+ for dk, dv in self.defaults.items():
169
+ kw.setdefault(dk, dv)
170
+
147
171
  return self.cls(**kw)
148
172
 
149
173
 
150
174
  @dc.dataclass(frozen=True)
151
175
  class SimpleObjectUnmarshalerFactory(UnmarshalerFactory):
152
176
  dct: ta.Mapping[type, ta.Sequence[FieldInfo]]
177
+
178
+ _: dc.KW_ONLY
179
+
153
180
  unknown_field: str | None = None
154
181
 
155
182
  def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
@@ -157,14 +184,24 @@ class SimpleObjectUnmarshalerFactory(UnmarshalerFactory):
157
184
 
158
185
  def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
159
186
  ty = check.isinstance(rty, type)
187
+
160
188
  flds = self.dct[ty]
189
+
161
190
  fields_by_unmarshal_name = {
162
191
  n: (fi, ctx.make(fi.type))
163
192
  for fi in flds
164
193
  for n in fi.unmarshal_names
165
194
  }
195
+
196
+ defaults = {
197
+ fi.name: fi.default.must()
198
+ for fi in flds
199
+ if fi.default.present
200
+ }
201
+
166
202
  return ObjectUnmarshaler(
167
203
  ty,
168
204
  fields_by_unmarshal_name,
169
205
  unknown_field=self.unknown_field,
206
+ defaults=defaults,
170
207
  )
@@ -56,7 +56,9 @@ class PrimitiveUnionMarshaler(Marshaler):
56
56
  tys: ta.Sequence[type]
57
57
 
58
58
  def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
59
- raise NotImplementedError
59
+ if type(o) not in self.tys:
60
+ raise TypeError(o)
61
+ return o
60
62
 
61
63
 
62
64
  @dc.dataclass(frozen=True)
@@ -79,7 +81,9 @@ class PrimitiveUnionUnmarshaler(Unmarshaler):
79
81
  tys: ta.Sequence[type]
80
82
 
81
83
  def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
82
- raise NotImplementedError
84
+ if type(v) not in self.tys:
85
+ raise TypeError(v)
86
+ return v
83
87
 
84
88
 
85
89
  @dc.dataclass(frozen=True)
@@ -50,7 +50,7 @@ def marshal_secret_field(f: dc.Field) -> dc.Field:
50
50
  })
51
51
 
52
52
 
53
- @lang.cached_function
53
+ @lang.static_init
54
54
  def _install_standard_marshalling() -> None:
55
55
  msh.STANDARD_MARSHALER_FACTORIES[0:0] = [
56
56
  msh.ForbiddenTypeMarshalerFactory({Secret}),
@@ -65,6 +65,3 @@ def _install_standard_marshalling() -> None:
65
65
  rfl.type_(SecretRefOrStr): StrOrSecretRefMarshalerUnmarshaler(),
66
66
  }),
67
67
  ]
68
-
69
-
70
- _install_standard_marshalling()
@@ -0,0 +1,28 @@
1
+ from .errors import ( # noqa
2
+ CUSTOM_ERROR_BASE,
3
+ KnownError,
4
+ KnownErrors,
5
+ )
6
+
7
+ from .types import ( # noqa
8
+ Error,
9
+ Id,
10
+ NotSpecified,
11
+ Number,
12
+ Object,
13
+ Request,
14
+ Response,
15
+ VERSION,
16
+ error,
17
+ notification,
18
+ request,
19
+ result,
20
+ )
21
+
22
+
23
+ ##
24
+
25
+
26
+ from ...lang.imports import _register_conditional_import # noqa
27
+
28
+ _register_conditional_import('...marshal', '.marshal', __package__)
@@ -0,0 +1,20 @@
1
+ from ... import dataclasses as dc
2
+ from ... import lang
3
+
4
+
5
+ @dc.dataclass(frozen=True)
6
+ class KnownError:
7
+ code: int
8
+ message: str
9
+ meaning: str
10
+
11
+
12
+ class KnownErrors(lang.Namespace):
13
+ PARSE_ERROR = KnownError(-32700, 'Parse error', 'Invalid JSON was received by the server.')
14
+ INVALID_REQUEST = KnownError(-32600, 'Invalid Request', 'The JSON sent is not a valid Request object.')
15
+ METHOD_NOT_FOUND = KnownError(-32601, 'Method not found', 'The method does not exist / is not available.')
16
+ INVALID_PARAMS = KnownError(-32602, 'Invalid params', 'Invalid method parameter(s).')
17
+ INTERNAL_ERROR = KnownError(-32603, 'Internal error', 'Internal JSON-RPC error.')
18
+
19
+
20
+ CUSTOM_ERROR_BASE = -32000
@@ -0,0 +1,59 @@
1
+ import typing as ta
2
+
3
+ from ... import check
4
+ from ... import dataclasses as dc
5
+ from ... import lang
6
+ from ... import marshal as msh
7
+ from ... import matchfns as mfs
8
+ from ... import reflect as rfl
9
+ from .types import NotSpecified
10
+
11
+
12
+ _NOT_SPECIFIED_RTY = rfl.type_(type[NotSpecified])
13
+
14
+
15
+ @dc.dataclass(frozen=True)
16
+ class NotSpecifiedUnionMarshaler(msh.Marshaler):
17
+ m: msh.Marshaler
18
+
19
+ def marshal(self, ctx: msh.MarshalContext, o: ta.Any) -> msh.Value:
20
+ if o is NotSpecified:
21
+ raise TypeError(o)
22
+ return self.m.marshal(ctx, o)
23
+
24
+
25
+ class NotSpecifiedUnionMarshalerFactory(msh.MarshalerFactoryMatchClass):
26
+ @mfs.simple(lambda _, ctx, rty: (
27
+ isinstance(rty, rfl.Union) and
28
+ not rty.is_optional and
29
+ _NOT_SPECIFIED_RTY in rty.args
30
+ ))
31
+ def _build(self, ctx: msh.MarshalContext, rty: rfl.Type) -> msh.Marshaler:
32
+ args = set(check.isinstance(rty, rfl.Union).args) - {_NOT_SPECIFIED_RTY}
33
+ nty = rfl.type_(ta.Union[*args])
34
+ m = ctx.make(nty)
35
+ return NotSpecifiedUnionMarshaler(m)
36
+
37
+
38
+ class NotSpecifiedUnionUnmarshalerFactory(msh.UnmarshalerFactoryMatchClass):
39
+ @mfs.simple(lambda _, ctx, rty: (
40
+ isinstance(rty, rfl.Union) and
41
+ not rty.is_optional and
42
+ _NOT_SPECIFIED_RTY in rty.args
43
+ ))
44
+ def _build(self, ctx: msh.UnmarshalContext, rty: rfl.Type) -> msh.Unmarshaler:
45
+ args = set(check.isinstance(rty, rfl.Union).args) - {_NOT_SPECIFIED_RTY}
46
+ nty = rfl.type_(ta.Union[*args])
47
+ return ctx.make(nty)
48
+
49
+
50
+ @lang.static_init
51
+ def _install_standard_marshalling() -> None:
52
+ msh.STANDARD_MARSHALER_FACTORIES[0:0] = [
53
+ msh.ForbiddenTypeMarshalerFactory({_NOT_SPECIFIED_RTY}),
54
+ NotSpecifiedUnionMarshalerFactory(),
55
+ ]
56
+ msh.STANDARD_UNMARSHALER_FACTORIES[0:0] = [
57
+ msh.ForbiddenTypeUnmarshalerFactory({_NOT_SPECIFIED_RTY}),
58
+ NotSpecifiedUnionUnmarshalerFactory(),
59
+ ]
@@ -0,0 +1,93 @@
1
+ """
2
+ https://www.jsonrpc.org/specification
3
+
4
+ TODO:
5
+ - drop NotSpecified, use lang.Maybe, make marshal do that
6
+ - server/client impl
7
+
8
+ See:
9
+ - https://github.com/python-lsp/python-lsp-jsonrpc
10
+ """
11
+ import operator
12
+ import typing as ta
13
+
14
+ from ... import dataclasses as dc
15
+ from ... import lang
16
+ from ... import marshal as msh
17
+
18
+
19
+ Number: ta.TypeAlias = int | float
20
+ Object: ta.TypeAlias = ta.Mapping[str, ta.Any]
21
+ Id: ta.TypeAlias = str | Number | None
22
+
23
+
24
+ ##
25
+
26
+
27
+ VERSION = '2.0'
28
+
29
+
30
+ class NotSpecified(lang.Marker):
31
+ pass
32
+
33
+
34
+ def is_not_specified(v: ta.Any) -> bool:
35
+ return v is NotSpecified
36
+
37
+
38
+ ##
39
+
40
+
41
+ @dc.dataclass(frozen=True)
42
+ @msh.update_fields_metadata(['id'], omit_if=is_not_specified, default=lang.just(NotSpecified))
43
+ @msh.update_fields_metadata(['params'], omit_if=operator.not_)
44
+ class Request(lang.Final):
45
+ id: Id | type[NotSpecified]
46
+ method: str
47
+ params: Object | None = None
48
+
49
+ jsonrpc: str = dc.field(default=VERSION, kw_only=True)
50
+ dc.validate(lambda self: self.jsonrpc == VERSION)
51
+
52
+
53
+ def request(id: Id, method: str, params: Object | None = None) -> Request: # noqa
54
+ return Request(id, method, params)
55
+
56
+
57
+ def notification(method: str, params: Object | None = None) -> Request:
58
+ return Request(NotSpecified, method, params)
59
+
60
+
61
+ ##
62
+
63
+
64
+ @dc.dataclass(frozen=True)
65
+ @msh.update_fields_metadata(['result', 'error'], omit_if=is_not_specified)
66
+ class Response(lang.Final):
67
+ id: Id
68
+ dc.validate(lambda self: self.id is not NotSpecified)
69
+
70
+ _: dc.KW_ONLY
71
+
72
+ result: ta.Any = dc.field(default=NotSpecified)
73
+ error: ta.Union['Error', type[NotSpecified]] = dc.field(default=NotSpecified)
74
+ dc.validate(lambda self: is_not_specified(self.result) ^ is_not_specified(self.error))
75
+
76
+ jsonrpc: str = dc.field(default=VERSION)
77
+ dc.validate(lambda self: self.jsonrpc == VERSION)
78
+
79
+
80
+ def result(id: Id, result: ta.Any) -> Response: # noqa
81
+ return Response(id, result=result)
82
+
83
+
84
+ @dc.dataclass(frozen=True)
85
+ @msh.update_fields_metadata(['data'], omit_if=is_not_specified)
86
+ class Error(lang.Final):
87
+ code: int
88
+ message: str
89
+ data: ta.Any = NotSpecified
90
+
91
+
92
+ def error(id: Id, error: Error) -> Response: # noqa
93
+ return Response(id, error=error)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev33
3
+ Version: 0.0.0.dev35
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -268,6 +268,10 @@ omlish/secrets/passwords.py
268
268
  omlish/secrets/secrets.py
269
269
  omlish/secrets/subprocesses.py
270
270
  omlish/specs/__init__.py
271
+ omlish/specs/jsonrpc/__init__.py
272
+ omlish/specs/jsonrpc/errors.py
273
+ omlish/specs/jsonrpc/marshal.py
274
+ omlish/specs/jsonrpc/types.py
271
275
  omlish/specs/jsonschema/__init__.py
272
276
  omlish/specs/jsonschema/types.py
273
277
  omlish/specs/jsonschema/keywords/__init__.py
@@ -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.dev33'
15
+ version = '0.0.0.dev35'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
File without changes
File without changes
File without changes
File without changes