omlish 0.0.0.dev51__tar.gz → 0.0.0.dev53__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 (354) hide show
  1. {omlish-0.0.0.dev51/omlish.egg-info → omlish-0.0.0.dev53}/PKG-INFO +18 -3
  2. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/.manifests.json +4 -1
  3. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/__about__.py +32 -3
  4. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/bootstrap/sys.py +1 -1
  5. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/__init__.py +9 -5
  6. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/api.py +1 -1
  7. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/fields.py +4 -1
  8. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/params.py +1 -1
  9. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/utils.py +4 -0
  10. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/__init__.py +6 -1
  11. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/base.py +17 -7
  12. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/dataclasses.py +35 -9
  13. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/global_.py +1 -1
  14. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/objects.py +84 -17
  15. omlish-0.0.0.dev53/omlish/marshal/registries.py +86 -0
  16. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/secrets/__init__.py +1 -0
  17. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/secrets/secrets.py +35 -6
  18. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/__main__.py +1 -1
  19. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/inject/harness.py +4 -8
  20. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53/omlish.egg-info}/PKG-INFO +18 -3
  21. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish.egg-info/requires.txt +11 -2
  22. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/pyproject.toml +20 -3
  23. omlish-0.0.0.dev51/omlish/marshal/registries.py +0 -57
  24. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/LICENSE +0 -0
  25. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/MANIFEST.in +0 -0
  26. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/README.rst +0 -0
  27. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/__init__.py +0 -0
  28. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/argparse.py +0 -0
  29. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/asyncs/__init__.py +0 -0
  30. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/asyncs/anyio.py +0 -0
  31. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/asyncs/asyncio.py +0 -0
  32. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/asyncs/asyncs.py +0 -0
  33. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/asyncs/bridge.py +0 -0
  34. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/asyncs/flavors.py +0 -0
  35. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/asyncs/trio.py +0 -0
  36. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/asyncs/trio_asyncio.py +0 -0
  37. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/bootstrap/__init__.py +0 -0
  38. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/bootstrap/__main__.py +0 -0
  39. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/bootstrap/base.py +0 -0
  40. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/bootstrap/diag.py +0 -0
  41. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/bootstrap/harness.py +0 -0
  42. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/bootstrap/main.py +0 -0
  43. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/bootstrap/marshal.py +0 -0
  44. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/c3.py +0 -0
  45. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/cached.py +0 -0
  46. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/check.py +0 -0
  47. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/__init__.py +0 -0
  48. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/_abc.py +0 -0
  49. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/_io_abc.py +0 -0
  50. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/cache/__init__.py +0 -0
  51. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/cache/descriptor.py +0 -0
  52. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/cache/impl.py +0 -0
  53. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/cache/types.py +0 -0
  54. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/coerce.py +0 -0
  55. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/exceptions.py +0 -0
  56. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/frozen.py +0 -0
  57. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/identity.py +0 -0
  58. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/indexed.py +0 -0
  59. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/mappings.py +0 -0
  60. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/ordered.py +0 -0
  61. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/persistent.py +0 -0
  62. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/skiplist.py +0 -0
  63. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/sorted.py +0 -0
  64. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/treap.py +0 -0
  65. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/treapmap.py +0 -0
  66. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/unmodifiable.py +0 -0
  67. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/collections/utils.py +0 -0
  68. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/concurrent/__init__.py +0 -0
  69. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/concurrent/executors.py +0 -0
  70. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/concurrent/futures.py +0 -0
  71. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/concurrent/threadlets.py +0 -0
  72. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/configs/__init__.py +0 -0
  73. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/configs/classes.py +0 -0
  74. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/configs/flattening.py +0 -0
  75. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/configs/strings.py +0 -0
  76. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/LICENSE +0 -0
  77. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/__init__.py +0 -0
  78. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/as_.py +0 -0
  79. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/copy.py +0 -0
  80. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/descriptors.py +0 -0
  81. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/exceptions.py +0 -0
  82. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/frozen.py +0 -0
  83. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/hashing.py +0 -0
  84. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/init.py +0 -0
  85. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/internals.py +0 -0
  86. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/main.py +0 -0
  87. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/metaclass.py +0 -0
  88. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/metadata.py +0 -0
  89. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/order.py +0 -0
  90. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/processing.py +0 -0
  91. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/reflect.py +0 -0
  92. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/replace.py +0 -0
  93. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/repr.py +0 -0
  94. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/simple.py +0 -0
  95. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/slots.py +0 -0
  96. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dataclasses/impl/utils.py +0 -0
  97. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/datetimes.py +0 -0
  98. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/defs.py +0 -0
  99. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/__init__.py +0 -0
  100. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/asts.py +0 -0
  101. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/procfs.py +0 -0
  102. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/procstats.py +0 -0
  103. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/ps.py +0 -0
  104. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/pycharm.py +0 -0
  105. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/pydevd.py +0 -0
  106. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/replserver/__init__.py +0 -0
  107. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/replserver/__main__.py +0 -0
  108. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/replserver/console.py +0 -0
  109. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/replserver/server.py +0 -0
  110. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/diag/threads.py +0 -0
  111. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dispatch/__init__.py +0 -0
  112. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dispatch/_dispatch2.py +0 -0
  113. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dispatch/_dispatch3.py +0 -0
  114. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dispatch/dispatch.py +0 -0
  115. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dispatch/functions.py +0 -0
  116. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dispatch/methods.py +0 -0
  117. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/docker/__init__.py +0 -0
  118. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/docker/cli.py +0 -0
  119. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/docker/compose.py +0 -0
  120. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/docker/helpers.py +0 -0
  121. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/docker/hub.py +0 -0
  122. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/docker/manifests.py +0 -0
  123. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/dynamic.py +0 -0
  124. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/fnpairs.py +0 -0
  125. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/fnpipes.py +0 -0
  126. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/formats/__init__.py +0 -0
  127. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/formats/dotenv.py +0 -0
  128. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/formats/json.py +0 -0
  129. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/formats/props.py +0 -0
  130. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/formats/yaml.py +0 -0
  131. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/genmachine.py +0 -0
  132. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/graphs/__init__.py +0 -0
  133. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/graphs/dags.py +0 -0
  134. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/graphs/domination.py +0 -0
  135. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/graphs/dot/__init__.py +0 -0
  136. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/graphs/dot/items.py +0 -0
  137. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/graphs/dot/make.py +0 -0
  138. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/graphs/dot/rendering.py +0 -0
  139. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/graphs/dot/utils.py +0 -0
  140. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/graphs/trees.py +0 -0
  141. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/http/__init__.py +0 -0
  142. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/http/asgi.py +0 -0
  143. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/http/collections.py +0 -0
  144. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/http/consts.py +0 -0
  145. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/http/cookies.py +0 -0
  146. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/http/dates.py +0 -0
  147. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/http/encodings.py +0 -0
  148. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/http/json.py +0 -0
  149. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/http/sessions.py +0 -0
  150. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/http/wsgi.py +0 -0
  151. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/__init__.py +0 -0
  152. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/binder.py +0 -0
  153. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/bindings.py +0 -0
  154. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/eagers.py +0 -0
  155. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/elements.py +0 -0
  156. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/exceptions.py +0 -0
  157. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/__init__.py +0 -0
  158. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/bindings.py +0 -0
  159. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/elements.py +0 -0
  160. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/injector.py +0 -0
  161. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/inspect.py +0 -0
  162. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/multis.py +0 -0
  163. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/origins.py +0 -0
  164. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/privates.py +0 -0
  165. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/providers.py +0 -0
  166. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/proxy.py +0 -0
  167. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/impl/scopes.py +0 -0
  168. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/injector.py +0 -0
  169. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/inspect.py +0 -0
  170. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/keys.py +0 -0
  171. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/listeners.py +0 -0
  172. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/managed.py +0 -0
  173. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/multis.py +0 -0
  174. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/origins.py +0 -0
  175. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/overrides.py +0 -0
  176. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/privates.py +0 -0
  177. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/providers.py +0 -0
  178. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/scopes.py +0 -0
  179. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/types.py +0 -0
  180. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/inject/utils.py +0 -0
  181. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/iterators.py +0 -0
  182. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/__init__.py +0 -0
  183. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/cached.py +0 -0
  184. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/classes/__init__.py +0 -0
  185. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/classes/abstract.py +0 -0
  186. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/classes/restrict.py +0 -0
  187. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/classes/simple.py +0 -0
  188. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/classes/virtual.py +0 -0
  189. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/clsdct.py +0 -0
  190. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/cmp.py +0 -0
  191. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/contextmanagers.py +0 -0
  192. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/datetimes.py +0 -0
  193. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/descriptors.py +0 -0
  194. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/exceptions.py +0 -0
  195. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/functions.py +0 -0
  196. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/imports.py +0 -0
  197. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/iterables.py +0 -0
  198. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/maybes.py +0 -0
  199. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/objects.py +0 -0
  200. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/resolving.py +0 -0
  201. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/resources.py +0 -0
  202. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/strings.py +0 -0
  203. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/sys.py +0 -0
  204. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/timeouts.py +0 -0
  205. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lang/typing.py +0 -0
  206. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/libc.py +0 -0
  207. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lifecycles/__init__.py +0 -0
  208. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lifecycles/abstract.py +0 -0
  209. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lifecycles/base.py +0 -0
  210. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lifecycles/contextmanagers.py +0 -0
  211. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lifecycles/controller.py +0 -0
  212. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lifecycles/manager.py +0 -0
  213. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lifecycles/states.py +0 -0
  214. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lifecycles/transitions.py +0 -0
  215. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/__init__.py +0 -0
  216. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/cached.py +0 -0
  217. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/check.py +0 -0
  218. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/contextmanagers.py +0 -0
  219. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/json.py +0 -0
  220. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/logs.py +0 -0
  221. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/marshal.py +0 -0
  222. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/reflect.py +0 -0
  223. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/runtime.py +0 -0
  224. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/secrets.py +0 -0
  225. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/strings.py +0 -0
  226. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/lite/subprocesses.py +0 -0
  227. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/logs/__init__.py +0 -0
  228. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/logs/_abc.py +0 -0
  229. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/logs/configs.py +0 -0
  230. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/logs/formatters.py +0 -0
  231. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/logs/handlers.py +0 -0
  232. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/logs/noisy.py +0 -0
  233. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/logs/utils.py +0 -0
  234. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/any.py +0 -0
  235. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/base64.py +0 -0
  236. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/datetimes.py +0 -0
  237. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/enums.py +0 -0
  238. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/exceptions.py +0 -0
  239. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/factories.py +0 -0
  240. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/forbidden.py +0 -0
  241. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/helpers.py +0 -0
  242. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/iterables.py +0 -0
  243. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/mappings.py +0 -0
  244. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/maybes.py +0 -0
  245. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/naming.py +0 -0
  246. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/numbers.py +0 -0
  247. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/optionals.py +0 -0
  248. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/polymorphism.py +0 -0
  249. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/primitives.py +0 -0
  250. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/standard.py +0 -0
  251. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/unions.py +0 -0
  252. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/utils.py +0 -0
  253. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/uuids.py +0 -0
  254. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/marshal/values.py +0 -0
  255. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/matchfns.py +0 -0
  256. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/math/__init__.py +0 -0
  257. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/math/bits.py +0 -0
  258. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/math/floats.py +0 -0
  259. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/math/stats.py +0 -0
  260. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/multiprocessing.py +0 -0
  261. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/os.py +0 -0
  262. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/reflect/__init__.py +0 -0
  263. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/reflect/isinstance.py +0 -0
  264. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/reflect/ops.py +0 -0
  265. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/reflect/subst.py +0 -0
  266. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/reflect/types.py +0 -0
  267. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/runmodule.py +0 -0
  268. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/secrets/crypto.py +0 -0
  269. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/secrets/marshal.py +0 -0
  270. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/secrets/openssl.py +0 -0
  271. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/secrets/passwords.py +0 -0
  272. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/secrets/subprocesses.py +0 -0
  273. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/__init__.py +0 -0
  274. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/LICENSE +0 -0
  275. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/__init__.py +0 -0
  276. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/ast.py +0 -0
  277. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/cli.py +0 -0
  278. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/exceptions.py +0 -0
  279. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/functions.py +0 -0
  280. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/lexer.py +0 -0
  281. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/parser.py +0 -0
  282. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/scope.py +0 -0
  283. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jmespath/visitor.py +0 -0
  284. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonrpc/__init__.py +0 -0
  285. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonrpc/errors.py +0 -0
  286. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonrpc/marshal.py +0 -0
  287. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonrpc/types.py +0 -0
  288. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/__init__.py +0 -0
  289. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/keywords/__init__.py +0 -0
  290. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/keywords/base.py +0 -0
  291. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/keywords/core.py +0 -0
  292. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/keywords/metadata.py +0 -0
  293. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/keywords/parse.py +0 -0
  294. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/keywords/render.py +0 -0
  295. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/keywords/validation.py +0 -0
  296. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/__init__.py +0 -0
  297. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/__init__.py +0 -0
  298. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/metaschema.json +0 -0
  299. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/__init__.py +0 -0
  300. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/applicator.json +0 -0
  301. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/content.json +0 -0
  302. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/core.json +0 -0
  303. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format-annotation.json +0 -0
  304. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format-assertion.json +0 -0
  305. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format.json +0 -0
  306. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/meta-data.json +0 -0
  307. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/unevaluated.json +0 -0
  308. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/validation.json +0 -0
  309. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/jsonschema/types.py +0 -0
  310. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/openapi/__init__.py +0 -0
  311. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/openapi/marshal.py +0 -0
  312. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/specs/openapi/openapi.py +0 -0
  313. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sql/__init__.py +0 -0
  314. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sql/_abc.py +0 -0
  315. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sql/alchemy/__init__.py +0 -0
  316. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sql/alchemy/asyncs.py +0 -0
  317. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sql/alchemy/duckdb.py +0 -0
  318. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sql/alchemy/exprs.py +0 -0
  319. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sql/alchemy/secrets.py +0 -0
  320. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sql/alchemy/sqlean.py +0 -0
  321. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sql/dbs.py +0 -0
  322. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sql/qualifiedname.py +0 -0
  323. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/sync.py +0 -0
  324. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/term.py +0 -0
  325. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/__init__.py +0 -0
  326. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/__init__.py +0 -0
  327. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/helpers.py +0 -0
  328. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/inject/__init__.py +0 -0
  329. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/marks.py +0 -0
  330. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/__init__.py +0 -0
  331. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/_registry.py +0 -0
  332. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/asyncs.py +0 -0
  333. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/depskip.py +0 -0
  334. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/logging.py +0 -0
  335. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/managermarks.py +0 -0
  336. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/pydevd.py +0 -0
  337. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/repeat.py +0 -0
  338. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/skips.py +0 -0
  339. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/spacing.py +0 -0
  340. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/switches.py +0 -0
  341. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/plugins/utils.py +0 -0
  342. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/pytest/skip.py +0 -0
  343. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/testing/testing.py +0 -0
  344. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/text/__init__.py +0 -0
  345. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/text/asdl.py +0 -0
  346. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/text/delimit.py +0 -0
  347. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/text/glyphsplit.py +0 -0
  348. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/text/indent.py +0 -0
  349. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish/text/parts.py +0 -0
  350. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish.egg-info/SOURCES.txt +0 -0
  351. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish.egg-info/dependency_links.txt +0 -0
  352. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish.egg-info/entry_points.txt +0 -0
  353. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/omlish.egg-info/top_level.txt +0 -0
  354. {omlish-0.0.0.dev51 → omlish-0.0.0.dev53}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev51
3
+ Version: 0.0.0.dev53
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -27,7 +27,7 @@ Requires-Dist: psutil~=6.0; extra == "all"
27
27
  Requires-Dist: orjson~=3.10; extra == "all"
28
28
  Requires-Dist: ujson~=5.10; extra == "all"
29
29
  Requires-Dist: json5~=0.9; extra == "all"
30
- Requires-Dist: pyyaml~=5.0; extra == "all"
30
+ Requires-Dist: pyyaml~=6.0; extra == "all"
31
31
  Requires-Dist: cbor2~=5.6; extra == "all"
32
32
  Requires-Dist: cloudpickle~=3.0; extra == "all"
33
33
  Requires-Dist: httpx[http2]~=0.27; extra == "all"
@@ -43,6 +43,13 @@ Requires-Dist: apsw~=3.46; extra == "all"
43
43
  Requires-Dist: sqlean.py~=3.45; python_version < "3.13" and extra == "all"
44
44
  Requires-Dist: duckdb~=1.1; extra == "all"
45
45
  Requires-Dist: pytest~=8.0; extra == "all"
46
+ Requires-Dist: anyio~=4.6; extra == "all"
47
+ Requires-Dist: sniffio~=1.3; extra == "all"
48
+ Requires-Dist: asttokens~=2.4; extra == "all"
49
+ Requires-Dist: executing~=2.1; extra == "all"
50
+ Requires-Dist: orjson~=3.10; extra == "all"
51
+ Requires-Dist: pyyaml~=6.0; extra == "all"
52
+ Requires-Dist: wrapt~=1.14; extra == "all"
46
53
  Provides-Extra: async
47
54
  Requires-Dist: anyio~=4.6; extra == "async"
48
55
  Requires-Dist: sniffio~=1.3; extra == "async"
@@ -61,7 +68,7 @@ Provides-Extra: formats
61
68
  Requires-Dist: orjson~=3.10; extra == "formats"
62
69
  Requires-Dist: ujson~=5.10; extra == "formats"
63
70
  Requires-Dist: json5~=0.9; extra == "formats"
64
- Requires-Dist: pyyaml~=5.0; extra == "formats"
71
+ Requires-Dist: pyyaml~=6.0; extra == "formats"
65
72
  Requires-Dist: cbor2~=5.6; extra == "formats"
66
73
  Requires-Dist: cloudpickle~=3.0; extra == "formats"
67
74
  Provides-Extra: http
@@ -83,3 +90,11 @@ Requires-Dist: sqlean.py~=3.45; python_version < "3.13" and extra == "sqldrivers
83
90
  Requires-Dist: duckdb~=1.1; extra == "sqldrivers"
84
91
  Provides-Extra: testing
85
92
  Requires-Dist: pytest~=8.0; extra == "testing"
93
+ Provides-Extra: plus
94
+ Requires-Dist: anyio~=4.6; extra == "plus"
95
+ Requires-Dist: sniffio~=1.3; extra == "plus"
96
+ Requires-Dist: asttokens~=2.4; extra == "plus"
97
+ Requires-Dist: executing~=2.1; extra == "plus"
98
+ Requires-Dist: orjson~=3.10; extra == "plus"
99
+ Requires-Dist: pyyaml~=6.0; extra == "plus"
100
+ Requires-Dist: wrapt~=1.14; extra == "plus"
@@ -42,7 +42,10 @@
42
42
  "line": 1,
43
43
  "value": {
44
44
  "$omdev.cli.types.CliModule": {
45
- "cmd_name": "jp",
45
+ "cmd_name": [
46
+ "jmespath",
47
+ "jp"
48
+ ],
46
49
  "mod_name": "omlish.specs.jmespath.__main__"
47
50
  }
48
51
  }
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev51'
2
- __revision__ = 'a9d714d2c1bc65f8d907b3e3bc7ad7d71f942d29'
1
+ __version__ = '0.0.0.dev53'
2
+ __revision__ = 'b933fe4d493e86c4f8b6531c82d6510916625619'
3
3
 
4
4
 
5
5
  #
@@ -28,6 +28,8 @@ class Project(ProjectBase):
28
28
  name = 'omlish'
29
29
  description = 'omlish'
30
30
 
31
+ #
32
+
31
33
  optional_dependencies = {
32
34
  'async': [
33
35
  'anyio ~= 4.6',
@@ -61,7 +63,7 @@ class Project(ProjectBase):
61
63
 
62
64
  'json5 ~= 0.9',
63
65
 
64
- 'pyyaml ~= 5.0',
66
+ 'pyyaml ~= 6.0',
65
67
 
66
68
  'cbor2 ~= 5.6',
67
69
 
@@ -109,6 +111,32 @@ class Project(ProjectBase):
109
111
  ],
110
112
  }
111
113
 
114
+ #
115
+
116
+ _plus_dependencies = [
117
+ 'anyio',
118
+ 'sniffio',
119
+
120
+ 'asttokens',
121
+ 'executing',
122
+
123
+ 'orjson',
124
+ 'pyyaml',
125
+
126
+ 'wrapt',
127
+ ]
128
+
129
+ _dependency_specs_by_name = (lambda od: { # noqa
130
+ s.split()[0]: s
131
+ for l in od.values() for s in l
132
+ })(optional_dependencies)
133
+
134
+ optional_dependencies['plus'] = (lambda ds, pd: [ # noqa
135
+ ds[n] for n in pd
136
+ ])(_dependency_specs_by_name, _plus_dependencies)
137
+
138
+ #
139
+
112
140
  entry_points = {
113
141
  'omlish.manifests': {name: name},
114
142
  }
@@ -134,6 +162,7 @@ class SetuptoolsBase:
134
162
  '*.c',
135
163
  '*.cc',
136
164
  '*.cu',
165
+ '*.g4',
137
166
  '*.h',
138
167
 
139
168
  '.manifests.json',
@@ -29,7 +29,7 @@ else:
29
29
  libc = lang.proxy_import('..libc', __package__)
30
30
  logs = lang.proxy_import('..logs', __package__)
31
31
  osu = lang.proxy_import('..os', __package__)
32
- dotenv = lang.proxy_import('.formats.dotenv', __package__)
32
+ dotenv = lang.proxy_import('..formats.dotenv', __package__)
33
33
 
34
34
 
35
35
  ##
@@ -89,15 +89,19 @@ from .impl.reflect import ( # noqa
89
89
  )
90
90
 
91
91
  from .utils import ( # noqa
92
- chain_metadata,
93
- deep_replace,
94
- field_modifier,
95
- fields_dict,
96
92
  maybe_post_init,
93
+
97
94
  opt_repr,
95
+ truthy_repr,
96
+
97
+ fields_dict,
98
+ field_modifier,
99
+ chain_metadata,
98
100
  update_class_metadata,
99
- update_field_extras,
100
101
  update_field_metadata,
102
+ update_field_extras,
101
103
  update_fields,
102
104
  update_fields_metadata,
105
+
106
+ deep_replace,
103
107
  )
@@ -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 | type | None = None,
36
+ check_type: bool | type | tuple[type | None, ...] | 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,10 @@ def field_init(
193
193
 
194
194
  if fx.check_type:
195
195
  cn = f'__dataclass_check_type__{f.name}__'
196
- if isinstance(fx.check_type, type):
196
+ ct: ta.Any
197
+ if isinstance(fx.check_type, tuple):
198
+ ct = tuple(type(None) if e is None else check_.isinstance(e, type) for e in fx.check_type)
199
+ elif isinstance(fx.check_type, (type, tuple)):
197
200
  ct = fx.check_type
198
201
  # FIXME:
199
202
  # elif info.params_extras.generic_init:
@@ -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 | type | None = None
48
+ check_type: bool | type | tuple[type | None, ...] | 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
@@ -33,6 +33,10 @@ def opt_repr(o: ta.Any) -> str | None:
33
33
  return repr(o) if o is not None else None
34
34
 
35
35
 
36
+ def truthy_repr(o: ta.Any) -> str | None:
37
+ return repr(o) if o else None
38
+
39
+
36
40
  #
37
41
 
38
42
 
@@ -24,7 +24,8 @@ from .base import ( # noqa
24
24
  RecursiveMarshalerFactory,
25
25
  RecursiveUnmarshalerFactory,
26
26
 
27
- SetType,
27
+ Override,
28
+ ReflectOverride,
28
29
  )
29
30
 
30
31
  from .exceptions import ( # noqa
@@ -44,6 +45,8 @@ from .naming import ( # noqa
44
45
  )
45
46
 
46
47
  from .global_ import ( # noqa
48
+ GLOBAL_REGISTRY,
49
+
47
50
  marshal,
48
51
  unmarshal,
49
52
  )
@@ -56,10 +59,12 @@ from .helpers import ( # noqa
56
59
 
57
60
  from .objects import ( # noqa
58
61
  FieldInfo,
62
+ FieldInfos,
59
63
  FieldMetadata,
60
64
  FieldOptions,
61
65
  ObjectMarshaler,
62
66
  ObjectMetadata,
67
+ ObjectSpecials,
63
68
  ObjectUnmarshaler,
64
69
  SimpleObjectMarshalerFactory,
65
70
  SimpleObjectUnmarshalerFactory,
@@ -81,11 +81,11 @@ https://github.com/yukinarit/pyserde
81
81
  - Flatten
82
82
  """
83
83
  import abc
84
- import dataclasses as dc
85
84
  import typing as ta
86
85
 
87
86
  from .. import check
88
87
  from .. import collections as col
88
+ from .. import dataclasses as dc
89
89
  from .. import lang
90
90
  from .. import matchfns as mfs
91
91
  from .. import reflect as rfl
@@ -163,13 +163,18 @@ class BaseContext(lang.Abstract):
163
163
  registry: Registry
164
164
  options: col.TypeMap[Option] = col.TypeMap()
165
165
 
166
+ def _reflect(self, o: ta.Any) -> rfl.Type:
167
+ if (ovr := self.registry.get_of(o, ReflectOverride)):
168
+ return ovr[-1].rty
169
+ return rfl.type_(o)
170
+
166
171
 
167
172
  @dc.dataclass(frozen=True)
168
173
  class MarshalContext(BaseContext, lang.Final):
169
174
  factory: MarshalerFactory | None = None
170
175
 
171
176
  def make(self, o: ta.Any) -> Marshaler:
172
- rty = rfl.type_(o)
177
+ rty = self._reflect(o)
173
178
  try:
174
179
  return check.not_none(self.factory)(self, rty) # type: ignore
175
180
  except mfs.MatchGuardError:
@@ -181,7 +186,7 @@ class UnmarshalContext(BaseContext, lang.Final):
181
186
  factory: UnmarshalerFactory | None = None
182
187
 
183
188
  def make(self, o: ta.Any) -> Unmarshaler:
184
- rty = rfl.type_(o)
189
+ rty = self._reflect(o)
185
190
  try:
186
191
  return check.not_none(self.factory)(self, rty) # type: ignore
187
192
  except mfs.MatchGuardError:
@@ -214,10 +219,15 @@ class RecursiveUnmarshalerFactory(RecursiveTypeFactory[UnmarshalContext, Unmarsh
214
219
  ##
215
220
 
216
221
 
217
- @dc.dataclass(frozen=True)
218
- class SetType(RegistryItem, lang.Final):
219
- marshaler: Marshaler | None = None
222
+ @dc.dataclass(frozen=True, kw_only=True)
223
+ class Override(RegistryItem, lang.Final):
224
+ marshaler: Marshaler | None = dc.xfield(None, check_type=(Marshaler, None))
220
225
  marshaler_factory: MarshalerFactory | None = None
221
226
 
222
- unmarshaler: Unmarshaler | None = None
227
+ unmarshaler: Unmarshaler | None = dc.xfield(None, check_type=(Unmarshaler, None))
223
228
  unmarshaler_factory: UnmarshalerFactory | None = None
229
+
230
+
231
+ @dc.dataclass(frozen=True)
232
+ class ReflectOverride(RegistryItem, lang.Final):
233
+ rty: rfl.Type
@@ -1,8 +1,13 @@
1
+ """
2
+ TODO:
3
+ - tangled with objects - Field/ObjectMetadata defined over there but unused
4
+ """
1
5
  import typing as ta
2
6
 
3
7
  from .. import check
4
8
  from .. import collections as col
5
9
  from .. import dataclasses as dc
10
+ from .. import lang
6
11
  from .. import reflect as rfl
7
12
  from .base import MarshalContext
8
13
  from .base import Marshaler
@@ -16,6 +21,7 @@ from .naming import translate_name
16
21
  from .objects import DEFAULT_FIELD_OPTIONS
17
22
  from .objects import FIELD_OPTIONS_KWARGS
18
23
  from .objects import FieldInfo
24
+ from .objects import FieldInfos
19
25
  from .objects import FieldMetadata
20
26
  from .objects import FieldOptions
21
27
  from .objects import ObjectMarshaler
@@ -37,7 +43,7 @@ def get_dataclass_metadata(ty: type) -> ObjectMetadata:
37
43
  def get_field_infos(
38
44
  ty: type,
39
45
  opts: col.TypeMap[Option] = col.TypeMap(),
40
- ) -> ta.Sequence[FieldInfo]:
46
+ ) -> FieldInfos:
41
47
  dc_md = get_dataclass_metadata(ty)
42
48
  dc_naming = dc_md.field_naming or opts.get(Naming)
43
49
 
@@ -96,6 +102,15 @@ def get_field_infos(
96
102
  unmarshal_names=[n + '_' for n in fi_kw['unmarshal_names']],
97
103
  )
98
104
 
105
+ if fo_kw.get('no_marshal'):
106
+ fi_kw.update(
107
+ marshal_name=None,
108
+ )
109
+ if fo_kw.get('no_unmarshal'):
110
+ fi_kw.update(
111
+ unmarshal_names=(),
112
+ )
113
+
99
114
  ret.append(
100
115
  FieldInfo(
101
116
  options=FieldOptions(**fo_kw),
@@ -103,7 +118,7 @@ def get_field_infos(
103
118
  ),
104
119
  )
105
120
 
106
- return ret
121
+ return FieldInfos(ret)
107
122
 
108
123
 
109
124
  def _make_field_obj(ctx, ty, obj, fac):
@@ -119,22 +134,25 @@ def _make_field_obj(ctx, ty, obj, fac):
119
134
 
120
135
  class DataclassMarshalerFactory(MarshalerFactory):
121
136
  def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
122
- return isinstance(rty, type) and dc.is_dataclass(rty)
137
+ return isinstance(rty, type) and dc.is_dataclass(rty) and not lang.is_abstract_class(rty)
123
138
 
124
139
  def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
125
140
  ty = check.isinstance(rty, type)
126
141
  check.state(dc.is_dataclass(ty))
142
+ check.state(not lang.is_abstract_class(ty))
127
143
 
128
144
  dc_md = get_dataclass_metadata(ty)
145
+ fis = get_field_infos(ty, ctx.options)
129
146
 
130
147
  fields = [
131
148
  (fi, _make_field_obj(ctx, fi.type, fi.metadata.marshaler, fi.metadata.marshaler_factory))
132
- for fi in get_field_infos(ty, ctx.options)
149
+ for fi in fis
150
+ if fi.name not in dc_md.specials.set
133
151
  ]
134
152
 
135
153
  return ObjectMarshaler(
136
154
  fields,
137
- unknown_field=dc_md.unknown_field,
155
+ specials=dc_md.specials,
138
156
  )
139
157
 
140
158
 
@@ -143,12 +161,15 @@ class DataclassMarshalerFactory(MarshalerFactory):
143
161
 
144
162
  class DataclassUnmarshalerFactory(UnmarshalerFactory):
145
163
  def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
146
- return isinstance(rty, type) and dc.is_dataclass(rty)
164
+ return isinstance(rty, type) and dc.is_dataclass(rty) and not lang.is_abstract_class(rty)
147
165
 
148
166
  def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
149
167
  ty = check.isinstance(rty, type)
150
168
  check.state(dc.is_dataclass(ty))
169
+ check.state(not lang.is_abstract_class(ty))
170
+
151
171
  dc_md = get_dataclass_metadata(ty)
172
+ fis = get_field_infos(ty, ctx.options)
152
173
 
153
174
  d: dict[str, tuple[FieldInfo, Unmarshaler]] = {}
154
175
  defaults: dict[str, ta.Any] = {}
@@ -161,7 +182,9 @@ class DataclassUnmarshalerFactory(UnmarshalerFactory):
161
182
  if fi.options.embed:
162
183
  e_ty = check.isinstance(fi.type, type)
163
184
  check.state(dc.is_dataclass(e_ty))
164
- # e_dc_md = get_dataclass_metadata(e_ty)
185
+ e_dc_md = get_dataclass_metadata(e_ty)
186
+ if e_dc_md.specials.set:
187
+ raise Exception(f'Embedded fields cannot have specials: {e_ty}')
165
188
 
166
189
  embeds[fi.name] = e_ty
167
190
  for e_fi in get_field_infos(e_ty, ctx.options):
@@ -185,14 +208,17 @@ class DataclassUnmarshalerFactory(UnmarshalerFactory):
185
208
 
186
209
  return ret
187
210
 
188
- for fi in get_field_infos(ty, ctx.options):
211
+ for fi in fis:
212
+ if fi.name in dc_md.specials.set:
213
+ continue
189
214
  add_field(fi)
190
215
 
191
216
  return ObjectUnmarshaler(
192
217
  ty,
193
218
  d,
194
- unknown_field=dc_md.unknown_field,
219
+ specials=dc_md.specials,
195
220
  defaults=defaults,
196
221
  embeds=embeds,
197
222
  embeds_by_unmarshal_name=embeds_by_unmarshal_name,
223
+ ignore_unknown=dc_md.ignore_unknown,
198
224
  )
@@ -17,7 +17,7 @@ T = ta.TypeVar('T')
17
17
  ##
18
18
 
19
19
 
20
- GLOBAL_REGISTRY = Registry()
20
+ GLOBAL_REGISTRY: Registry = Registry()
21
21
 
22
22
 
23
23
  ##
@@ -8,7 +8,9 @@ TODO:
8
8
  import collections.abc
9
9
  import typing as ta
10
10
 
11
+ from .. import cached
11
12
  from .. import check
13
+ from .. import collections as col
12
14
  from .. import dataclasses as dc
13
15
  from .. import lang
14
16
  from .. import reflect as rfl
@@ -33,6 +35,9 @@ class FieldOptions:
33
35
 
34
36
  embed: bool = False
35
37
 
38
+ no_marshal: bool = False
39
+ no_unmarshal: bool = False
40
+
36
41
 
37
42
  DEFAULT_FIELD_OPTIONS = FieldOptions()
38
43
  FIELD_OPTIONS_KWARGS: frozenset[str] = frozenset(dc.fields_dict(FieldOptions).keys())
@@ -45,10 +50,10 @@ class FieldMetadata:
45
50
 
46
51
  options: FieldOptions = DEFAULT_FIELD_OPTIONS
47
52
 
48
- marshaler: Marshaler | None = None
53
+ marshaler: Marshaler | None = dc.xfield(None, check_type=(Marshaler, None))
49
54
  marshaler_factory: MarshalerFactory | None = None
50
55
 
51
- unmarshaler: Unmarshaler | None = None
56
+ unmarshaler: Unmarshaler | None = dc.xfield(None, check_type=(Unmarshaler, None))
52
57
  unmarshaler_factory: UnmarshalerFactory | None = None
53
58
 
54
59
  def update(self, **kwargs: ta.Any) -> 'FieldMetadata':
@@ -66,9 +71,29 @@ class ObjectMetadata:
66
71
  field_naming: Naming | None = None
67
72
 
68
73
  unknown_field: str | None = None
74
+ source_field: str | None = None
75
+
76
+ @cached.property
77
+ def specials(self) -> 'ObjectSpecials':
78
+ return ObjectSpecials(
79
+ unknown=self.unknown_field,
80
+ source=self.source_field,
81
+ )
69
82
 
70
83
  field_defaults: FieldMetadata = FieldMetadata()
71
84
 
85
+ ignore_unknown: bool = False
86
+
87
+
88
+ @dc.dataclass(frozen=True, kw_only=True)
89
+ class ObjectSpecials:
90
+ unknown: str | None = None
91
+ source: str | None = None
92
+
93
+ @cached.property
94
+ def set(self) -> frozenset[str]:
95
+ return frozenset(k for k, v in dc.asdict(self).items() if v is not None)
96
+
72
97
 
73
98
  ##
74
99
 
@@ -78,7 +103,7 @@ class FieldInfo:
78
103
  name: str
79
104
  type: ta.Any
80
105
 
81
- marshal_name: str
106
+ marshal_name: str | None
82
107
  unmarshal_names: ta.Sequence[str]
83
108
 
84
109
  metadata: FieldMetadata = FieldMetadata()
@@ -86,6 +111,32 @@ class FieldInfo:
86
111
  options: FieldOptions = FieldOptions()
87
112
 
88
113
 
114
+ @dc.dataclass(frozen=True)
115
+ class FieldInfos:
116
+ lst: ta.Sequence[FieldInfo]
117
+
118
+ def __iter__(self) -> ta.Iterator[FieldInfo]:
119
+ return iter(self.lst)
120
+
121
+ def __len__(self) -> int:
122
+ return len(self.lst)
123
+
124
+ @cached.property
125
+ @dc.init
126
+ def by_name(self) -> ta.Mapping[str, FieldInfo]:
127
+ return col.make_map(((fi.name, fi) for fi in self), strict=True)
128
+
129
+ @cached.property
130
+ @dc.init
131
+ def by_marshal_name(self) -> ta.Mapping[str, FieldInfo]:
132
+ return col.make_map(((fi.marshal_name, fi) for fi in self if fi.marshal_name is not None), strict=True)
133
+
134
+ @cached.property
135
+ @dc.init
136
+ def by_unmarshal_name(self) -> ta.Mapping[str, FieldInfo]:
137
+ return col.make_map(((n, fi) for fi in self for n in fi.unmarshal_names), strict=True)
138
+
139
+
89
140
  ##
90
141
 
91
142
 
@@ -95,7 +146,7 @@ class ObjectMarshaler(Marshaler):
95
146
 
96
147
  _: dc.KW_ONLY
97
148
 
98
- unknown_field: str | None = None
149
+ specials: ObjectSpecials = ObjectSpecials()
99
150
 
100
151
  def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
101
152
  ret: dict[str, ta.Any] = {}
@@ -105,17 +156,24 @@ class ObjectMarshaler(Marshaler):
105
156
  if fi.options.omit_if is not None and fi.options.omit_if(v):
106
157
  continue
107
158
 
159
+ if fi.name in self.specials.set:
160
+ continue
161
+
162
+ mn = fi.marshal_name
163
+ if mn is None:
164
+ continue
165
+
108
166
  mv = m.marshal(ctx, v)
109
167
 
110
168
  if fi.options.embed:
111
169
  for ek, ev in check.isinstance(mv, collections.abc.Mapping).items():
112
- ret[fi.marshal_name + check.non_empty_str(ek)] = ev # type: ignore
170
+ ret[mn + check.non_empty_str(ek)] = ev # type: ignore
113
171
 
114
172
  else:
115
- ret[fi.marshal_name] = mv
173
+ ret[mn] = mv
116
174
 
117
- if self.unknown_field is not None:
118
- if (ukf := getattr(o, self.unknown_field)):
175
+ if self.specials.unknown is not None:
176
+ if (ukf := getattr(o, self.specials.unknown)):
119
177
  if (dks := set(ret) & set(ukf)):
120
178
  raise KeyError(f'Unknown field keys duplicate fields: {dks!r}')
121
179
 
@@ -130,7 +188,7 @@ class SimpleObjectMarshalerFactory(MarshalerFactory):
130
188
 
131
189
  _: dc.KW_ONLY
132
190
 
133
- unknown_field: str | None = None
191
+ specials: ObjectSpecials = ObjectSpecials()
134
192
 
135
193
  def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
136
194
  return isinstance(rty, type) and rty in self.dct
@@ -138,7 +196,7 @@ class SimpleObjectMarshalerFactory(MarshalerFactory):
138
196
  def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
139
197
  ty = check.isinstance(rty, type)
140
198
 
141
- flds = self.dct[ty]
199
+ flds = FieldInfos(self.dct[ty])
142
200
 
143
201
  fields = [
144
202
  (fi, ctx.make(fi.type))
@@ -147,7 +205,7 @@ class SimpleObjectMarshalerFactory(MarshalerFactory):
147
205
 
148
206
  return ObjectMarshaler(
149
207
  fields,
150
- unknown_field=self.unknown_field,
208
+ specials=self.specials,
151
209
  )
152
210
 
153
211
 
@@ -161,13 +219,15 @@ class ObjectUnmarshaler(Unmarshaler):
161
219
 
162
220
  _: dc.KW_ONLY
163
221
 
164
- unknown_field: str | None = None
222
+ specials: ObjectSpecials = ObjectSpecials()
165
223
 
166
224
  defaults: ta.Mapping[str, ta.Any] | None = None
167
225
 
168
226
  embeds: ta.Mapping[str, type] | None = None
169
227
  embeds_by_unmarshal_name: ta.Mapping[str, tuple[str, str]] | None = None
170
228
 
229
+ ignore_unknown: bool = False
230
+
171
231
  def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
172
232
  ma = check.isinstance(v, collections.abc.Mapping)
173
233
 
@@ -177,8 +237,11 @@ class ObjectUnmarshaler(Unmarshaler):
177
237
 
178
238
  ekws: dict[str, dict[str, ta.Any]] = {en: {} for en in self.embeds or ()}
179
239
 
180
- if self.unknown_field is not None:
181
- kw[self.unknown_field] = ukf = {}
240
+ if self.specials.source is not None:
241
+ kw[self.specials.source] = v
242
+
243
+ if self.specials.unknown is not None:
244
+ kw[self.specials.unknown] = ukf = {}
182
245
 
183
246
  for k, mv in ma.items():
184
247
  ks = check.isinstance(k, str)
@@ -190,6 +253,10 @@ class ObjectUnmarshaler(Unmarshaler):
190
253
  if ukf is not None:
191
254
  ukf[ks] = mv # FIXME: unmarshal?
192
255
  continue
256
+
257
+ if self.ignore_unknown:
258
+ continue
259
+
193
260
  raise
194
261
 
195
262
  if self.embeds_by_unmarshal_name and (en := self.embeds_by_unmarshal_name.get(ks)):
@@ -220,7 +287,7 @@ class SimpleObjectUnmarshalerFactory(UnmarshalerFactory):
220
287
 
221
288
  _: dc.KW_ONLY
222
289
 
223
- unknown_field: str | None = None
290
+ specials: ObjectSpecials = ObjectSpecials()
224
291
 
225
292
  def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
226
293
  return isinstance(rty, type) and rty in self.dct
@@ -228,7 +295,7 @@ class SimpleObjectUnmarshalerFactory(UnmarshalerFactory):
228
295
  def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
229
296
  ty = check.isinstance(rty, type)
230
297
 
231
- flds = self.dct[ty]
298
+ flds = FieldInfos(self.dct[ty])
232
299
 
233
300
  fields_by_unmarshal_name = {
234
301
  n: (fi, ctx.make(fi.type))
@@ -245,6 +312,6 @@ class SimpleObjectUnmarshalerFactory(UnmarshalerFactory):
245
312
  return ObjectUnmarshaler(
246
313
  ty,
247
314
  fields_by_unmarshal_name,
248
- unknown_field=self.unknown_field,
315
+ specials=self.specials,
249
316
  defaults=defaults,
250
317
  )