omlish 0.0.0.dev47__tar.gz → 0.0.0.dev48__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 (355) hide show
  1. {omlish-0.0.0.dev47/omlish.egg-info → omlish-0.0.0.dev48}/PKG-INFO +1 -1
  2. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/__about__.py +2 -2
  3. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/bootstrap/harness.py +1 -2
  4. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/objects.py +5 -2
  5. omlish-0.0.0.dev48/omlish/specs/jmespath/__init__.py +41 -0
  6. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jmespath/ast.py +24 -0
  7. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jmespath/cli.py +4 -0
  8. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jmespath/exceptions.py +24 -0
  9. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jmespath/functions.py +227 -6
  10. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jmespath/lexer.py +115 -38
  11. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jmespath/parser.py +91 -14
  12. omlish-0.0.0.dev48/omlish/specs/jmespath/scope.py +35 -0
  13. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jmespath/visitor.py +93 -8
  14. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/keywords/__init__.py +6 -0
  15. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/keywords/base.py +1 -1
  16. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/keywords/core.py +1 -1
  17. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/keywords/metadata.py +1 -1
  18. omlish-0.0.0.dev48/omlish/specs/jsonschema/keywords/parse.py +101 -0
  19. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/keywords/validation.py +1 -1
  20. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48/omlish.egg-info}/PKG-INFO +1 -1
  21. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish.egg-info/SOURCES.txt +1 -0
  22. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/pyproject.toml +1 -1
  23. omlish-0.0.0.dev47/omlish/specs/jmespath/__init__.py +0 -20
  24. omlish-0.0.0.dev47/omlish/specs/jsonschema/keywords/parse.py +0 -68
  25. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/LICENSE +0 -0
  26. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/MANIFEST.in +0 -0
  27. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/README.rst +0 -0
  28. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/.manifests.json +0 -0
  29. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/__init__.py +0 -0
  30. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/argparse.py +0 -0
  31. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/asyncs/__init__.py +0 -0
  32. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/asyncs/anyio.py +0 -0
  33. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/asyncs/asyncio.py +0 -0
  34. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/asyncs/asyncs.py +0 -0
  35. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/asyncs/bridge.py +0 -0
  36. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/asyncs/flavors.py +0 -0
  37. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/asyncs/trio.py +0 -0
  38. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/asyncs/trio_asyncio.py +0 -0
  39. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/bootstrap/__init__.py +0 -0
  40. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/bootstrap/__main__.py +0 -0
  41. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/bootstrap/base.py +0 -0
  42. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/bootstrap/diag.py +0 -0
  43. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/bootstrap/main.py +0 -0
  44. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/bootstrap/marshal.py +0 -0
  45. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/bootstrap/sys.py +0 -0
  46. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/c3.py +0 -0
  47. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/cached.py +0 -0
  48. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/check.py +0 -0
  49. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/__init__.py +0 -0
  50. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/_abc.py +0 -0
  51. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/_io_abc.py +0 -0
  52. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/cache/__init__.py +0 -0
  53. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/cache/descriptor.py +0 -0
  54. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/cache/impl.py +0 -0
  55. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/cache/types.py +0 -0
  56. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/coerce.py +0 -0
  57. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/exceptions.py +0 -0
  58. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/frozen.py +0 -0
  59. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/identity.py +0 -0
  60. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/indexed.py +0 -0
  61. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/mappings.py +0 -0
  62. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/ordered.py +0 -0
  63. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/persistent.py +0 -0
  64. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/skiplist.py +0 -0
  65. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/sorted.py +0 -0
  66. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/treap.py +0 -0
  67. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/treapmap.py +0 -0
  68. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/unmodifiable.py +0 -0
  69. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/collections/utils.py +0 -0
  70. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/concurrent/__init__.py +0 -0
  71. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/concurrent/executors.py +0 -0
  72. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/concurrent/futures.py +0 -0
  73. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/concurrent/threadlets.py +0 -0
  74. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/configs/__init__.py +0 -0
  75. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/configs/classes.py +0 -0
  76. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/configs/flattening.py +0 -0
  77. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/configs/strings.py +0 -0
  78. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/__init__.py +0 -0
  79. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/LICENSE +0 -0
  80. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/__init__.py +0 -0
  81. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/api.py +0 -0
  82. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/as_.py +0 -0
  83. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/copy.py +0 -0
  84. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/descriptors.py +0 -0
  85. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/exceptions.py +0 -0
  86. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/fields.py +0 -0
  87. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/frozen.py +0 -0
  88. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/hashing.py +0 -0
  89. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/init.py +0 -0
  90. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/internals.py +0 -0
  91. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/main.py +0 -0
  92. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/metaclass.py +0 -0
  93. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/metadata.py +0 -0
  94. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/order.py +0 -0
  95. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/params.py +0 -0
  96. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/processing.py +0 -0
  97. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/reflect.py +0 -0
  98. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/replace.py +0 -0
  99. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/repr.py +0 -0
  100. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/simple.py +0 -0
  101. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/slots.py +0 -0
  102. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/impl/utils.py +0 -0
  103. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dataclasses/utils.py +0 -0
  104. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/datetimes.py +0 -0
  105. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/defs.py +0 -0
  106. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/__init__.py +0 -0
  107. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/asts.py +0 -0
  108. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/procfs.py +0 -0
  109. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/procstats.py +0 -0
  110. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/ps.py +0 -0
  111. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/pycharm.py +0 -0
  112. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/pydevd.py +0 -0
  113. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/replserver/__init__.py +0 -0
  114. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/replserver/__main__.py +0 -0
  115. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/replserver/console.py +0 -0
  116. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/replserver/server.py +0 -0
  117. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/diag/threads.py +0 -0
  118. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dispatch/__init__.py +0 -0
  119. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dispatch/_dispatch2.py +0 -0
  120. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dispatch/_dispatch3.py +0 -0
  121. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dispatch/dispatch.py +0 -0
  122. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dispatch/functions.py +0 -0
  123. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dispatch/methods.py +0 -0
  124. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/docker/__init__.py +0 -0
  125. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/docker/cli.py +0 -0
  126. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/docker/compose.py +0 -0
  127. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/docker/helpers.py +0 -0
  128. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/docker/hub.py +0 -0
  129. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/docker/manifests.py +0 -0
  130. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/dynamic.py +0 -0
  131. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/fnpairs.py +0 -0
  132. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/fnpipes.py +0 -0
  133. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/formats/__init__.py +0 -0
  134. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/formats/dotenv.py +0 -0
  135. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/formats/json.py +0 -0
  136. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/formats/props.py +0 -0
  137. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/formats/yaml.py +0 -0
  138. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/genmachine.py +0 -0
  139. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/graphs/__init__.py +0 -0
  140. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/graphs/dags.py +0 -0
  141. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/graphs/domination.py +0 -0
  142. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/graphs/dot/__init__.py +0 -0
  143. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/graphs/dot/items.py +0 -0
  144. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/graphs/dot/make.py +0 -0
  145. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/graphs/dot/rendering.py +0 -0
  146. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/graphs/dot/utils.py +0 -0
  147. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/graphs/trees.py +0 -0
  148. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/http/__init__.py +0 -0
  149. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/http/asgi.py +0 -0
  150. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/http/collections.py +0 -0
  151. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/http/consts.py +0 -0
  152. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/http/cookies.py +0 -0
  153. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/http/dates.py +0 -0
  154. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/http/encodings.py +0 -0
  155. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/http/json.py +0 -0
  156. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/http/sessions.py +0 -0
  157. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/http/wsgi.py +0 -0
  158. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/__init__.py +0 -0
  159. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/binder.py +0 -0
  160. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/bindings.py +0 -0
  161. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/eagers.py +0 -0
  162. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/elements.py +0 -0
  163. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/exceptions.py +0 -0
  164. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/__init__.py +0 -0
  165. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/bindings.py +0 -0
  166. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/elements.py +0 -0
  167. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/injector.py +0 -0
  168. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/inspect.py +0 -0
  169. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/multis.py +0 -0
  170. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/origins.py +0 -0
  171. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/privates.py +0 -0
  172. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/providers.py +0 -0
  173. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/proxy.py +0 -0
  174. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/impl/scopes.py +0 -0
  175. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/injector.py +0 -0
  176. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/inspect.py +0 -0
  177. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/keys.py +0 -0
  178. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/listeners.py +0 -0
  179. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/managed.py +0 -0
  180. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/multis.py +0 -0
  181. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/origins.py +0 -0
  182. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/overrides.py +0 -0
  183. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/privates.py +0 -0
  184. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/providers.py +0 -0
  185. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/scopes.py +0 -0
  186. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/types.py +0 -0
  187. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/inject/utils.py +0 -0
  188. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/iterators.py +0 -0
  189. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/__init__.py +0 -0
  190. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/cached.py +0 -0
  191. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/classes/__init__.py +0 -0
  192. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/classes/abstract.py +0 -0
  193. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/classes/restrict.py +0 -0
  194. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/classes/simple.py +0 -0
  195. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/classes/virtual.py +0 -0
  196. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/clsdct.py +0 -0
  197. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/cmp.py +0 -0
  198. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/contextmanagers.py +0 -0
  199. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/datetimes.py +0 -0
  200. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/descriptors.py +0 -0
  201. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/exceptions.py +0 -0
  202. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/functions.py +0 -0
  203. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/imports.py +0 -0
  204. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/iterables.py +0 -0
  205. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/maybes.py +0 -0
  206. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/resolving.py +0 -0
  207. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/resources.py +0 -0
  208. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/strings.py +0 -0
  209. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/sys.py +0 -0
  210. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/timeouts.py +0 -0
  211. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lang/typing.py +0 -0
  212. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/libc.py +0 -0
  213. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lifecycles/__init__.py +0 -0
  214. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lifecycles/abstract.py +0 -0
  215. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lifecycles/base.py +0 -0
  216. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lifecycles/contextmanagers.py +0 -0
  217. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lifecycles/controller.py +0 -0
  218. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lifecycles/manager.py +0 -0
  219. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lifecycles/states.py +0 -0
  220. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lifecycles/transitions.py +0 -0
  221. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/__init__.py +0 -0
  222. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/cached.py +0 -0
  223. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/check.py +0 -0
  224. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/contextmanagers.py +0 -0
  225. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/json.py +0 -0
  226. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/logs.py +0 -0
  227. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/marshal.py +0 -0
  228. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/reflect.py +0 -0
  229. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/runtime.py +0 -0
  230. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/secrets.py +0 -0
  231. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/strings.py +0 -0
  232. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/lite/subprocesses.py +0 -0
  233. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/logs/__init__.py +0 -0
  234. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/logs/_abc.py +0 -0
  235. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/logs/configs.py +0 -0
  236. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/logs/formatters.py +0 -0
  237. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/logs/handlers.py +0 -0
  238. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/logs/noisy.py +0 -0
  239. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/logs/utils.py +0 -0
  240. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/__init__.py +0 -0
  241. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/any.py +0 -0
  242. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/base.py +0 -0
  243. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/base64.py +0 -0
  244. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/dataclasses.py +0 -0
  245. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/datetimes.py +0 -0
  246. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/enums.py +0 -0
  247. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/exceptions.py +0 -0
  248. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/factories.py +0 -0
  249. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/forbidden.py +0 -0
  250. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/global_.py +0 -0
  251. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/helpers.py +0 -0
  252. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/iterables.py +0 -0
  253. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/mappings.py +0 -0
  254. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/maybes.py +0 -0
  255. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/naming.py +0 -0
  256. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/numbers.py +0 -0
  257. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/objects.py +0 -0
  258. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/optionals.py +0 -0
  259. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/polymorphism.py +0 -0
  260. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/primitives.py +0 -0
  261. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/registries.py +0 -0
  262. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/standard.py +0 -0
  263. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/unions.py +0 -0
  264. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/utils.py +0 -0
  265. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/uuids.py +0 -0
  266. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/marshal/values.py +0 -0
  267. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/matchfns.py +0 -0
  268. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/math/__init__.py +0 -0
  269. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/math/bits.py +0 -0
  270. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/math/floats.py +0 -0
  271. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/math/stats.py +0 -0
  272. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/multiprocessing.py +0 -0
  273. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/os.py +0 -0
  274. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/reflect/__init__.py +0 -0
  275. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/reflect/isinstance.py +0 -0
  276. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/reflect/ops.py +0 -0
  277. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/reflect/subst.py +0 -0
  278. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/reflect/types.py +0 -0
  279. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/runmodule.py +0 -0
  280. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/secrets/__init__.py +0 -0
  281. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/secrets/crypto.py +0 -0
  282. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/secrets/marshal.py +0 -0
  283. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/secrets/openssl.py +0 -0
  284. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/secrets/passwords.py +0 -0
  285. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/secrets/secrets.py +0 -0
  286. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/secrets/subprocesses.py +0 -0
  287. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/__init__.py +0 -0
  288. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jmespath/LICENSE +0 -0
  289. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jmespath/__main__.py +0 -0
  290. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonrpc/__init__.py +0 -0
  291. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonrpc/errors.py +0 -0
  292. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonrpc/marshal.py +0 -0
  293. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonrpc/types.py +0 -0
  294. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/__init__.py +0 -0
  295. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/keywords/render.py +0 -0
  296. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/__init__.py +0 -0
  297. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/__init__.py +0 -0
  298. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/metaschema.json +0 -0
  299. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/__init__.py +0 -0
  300. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/applicator.json +0 -0
  301. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/content.json +0 -0
  302. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/core.json +0 -0
  303. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format-annotation.json +0 -0
  304. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format-assertion.json +0 -0
  305. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/format.json +0 -0
  306. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/meta-data.json +0 -0
  307. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/unevaluated.json +0 -0
  308. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/schemas/draft202012/vocabularies/validation.json +0 -0
  309. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/jsonschema/types.py +0 -0
  310. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/openapi/__init__.py +0 -0
  311. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/openapi/marshal.py +0 -0
  312. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/specs/openapi/openapi.py +0 -0
  313. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sql/__init__.py +0 -0
  314. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sql/_abc.py +0 -0
  315. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sql/alchemy/__init__.py +0 -0
  316. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sql/alchemy/asyncs.py +0 -0
  317. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sql/alchemy/duckdb.py +0 -0
  318. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sql/alchemy/exprs.py +0 -0
  319. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sql/alchemy/secrets.py +0 -0
  320. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sql/alchemy/sqlean.py +0 -0
  321. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sql/dbs.py +0 -0
  322. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sql/qualifiedname.py +0 -0
  323. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/sync.py +0 -0
  324. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/term.py +0 -0
  325. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/__init__.py +0 -0
  326. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/__init__.py +0 -0
  327. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/helpers.py +0 -0
  328. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/inject/__init__.py +0 -0
  329. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/inject/harness.py +0 -0
  330. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/marks.py +0 -0
  331. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/__init__.py +0 -0
  332. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/_registry.py +0 -0
  333. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/asyncs.py +0 -0
  334. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/depskip.py +0 -0
  335. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/logging.py +0 -0
  336. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/managermarks.py +0 -0
  337. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/pydevd.py +0 -0
  338. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/repeat.py +0 -0
  339. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/skips.py +0 -0
  340. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/spacing.py +0 -0
  341. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/switches.py +0 -0
  342. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/plugins/utils.py +0 -0
  343. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/pytest/skip.py +0 -0
  344. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/testing/testing.py +0 -0
  345. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/text/__init__.py +0 -0
  346. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/text/asdl.py +0 -0
  347. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/text/delimit.py +0 -0
  348. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/text/glyphsplit.py +0 -0
  349. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/text/indent.py +0 -0
  350. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish/text/parts.py +0 -0
  351. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish.egg-info/dependency_links.txt +0 -0
  352. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish.egg-info/entry_points.txt +0 -0
  353. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish.egg-info/requires.txt +0 -0
  354. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/omlish.egg-info/top_level.txt +0 -0
  355. {omlish-0.0.0.dev47 → omlish-0.0.0.dev48}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev47
3
+ Version: 0.0.0.dev48
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev47'
2
- __revision__ = 'f28331ec54caff2de81847ec3e299466513a08f7'
1
+ __version__ = '0.0.0.dev48'
2
+ __revision__ = 'f7465912309f3de0889d4c1fbf3df1abe229e4c1'
3
3
 
4
4
 
5
5
  #
@@ -38,8 +38,7 @@ from .base import SimpleBootstrap
38
38
 
39
39
  BOOTSTRAP_TYPES_BY_NAME: ta.Mapping[str, ta.Type[Bootstrap]] = { # noqa
40
40
  lang.snake_case(cls.__name__[:-len('Bootstrap')]): cls
41
- for cls in lang.deep_subclasses(Bootstrap)
42
- if not lang.is_abstract_class(cls)
41
+ for cls in lang.deep_subclasses(Bootstrap, concrete_only=True)
43
42
  }
44
43
 
45
44
  BOOTSTRAP_TYPES_BY_CONFIG_TYPE: ta.Mapping[ta.Type[Bootstrap.Config], ta.Type[Bootstrap]] = {
@@ -2,6 +2,8 @@ import types
2
2
  import typing as ta
3
3
  import weakref
4
4
 
5
+ from .classes.abstract import is_abstract_class
6
+
5
7
 
6
8
  T = ta.TypeVar('T')
7
9
 
@@ -85,7 +87,7 @@ def super_meta(
85
87
  ##
86
88
 
87
89
 
88
- def deep_subclasses(cls: type) -> ta.Iterator[type]:
90
+ def deep_subclasses(cls: type, *, concrete_only: bool = False) -> ta.Iterator[type]:
89
91
  seen = set()
90
92
  todo = list(reversed(cls.__subclasses__()))
91
93
  while todo:
@@ -93,7 +95,8 @@ def deep_subclasses(cls: type) -> ta.Iterator[type]:
93
95
  if cur in seen:
94
96
  continue
95
97
  seen.add(cur)
96
- yield cur
98
+ if not (concrete_only and is_abstract_class(cur)):
99
+ yield cur
97
100
  todo.extend(reversed(cur.__subclasses__()))
98
101
 
99
102
 
@@ -0,0 +1,41 @@
1
+ """
2
+ TODO:
3
+ - @omlish-lite
4
+
5
+ Applied:
6
+ https://github.com/jmespath-community/python-jmespath/compare/bbe7300c60056f52413603cf3e2bcd0b6afeda3d...aef45e9d665de662eee31b06aeb8261e2bc8b90a
7
+
8
+ From community:
9
+ - JEP-11 Lexical Scoping - https://github.com/jmespath-community/jmespath.spec/discussions/24#discussioncomment-3285710
10
+ - JEP-11a Lexical Scoping deprecates the let function.
11
+ - JEP-13 Object Manipulation functions - https://github.com/jmespath-community/jmespath.spec/discussions/47#discussioncomment-3308897
12
+ - JEP-14 String functions - https://github.com/jmespath-community/jmespath.spec/discussions/21#discussioncomment-3869583
13
+ - JEP-15 String Slices - https://github.com/jmespath-community/jmespath.spec/discussions/26#discussioncomment-3284127
14
+ - JEP-16 Arithmetic Expressions - https://github.com/jmespath-community/jmespath.spec/discussions/25#discussioncomment-3277652
15
+ - JEP-17 Root Reference - https://github.com/jmespath-community/jmespath.spec/discussions/18#discussion-3913993
16
+ - JEP-18 Grouping - https://github.com/jmespath-community/jmespath.spec/discussions/96#discussion-4282156
17
+ - JEP-19 Evaluation of Pipe Expressions - https://github.com/jmespath-community/jmespath.spec/discussions/113#discussioncomment-4000862
18
+ - JEP-20 Compact syntax for multi-select-hash - https://github.com/jmespath-community/jmespath.spec/discussions/19
19
+
20
+ See:
21
+ - https://github.com/jmespath-community/jmespath.spec/tree/main
22
+ - https://github.com/jmespath-community/python-jmespath
23
+ - https://github.com/jmespath-community/jmespath.spec/discussions?discussions_q=label%3Ajep-candidate
24
+ - https://github.com/jmespath-community/jmespath.spec/discussions/97
25
+ """ # noqa
26
+ from . import exceptions # noqa
27
+ from . import functions # noqa
28
+ from . import lexer # noqa
29
+ from . import parser # noqa
30
+
31
+ from .parser import ( # noqa
32
+ compile,
33
+ search,
34
+ )
35
+
36
+ from .visitor import ( # noqa
37
+ Options,
38
+ )
39
+
40
+
41
+ __version__ = '1.0.1'
@@ -2,6 +2,18 @@
2
2
  # {'type': <node type>', children: [], 'value': ''}
3
3
 
4
4
 
5
+ def arithmetic_unary(operator, expression):
6
+ return {'type': 'arithmetic_unary', 'children': [expression], 'value': operator}
7
+
8
+
9
+ def arithmetic(operator, left, right):
10
+ return {'type': 'arithmetic', 'children': [left, right], 'value': operator}
11
+
12
+
13
+ def assign(name, expr):
14
+ return {'type': 'assign', 'children': [expr], 'value': name}
15
+
16
+
5
17
  def comparator(name, first, second):
6
18
  return {'type': 'comparator', 'children': [first, second], 'value': name}
7
19
 
@@ -10,6 +22,10 @@ def current_node():
10
22
  return {'type': 'current', 'children': []}
11
23
 
12
24
 
25
+ def root_node():
26
+ return {'type': 'root', 'children': []}
27
+
28
+
13
29
  def expref(expression):
14
30
  return {'type': 'expref', 'children': [expression]}
15
31
 
@@ -46,6 +62,10 @@ def key_val_pair(key_name, node):
46
62
  return {'type': 'key_val_pair', 'children': [node], 'value': key_name}
47
63
 
48
64
 
65
+ def let_expression(bindings, expr):
66
+ return {'type': 'let_expression', 'children': [*bindings, expr]}
67
+
68
+
49
69
  def literal(literal_value):
50
70
  return {'type': 'literal', 'value': literal_value, 'children': []}
51
71
 
@@ -88,3 +108,7 @@ def slice(start, end, step): # noqa
88
108
 
89
109
  def value_projection(left, right):
90
110
  return {'type': 'value_projection', 'children': [left, right]}
111
+
112
+
113
+ def variable_ref(name):
114
+ return {'type': 'variable_ref', 'children': [], 'value': name}
@@ -51,6 +51,10 @@ def _main():
51
51
  sys.stderr.write(f'invalid-type: {e}\n')
52
52
  return 1
53
53
 
54
+ except exceptions.JmespathValueError as e:
55
+ sys.stderr.write(f'invalid-value: {e}\n')
56
+ return 1
57
+
54
58
  except exceptions.UnknownFunctionError as e:
55
59
  sys.stderr.write(f'unknown-function: {e}\n')
56
60
  return 1
@@ -107,6 +107,24 @@ class JmespathTypeError(JmespathError):
107
107
  )
108
108
 
109
109
 
110
+ class JmespathValueError(JmespathError):
111
+ def __init__(
112
+ self,
113
+ function_name,
114
+ current_value,
115
+ expected_types,
116
+ ):
117
+ self.function_name = function_name
118
+ self.current_value = current_value
119
+ self.expected_types = expected_types
120
+
121
+ def __str__(self):
122
+ return (
123
+ f'In function {self.function_name}(), invalid value: "{self.current_value}", '
124
+ f'expected: {self.expected_types}'
125
+ )
126
+
127
+
110
128
  class EmptyExpressionError(JmespathError):
111
129
  def __init__(self):
112
130
  super().__init__('Invalid Jmespath expression: cannot be empty.')
@@ -114,3 +132,9 @@ class EmptyExpressionError(JmespathError):
114
132
 
115
133
  class UnknownFunctionError(JmespathError):
116
134
  pass
135
+
136
+
137
+ class UndefinedVariableError(JmespathError):
138
+ def __init__(self, varname):
139
+ self.varname = varname
140
+ super().__init__(f'Reference to undefined variable: {self.varname}')
@@ -83,18 +83,36 @@ class Functions(metaclass=FunctionRegistry):
83
83
  return function(self, *resolved_args)
84
84
 
85
85
  def _validate_arguments(self, args, signature, function_name):
86
- if signature and signature[-1].get('variadic'):
86
+
87
+ if len(signature) == 0:
88
+ return self._type_check(args, signature, function_name)
89
+
90
+ required_arguments_count = len([
91
+ param for param in signature if param and (not param.get('optional') or not param['optional'])
92
+ ])
93
+ optional_arguments_count = len([
94
+ param for param in signature if param and param.get('optional') and param['optional']
95
+ ])
96
+ has_variadic = signature[-1].get('variadic') if signature is not None else False
97
+
98
+ if has_variadic:
87
99
  if len(args) < len(signature):
88
100
  raise exceptions.VariadicArityError(len(signature), len(args), function_name)
89
101
 
90
- elif len(args) != len(signature):
102
+ elif optional_arguments_count > 0:
103
+ if (
104
+ len(args) < required_arguments_count or
105
+ len(args) > (required_arguments_count + optional_arguments_count)
106
+ ):
107
+ raise exceptions.ArityError(len(signature), len(args), function_name)
108
+ elif len(args) != required_arguments_count:
91
109
  raise exceptions.ArityError(len(signature), len(args), function_name)
92
110
 
93
111
  return self._type_check(args, signature, function_name)
94
112
 
95
113
  def _type_check(self, actual, signature, function_name):
96
- for i in range(len(signature)):
97
- allowed_types = signature[i]['types']
114
+ for i in range(min(len(signature), len(actual))):
115
+ allowed_types = self._get_allowed_types_from_signature(signature[i])
98
116
  if allowed_types:
99
117
  self._type_check_single(actual[i], allowed_types, function_name)
100
118
 
@@ -117,6 +135,12 @@ class Functions(metaclass=FunctionRegistry):
117
135
  if allowed_subtypes:
118
136
  self._subtype_check(current, allowed_subtypes, types, function_name)
119
137
 
138
+ def _get_allowed_types_from_signature(self, spec):
139
+ # signature supports monotype {'type': 'type-name'}## or multiple types {'types': ['type1-name', 'type2-name']}
140
+ if spec.get('type'):
141
+ spec.update({'types': [spec.get('type')]})
142
+ return spec.get('types')
143
+
120
144
  def _get_allowed_pytypes(self, types):
121
145
  allowed_types: list = []
122
146
  allowed_subtypes: list = []
@@ -161,6 +185,14 @@ class Functions(metaclass=FunctionRegistry):
161
185
  def _func_abs(self, arg):
162
186
  return abs(arg)
163
187
 
188
+ @signature({'types': ['string']})
189
+ def _func_lower(self, arg):
190
+ return arg.lower()
191
+
192
+ @signature({'types': ['string']})
193
+ def _func_upper(self, arg):
194
+ return arg.upper()
195
+
164
196
  @signature({'types': ['array-number']})
165
197
  def _func_avg(self, arg):
166
198
  if arg:
@@ -280,6 +312,14 @@ class Functions(metaclass=FunctionRegistry):
280
312
  def _func_sum(self, arg):
281
313
  return sum(arg)
282
314
 
315
+ @signature({'types': ['object']})
316
+ def _func_items(self, arg):
317
+ return [list(t) for t in arg.items()]
318
+
319
+ @signature({'types': ['array']})
320
+ def _func_from_items(self, items):
321
+ return dict(items)
322
+
283
323
  @signature({'types': ['object']})
284
324
  def _func_keys(self, arg):
285
325
  # To be consistent with .values() should we also return the indices of a list?
@@ -289,6 +329,169 @@ class Functions(metaclass=FunctionRegistry):
289
329
  def _func_values(self, arg):
290
330
  return list(arg.values())
291
331
 
332
+ @signature(
333
+ {'type': 'string'},
334
+ {'type': 'string'},
335
+ {'type': 'number', 'optional': True},
336
+ {'type': 'number', 'optional': True},
337
+ )
338
+ def _func_find_first(self, text, search, start=0, end=None):
339
+ self._ensure_integer('find_first', 'start', start)
340
+ self._ensure_integer('find_first', 'end', end)
341
+ return self._find_impl(
342
+ text,
343
+ search,
344
+ lambda t, s: t.find(s),
345
+ start,
346
+ end,
347
+ )
348
+
349
+ @signature(
350
+ {'type': 'string'},
351
+ {'type': 'string'},
352
+ {'type': 'number', 'optional': True},
353
+ {'type': 'number', 'optional': True})
354
+ def _func_find_last(self, text, search, start=0, end=None):
355
+ self._ensure_integer('find_last', 'start', start)
356
+ self._ensure_integer('find_last', 'end', end)
357
+ return self._find_impl(
358
+ text,
359
+ search,
360
+ lambda t, s: t.rfind(s),
361
+ start,
362
+ end,
363
+ )
364
+
365
+ def _find_impl(self, text, search, func, start, end):
366
+ if len(search) == 0:
367
+ return None
368
+ if end is None:
369
+ end = len(text)
370
+
371
+ pos = func(text[start:end], search)
372
+ if start < 0:
373
+ start = start + len(text)
374
+
375
+ # restrict resulting range to valid indices
376
+ start = min(max(start, 0), len(text))
377
+ return start + pos if pos != -1 else None
378
+
379
+ @signature(
380
+ {'type': 'string'},
381
+ {'type': 'number'},
382
+ {'type': 'string', 'optional': True},
383
+ )
384
+ def _func_pad_left(self, text, width, padding=' '):
385
+ self._ensure_non_negative_integer('pad_left', 'width', width)
386
+ return self._pad_impl(lambda: text.rjust(width, padding), padding)
387
+
388
+ @signature(
389
+ {'type': 'string'},
390
+ {'type': 'number'},
391
+ {'type': 'string', 'optional': True},
392
+ )
393
+ def _func_pad_right(self, text, width, padding=' '):
394
+ self._ensure_non_negative_integer('pad_right', 'width', width)
395
+ return self._pad_impl(lambda: text.ljust(width, padding), padding)
396
+
397
+ def _pad_impl(self, func, padding):
398
+ if len(padding) != 1:
399
+ raise exceptions.JmespathError(
400
+ f'syntax-error: pad_right() expects $padding to have a single character, but received '
401
+ f'`{padding}` instead.',
402
+ )
403
+ return func()
404
+
405
+ @signature(
406
+ {'type': 'string'},
407
+ {'type': 'string'},
408
+ {'type': 'string'},
409
+ {'type': 'number', 'optional': True},
410
+ )
411
+ def _func_replace(self, text, search, replacement, count=None):
412
+ self._ensure_non_negative_integer(
413
+ 'replace',
414
+ 'count',
415
+ count,
416
+ )
417
+
418
+ if count is not None:
419
+ return text.replace(search, replacement, int(count))
420
+
421
+ return text.replace(search, replacement)
422
+
423
+ @signature(
424
+ {'type': 'string'},
425
+ {'type': 'string'},
426
+ {'type': 'number', 'optional': True},
427
+ )
428
+ def _func_split(self, text, search, count=None):
429
+ self._ensure_non_negative_integer(
430
+ 'split',
431
+ 'count',
432
+ count,
433
+ )
434
+
435
+ if len(search) == 0:
436
+ chars = list(text)
437
+ if count is None:
438
+ return chars
439
+
440
+ head = list(chars[:count])
441
+ tail = [''.join(chars[count:])]
442
+ return head + tail
443
+
444
+ if count is not None:
445
+ return text.split(search, count)
446
+
447
+ return text.split(search)
448
+
449
+ def _ensure_integer(
450
+ self,
451
+ func_name,
452
+ param_name,
453
+ param_value,
454
+ ):
455
+ if param_value is not None:
456
+ if int(param_value) != param_value:
457
+ raise exceptions.JmespathValueError(
458
+ func_name,
459
+ param_value,
460
+ 'integer',
461
+ )
462
+
463
+ def _ensure_non_negative_integer(
464
+ self,
465
+ func_name,
466
+ param_name,
467
+ param_value,
468
+ ):
469
+ if param_value is not None:
470
+ if int(param_value) != param_value or int(param_value) < 0:
471
+ raise exceptions.JmespathValueError(
472
+ func_name,
473
+ param_name,
474
+ 'non-negative integer',
475
+ )
476
+
477
+ @signature({'type': 'string'}, {'type': 'string', 'optional': True})
478
+ def _func_trim(self, text, chars=None):
479
+ if chars is None or len(chars) == 0:
480
+ return text.strip()
481
+ return text.strip(chars)
482
+
483
+ @signature({'type': 'string'}, {'type': 'string', 'optional': True})
484
+ def _func_trim_left(self, text, chars=None):
485
+ if chars is None or len(chars) == 0:
486
+ return text.lstrip()
487
+ return text.lstrip(chars)
488
+
489
+ @signature({'type': 'string'}, {'type': 'string', 'optional': True})
490
+ def _func_trim_right(self, text, chars=None):
491
+ if chars is None or len(chars) == 0:
492
+ return text.rstrip()
493
+ return text.rstrip(chars)
494
+
292
495
  @signature({'types': []})
293
496
  def _func_type(self, arg):
294
497
  if isinstance(arg, str):
@@ -310,6 +513,7 @@ class Functions(metaclass=FunctionRegistry):
310
513
  def _func_sort_by(self, array, expref):
311
514
  if not array:
312
515
  return array
516
+
313
517
  # sort_by allows for the expref to be either a number of a string, so we have some special logic to handle this.
314
518
  # We evaluate the first array element and verify that it's either a string of a number. We then create a key
315
519
  # function that validates that type, which requires that remaining array elements resolve to the same type as
@@ -324,7 +528,6 @@ class Functions(metaclass=FunctionRegistry):
324
528
  )
325
529
 
326
530
  keyfunc = self._create_key_func(expref, [required_type], 'sort_by')
327
-
328
531
  return sorted(array, key=keyfunc)
329
532
 
330
533
  @signature({'types': ['array']}, {'types': ['expref']})
@@ -353,13 +556,31 @@ class Functions(metaclass=FunctionRegistry):
353
556
  else:
354
557
  return None
355
558
 
559
+ @signature({'types': ['array'], 'variadic': True})
560
+ def _func_zip(self, *arguments):
561
+ return [list(t) for t in zip(*arguments)]
562
+
563
+ @signature({'types': ['array']}, {'types': ['expref']})
564
+ def _func_group_by(self, array, expref):
565
+ keyfunc = self._create_key_func(expref, ['null', 'string'], 'group_by')
566
+ if not array:
567
+ return None
568
+
569
+ result = {}
570
+ keys = list(dict.fromkeys([keyfunc(item) for item in array if keyfunc(item) is not None]))
571
+ for key in keys:
572
+ items = [item for item in array if keyfunc(item) == key]
573
+ result.update({key: items})
574
+
575
+ return result
576
+
356
577
  def _create_key_func(self, expref, allowed_types, function_name):
357
578
  def keyfunc(x):
358
579
  result = expref.visit(expref.expression, x)
359
580
  actual_typename = type(result).__name__
360
581
 
361
582
  jmespath_type = self._convert_to_jmespath_type(actual_typename)
362
- # allowed_types is in term of jmespath types, not python types.
583
+ # allowed_types is in terms of jmespath types, not python types.
363
584
  if jmespath_type not in allowed_types:
364
585
  raise exceptions.JmespathTypeError(
365
586
  function_name, result, jmespath_type, allowed_types)