omlish 0.0.0.dev423__py3-none-any.whl → 0.0.0.dev484__py3-none-any.whl

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.

Potentially problematic release.


This version of omlish might be problematic. Click here for more details.

Files changed (464) hide show
  1. omlish/{.manifests.json → .omlish-manifests.json} +12 -0
  2. omlish/__about__.py +21 -18
  3. omlish/argparse/all.py +17 -9
  4. omlish/argparse/cli.py +16 -3
  5. omlish/argparse/utils.py +21 -0
  6. omlish/asyncs/all.py +0 -13
  7. omlish/asyncs/asyncio/rlock.py +110 -0
  8. omlish/asyncs/asyncio/subprocesses.py +2 -2
  9. omlish/asyncs/asyncio/sync.py +43 -0
  10. omlish/asyncs/asyncio/utils.py +2 -0
  11. omlish/asyncs/ioproxy/proxy.py +1 -1
  12. omlish/asyncs/sync.py +25 -0
  13. omlish/bootstrap/_marshal.py +1 -1
  14. omlish/bootstrap/diag.py +12 -21
  15. omlish/bootstrap/main.py +2 -5
  16. omlish/bootstrap/sys.py +27 -28
  17. omlish/c3.py +4 -1
  18. omlish/cexts/include/omlish/omlish.hh +1 -0
  19. omlish/collections/__init__.py +13 -1
  20. omlish/collections/attrregistry.py +210 -0
  21. omlish/collections/cache/impl.py +3 -2
  22. omlish/collections/identity.py +1 -0
  23. omlish/collections/mappings.py +28 -0
  24. omlish/collections/trie.py +5 -1
  25. omlish/collections/utils.py +77 -0
  26. omlish/concurrent/__init__.py +0 -11
  27. omlish/concurrent/all.py +18 -0
  28. omlish/concurrent/futures.py +25 -0
  29. omlish/concurrent/threadlets.py +1 -1
  30. omlish/configs/processing/flattening.py +1 -1
  31. omlish/configs/processing/merging.py +8 -6
  32. omlish/configs/types.py +1 -1
  33. omlish/daemons/__init__.py +70 -0
  34. omlish/daemons/daemon.py +2 -2
  35. omlish/daemons/launching.py +2 -2
  36. omlish/daemons/reparent.py +2 -3
  37. omlish/daemons/spawning.py +2 -3
  38. omlish/dataclasses/__init__.py +5 -5
  39. omlish/dataclasses/errors.py +1 -1
  40. omlish/dataclasses/impl/api/classes/decorator.py +3 -0
  41. omlish/dataclasses/impl/api/classes/make.py +4 -1
  42. omlish/dataclasses/impl/concerns/doc.py +1 -1
  43. omlish/dataclasses/impl/concerns/repr.py +15 -2
  44. omlish/dataclasses/impl/configs.py +97 -36
  45. omlish/dataclasses/impl/generation/compilation.py +21 -19
  46. omlish/dataclasses/impl/generation/globals.py +1 -0
  47. omlish/dataclasses/impl/generation/ops.py +1 -0
  48. omlish/dataclasses/impl/generation/processor.py +105 -24
  49. omlish/dataclasses/impl/processing/base.py +8 -0
  50. omlish/dataclasses/impl/processing/driving.py +8 -8
  51. omlish/dataclasses/specs.py +34 -2
  52. omlish/dataclasses/tools/as_.py +0 -12
  53. omlish/dataclasses/tools/modifiers.py +5 -0
  54. omlish/dataclasses/tools/static.py +1 -1
  55. omlish/diag/_pycharm/runhack.py +1 -1
  56. omlish/diag/{lslocks.py → cmds/lslocks.py} +6 -6
  57. omlish/diag/{lsof.py → cmds/lsof.py} +6 -6
  58. omlish/diag/{ps.py → cmds/ps.py} +6 -6
  59. omlish/diag/procfs.py +4 -4
  60. omlish/diag/pycharm.py +16 -2
  61. omlish/diag/pydevd.py +58 -40
  62. omlish/diag/replserver/console.py +3 -3
  63. omlish/diag/replserver/server.py +2 -2
  64. omlish/dispatch/__init__.py +18 -12
  65. omlish/dispatch/methods.py +50 -140
  66. omlish/dom/rendering.py +1 -1
  67. omlish/formats/dotenv.py +8 -8
  68. omlish/formats/json/stream/__init__.py +18 -3
  69. omlish/formats/json/stream/building.py +2 -2
  70. omlish/formats/json/stream/lexing.py +401 -67
  71. omlish/formats/json/stream/parsing.py +32 -10
  72. omlish/formats/json/stream/rendering.py +6 -6
  73. omlish/formats/json/stream/utils.py +132 -30
  74. omlish/formats/json5/literals.py +7 -4
  75. omlish/formats/json5/parsing.py +33 -79
  76. omlish/formats/json5/stream.py +77 -0
  77. omlish/formats/logfmt.py +8 -2
  78. omlish/funcs/genmachine.py +2 -2
  79. omlish/funcs/guard.py +225 -0
  80. omlish/graphs/dot/rendering.py +1 -1
  81. omlish/http/all.py +122 -53
  82. omlish/http/asgi.py +2 -2
  83. omlish/http/clients/__init__.py +0 -34
  84. omlish/http/clients/asyncs.py +153 -0
  85. omlish/http/clients/base.py +63 -122
  86. omlish/http/clients/coro/sync.py +171 -0
  87. omlish/http/clients/default.py +209 -30
  88. omlish/http/clients/executor.py +56 -0
  89. omlish/http/clients/httpx.py +78 -13
  90. omlish/http/clients/middleware.py +181 -0
  91. omlish/http/clients/sync.py +151 -0
  92. omlish/http/clients/syncasync.py +49 -0
  93. omlish/http/clients/urllib.py +8 -5
  94. omlish/http/coro/client/{client.py → connection.py} +43 -37
  95. omlish/http/coro/client/headers.py +5 -5
  96. omlish/http/coro/client/response.py +37 -38
  97. omlish/http/coro/client/status.py +4 -4
  98. omlish/http/coro/{client/io.py → io.py} +19 -2
  99. omlish/http/coro/server/fdio.py +10 -9
  100. omlish/http/coro/server/server.py +14 -41
  101. omlish/http/coro/server/sockets.py +7 -6
  102. omlish/http/flasky/__init__.py +40 -0
  103. omlish/http/flasky/_compat.py +2 -0
  104. omlish/http/flasky/api.py +82 -0
  105. omlish/http/flasky/app.py +203 -0
  106. omlish/http/flasky/cvs.py +59 -0
  107. omlish/http/flasky/requests.py +20 -0
  108. omlish/http/flasky/responses.py +23 -0
  109. omlish/http/flasky/routes.py +23 -0
  110. omlish/http/flasky/types.py +15 -0
  111. omlish/http/handlers.py +3 -2
  112. omlish/http/headers.py +69 -35
  113. omlish/http/sse.py +1 -1
  114. omlish/http/urls.py +67 -0
  115. omlish/inject/__init__.py +173 -126
  116. omlish/inject/_dataclasses.py +4986 -0
  117. omlish/inject/binder.py +10 -49
  118. omlish/inject/elements.py +27 -0
  119. omlish/inject/{utils.py → helpers/constfn.py} +3 -3
  120. omlish/inject/{tags.py → helpers/id.py} +2 -2
  121. omlish/inject/helpers/multis.py +143 -0
  122. omlish/inject/helpers/wrappers.py +54 -0
  123. omlish/inject/impl/elements.py +52 -22
  124. omlish/inject/impl/injector.py +76 -49
  125. omlish/inject/impl/inspect.py +11 -1
  126. omlish/inject/impl/maysync.py +43 -0
  127. omlish/inject/impl/multis.py +10 -7
  128. omlish/inject/impl/privates.py +8 -8
  129. omlish/inject/impl/providers.py +23 -34
  130. omlish/inject/impl/providersmap.py +43 -0
  131. omlish/inject/impl/proxy.py +0 -2
  132. omlish/inject/impl/scopes.py +19 -23
  133. omlish/inject/impl/sync.py +41 -0
  134. omlish/inject/injector.py +37 -8
  135. omlish/inject/inspect.py +35 -0
  136. omlish/inject/listeners.py +4 -4
  137. omlish/inject/managed.py +54 -18
  138. omlish/inject/maysync.py +27 -0
  139. omlish/inject/multis.py +8 -0
  140. omlish/inject/overrides.py +3 -3
  141. omlish/inject/privates.py +6 -0
  142. omlish/inject/providers.py +8 -1
  143. omlish/inject/scopes.py +40 -12
  144. omlish/inject/sync.py +49 -0
  145. omlish/io/buffers.py +119 -1
  146. omlish/io/readers.py +29 -0
  147. omlish/iterators/__init__.py +28 -20
  148. omlish/iterators/transforms.py +204 -0
  149. omlish/lang/__init__.py +240 -129
  150. omlish/lang/_asyncs.cc +186 -0
  151. omlish/lang/asyncs.py +67 -43
  152. omlish/lang/{attrs.py → attrstorage.py} +15 -15
  153. omlish/lang/cached/property.py +2 -2
  154. omlish/lang/casing.py +11 -0
  155. omlish/lang/classes/bindable.py +2 -3
  156. omlish/lang/classes/restrict.py +8 -0
  157. omlish/lang/classes/simple.py +26 -4
  158. omlish/lang/collections.py +1 -1
  159. omlish/lang/contextmanagers.py +59 -9
  160. omlish/lang/functions.py +31 -33
  161. omlish/lang/imports/_capture.cc +103 -0
  162. omlish/lang/imports/capture.py +902 -0
  163. omlish/lang/imports/lazy.py +0 -25
  164. omlish/lang/imports/proxy.py +559 -0
  165. omlish/lang/iterables.py +2 -2
  166. omlish/lang/lazyglobals.py +49 -14
  167. omlish/lang/maybes.py +2 -1
  168. omlish/lang/maysync.py +2 -2
  169. omlish/lang/params.py +17 -0
  170. omlish/lang/recursion.py +0 -1
  171. omlish/lang/resources.py +1 -1
  172. omlish/lang/sequences.py +124 -0
  173. omlish/lifecycles/contextmanagers.py +1 -2
  174. omlish/lifecycles/controller.py +1 -2
  175. omlish/lite/abstract.py +54 -24
  176. omlish/lite/asyncs.py +146 -0
  177. omlish/lite/attrops.py +415 -0
  178. omlish/lite/cached.py +57 -1
  179. omlish/lite/contextmanagers.py +4 -4
  180. omlish/lite/dataclasses.py +55 -0
  181. omlish/lite/inject.py +5 -4
  182. omlish/lite/marshal.py +1 -0
  183. omlish/lite/maybes.py +10 -2
  184. omlish/lite/maysync.py +22 -5
  185. omlish/lite/pycharm.py +1 -1
  186. omlish/lite/strings.py +0 -7
  187. omlish/lite/timing.py +6 -3
  188. omlish/lite/typing.py +6 -0
  189. omlish/logs/_amalg.py +8 -0
  190. omlish/logs/all.py +59 -31
  191. omlish/logs/base.py +204 -0
  192. omlish/logs/contexts.py +171 -0
  193. omlish/logs/formatters.py +13 -0
  194. omlish/logs/infos.py +377 -0
  195. omlish/logs/levels.py +97 -0
  196. omlish/logs/modules.py +13 -0
  197. omlish/logs/protocols.py +32 -0
  198. omlish/logs/standard.py +20 -15
  199. omlish/logs/std/configs.py +29 -0
  200. omlish/logs/{filters.py → std/filters.py} +1 -1
  201. omlish/logs/std/formatters.py +25 -0
  202. omlish/logs/std/handlers.py +19 -0
  203. omlish/logs/{json.py → std/json.py} +2 -2
  204. omlish/logs/std/loggers.py +48 -0
  205. omlish/logs/{proxy.py → std/proxy.py} +3 -3
  206. omlish/logs/std/records.py +671 -0
  207. omlish/logs/typed/bindings.py +108 -37
  208. omlish/logs/typed/types.py +17 -1
  209. omlish/logs/typed/values.py +2 -2
  210. omlish/logs/utils.py +60 -4
  211. omlish/logs/warnings.py +8 -0
  212. omlish/manifests/loading.py +8 -1
  213. omlish/marshal/__init__.py +54 -22
  214. omlish/marshal/_dataclasses.py +2774 -0
  215. omlish/marshal/base/configs.py +12 -0
  216. omlish/marshal/base/contexts.py +36 -21
  217. omlish/marshal/base/funcs.py +8 -11
  218. omlish/marshal/base/options.py +8 -0
  219. omlish/marshal/base/registries.py +146 -44
  220. omlish/marshal/base/types.py +40 -16
  221. omlish/marshal/composite/iterables.py +33 -20
  222. omlish/marshal/composite/literals.py +20 -18
  223. omlish/marshal/composite/mappings.py +36 -23
  224. omlish/marshal/composite/maybes.py +29 -19
  225. omlish/marshal/composite/newtypes.py +16 -16
  226. omlish/marshal/composite/optionals.py +14 -14
  227. omlish/marshal/composite/special.py +15 -15
  228. omlish/marshal/composite/unions/literals.py +93 -0
  229. omlish/marshal/composite/unions/primitives.py +103 -0
  230. omlish/marshal/factories/invalidate.py +18 -68
  231. omlish/marshal/factories/method.py +26 -0
  232. omlish/marshal/factories/moduleimport/factories.py +22 -65
  233. omlish/marshal/factories/multi.py +13 -25
  234. omlish/marshal/factories/recursive.py +42 -56
  235. omlish/marshal/factories/typecache.py +29 -74
  236. omlish/marshal/factories/typemap.py +42 -43
  237. omlish/marshal/objects/dataclasses.py +129 -106
  238. omlish/marshal/objects/marshal.py +18 -14
  239. omlish/marshal/objects/namedtuples.py +48 -42
  240. omlish/marshal/objects/unmarshal.py +19 -15
  241. omlish/marshal/polymorphism/marshal.py +9 -11
  242. omlish/marshal/polymorphism/metadata.py +16 -5
  243. omlish/marshal/polymorphism/standard.py +13 -1
  244. omlish/marshal/polymorphism/unions.py +15 -105
  245. omlish/marshal/polymorphism/unmarshal.py +9 -10
  246. omlish/marshal/singular/enums.py +14 -18
  247. omlish/marshal/standard.py +10 -6
  248. omlish/marshal/trivial/any.py +1 -1
  249. omlish/marshal/trivial/forbidden.py +21 -26
  250. omlish/math/fixed.py +2 -2
  251. omlish/metadata.py +23 -1
  252. omlish/os/atomics.py +2 -2
  253. omlish/os/forkhooks.py +4 -0
  254. omlish/os/journald.py +3 -3
  255. omlish/os/pidfiles/pinning.py +2 -2
  256. omlish/reflect/ops.py +9 -0
  257. omlish/reflect/types.py +44 -8
  258. omlish/secrets/marshal.py +1 -1
  259. omlish/secrets/secrets.py +6 -3
  260. omlish/sockets/addresses.py +1 -1
  261. omlish/sockets/server/handlers.py +2 -2
  262. omlish/sockets/server/server.py +4 -3
  263. omlish/sockets/server/ssl.py +2 -2
  264. omlish/specs/jmespath/__init__.py +12 -3
  265. omlish/specs/jmespath/_dataclasses.py +2893 -0
  266. omlish/specs/jmespath/ast.py +1 -1
  267. omlish/specs/jsonrpc/__init__.py +13 -0
  268. omlish/specs/jsonrpc/_marshal.py +32 -23
  269. omlish/specs/jsonrpc/conns.py +10 -7
  270. omlish/specs/jsonschema/_marshal.py +1 -1
  271. omlish/specs/jsonschema/keywords/__init__.py +7 -0
  272. omlish/specs/jsonschema/keywords/_dataclasses.py +1644 -0
  273. omlish/specs/openapi/_marshal.py +31 -22
  274. omlish/sql/__init__.py +15 -20
  275. omlish/sql/{tabledefs/alchemy.py → alchemy/tabledefs.py} +2 -2
  276. omlish/sql/queries/_marshal.py +3 -3
  277. omlish/sql/queries/params.py +1 -1
  278. omlish/sql/queries/rendering.py +1 -1
  279. omlish/sql/tabledefs/_marshal.py +1 -1
  280. omlish/subprocesses/all.py +135 -0
  281. omlish/subprocesses/base.py +8 -3
  282. omlish/subprocesses/editor.py +1 -1
  283. omlish/sync.py +181 -20
  284. omlish/term/alt.py +60 -0
  285. omlish/term/confirm.py +8 -8
  286. omlish/term/pager.py +235 -0
  287. omlish/term/terminfo.py +935 -0
  288. omlish/term/termstate.py +67 -0
  289. omlish/term/vt100/terminal.py +0 -3
  290. omlish/testing/pytest/plugins/asyncs/fixtures.py +4 -1
  291. omlish/testing/pytest/plugins/skips.py +2 -5
  292. omlish/testing/unittest/main.py +3 -3
  293. omlish/text/docwrap/__init__.py +3 -0
  294. omlish/text/docwrap/__main__.py +11 -0
  295. omlish/text/docwrap/api.py +83 -0
  296. omlish/text/docwrap/cli.py +86 -0
  297. omlish/text/docwrap/groups.py +84 -0
  298. omlish/text/docwrap/lists.py +167 -0
  299. omlish/text/docwrap/parts.py +146 -0
  300. omlish/text/docwrap/reflowing.py +106 -0
  301. omlish/text/docwrap/rendering.py +151 -0
  302. omlish/text/docwrap/utils.py +11 -0
  303. omlish/text/docwrap/wrapping.py +59 -0
  304. omlish/text/filecache.py +2 -2
  305. omlish/text/lorem.py +6 -0
  306. omlish/text/parts.py +2 -2
  307. omlish/text/textwrap.py +51 -0
  308. omlish/typedvalues/__init__.py +1 -1
  309. omlish/typedvalues/marshal.py +85 -59
  310. omlish/typedvalues/values.py +2 -1
  311. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/METADATA +36 -38
  312. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/RECORD +323 -385
  313. omlish/asyncs/bluelet/LICENSE +0 -6
  314. omlish/asyncs/bluelet/all.py +0 -67
  315. omlish/asyncs/bluelet/api.py +0 -23
  316. omlish/asyncs/bluelet/core.py +0 -178
  317. omlish/asyncs/bluelet/events.py +0 -79
  318. omlish/asyncs/bluelet/files.py +0 -80
  319. omlish/asyncs/bluelet/runner.py +0 -417
  320. omlish/asyncs/bluelet/sockets.py +0 -216
  321. omlish/asyncs/bridge.py +0 -359
  322. omlish/asyncs/utils.py +0 -18
  323. omlish/dataclasses/impl/generation/mangling.py +0 -18
  324. omlish/defs.py +0 -216
  325. omlish/dispatch/_dispatch2.py +0 -69
  326. omlish/dispatch/_dispatch3.py +0 -108
  327. omlish/dynamic.py +0 -219
  328. omlish/formats/json/Json.g4 +0 -77
  329. omlish/formats/json/_antlr/JsonLexer.py +0 -109
  330. omlish/formats/json/_antlr/JsonListener.py +0 -61
  331. omlish/formats/json/_antlr/JsonParser.py +0 -457
  332. omlish/formats/json/_antlr/JsonVisitor.py +0 -42
  333. omlish/formats/json5/Json5.g4 +0 -168
  334. omlish/formats/json5/_antlr/Json5Lexer.py +0 -354
  335. omlish/formats/json5/_antlr/Json5Listener.py +0 -79
  336. omlish/formats/json5/_antlr/Json5Parser.py +0 -617
  337. omlish/formats/json5/_antlr/Json5Visitor.py +0 -52
  338. omlish/funcs/match.py +0 -227
  339. omlish/io/trampoline.py +0 -289
  340. omlish/lang/imports/proxyinit.py +0 -665
  341. omlish/lite/logs.py +0 -4
  342. omlish/lite/reprs.py +0 -85
  343. omlish/logs/abc.py +0 -319
  344. omlish/logs/callers.py +0 -67
  345. omlish/logs/color.py +0 -27
  346. omlish/logs/configs.py +0 -29
  347. omlish/logs/handlers.py +0 -17
  348. omlish/logs/protocol.py +0 -218
  349. omlish/logs/timing.py +0 -58
  350. omlish/marshal/factories/match.py +0 -34
  351. omlish/marshal/factories/simple.py +0 -28
  352. omlish/specs/irc/messages/base.py +0 -49
  353. omlish/specs/irc/messages/formats.py +0 -92
  354. omlish/specs/irc/messages/messages.py +0 -774
  355. omlish/specs/irc/messages/parsing.py +0 -98
  356. omlish/specs/irc/numerics/formats.py +0 -97
  357. omlish/specs/irc/numerics/numerics.py +0 -865
  358. omlish/specs/irc/numerics/types.py +0 -59
  359. omlish/specs/irc/protocol/LICENSE +0 -11
  360. omlish/specs/irc/protocol/__init__.py +0 -61
  361. omlish/specs/irc/protocol/consts.py +0 -6
  362. omlish/specs/irc/protocol/errors.py +0 -30
  363. omlish/specs/irc/protocol/message.py +0 -21
  364. omlish/specs/irc/protocol/nuh.py +0 -55
  365. omlish/specs/irc/protocol/parsing.py +0 -158
  366. omlish/specs/irc/protocol/rendering.py +0 -153
  367. omlish/specs/irc/protocol/tags.py +0 -102
  368. omlish/specs/irc/protocol/utils.py +0 -30
  369. omlish/specs/proto/Protobuf3.g4 +0 -396
  370. omlish/specs/proto/__init__.py +0 -0
  371. omlish/specs/proto/_antlr/Protobuf3Lexer.py +0 -340
  372. omlish/specs/proto/_antlr/Protobuf3Listener.py +0 -448
  373. omlish/specs/proto/_antlr/Protobuf3Parser.py +0 -3909
  374. omlish/specs/proto/_antlr/Protobuf3Visitor.py +0 -257
  375. omlish/specs/proto/_antlr/__init__.py +0 -0
  376. omlish/specs/proto/nodes.py +0 -54
  377. omlish/specs/proto/parsing.py +0 -97
  378. omlish/sql/parsing/Minisql.g4 +0 -292
  379. omlish/sql/parsing/__init__.py +0 -0
  380. omlish/sql/parsing/_antlr/MinisqlLexer.py +0 -322
  381. omlish/sql/parsing/_antlr/MinisqlListener.py +0 -511
  382. omlish/sql/parsing/_antlr/MinisqlParser.py +0 -3763
  383. omlish/sql/parsing/_antlr/MinisqlVisitor.py +0 -292
  384. omlish/sql/parsing/_antlr/__init__.py +0 -0
  385. omlish/sql/parsing/parsing.py +0 -119
  386. omlish/text/antlr/__init__.py +0 -3
  387. omlish/text/antlr/_runtime/BufferedTokenStream.py +0 -305
  388. omlish/text/antlr/_runtime/CommonTokenFactory.py +0 -64
  389. omlish/text/antlr/_runtime/CommonTokenStream.py +0 -90
  390. omlish/text/antlr/_runtime/FileStream.py +0 -30
  391. omlish/text/antlr/_runtime/InputStream.py +0 -90
  392. omlish/text/antlr/_runtime/IntervalSet.py +0 -183
  393. omlish/text/antlr/_runtime/LICENSE.txt +0 -28
  394. omlish/text/antlr/_runtime/LL1Analyzer.py +0 -176
  395. omlish/text/antlr/_runtime/Lexer.py +0 -332
  396. omlish/text/antlr/_runtime/ListTokenSource.py +0 -147
  397. omlish/text/antlr/_runtime/Parser.py +0 -583
  398. omlish/text/antlr/_runtime/ParserInterpreter.py +0 -173
  399. omlish/text/antlr/_runtime/ParserRuleContext.py +0 -189
  400. omlish/text/antlr/_runtime/PredictionContext.py +0 -632
  401. omlish/text/antlr/_runtime/Recognizer.py +0 -150
  402. omlish/text/antlr/_runtime/RuleContext.py +0 -230
  403. omlish/text/antlr/_runtime/StdinStream.py +0 -14
  404. omlish/text/antlr/_runtime/Token.py +0 -158
  405. omlish/text/antlr/_runtime/TokenStreamRewriter.py +0 -258
  406. omlish/text/antlr/_runtime/Utils.py +0 -36
  407. omlish/text/antlr/_runtime/__init__.py +0 -2
  408. omlish/text/antlr/_runtime/_all.py +0 -24
  409. omlish/text/antlr/_runtime/_pygrun.py +0 -174
  410. omlish/text/antlr/_runtime/atn/ATN.py +0 -135
  411. omlish/text/antlr/_runtime/atn/ATNConfig.py +0 -162
  412. omlish/text/antlr/_runtime/atn/ATNConfigSet.py +0 -215
  413. omlish/text/antlr/_runtime/atn/ATNDeserializationOptions.py +0 -27
  414. omlish/text/antlr/_runtime/atn/ATNDeserializer.py +0 -449
  415. omlish/text/antlr/_runtime/atn/ATNSimulator.py +0 -50
  416. omlish/text/antlr/_runtime/atn/ATNState.py +0 -267
  417. omlish/text/antlr/_runtime/atn/ATNType.py +0 -20
  418. omlish/text/antlr/_runtime/atn/LexerATNSimulator.py +0 -573
  419. omlish/text/antlr/_runtime/atn/LexerAction.py +0 -301
  420. omlish/text/antlr/_runtime/atn/LexerActionExecutor.py +0 -146
  421. omlish/text/antlr/_runtime/atn/ParserATNSimulator.py +0 -1664
  422. omlish/text/antlr/_runtime/atn/PredictionMode.py +0 -502
  423. omlish/text/antlr/_runtime/atn/SemanticContext.py +0 -333
  424. omlish/text/antlr/_runtime/atn/Transition.py +0 -271
  425. omlish/text/antlr/_runtime/atn/__init__.py +0 -4
  426. omlish/text/antlr/_runtime/dfa/DFA.py +0 -136
  427. omlish/text/antlr/_runtime/dfa/DFASerializer.py +0 -76
  428. omlish/text/antlr/_runtime/dfa/DFAState.py +0 -129
  429. omlish/text/antlr/_runtime/dfa/__init__.py +0 -4
  430. omlish/text/antlr/_runtime/error/DiagnosticErrorListener.py +0 -111
  431. omlish/text/antlr/_runtime/error/ErrorListener.py +0 -75
  432. omlish/text/antlr/_runtime/error/ErrorStrategy.py +0 -712
  433. omlish/text/antlr/_runtime/error/Errors.py +0 -176
  434. omlish/text/antlr/_runtime/error/__init__.py +0 -4
  435. omlish/text/antlr/_runtime/tree/Chunk.py +0 -33
  436. omlish/text/antlr/_runtime/tree/ParseTreeMatch.py +0 -121
  437. omlish/text/antlr/_runtime/tree/ParseTreePattern.py +0 -75
  438. omlish/text/antlr/_runtime/tree/ParseTreePatternMatcher.py +0 -377
  439. omlish/text/antlr/_runtime/tree/RuleTagToken.py +0 -53
  440. omlish/text/antlr/_runtime/tree/TokenTagToken.py +0 -50
  441. omlish/text/antlr/_runtime/tree/Tree.py +0 -194
  442. omlish/text/antlr/_runtime/tree/Trees.py +0 -114
  443. omlish/text/antlr/_runtime/tree/__init__.py +0 -2
  444. omlish/text/antlr/_runtime/xpath/XPath.py +0 -278
  445. omlish/text/antlr/_runtime/xpath/XPathLexer.py +0 -98
  446. omlish/text/antlr/_runtime/xpath/__init__.py +0 -4
  447. omlish/text/antlr/delimit.py +0 -109
  448. omlish/text/antlr/dot.py +0 -41
  449. omlish/text/antlr/errors.py +0 -14
  450. omlish/text/antlr/input.py +0 -96
  451. omlish/text/antlr/parsing.py +0 -54
  452. omlish/text/antlr/runtime.py +0 -102
  453. omlish/text/antlr/utils.py +0 -38
  454. /omlish/{asyncs/bluelet → cexts}/__init__.py +0 -0
  455. /omlish/{formats/json/_antlr → diag/cmds}/__init__.py +0 -0
  456. /omlish/{formats/json5/_antlr → http/clients/coro}/__init__.py +0 -0
  457. /omlish/{specs/irc → inject/helpers}/__init__.py +0 -0
  458. /omlish/{specs/irc/messages → logs/std}/__init__.py +0 -0
  459. /omlish/logs/{noisy.py → std/noisy.py} +0 -0
  460. /omlish/{specs/irc/numerics → marshal/composite/unions}/__init__.py +0 -0
  461. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/WHEEL +0 -0
  462. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/entry_points.txt +0 -0
  463. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/licenses/LICENSE +0 -0
  464. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/top_level.txt +0 -0
@@ -17,7 +17,7 @@ from ..elements import Elements
17
17
  from ..elements import as_elements
18
18
  from ..errors import ScopeAlreadyOpenError
19
19
  from ..errors import ScopeNotOpenError
20
- from ..injector import Injector
20
+ from ..injector import AsyncInjector
21
21
  from ..keys import Key
22
22
  from ..providers import FnProvider
23
23
  from ..providers import Provider
@@ -28,14 +28,13 @@ from ..scopes import ThreadScope
28
28
  from ..types import Scope
29
29
  from ..types import Unscoped
30
30
  from .bindings import BindingImpl
31
- from .providers import PROVIDER_IMPLS_BY_PROVIDER
32
31
  from .providers import ProviderImpl
33
32
 
34
33
 
35
34
  if ta.TYPE_CHECKING:
36
- from . import injector as injector_
35
+ from . import injector as _injector
37
36
  else:
38
- injector_ = lang.proxy_import('.injector', __package__)
37
+ _injector = lang.proxy_import('.injector', __package__)
39
38
 
40
39
 
41
40
  ##
@@ -51,7 +50,7 @@ class ScopeImpl(lang.Abstract):
51
50
  return None
52
51
 
53
52
  @abc.abstractmethod
54
- def provide(self, binding: BindingImpl, injector: Injector) -> ta.Any:
53
+ def provide(self, binding: BindingImpl, injector: AsyncInjector) -> ta.Awaitable[ta.Any]:
55
54
  raise NotImplementedError
56
55
 
57
56
 
@@ -60,8 +59,8 @@ class UnscopedScopeImpl(ScopeImpl, lang.Final):
60
59
  def scope(self) -> Unscoped:
61
60
  return Unscoped()
62
61
 
63
- def provide(self, binding: BindingImpl, injector: Injector) -> ta.Any:
64
- return binding.provider.provide(injector)
62
+ async def provide(self, binding: BindingImpl, injector: AsyncInjector) -> ta.Any:
63
+ return await binding.provider.provide(injector)
65
64
 
66
65
 
67
66
  class SingletonScopeImpl(ScopeImpl, lang.Final):
@@ -74,12 +73,12 @@ class SingletonScopeImpl(ScopeImpl, lang.Final):
74
73
  def scope(self) -> Singleton:
75
74
  return Singleton()
76
75
 
77
- def provide(self, binding: BindingImpl, injector: Injector) -> ta.Any:
76
+ async def provide(self, binding: BindingImpl, injector: AsyncInjector) -> ta.Any:
78
77
  try:
79
78
  return self._dct[binding]
80
79
  except KeyError:
81
80
  pass
82
- v = binding.provider.provide(injector)
81
+ v = await binding.provider.provide(injector)
83
82
  self._dct[binding] = v
84
83
  return v
85
84
 
@@ -94,7 +93,7 @@ class ThreadScopeImpl(ScopeImpl, lang.Final):
94
93
  def scope(self) -> ThreadScope:
95
94
  return ThreadScope()
96
95
 
97
- def provide(self, binding: BindingImpl, injector: Injector) -> ta.Any:
96
+ async def provide(self, binding: BindingImpl, injector: AsyncInjector) -> ta.Any:
98
97
  dct: dict[BindingImpl, ta.Any]
99
98
  try:
100
99
  dct = self._local.dct
@@ -104,7 +103,7 @@ class ThreadScopeImpl(ScopeImpl, lang.Final):
104
103
  return dct[binding]
105
104
  except KeyError:
106
105
  pass
107
- v = binding.provider.provide(injector)
106
+ v = await binding.provider.provide(injector)
108
107
  dct[binding] = v
109
108
  return v
110
109
 
@@ -120,15 +119,12 @@ class ScopeSeededProviderImpl(ProviderImpl):
120
119
  def providers(self) -> ta.Iterable[Provider]:
121
120
  return (self.p,)
122
121
 
123
- def provide(self, injector: Injector) -> ta.Any:
124
- ii = check.isinstance(injector, injector_.InjectorImpl)
122
+ async def provide(self, injector: AsyncInjector) -> ta.Any:
123
+ ii = check.isinstance(injector, _injector.AsyncInjectorImpl)
125
124
  ssi = check.isinstance(ii.get_scope_impl(self.p.ss), SeededScopeImpl)
126
125
  return ssi.must_state().seeds[self.p.key]
127
126
 
128
127
 
129
- PROVIDER_IMPLS_BY_PROVIDER[ScopeSeededProvider] = ScopeSeededProviderImpl
130
-
131
-
132
128
  class SeededScopeImpl(ScopeImpl):
133
129
  @dc.dataclass(frozen=True)
134
130
  class State:
@@ -151,20 +147,20 @@ class SeededScopeImpl(ScopeImpl):
151
147
  return st
152
148
 
153
149
  class Manager(SeededScope.Manager, lang.Final):
154
- def __init__(self, ss: SeededScope, i: Injector) -> None:
150
+ def __init__(self, ss: SeededScope, i: AsyncInjector) -> None:
155
151
  super().__init__()
156
152
 
157
153
  self._ss = check.isinstance(ss, SeededScope)
158
- self._ii = check.isinstance(i, injector_.InjectorImpl)
154
+ self._ii = check.isinstance(i, _injector.AsyncInjectorImpl)
159
155
  self._ssi = check.isinstance(self._ii.get_scope_impl(self._ss), SeededScopeImpl)
160
156
 
161
- @contextlib.contextmanager
162
- def __call__(self, seeds: ta.Mapping[Key, ta.Any]) -> ta.Generator[None]:
157
+ @contextlib.asynccontextmanager
158
+ async def __call__(self, seeds: ta.Mapping[Key, ta.Any]) -> ta.AsyncGenerator[None]:
163
159
  try:
164
160
  if self._ssi._st is not None: # noqa
165
161
  raise ScopeAlreadyOpenError(self._ss)
166
162
  self._ssi._st = SeededScopeImpl.State(dict(seeds)) # noqa
167
- self._ii._instantiate_eagers(self._ss) # noqa
163
+ await self._ii._instantiate_eagers(self._ss) # noqa
168
164
  yield
169
165
  finally:
170
166
  if self._ssi._st is None: # noqa
@@ -180,13 +176,13 @@ class SeededScopeImpl(ScopeImpl):
180
176
  ),
181
177
  )
182
178
 
183
- def provide(self, binding: BindingImpl, injector: Injector) -> ta.Any:
179
+ async def provide(self, binding: BindingImpl, injector: AsyncInjector) -> ta.Any:
184
180
  st = self.must_state()
185
181
  try:
186
182
  return st.prvs[binding]
187
183
  except KeyError:
188
184
  pass
189
- v = binding.provider.provide(injector)
185
+ v = await binding.provider.provide(injector)
190
186
  st.prvs[binding] = v
191
187
  return v
192
188
 
@@ -0,0 +1,41 @@
1
+ import typing as ta
2
+
3
+ from ... import lang
4
+ from ..elements import CollectedElements
5
+ from ..injector import AsyncInjector
6
+ from ..inspect import KwargsTarget
7
+ from ..keys import Key
8
+ from ..sync import Injector
9
+ from .injector import AsyncInjectorImpl
10
+
11
+
12
+ ##
13
+
14
+
15
+ class InjectorImpl(Injector, lang.Final):
16
+ _ai: AsyncInjector
17
+
18
+ def try_provide(self, key: ta.Any) -> lang.Maybe[ta.Any]:
19
+ return lang.sync_await(self._ai.try_provide(key))
20
+
21
+ def provide(self, key: ta.Any) -> ta.Any:
22
+ return lang.sync_await(self._ai.provide(key))
23
+
24
+ def provide_kwargs(self, kt: KwargsTarget) -> ta.Mapping[str, ta.Any]:
25
+ return lang.sync_await(self._ai.provide_kwargs(kt))
26
+
27
+ def inject(self, obj: ta.Any) -> ta.Any:
28
+ return lang.sync_await(self._ai.inject(obj))
29
+
30
+
31
+ def create_injector(ce: CollectedElements) -> Injector:
32
+ si = InjectorImpl()
33
+ ai = AsyncInjectorImpl(
34
+ ce,
35
+ internal_consts={
36
+ Key(Injector): si,
37
+ },
38
+ )
39
+ si._ai = ai # noqa
40
+ lang.sync_await(ai._init()) # noqa
41
+ return si
omlish/inject/injector.py CHANGED
@@ -1,9 +1,12 @@
1
1
  import abc
2
2
  import typing as ta
3
3
 
4
+ from .. import check
4
5
  from .. import lang
6
+ from .elements import CollectedElements
5
7
  from .elements import Elemental
6
8
  from .elements import as_elements
9
+ from .elements import collect_elements
7
10
  from .inspect import KwargsTarget
8
11
  from .keys import Key
9
12
 
@@ -20,29 +23,55 @@ T = ta.TypeVar('T')
20
23
  ##
21
24
 
22
25
 
23
- class Injector(lang.Abstract):
26
+ class AsyncInjector(lang.Abstract):
24
27
  @abc.abstractmethod
25
- def try_provide(self, key: ta.Any) -> lang.Maybe[ta.Any]:
28
+ def try_provide(self, key: ta.Any) -> ta.Awaitable[lang.Maybe[ta.Any]]:
26
29
  raise NotImplementedError
27
30
 
28
31
  @abc.abstractmethod
29
- def provide(self, key: ta.Any) -> ta.Any:
32
+ def provide(self, key: ta.Any) -> ta.Awaitable[ta.Any]:
30
33
  raise NotImplementedError
31
34
 
32
35
  @abc.abstractmethod
33
- def provide_kwargs(self, kt: KwargsTarget) -> ta.Mapping[str, ta.Any]:
36
+ def provide_kwargs(self, kt: KwargsTarget) -> ta.Awaitable[ta.Mapping[str, ta.Any]]:
34
37
  raise NotImplementedError
35
38
 
36
39
  @abc.abstractmethod
37
- def inject(self, obj: ta.Any) -> ta.Any:
40
+ def inject(self, obj: ta.Any) -> ta.Awaitable[ta.Any]:
38
41
  raise NotImplementedError
39
42
 
40
43
  def __getitem__(
41
44
  self,
42
45
  target: Key[T] | type[T],
43
- ) -> T:
46
+ ) -> ta.Awaitable[T]:
44
47
  return self.provide(target)
45
48
 
46
49
 
47
- def create_injector(*args: Elemental) -> Injector:
48
- return _injector.create_injector(as_elements(*args))
50
+ ##
51
+
52
+
53
+ @ta.final
54
+ class _InjectorCreator(ta.Generic[T]):
55
+ def __init__(self, fac: ta.Callable[[CollectedElements], T]) -> None:
56
+ self._fac = fac
57
+
58
+ @ta.overload
59
+ def __call__(self, es: CollectedElements, /) -> T: ...
60
+
61
+ @ta.overload
62
+ def __call__(self, *es: Elemental) -> T: ...
63
+
64
+ def __call__(self, arg0, *argv):
65
+ ce: CollectedElements
66
+ if isinstance(arg0, CollectedElements):
67
+ check.arg(not argv)
68
+ ce = arg0
69
+ else:
70
+ ce = collect_elements(as_elements(arg0, *argv))
71
+ return self._fac(ce)
72
+
73
+
74
+ ##
75
+
76
+
77
+ create_async_injector = _InjectorCreator[ta.Awaitable[AsyncInjector]](lambda ce: _injector.create_async_injector(ce))
omlish/inject/inspect.py CHANGED
@@ -2,6 +2,7 @@ import typing as ta
2
2
 
3
3
  from .. import lang
4
4
  from .keys import Key
5
+ from .keys import as_key
5
6
 
6
7
 
7
8
  if ta.TYPE_CHECKING:
@@ -21,11 +22,45 @@ class Kwarg(ta.NamedTuple):
21
22
  key: Key
22
23
  has_default: bool
23
24
 
25
+ @classmethod
26
+ def of(
27
+ cls,
28
+ name: str,
29
+ key: Key,
30
+ *,
31
+ has_default: bool = False,
32
+ ) -> 'Kwarg':
33
+ return cls(
34
+ name,
35
+ key,
36
+ has_default,
37
+ )
38
+
24
39
 
25
40
  class KwargsTarget(ta.NamedTuple):
26
41
  obj: ta.Any
27
42
  kwargs: ta.Sequence[Kwarg]
28
43
 
44
+ @classmethod
45
+ def of(
46
+ cls,
47
+ obj: ta.Any,
48
+ *kws: Kwarg,
49
+ **kwargs: tuple[Key, bool] | Key | ta.Any,
50
+ ) -> 'KwargsTarget':
51
+ kw_kwargs: list[Kwarg] = []
52
+ for n, v in kwargs.items():
53
+ if isinstance(v, tuple):
54
+ kw_k, kw_hd = v
55
+ kw_kwargs.append(Kwarg.of(n, kw_k, has_default=kw_hd))
56
+ else:
57
+ kw_kwargs.append(Kwarg.of(n, as_key(v)))
58
+
59
+ return cls(
60
+ obj,
61
+ [*kws, *kw_kwargs],
62
+ )
63
+
29
64
 
30
65
  def tag(obj: T, **kwargs: ta.Any) -> T:
31
66
  return _inspect.tag(obj, **kwargs)
@@ -4,7 +4,7 @@ from .. import dataclasses as dc
4
4
  from .. import lang
5
5
  from .bindings import Binding
6
6
  from .elements import Element
7
- from .injector import Injector
7
+ from .injector import AsyncInjector
8
8
  from .keys import Key
9
9
 
10
10
 
@@ -12,11 +12,11 @@ from .keys import Key
12
12
 
13
13
 
14
14
  ProvisionListener: ta.TypeAlias = ta.Callable[[
15
- Injector,
15
+ AsyncInjector,
16
16
  Key,
17
17
  Binding | None,
18
- ta.Callable[[], ta.Any],
19
- ], ta.Callable[[], ta.Any]]
18
+ ta.Callable[[], ta.Awaitable[ta.Any]],
19
+ ], ta.Awaitable[ta.Any]]
20
20
 
21
21
 
22
22
  @dc.dataclass(frozen=True)
omlish/inject/managed.py CHANGED
@@ -9,14 +9,16 @@ from .. import lang
9
9
  from .binder import bind
10
10
  from .elements import Elemental
11
11
  from .impl.inspect import build_kwargs_target
12
- from .injector import Injector
13
- from .injector import create_injector
14
12
 
15
13
 
16
14
  if ta.TYPE_CHECKING:
17
- from ..asyncs import all as _asyncs
15
+ from . import injector as _injector
16
+ from . import maysync as _maysync
17
+ from . import sync as _sync
18
18
  else:
19
- _asyncs = lang.proxy_import('..asyncs.all', __package__)
19
+ _injector = lang.proxy_import('.injector', __package__)
20
+ _maysync = lang.proxy_import('.maysync', __package__)
21
+ _sync = lang.proxy_import('.sync', __package__)
20
22
 
21
23
 
22
24
  T = ta.TypeVar('T')
@@ -25,9 +27,43 @@ T = ta.TypeVar('T')
25
27
  ##
26
28
 
27
29
 
30
+ @contextlib.asynccontextmanager
31
+ async def create_async_managed_injector(*args: Elemental) -> ta.AsyncGenerator['_injector.AsyncInjector']:
32
+ ai = await _injector.create_async_injector(
33
+ bind(contextlib.AsyncExitStack, singleton=True, eager=True),
34
+ *args,
35
+ )
36
+ async with (await ai[contextlib.AsyncExitStack]):
37
+ yield ai
38
+
39
+
40
+ def make_async_managed_provider(
41
+ fac: ta.Callable[..., T],
42
+ *fns: ta.Callable[[T], ta.AsyncContextManager[T]],
43
+ ) -> ta.Callable[..., ta.Awaitable[T]]:
44
+ kt = build_kwargs_target(fac)
45
+
46
+ async def _provide(
47
+ ai: _injector.AsyncInjector,
48
+ aes: contextlib.AsyncExitStack,
49
+ ):
50
+ obj = await ai.inject(kt)
51
+ if not fns:
52
+ obj = await aes.enter_async_context(obj)
53
+ else:
54
+ for fn in fns:
55
+ await aes.enter_async_context(fn(obj))
56
+ return obj
57
+
58
+ return _provide
59
+
60
+
61
+ ##
62
+
63
+
28
64
  @contextlib.contextmanager
29
- def create_managed_injector(*args: Elemental) -> ta.Generator[Injector]:
30
- i = create_injector(
65
+ def create_managed_injector(*args: Elemental) -> ta.Generator['_sync.Injector']:
66
+ i = _sync.create_injector(
31
67
  bind(contextlib.ExitStack, singleton=True, eager=True),
32
68
  *args,
33
69
  )
@@ -42,7 +78,7 @@ def make_managed_provider(
42
78
  kt = build_kwargs_target(fac)
43
79
 
44
80
  def _provide(
45
- i: Injector,
81
+ i: _sync.Injector,
46
82
  es: contextlib.ExitStack,
47
83
  ):
48
84
  obj = i.inject(kt)
@@ -59,32 +95,32 @@ def make_managed_provider(
59
95
  ##
60
96
 
61
97
 
62
- @contextlib.asynccontextmanager
63
- async def create_async_managed_injector(*args: Elemental) -> ta.AsyncGenerator[Injector]:
64
- i = await _asyncs.s_to_a(create_injector)(
65
- bind(contextlib.AsyncExitStack, singleton=True, eager=True),
98
+ @contextlib.contextmanager
99
+ def create_maysync_managed_injector(*args: Elemental) -> ta.Generator['_maysync.MaysyncInjector']:
100
+ i = _maysync.create_maysync_injector(
101
+ bind(contextlib.ExitStack, singleton=True, eager=True),
66
102
  *args,
67
103
  )
68
- async with i[contextlib.AsyncExitStack]:
104
+ with i[contextlib.ExitStack]:
69
105
  yield i
70
106
 
71
107
 
72
- def make_async_managed_provider(
108
+ def make_maysync_managed_provider(
73
109
  fac: ta.Callable[..., T],
74
- *fns: ta.Callable[[T], ta.AsyncContextManager[T]],
110
+ *fns: ta.Callable[[T], ta.ContextManager[T]],
75
111
  ) -> ta.Callable[..., T]:
76
112
  kt = build_kwargs_target(fac)
77
113
 
78
114
  def _provide(
79
- i: Injector,
80
- aes: contextlib.AsyncExitStack,
115
+ i: _maysync.MaysyncInjector,
116
+ es: contextlib.ExitStack,
81
117
  ):
82
118
  obj = i.inject(kt)
83
119
  if not fns:
84
- obj = _asyncs.a_to_s(aes.enter_async_context)(obj)
120
+ obj = es.enter_context(obj)
85
121
  else:
86
122
  for fn in fns:
87
- _asyncs.a_to_s(aes.enter_async_context)(fn(obj))
123
+ es.enter_context(fn(obj))
88
124
  return obj
89
125
 
90
126
  return _provide
@@ -0,0 +1,27 @@
1
+ import typing as ta
2
+
3
+ from .. import lang
4
+ from .injector import _InjectorCreator
5
+ from .sync import Injector
6
+
7
+
8
+ if ta.TYPE_CHECKING:
9
+ from .impl import maysync as _maysync
10
+ else:
11
+ _maysync = lang.proxy_import('.impl.maysync', __package__)
12
+
13
+
14
+ T = ta.TypeVar('T')
15
+
16
+
17
+ ##
18
+
19
+
20
+ class MaysyncInjector(Injector, lang.Abstract):
21
+ pass
22
+
23
+
24
+ ##
25
+
26
+
27
+ create_maysync_injector = _InjectorCreator[MaysyncInjector](lambda ce: _maysync.create_maysync_injector(ce))
omlish/inject/multis.py CHANGED
@@ -1,5 +1,7 @@
1
1
  """
2
2
  TODO:
3
+ - DynamicSetBinding / DynamicMapBinding ? provider of set[T] / map[K, V] ?
4
+ - doable not guicey - too much dynamism
3
5
  - scopes
4
6
  """
5
7
  import collections.abc
@@ -94,6 +96,9 @@ class SetBinder(ElementGenerator, ta.Generic[T]):
94
96
  yield from self._sbs
95
97
 
96
98
 
99
+ set_binder = SetBinder
100
+
101
+
97
102
  #
98
103
 
99
104
 
@@ -123,3 +128,6 @@ class MapBinder(ElementGenerator, ta.Generic[K, V]):
123
128
  def __iter__(self) -> ta.Iterator[Element]:
124
129
  yield self._map_provider_binding
125
130
  yield from self._mbs
131
+
132
+
133
+ map_binder = MapBinder
@@ -14,9 +14,9 @@ from .elements import as_elements
14
14
  @dc.dataclass(frozen=True)
15
15
  @dc.extra_class_params(cache_hash=True)
16
16
  class Overrides(Element, lang.Final):
17
- ovr: Elements = dc.xfield(coerce=check.of_isinstance(Elements))
18
17
  src: Elements = dc.xfield(coerce=check.of_isinstance(Elements))
18
+ ovr: Elements = dc.xfield(coerce=check.of_isinstance(Elements))
19
19
 
20
20
 
21
- def override(ovr: ta.Any, *a: ta.Any) -> Element:
22
- return Overrides(as_elements(ovr), as_elements(*a))
21
+ def override(src: ta.Any, *ovr: ta.Any) -> Element:
22
+ return Overrides(as_elements(src), as_elements(*ovr))
omlish/inject/privates.py CHANGED
@@ -18,6 +18,12 @@ class Expose(Element, lang.Final):
18
18
  key: Key = dc.xfield(coerce=as_key)
19
19
 
20
20
 
21
+ expose = Expose
22
+
23
+
24
+ #
25
+
26
+
21
27
  @dc.dataclass(frozen=True)
22
28
  @dc.extra_class_params(cache_hash=True)
23
29
  class Private(Element, lang.Final):
@@ -3,6 +3,7 @@ import typing as ta
3
3
  from .. import check
4
4
  from .. import dataclasses as dc
5
5
  from .. import lang
6
+ from .inspect import KwargsTarget
6
7
  from .keys import Key
7
8
 
8
9
 
@@ -17,10 +18,16 @@ class Provider(lang.Abstract):
17
18
  pass
18
19
 
19
20
 
21
+ @dc.dataclass(frozen=True)
22
+ @dc.extra_class_params(cache_hash=True)
23
+ class AsyncFnProvider(Provider):
24
+ fn: ta.Any = dc.xfield(validate=lambda v: callable(v) or isinstance(v, KwargsTarget))
25
+
26
+
20
27
  @dc.dataclass(frozen=True)
21
28
  @dc.extra_class_params(cache_hash=True)
22
29
  class FnProvider(Provider):
23
- fn: ta.Any = dc.xfield(validate=callable)
30
+ fn: ta.Any = dc.xfield(validate=lambda v: callable(v) or isinstance(v, KwargsTarget))
24
31
 
25
32
 
26
33
  @dc.dataclass(frozen=True)
omlish/inject/scopes.py CHANGED
@@ -5,9 +5,9 @@ import typing as ta
5
5
  from .. import check
6
6
  from .. import dataclasses as dc
7
7
  from .. import lang
8
- from .. import reflect as rfl
9
8
  from .bindings import Binding
10
9
  from .elements import Element
10
+ from .injector import AsyncInjector
11
11
  from .keys import Key
12
12
  from .keys import as_key
13
13
  from .providers import Provider
@@ -15,9 +15,13 @@ from .types import Scope
15
15
 
16
16
 
17
17
  if ta.TYPE_CHECKING:
18
- from . import injector as injector_
18
+ from . import injector as _injector
19
+ from . import maysync as _maysync
20
+ from . import sync as _sync
19
21
  else:
20
- injector_ = lang.proxy_import('.injector', __package__)
22
+ _injector = lang.proxy_import('.injector', __package__)
23
+ _maysync = lang.proxy_import('.maysync', __package__)
24
+ _sync = lang.proxy_import('.sync', __package__)
21
25
 
22
26
 
23
27
  ##
@@ -66,7 +70,7 @@ class SeededScope(Scope, lang.Final):
66
70
 
67
71
  class Manager(lang.Abstract):
68
72
  @abc.abstractmethod
69
- def __call__(self, seeds: ta.Mapping[Key, ta.Any]) -> ta.ContextManager[None]:
73
+ def __call__(self, seeds: ta.Mapping[Key, ta.Any]) -> ta.AsyncContextManager[None]:
70
74
  raise NotImplementedError
71
75
 
72
76
 
@@ -76,20 +80,44 @@ class ScopeSeededProvider(Provider):
76
80
  ss: SeededScope = dc.xfield(coerce=check.of_isinstance(SeededScope))
77
81
  key: Key = dc.xfield(coerce=check.of_isinstance(Key))
78
82
 
79
- def provided_ty(self) -> rfl.Type | None:
80
- return self.key.ty
81
-
82
83
 
83
84
  def bind_scope_seed(k: ta.Any, ss: SeededScope) -> Element:
84
85
  k = as_key(k)
85
86
  return Binding(k, ScopeSeededProvider(ss, k))
86
87
 
87
88
 
88
- @contextlib.contextmanager
89
- def enter_seeded_scope(
90
- i: injector_.Injector,
89
+ ##
90
+
91
+
92
+ @contextlib.asynccontextmanager
93
+ async def async_enter_seeded_scope(
94
+ i: '_injector.AsyncInjector',
91
95
  ss: SeededScope,
92
96
  keys: ta.Mapping[Key, ta.Any],
93
- ) -> ta.Generator[None]:
94
- with i.provide(Key(SeededScope.Manager, tag=ss))(keys):
97
+ ) -> ta.AsyncGenerator[None]:
98
+ async with (await i.provide(Key(SeededScope.Manager, tag=ss)))(keys):
95
99
  yield
100
+
101
+
102
+ def enter_seeded_scope(
103
+ i: '_sync.Injector',
104
+ ss: SeededScope,
105
+ keys: ta.Mapping[Key, ta.Any],
106
+ ) -> ta.ContextManager[None]:
107
+ return lang.run_maysync_context_manager(async_enter_seeded_scope(
108
+ i[AsyncInjector],
109
+ ss,
110
+ keys,
111
+ ))
112
+
113
+
114
+ def maysync_enter_seeded_scope(
115
+ i: '_maysync.MaysyncInjector',
116
+ ss: SeededScope,
117
+ keys: ta.Mapping[Key, ta.Any],
118
+ ) -> ta.ContextManager[None]:
119
+ return lang.sync_async_with(async_enter_seeded_scope(
120
+ i[AsyncInjector],
121
+ ss,
122
+ keys,
123
+ ))