omlish 0.0.0.dev41__tar.gz → 0.0.0.dev43__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 (342) hide show
  1. {omlish-0.0.0.dev41/omlish.egg-info → omlish-0.0.0.dev43}/PKG-INFO +1 -1
  2. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/__about__.py +2 -2
  3. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/__init__.py +1 -0
  4. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/__init__.py +1 -0
  5. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/utils.py +4 -0
  6. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/__init__.py +1 -0
  7. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/dataclasses.py +68 -15
  8. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/helpers.py +2 -8
  9. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/objects.py +58 -15
  10. omlish-0.0.0.dev43/omlish/specs/openapi/__init__.py +5 -0
  11. omlish-0.0.0.dev43/omlish/specs/openapi/marshal.py +63 -0
  12. omlish-0.0.0.dev43/omlish/specs/openapi/openapi.py +443 -0
  13. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43/omlish.egg-info}/PKG-INFO +1 -1
  14. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish.egg-info/SOURCES.txt +3 -0
  15. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/pyproject.toml +1 -1
  16. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/LICENSE +0 -0
  17. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/MANIFEST.in +0 -0
  18. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/README.rst +0 -0
  19. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/.manifests.json +0 -0
  20. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/__init__.py +0 -0
  21. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/argparse.py +0 -0
  22. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/asyncs/__init__.py +0 -0
  23. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/asyncs/anyio.py +0 -0
  24. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/asyncs/asyncio.py +0 -0
  25. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/asyncs/asyncs.py +0 -0
  26. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/asyncs/bridge.py +0 -0
  27. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/asyncs/flavors.py +0 -0
  28. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/asyncs/trio.py +0 -0
  29. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/asyncs/trio_asyncio.py +0 -0
  30. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/bootstrap/__init__.py +0 -0
  31. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/bootstrap/__main__.py +0 -0
  32. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/bootstrap/base.py +0 -0
  33. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/bootstrap/diag.py +0 -0
  34. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/bootstrap/harness.py +0 -0
  35. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/bootstrap/main.py +0 -0
  36. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/bootstrap/marshal.py +0 -0
  37. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/bootstrap/sys.py +0 -0
  38. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/c3.py +0 -0
  39. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/cached.py +0 -0
  40. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/check.py +0 -0
  41. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/__init__.py +0 -0
  42. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/_abc.py +0 -0
  43. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/_io_abc.py +0 -0
  44. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/cache/__init__.py +0 -0
  45. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/cache/descriptor.py +0 -0
  46. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/cache/impl.py +0 -0
  47. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/cache/types.py +0 -0
  48. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/coerce.py +0 -0
  49. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/exceptions.py +0 -0
  50. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/frozen.py +0 -0
  51. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/identity.py +0 -0
  52. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/indexed.py +0 -0
  53. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/mappings.py +0 -0
  54. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/ordered.py +0 -0
  55. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/persistent.py +0 -0
  56. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/skiplist.py +0 -0
  57. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/sorted.py +0 -0
  58. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/treap.py +0 -0
  59. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/treapmap.py +0 -0
  60. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/unmodifiable.py +0 -0
  61. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/collections/utils.py +0 -0
  62. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/concurrent/__init__.py +0 -0
  63. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/concurrent/executors.py +0 -0
  64. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/concurrent/futures.py +0 -0
  65. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/concurrent/threadlets.py +0 -0
  66. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/configs/__init__.py +0 -0
  67. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/configs/classes.py +0 -0
  68. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/configs/flattening.py +0 -0
  69. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/configs/strings.py +0 -0
  70. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/LICENSE +0 -0
  71. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/api.py +0 -0
  72. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/as_.py +0 -0
  73. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/copy.py +0 -0
  74. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/descriptors.py +0 -0
  75. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/exceptions.py +0 -0
  76. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/fields.py +0 -0
  77. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/frozen.py +0 -0
  78. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/hashing.py +0 -0
  79. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/init.py +0 -0
  80. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/internals.py +0 -0
  81. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/main.py +0 -0
  82. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/metaclass.py +0 -0
  83. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/metadata.py +0 -0
  84. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/order.py +0 -0
  85. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/params.py +0 -0
  86. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/processing.py +0 -0
  87. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/reflect.py +0 -0
  88. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/replace.py +0 -0
  89. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/repr.py +0 -0
  90. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/simple.py +0 -0
  91. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/slots.py +0 -0
  92. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dataclasses/impl/utils.py +0 -0
  93. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/datetimes.py +0 -0
  94. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/defs.py +0 -0
  95. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/__init__.py +0 -0
  96. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/asts.py +0 -0
  97. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/procfs.py +0 -0
  98. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/procstats.py +0 -0
  99. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/ps.py +0 -0
  100. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/pycharm.py +0 -0
  101. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/pydevd.py +0 -0
  102. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/replserver/__init__.py +0 -0
  103. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/replserver/__main__.py +0 -0
  104. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/replserver/console.py +0 -0
  105. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/replserver/server.py +0 -0
  106. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/diag/threads.py +0 -0
  107. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dispatch/__init__.py +0 -0
  108. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dispatch/_dispatch2.py +0 -0
  109. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dispatch/_dispatch3.py +0 -0
  110. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dispatch/dispatch.py +0 -0
  111. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dispatch/functions.py +0 -0
  112. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dispatch/methods.py +0 -0
  113. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/docker/__init__.py +0 -0
  114. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/docker/cli.py +0 -0
  115. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/docker/compose.py +0 -0
  116. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/docker/helpers.py +0 -0
  117. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/docker/hub.py +0 -0
  118. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/docker/manifests.py +0 -0
  119. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/dynamic.py +0 -0
  120. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/fnpairs.py +0 -0
  121. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/fnpipes.py +0 -0
  122. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/formats/__init__.py +0 -0
  123. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/formats/dotenv.py +0 -0
  124. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/formats/json.py +0 -0
  125. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/formats/props.py +0 -0
  126. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/formats/yaml.py +0 -0
  127. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/genmachine.py +0 -0
  128. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/graphs/__init__.py +0 -0
  129. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/graphs/dags.py +0 -0
  130. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/graphs/domination.py +0 -0
  131. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/graphs/dot/__init__.py +0 -0
  132. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/graphs/dot/items.py +0 -0
  133. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/graphs/dot/make.py +0 -0
  134. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/graphs/dot/rendering.py +0 -0
  135. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/graphs/dot/utils.py +0 -0
  136. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/graphs/trees.py +0 -0
  137. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/http/__init__.py +0 -0
  138. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/http/asgi.py +0 -0
  139. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/http/collections.py +0 -0
  140. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/http/consts.py +0 -0
  141. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/http/cookies.py +0 -0
  142. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/http/dates.py +0 -0
  143. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/http/encodings.py +0 -0
  144. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/http/json.py +0 -0
  145. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/http/sessions.py +0 -0
  146. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/http/wsgi.py +0 -0
  147. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/__init__.py +0 -0
  148. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/binder.py +0 -0
  149. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/bindings.py +0 -0
  150. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/eagers.py +0 -0
  151. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/elements.py +0 -0
  152. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/exceptions.py +0 -0
  153. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/__init__.py +0 -0
  154. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/bindings.py +0 -0
  155. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/elements.py +0 -0
  156. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/injector.py +0 -0
  157. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/inspect.py +0 -0
  158. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/multis.py +0 -0
  159. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/origins.py +0 -0
  160. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/privates.py +0 -0
  161. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/providers.py +0 -0
  162. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/proxy.py +0 -0
  163. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/impl/scopes.py +0 -0
  164. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/injector.py +0 -0
  165. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/inspect.py +0 -0
  166. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/keys.py +0 -0
  167. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/listeners.py +0 -0
  168. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/managed.py +0 -0
  169. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/multis.py +0 -0
  170. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/origins.py +0 -0
  171. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/overrides.py +0 -0
  172. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/privates.py +0 -0
  173. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/providers.py +0 -0
  174. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/scopes.py +0 -0
  175. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/types.py +0 -0
  176. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/inject/utils.py +0 -0
  177. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/iterators.py +0 -0
  178. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/__init__.py +0 -0
  179. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/cached.py +0 -0
  180. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/classes/__init__.py +0 -0
  181. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/classes/abstract.py +0 -0
  182. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/classes/restrict.py +0 -0
  183. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/classes/simple.py +0 -0
  184. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/classes/virtual.py +0 -0
  185. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/clsdct.py +0 -0
  186. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/cmp.py +0 -0
  187. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/contextmanagers.py +0 -0
  188. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/datetimes.py +0 -0
  189. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/descriptors.py +0 -0
  190. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/exceptions.py +0 -0
  191. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/functions.py +0 -0
  192. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/imports.py +0 -0
  193. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/iterables.py +0 -0
  194. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/maybes.py +0 -0
  195. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/objects.py +0 -0
  196. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/resolving.py +0 -0
  197. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/resources.py +0 -0
  198. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/strings.py +0 -0
  199. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/sys.py +0 -0
  200. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/timeouts.py +0 -0
  201. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lang/typing.py +0 -0
  202. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/libc.py +0 -0
  203. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lifecycles/__init__.py +0 -0
  204. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lifecycles/abstract.py +0 -0
  205. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lifecycles/base.py +0 -0
  206. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lifecycles/contextmanagers.py +0 -0
  207. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lifecycles/controller.py +0 -0
  208. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lifecycles/manager.py +0 -0
  209. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lifecycles/states.py +0 -0
  210. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lifecycles/transitions.py +0 -0
  211. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/__init__.py +0 -0
  212. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/cached.py +0 -0
  213. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/check.py +0 -0
  214. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/contextmanagers.py +0 -0
  215. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/json.py +0 -0
  216. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/logs.py +0 -0
  217. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/marshal.py +0 -0
  218. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/reflect.py +0 -0
  219. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/runtime.py +0 -0
  220. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/secrets.py +0 -0
  221. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/strings.py +0 -0
  222. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/lite/subprocesses.py +0 -0
  223. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/logs/__init__.py +0 -0
  224. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/logs/_abc.py +0 -0
  225. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/logs/configs.py +0 -0
  226. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/logs/formatters.py +0 -0
  227. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/logs/handlers.py +0 -0
  228. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/logs/noisy.py +0 -0
  229. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/logs/utils.py +0 -0
  230. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/any.py +0 -0
  231. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/base.py +0 -0
  232. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/base64.py +0 -0
  233. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/datetimes.py +0 -0
  234. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/enums.py +0 -0
  235. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/exceptions.py +0 -0
  236. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/factories.py +0 -0
  237. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/forbidden.py +0 -0
  238. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/global_.py +0 -0
  239. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/iterables.py +0 -0
  240. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/mappings.py +0 -0
  241. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/maybes.py +0 -0
  242. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/naming.py +0 -0
  243. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/numbers.py +0 -0
  244. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/optionals.py +0 -0
  245. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/polymorphism.py +0 -0
  246. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/primitives.py +0 -0
  247. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/registries.py +0 -0
  248. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/standard.py +0 -0
  249. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/unions.py +0 -0
  250. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/utils.py +0 -0
  251. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/uuids.py +0 -0
  252. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/marshal/values.py +0 -0
  253. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/matchfns.py +0 -0
  254. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/math/__init__.py +0 -0
  255. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/math/bits.py +0 -0
  256. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/math/floats.py +0 -0
  257. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/math/stats.py +0 -0
  258. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/multiprocessing.py +0 -0
  259. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/os.py +0 -0
  260. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/reflect/__init__.py +0 -0
  261. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/reflect/isinstance.py +0 -0
  262. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/reflect/ops.py +0 -0
  263. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/reflect/subst.py +0 -0
  264. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/reflect/types.py +0 -0
  265. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/runmodule.py +0 -0
  266. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/secrets/__init__.py +0 -0
  267. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/secrets/crypto.py +0 -0
  268. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/secrets/marshal.py +0 -0
  269. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/secrets/openssl.py +0 -0
  270. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/secrets/passwords.py +0 -0
  271. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/secrets/secrets.py +0 -0
  272. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/secrets/subprocesses.py +0 -0
  273. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/__init__.py +0 -0
  274. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonrpc/__init__.py +0 -0
  275. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonrpc/errors.py +0 -0
  276. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonrpc/marshal.py +0 -0
  277. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonrpc/types.py +0 -0
  278. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/__init__.py +0 -0
  279. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/keywords/__init__.py +0 -0
  280. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/keywords/base.py +0 -0
  281. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/keywords/core.py +0 -0
  282. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/keywords/metadata.py +0 -0
  283. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/keywords/parse.py +0 -0
  284. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/keywords/render.py +0 -0
  285. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/keywords/validation.py +0 -0
  286. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/__init__.py +0 -0
  287. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/__init__.py +0 -0
  288. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/metaschema.json +0 -0
  289. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/__init__.py +0 -0
  290. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/applicator.json +0 -0
  291. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/content.json +0 -0
  292. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/core.json +0 -0
  293. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format-annotation.json +0 -0
  294. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format-assertion.json +0 -0
  295. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format.json +0 -0
  296. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/meta-data.json +0 -0
  297. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/unevaluated.json +0 -0
  298. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/validation.json +0 -0
  299. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/specs/jsonschema/types.py +0 -0
  300. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sql/__init__.py +0 -0
  301. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sql/_abc.py +0 -0
  302. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sql/alchemy/__init__.py +0 -0
  303. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sql/alchemy/asyncs.py +0 -0
  304. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sql/alchemy/duckdb.py +0 -0
  305. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sql/alchemy/exprs.py +0 -0
  306. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sql/alchemy/secrets.py +0 -0
  307. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sql/alchemy/sqlean.py +0 -0
  308. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sql/dbs.py +0 -0
  309. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sql/qualifiedname.py +0 -0
  310. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/sync.py +0 -0
  311. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/term.py +0 -0
  312. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/__init__.py +0 -0
  313. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/__init__.py +0 -0
  314. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/helpers.py +0 -0
  315. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/inject/__init__.py +0 -0
  316. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/inject/harness.py +0 -0
  317. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/marks.py +0 -0
  318. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/__init__.py +0 -0
  319. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/_registry.py +0 -0
  320. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/asyncs.py +0 -0
  321. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/depskip.py +0 -0
  322. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/logging.py +0 -0
  323. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/managermarks.py +0 -0
  324. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/pydevd.py +0 -0
  325. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/repeat.py +0 -0
  326. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/skips.py +0 -0
  327. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/spacing.py +0 -0
  328. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/switches.py +0 -0
  329. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/plugins/utils.py +0 -0
  330. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/pytest/skip.py +0 -0
  331. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/testing/testing.py +0 -0
  332. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/text/__init__.py +0 -0
  333. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/text/asdl.py +0 -0
  334. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/text/delimit.py +0 -0
  335. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/text/glyphsplit.py +0 -0
  336. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/text/indent.py +0 -0
  337. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish/text/parts.py +0 -0
  338. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish.egg-info/dependency_links.txt +0 -0
  339. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish.egg-info/entry_points.txt +0 -0
  340. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish.egg-info/requires.txt +0 -0
  341. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/omlish.egg-info/top_level.txt +0 -0
  342. {omlish-0.0.0.dev41 → omlish-0.0.0.dev43}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev41
3
+ Version: 0.0.0.dev43
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev41'
2
- __revision__ = '9666ba3a1c40b95074dfcacd1c0c87ca5e267d6f'
1
+ __version__ = '0.0.0.dev43'
2
+ __revision__ = '00082c22c620ab906955cc479d2d861116e82c45'
3
3
 
4
4
 
5
5
  #
@@ -92,6 +92,7 @@ from .utils import ( # noqa
92
92
  chain_metadata,
93
93
  deep_replace,
94
94
  field_modifier,
95
+ fields_dict,
95
96
  maybe_post_init,
96
97
  opt_repr,
97
98
  update_class_metadata,
@@ -21,4 +21,5 @@ TODO:
21
21
  - proto/jsonschema gen
22
22
  - enums
23
23
  - nodal
24
+ - embedding? forward kwargs in general? or only for replace?
24
25
  """
@@ -36,6 +36,10 @@ def opt_repr(o: ta.Any) -> str | None:
36
36
  #
37
37
 
38
38
 
39
+ def fields_dict(cls_or_instance: ta.Any) -> dict[str, dc.Field]:
40
+ return {f.name: f for f in dc.fields(cls_or_instance)}
41
+
42
+
39
43
  class field_modifier: # noqa
40
44
  def __init__(self, fn: ta.Callable[[dc.Field], dc.Field]) -> None:
41
45
  super().__init__()
@@ -57,6 +57,7 @@ from .helpers import ( # noqa
57
57
  from .objects import ( # noqa
58
58
  FieldInfo,
59
59
  FieldMetadata,
60
+ FieldOptions,
60
61
  ObjectMarshaler,
61
62
  ObjectMetadata,
62
63
  ObjectUnmarshaler,
@@ -13,8 +13,11 @@ from .base import Unmarshaler
13
13
  from .base import UnmarshalerFactory
14
14
  from .naming import Naming
15
15
  from .naming import translate_name
16
+ from .objects import DEFAULT_FIELD_OPTIONS
17
+ from .objects import FIELD_OPTIONS_KWARGS
16
18
  from .objects import FieldInfo
17
19
  from .objects import FieldMetadata
20
+ from .objects import FieldOptions
18
21
  from .objects import ObjectMarshaler
19
22
  from .objects import ObjectMetadata
20
23
  from .objects import ObjectUnmarshaler
@@ -43,6 +46,11 @@ def get_field_infos(
43
46
  for k, v in dc.asdict(dc_md.field_defaults).items()
44
47
  if v is not None
45
48
  }
49
+ fo_defaults = {
50
+ k: v
51
+ for k, v in fi_defaults.pop('options').items()
52
+ if v != getattr(DEFAULT_FIELD_OPTIONS, k)
53
+ }
46
54
 
47
55
  type_hints = ta.get_type_hints(ty)
48
56
 
@@ -53,8 +61,10 @@ def get_field_infos(
53
61
  else:
54
62
  um_name = field.name
55
63
 
56
- kw = dict(fi_defaults)
57
- kw.update(
64
+ fi_kw = dict(fi_defaults)
65
+ fo_kw = dict(fo_defaults)
66
+
67
+ fi_kw.update(
58
68
  name=field.name,
59
69
  type=type_hints[field.name],
60
70
  metadata=FieldMetadata(),
@@ -63,20 +73,35 @@ def get_field_infos(
63
73
  unmarshal_names=[um_name],
64
74
  )
65
75
 
76
+ has_set_name = False
66
77
  if (fmd := field.metadata.get(FieldMetadata)) is not None:
67
- kw.update(
78
+ fi_kw.update(
68
79
  metadata=fmd,
69
- omit_if=fmd.omit_if,
70
- default=fmd.default,
71
80
  )
72
81
 
82
+ for fo_k in FIELD_OPTIONS_KWARGS:
83
+ if (fo_v := getattr(fmd.options, fo_k)) != getattr(DEFAULT_FIELD_OPTIONS, fo_k):
84
+ fo_kw[fo_k] = fo_v
85
+
73
86
  if fmd.name is not None:
74
- kw.update(
87
+ has_set_name = True
88
+ fi_kw.update(
75
89
  marshal_name=fmd.name,
76
90
  unmarshal_names=col.unique([fmd.name, *(fmd.alts or ())]),
77
91
  )
78
92
 
79
- ret.append(FieldInfo(**kw))
93
+ if fo_kw.get('embed') and not has_set_name:
94
+ fi_kw.update(
95
+ marshal_name=fi_kw['marshal_name'] + '_',
96
+ unmarshal_names=[n + '_' for n in fi_kw['unmarshal_names']],
97
+ )
98
+
99
+ ret.append(
100
+ FieldInfo(
101
+ options=FieldOptions(**fo_kw),
102
+ **fi_kw,
103
+ ),
104
+ )
80
105
 
81
106
  return ret
82
107
 
@@ -123,23 +148,51 @@ class DataclassUnmarshalerFactory(UnmarshalerFactory):
123
148
  def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
124
149
  ty = check.isinstance(rty, type)
125
150
  check.state(dc.is_dataclass(ty))
126
-
127
151
  dc_md = get_dataclass_metadata(ty)
128
152
 
129
153
  d: dict[str, tuple[FieldInfo, Unmarshaler]] = {}
130
154
  defaults: dict[str, ta.Any] = {}
155
+ embeds: dict[str, type] = {}
156
+ embeds_by_unmarshal_name: dict[str, tuple[str, str]] = {}
157
+
158
+ def add_field(fi: FieldInfo, *, prefixes: ta.Iterable[str] = ('',)) -> ta.Iterable[str]:
159
+ ret: list[str] = []
160
+
161
+ if fi.options.embed:
162
+ e_ty = check.isinstance(fi.type, type)
163
+ check.state(dc.is_dataclass(e_ty))
164
+ # e_dc_md = get_dataclass_metadata(e_ty)
165
+
166
+ embeds[fi.name] = e_ty
167
+ for e_fi in get_field_infos(e_ty, ctx.options):
168
+ e_ns = add_field(e_fi, prefixes=[p + ep for p in prefixes for ep in fi.unmarshal_names])
169
+ embeds_by_unmarshal_name.update({e_f: (fi.name, e_fi.name) for e_f in e_ns})
170
+ ret.extend(e_ns)
171
+
172
+ else:
173
+ tup = (fi, _make_field_obj(ctx, fi.type, fi.metadata.unmarshaler, fi.metadata.unmarshaler_factory))
174
+
175
+ for pfx in prefixes:
176
+ for un in fi.unmarshal_names:
177
+ un = pfx + un
178
+ if un in d:
179
+ raise KeyError(f'Duplicate fields for name {un!r}: {fi.name!r}, {d[un][0].name!r}')
180
+ d[un] = tup
181
+ ret.append(un)
182
+
183
+ if fi.options.default.present:
184
+ defaults[fi.name] = fi.options.default.must()
185
+
186
+ return ret
187
+
131
188
  for fi in get_field_infos(ty, ctx.options):
132
- tup = (fi, _make_field_obj(ctx, fi.type, fi.metadata.unmarshaler, fi.metadata.unmarshaler_factory))
133
- for un in fi.unmarshal_names:
134
- if un in d:
135
- raise KeyError(f'Duplicate fields for name {un!r}: {fi.name!r}, {d[un][0].name!r}')
136
- d[un] = tup
137
- if fi.default.present:
138
- defaults[fi.name] = fi.default.must()
189
+ add_field(fi)
139
190
 
140
191
  return ObjectUnmarshaler(
141
192
  ty,
142
193
  d,
143
194
  unknown_field=dc_md.unknown_field,
144
195
  defaults=defaults,
196
+ embeds=embeds,
197
+ embeds_by_unmarshal_name=embeds_by_unmarshal_name,
145
198
  )
@@ -12,10 +12,7 @@ def update_field_metadata(**kwargs: ta.Any) -> dc.field_modifier:
12
12
  @dc.field_modifier
13
13
  def inner(f: dc.Field) -> dc.Field:
14
14
  return dc.update_field_metadata(f, {
15
- FieldMetadata: dc.replace(
16
- f.metadata.get(FieldMetadata, FieldMetadata()),
17
- **kwargs,
18
- ),
15
+ FieldMetadata: f.metadata.get(FieldMetadata, FieldMetadata()).update(**kwargs),
19
16
  })
20
17
  return inner
21
18
 
@@ -26,10 +23,7 @@ def update_fields_metadata(
26
23
  ) -> ta.Callable[[type[T]], type[T]]:
27
24
  def inner(a: str, f: dc.Field) -> dc.Field:
28
25
  return dc.update_field_metadata(f, {
29
- FieldMetadata: dc.replace(
30
- f.metadata.get(FieldMetadata, FieldMetadata()),
31
- **kwargs,
32
- ),
26
+ FieldMetadata: f.metadata.get(FieldMetadata, FieldMetadata()).update(**kwargs),
33
27
  })
34
28
 
35
29
  return dc.update_fields(inner, fields)
@@ -1,11 +1,9 @@
1
1
  """
2
2
  TODO:
3
3
  - cfg naming
4
- - adapters for dataclasses / namedtuples / user objects (as confitured)
4
+ - adapters for dataclasses / namedtuples / user objects (as configured)
5
5
  - mro-merge ObjectMetadata
6
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
9
7
  """
10
8
  import collections.abc
11
9
  import typing as ta
@@ -27,13 +25,25 @@ from .values import Value
27
25
  ##
28
26
 
29
27
 
28
+ @dc.dataclass(frozen=True, kw_only=True)
29
+ class FieldOptions:
30
+ omit_if: ta.Callable[[ta.Any], bool] | None = None
31
+
32
+ default: lang.Maybe[ta.Any] = dc.xfield(default=lang.empty(), check_type=lang.Maybe)
33
+
34
+ embed: bool = False
35
+
36
+
37
+ DEFAULT_FIELD_OPTIONS = FieldOptions()
38
+ FIELD_OPTIONS_KWARGS: frozenset[str] = frozenset(dc.fields_dict(FieldOptions).keys())
39
+
40
+
30
41
  @dc.dataclass(frozen=True, kw_only=True)
31
42
  class FieldMetadata:
32
43
  name: str | None = None
33
44
  alts: ta.Iterable[str] | None = None
34
45
 
35
- omit_if: ta.Callable[[ta.Any], bool] | None = None
36
- default: lang.Maybe[ta.Any] = dc.xfield(lang.empty(), check_type=lang.Maybe)
46
+ options: FieldOptions = DEFAULT_FIELD_OPTIONS
37
47
 
38
48
  marshaler: Marshaler | None = None
39
49
  marshaler_factory: MarshalerFactory | None = None
@@ -41,6 +51,15 @@ class FieldMetadata:
41
51
  unmarshaler: Unmarshaler | None = None
42
52
  unmarshaler_factory: UnmarshalerFactory | None = None
43
53
 
54
+ def update(self, **kwargs: ta.Any) -> 'FieldMetadata':
55
+ okw = {k: v for k, v in kwargs.items() if k in FIELD_OPTIONS_KWARGS}
56
+ mkw = {k: v for k, v in kwargs.items() if k not in FIELD_OPTIONS_KWARGS}
57
+ return dc.replace(
58
+ self,
59
+ **(dict(options=dc.replace(self.options, **okw)) if okw else {}),
60
+ **mkw,
61
+ )
62
+
44
63
 
45
64
  @dc.dataclass(frozen=True, kw_only=True)
46
65
  class ObjectMetadata:
@@ -64,8 +83,7 @@ class FieldInfo:
64
83
 
65
84
  metadata: FieldMetadata = FieldMetadata()
66
85
 
67
- omit_if: ta.Callable[[ta.Any], bool] | None = None
68
- default: lang.Maybe[ta.Any] = lang.empty()
86
+ options: FieldOptions = FieldOptions()
69
87
 
70
88
 
71
89
  ##
@@ -80,12 +98,21 @@ class ObjectMarshaler(Marshaler):
80
98
  unknown_field: str | None = None
81
99
 
82
100
  def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
83
- ret = {}
101
+ ret: dict[str, ta.Any] = {}
84
102
  for fi, m in self.fields:
85
103
  v = getattr(o, fi.name)
86
- if fi.omit_if is not None and fi.omit_if(v):
104
+
105
+ if fi.options.omit_if is not None and fi.options.omit_if(v):
87
106
  continue
88
- ret[fi.marshal_name] = m.marshal(ctx, v)
107
+
108
+ mv = m.marshal(ctx, v)
109
+
110
+ if fi.options.embed:
111
+ for ek, ev in check.isinstance(mv, collections.abc.Mapping).items():
112
+ ret[fi.marshal_name + check.non_empty_str(ek)] = ev # type: ignore
113
+
114
+ else:
115
+ ret[fi.marshal_name] = mv
89
116
 
90
117
  if self.unknown_field is not None:
91
118
  if (ukf := getattr(o, self.unknown_field)):
@@ -135,8 +162,12 @@ class ObjectUnmarshaler(Unmarshaler):
135
162
  _: dc.KW_ONLY
136
163
 
137
164
  unknown_field: str | None = None
165
+
138
166
  defaults: ta.Mapping[str, ta.Any] | None = None
139
167
 
168
+ embeds: ta.Mapping[str, type] | None = None
169
+ embeds_by_unmarshal_name: ta.Mapping[str, tuple[str, str]] | None = None
170
+
140
171
  def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
141
172
  ma = check.isinstance(v, collections.abc.Mapping)
142
173
 
@@ -144,6 +175,8 @@ class ObjectUnmarshaler(Unmarshaler):
144
175
  kw: dict[str, ta.Any] = {}
145
176
  ukf: dict[str, ta.Any] | None = None
146
177
 
178
+ ekws: dict[str, dict[str, ta.Any]] = {en: {} for en in self.embeds or ()}
179
+
147
180
  if self.unknown_field is not None:
148
181
  kw[self.unknown_field] = ukf = {}
149
182
 
@@ -159,10 +192,20 @@ class ObjectUnmarshaler(Unmarshaler):
159
192
  continue
160
193
  raise
161
194
 
162
- if fi.name in kw:
163
- raise KeyError(f'Duplicate keys for field {fi.name!r}: {ks!r}')
195
+ if self.embeds_by_unmarshal_name and (en := self.embeds_by_unmarshal_name.get(ks)):
196
+ tkw, tk = ekws[en[0]], en[1]
197
+ else:
198
+ tkw, tk = kw, fi.name
199
+
200
+ if tk in tkw:
201
+ raise KeyError(f'Duplicate keys for field {tk!r}: {ks!r}')
202
+
203
+ tkw[tk] = u.unmarshal(ctx, mv)
164
204
 
165
- kw[fi.name] = u.unmarshal(ctx, mv)
205
+ for em, ecls in self.embeds.items() if self.embeds else ():
206
+ ekw = ekws[em]
207
+ ev = ecls(**ekw)
208
+ kw[em] = ev
166
209
 
167
210
  if self.defaults:
168
211
  for dk, dv in self.defaults.items():
@@ -194,9 +237,9 @@ class SimpleObjectUnmarshalerFactory(UnmarshalerFactory):
194
237
  }
195
238
 
196
239
  defaults = {
197
- fi.name: fi.default.must()
240
+ fi.name: fi.options.default.must()
198
241
  for fi in flds
199
- if fi.default.present
242
+ if fi.options.default.present
200
243
  }
201
244
 
202
245
  return ObjectUnmarshaler(
@@ -0,0 +1,5 @@
1
+ from . import marshal # noqa
2
+
3
+ from .openapi import ( # noqa
4
+ Openapi,
5
+ )
@@ -0,0 +1,63 @@
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 .openapi import Reference
10
+
11
+
12
+ #
13
+
14
+
15
+ def _reference_union_arg(rty: rfl.Type) -> rfl.Type | None:
16
+ if isinstance(rty, rfl.Union) and len(rty.args) == 2 and Reference in rty.args:
17
+ return check.single(a for a in rty.args if a is not Reference)
18
+ else:
19
+ return None
20
+
21
+
22
+ @dc.dataclass(frozen=True)
23
+ class _ReferenceUnionMarshaler(msh.Marshaler):
24
+ m: msh.Marshaler
25
+ r: msh.Marshaler
26
+
27
+ def marshal(self, ctx: msh.MarshalContext, o: ta.Any) -> msh.Value:
28
+ if isinstance(o, Reference):
29
+ return self.r.marshal(ctx, o)
30
+ else:
31
+ return self.m.marshal(ctx, o)
32
+
33
+
34
+ class _ReferenceUnionMarshalerFactory(msh.MarshalerFactoryMatchClass):
35
+ @mfs.simple(lambda _, ctx, rty: _reference_union_arg(rty) is not None)
36
+ def _build(self, ctx: msh.MarshalContext, rty: rfl.Type) -> msh.Marshaler:
37
+ return _ReferenceUnionMarshaler(ctx.make(check.not_none(_reference_union_arg(rty))), ctx.make(Reference))
38
+
39
+
40
+ @dc.dataclass(frozen=True)
41
+ class _ReferenceUnionUnmarshaler(msh.Unmarshaler):
42
+ u: msh.Unmarshaler
43
+ r: msh.Unmarshaler
44
+
45
+ def unmarshal(self, ctx: msh.UnmarshalContext, v: msh.Value) -> ta.Any:
46
+ if not isinstance(v, ta.Mapping):
47
+ raise TypeError(v)
48
+ elif '$ref' in v:
49
+ return self.r.unmarshal(ctx, v)
50
+ else:
51
+ return self.u.unmarshal(ctx, v) # noqa
52
+
53
+
54
+ class _ReferenceUnionUnmarshalerFactory(msh.UnmarshalerFactoryMatchClass):
55
+ @mfs.simple(lambda _, ctx, rty: _reference_union_arg(rty) is not None)
56
+ def _build(self, ctx: msh.UnmarshalContext, rty: rfl.Type) -> msh.Unmarshaler:
57
+ return _ReferenceUnionUnmarshaler(ctx.make(check.not_none(_reference_union_arg(rty))), ctx.make(Reference))
58
+
59
+
60
+ @lang.static_init
61
+ def _install_standard_marshalling() -> None:
62
+ msh.STANDARD_MARSHALER_FACTORIES[0:0] = [_ReferenceUnionMarshalerFactory()]
63
+ msh.STANDARD_UNMARSHALER_FACTORIES[0:0] = [_ReferenceUnionUnmarshalerFactory()]