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
@@ -2,36 +2,35 @@
2
2
  TODO:
3
3
  - ** can currently bind in a child/private scope shadowing an external parent binding **
4
4
  - better source tracking
5
- - cache/export ElementCollections lol
6
5
  - scope bindings, auto in root
7
6
  - injector-internal / blacklisted bindings (Injector itself, default scopes) without rebuilding ElementCollection
8
7
  - config - proxies, impl select, etc
9
8
  - config is probably shared with ElementCollection... but not 'bound', must be shared everywhere
10
9
  - InjectorRoot object?
11
10
  - ** eagers in any scope, on scope init/open
12
- - injection listeners
13
11
  - unions - raise on ambiguous - usecase: sql.AsyncEngineLike
14
12
  - multiple live request scopes on single injector - use private injectors?
13
+ - more listeners - UnboundKeyListener
14
+ - lazy parent listener chain cache thing
15
15
  """
16
16
  import contextlib
17
17
  import functools
18
18
  import itertools
19
- import logging
20
19
  import typing as ta
21
20
  import weakref
22
21
 
23
22
  from ... import check
24
23
  from ... import lang
25
- from ..elements import Elements
24
+ from ...logs import all as logs
25
+ from ..elements import CollectedElements
26
26
  from ..errors import CyclicDependencyError
27
27
  from ..errors import UnboundKeyError
28
- from ..injector import Injector
28
+ from ..injector import AsyncInjector
29
29
  from ..inspect import KwargsTarget
30
30
  from ..keys import Key
31
31
  from ..keys import as_key
32
32
  from ..listeners import ProvisionListener
33
33
  from ..listeners import ProvisionListenerBinding
34
- from ..scopes import ScopeBinding
35
34
  from ..scopes import Singleton
36
35
  from ..scopes import ThreadScope
37
36
  from ..types import Scope
@@ -42,7 +41,7 @@ from .scopes import ScopeImpl
42
41
  from .scopes import make_scope_impl
43
42
 
44
43
 
45
- log = logging.getLogger(__name__)
44
+ log = logs.get_module_logger(globals())
46
45
 
47
46
 
48
47
  ##
@@ -55,61 +54,84 @@ DEFAULT_SCOPES: list[Scope] = [
55
54
  ]
56
55
 
57
56
 
58
- class InjectorImpl(Injector, lang.Final):
59
- def __init__(self, ec: ElementCollection, p: ta.Optional['InjectorImpl'] = None) -> None:
60
- super().__init__()
61
-
62
- self._ec = check.isinstance(ec, ElementCollection)
63
- self._p: InjectorImpl | None = check.isinstance(p, (InjectorImpl, None))
57
+ @ta.final
58
+ class AsyncInjectorImpl(AsyncInjector, lang.Final):
59
+ def __init__(
60
+ self,
61
+ ec: CollectedElements,
62
+ p: ta.Optional['AsyncInjectorImpl'] = None,
63
+ *,
64
+ internal_consts: dict[Key, ta.Any] | None = None,
65
+ ) -> None:
66
+ self._ec = (ec := check.isinstance(ec, ElementCollection))
67
+ self._p: AsyncInjectorImpl | None = check.isinstance(p, (AsyncInjectorImpl, None))
64
68
 
65
69
  self._internal_consts: dict[Key, ta.Any] = {
66
- Key(Injector): self,
70
+ Key(AsyncInjector): self,
71
+ **(internal_consts or {}),
67
72
  }
68
73
 
69
74
  self._bim = ec.binding_impl_map()
75
+
70
76
  self._ekbs = ec.eager_keys_by_scope()
77
+
71
78
  self._pls: tuple[ProvisionListener, ...] = tuple(
72
79
  b.listener # type: ignore[attr-defined]
73
80
  for b in itertools.chain(
74
81
  ec.elements_of_type(ProvisionListenerBinding),
75
- (p._pls if p is not None else ()), # noqa
82
+ p._pls if p is not None else (), # noqa
76
83
  )
77
84
  )
78
85
 
79
- self._cs: weakref.WeakSet[InjectorImpl] | None = None
80
- self._root: InjectorImpl = p._root if p is not None else self # noqa
81
-
82
- self.__cur_req: InjectorImpl._Request | None = None
86
+ self._root: AsyncInjectorImpl = p._root if p is not None else self # noqa
83
87
 
84
- ss = [
85
- *DEFAULT_SCOPES,
86
- *[sb.scope for sb in ec.elements_of_type(ScopeBinding)],
87
- ]
88
88
  self._scopes: dict[Scope, ScopeImpl] = {
89
- s: make_scope_impl(s) for s in ss
89
+ s: make_scope_impl(s)
90
+ for s in itertools.chain(
91
+ DEFAULT_SCOPES,
92
+ ec.scope_binding_scopes(),
93
+ )
90
94
  }
91
95
 
92
- self._instantiate_eagers(Unscoped())
93
- self._instantiate_eagers(Singleton())
96
+ _cs: weakref.WeakSet['AsyncInjectorImpl'] | None = None # noqa
97
+
98
+ __cur_req: ta.Optional['AsyncInjectorImpl._Request'] = None
99
+
100
+ #
101
+
102
+ _has_run_init: bool = False
103
+
104
+ async def _init(self) -> bool:
105
+ if self._has_run_init:
106
+ return False
107
+
108
+ self._has_run_init = True
109
+
110
+ await self._instantiate_eagers(Unscoped())
111
+ await self._instantiate_eagers(Singleton())
94
112
 
95
- _root: 'InjectorImpl'
113
+ return True
96
114
 
97
- def _instantiate_eagers(self, sc: Scope) -> None:
115
+ #
116
+
117
+ _root: 'AsyncInjectorImpl'
118
+
119
+ async def _instantiate_eagers(self, sc: Scope) -> None:
98
120
  for k in self._ekbs.get(sc, ()):
99
- self.provide(k)
121
+ await self.provide(k)
100
122
 
101
123
  def get_scope_impl(self, sc: Scope) -> ScopeImpl:
102
124
  return self._scopes[sc]
103
125
 
104
- def create_child(self, ec: ElementCollection) -> Injector:
105
- c = InjectorImpl(ec, self)
126
+ def create_child(self, ec: ElementCollection) -> AsyncInjector:
127
+ c = AsyncInjectorImpl(ec, self)
106
128
  if self._cs is None:
107
129
  self._cs = weakref.WeakSet()
108
130
  self._cs.add(c)
109
131
  return c
110
132
 
111
133
  class _Request:
112
- def __init__(self, injector: 'InjectorImpl') -> None:
134
+ def __init__(self, injector: 'AsyncInjectorImpl') -> None:
113
135
  super().__init__()
114
136
 
115
137
  self._injector = injector
@@ -162,10 +184,13 @@ class InjectorImpl(Injector, lang.Final):
162
184
  finally:
163
185
  self.__cur_req = None
164
186
 
165
- def _try_provide(self, key: ta.Any, *, source: ta.Any = None) -> lang.Maybe[ta.Any]:
187
+ async def _try_provide(self, key: ta.Any, *, source: ta.Any = None) -> lang.Maybe[ta.Any]:
188
+ if not self._has_run_init:
189
+ await self._init()
190
+
166
191
  key = as_key(key)
167
192
 
168
- cr: InjectorImpl._Request
193
+ cr: AsyncInjectorImpl._Request
169
194
  with self._current_request() as cr:
170
195
  with cr.push_source(source):
171
196
  if (rv := cr.handle_key(key)).present:
@@ -182,55 +207,57 @@ class InjectorImpl(Injector, lang.Final):
182
207
  fn = lambda: sc.provide(bi, self) # noqa
183
208
  for pl in self._pls:
184
209
  fn = functools.partial(pl, self, key, bi.binding, fn)
185
- v = fn()
210
+ v = await fn()
186
211
 
187
212
  return cr.handle_provision(key, lang.just(v))
188
213
 
189
214
  if self._p is not None:
190
- pv = self._p._try_provide(key, source=source) # noqa
215
+ pv = await self._p._try_provide(key, source=source) # noqa
191
216
  if pv.present:
192
217
  return cr.handle_provision(key, pv)
193
218
 
194
219
  return cr.handle_provision(key, lang.empty())
195
220
 
196
- def _provide(self, key: ta.Any, *, source: ta.Any = None) -> ta.Any:
197
- v = self._try_provide(key, source=source)
221
+ async def _provide(self, key: ta.Any, *, source: ta.Any = None) -> ta.Any:
222
+ v = await self._try_provide(key, source=source)
198
223
  if v.present:
199
224
  return v.must()
200
225
  raise UnboundKeyError(key)
201
226
 
202
227
  #
203
228
 
204
- def try_provide(self, key: ta.Any) -> lang.Maybe[ta.Any]:
205
- return self.try_provide(key)
229
+ def try_provide(self, key: ta.Any) -> ta.Awaitable[lang.Maybe[ta.Any]]:
230
+ return self._try_provide(key)
206
231
 
207
- def provide(self, key: ta.Any) -> ta.Any:
208
- v = self._try_provide(key)
232
+ async def provide(self, key: ta.Any) -> ta.Any:
233
+ v = await self._try_provide(key)
209
234
  if v.present:
210
235
  return v.must()
211
236
  raise UnboundKeyError(key)
212
237
 
213
- def provide_kwargs(self, kt: KwargsTarget) -> ta.Mapping[str, ta.Any]:
238
+ async def provide_kwargs(self, kt: KwargsTarget) -> ta.Mapping[str, ta.Any]:
214
239
  ret: dict[str, ta.Any] = {}
215
240
  for kw in kt.kwargs:
216
241
  if kw.has_default:
217
- if not (mv := self._try_provide(kw.key, source=kt)).present:
242
+ if not (mv := await self._try_provide(kw.key, source=kt)).present:
218
243
  continue
219
244
  v = mv.must()
220
245
  else:
221
- v = self._provide(kw.key, source=kt)
246
+ v = await self._provide(kw.key, source=kt)
222
247
  ret[kw.name] = v
223
248
  return ret
224
249
 
225
- def inject(self, obj: ta.Any) -> ta.Any:
250
+ async def inject(self, obj: ta.Any) -> ta.Any:
226
251
  if isinstance(obj, KwargsTarget):
227
252
  obj, kt = obj.obj, obj
228
253
  else:
229
254
  kt = build_kwargs_target(obj)
230
- kws = self.provide_kwargs(kt)
255
+ kws = await self.provide_kwargs(kt)
231
256
  # FIXME: still 'injecting' (as in has a req) if ctor needs and uses Injector
232
257
  return obj(**kws)
233
258
 
234
259
 
235
- def create_injector(es: Elements) -> Injector:
236
- return InjectorImpl(ElementCollection(es))
260
+ async def create_async_injector(ce: CollectedElements) -> AsyncInjector:
261
+ i = AsyncInjectorImpl(ce)
262
+ await i._init() # noqa
263
+ return i
@@ -4,6 +4,7 @@ TODO:
4
4
  - tag annotations? x: ta.Annotated[int, inj.Tag('foo')]
5
5
  - tag decorator - @inj.tag(x='foo')
6
6
  - *unpack optional here*
7
+ - use ...metadata
7
8
  """
8
9
  import dataclasses as dc
9
10
  import inspect
@@ -74,7 +75,11 @@ def build_kwargs_target(
74
75
  skip_args: int = 0,
75
76
  skip_kwargs: ta.Iterable[str] | None = None,
76
77
  raw_optional: bool = False,
78
+ non_strict: bool = False,
77
79
  ) -> KwargsTarget:
80
+ if isinstance(obj, KwargsTarget):
81
+ return obj
82
+
78
83
  sig = signature(obj)
79
84
  tags = _TAGS.get(obj)
80
85
 
@@ -89,11 +94,15 @@ def build_kwargs_target(
89
94
  continue
90
95
 
91
96
  if p.annotation is inspect.Signature.empty:
97
+ if non_strict:
98
+ continue
92
99
  if p.default is not inspect.Parameter.empty:
93
100
  raise KeyError(f'{obj}, {p.name}')
94
101
  continue
95
102
 
96
103
  if p.kind not in (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY):
104
+ if non_strict:
105
+ continue
97
106
  raise TypeError(sig)
98
107
 
99
108
  ann = p.annotation
@@ -118,7 +127,8 @@ def build_kwargs_target(
118
127
  k = dc.replace(k, tag=pt)
119
128
 
120
129
  if k in seen:
121
- raise ConflictingKeyError(k)
130
+ if not non_strict:
131
+ raise ConflictingKeyError(k)
122
132
  seen.add(k)
123
133
 
124
134
  kws.append(Kwarg(
@@ -0,0 +1,43 @@
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 ..maysync import MaysyncInjector
9
+ from ..sync import Injector
10
+ from .injector import AsyncInjectorImpl
11
+
12
+
13
+ ##
14
+
15
+
16
+ class MaysyncInjectorImpl(MaysyncInjector, lang.Final):
17
+ _ai: AsyncInjector
18
+
19
+ def try_provide(self, key: ta.Any) -> lang.Maybe[ta.Any]:
20
+ return lang.run_maysync(self._ai.try_provide(key))
21
+
22
+ def provide(self, key: ta.Any) -> ta.Any:
23
+ return lang.run_maysync(self._ai.provide(key))
24
+
25
+ def provide_kwargs(self, kt: KwargsTarget) -> ta.Mapping[str, ta.Any]:
26
+ return lang.run_maysync(self._ai.provide_kwargs(kt))
27
+
28
+ def inject(self, obj: ta.Any) -> ta.Any:
29
+ return lang.run_maysync(self._ai.inject(obj))
30
+
31
+
32
+ def create_maysync_injector(ce: CollectedElements) -> MaysyncInjector:
33
+ si = MaysyncInjectorImpl()
34
+ ai = AsyncInjectorImpl(
35
+ ce,
36
+ internal_consts={
37
+ Key(MaysyncInjector): si,
38
+ Key(Injector): si,
39
+ },
40
+ )
41
+ si._ai = ai # noqa
42
+ lang.run_maysync(ai._init()) # noqa
43
+ return si
@@ -1,9 +1,10 @@
1
1
  import typing as ta
2
2
 
3
+ from ... import check
3
4
  from ... import dataclasses as dc
4
5
  from ... import lang
5
6
  from ..elements import Element
6
- from ..injector import Injector
7
+ from ..injector import AsyncInjector
7
8
  from ..multis import MapBinding
8
9
  from ..multis import MapProvider
9
10
  from ..multis import SetBinding
@@ -22,14 +23,14 @@ class SetProviderImpl(ProviderImpl, lang.Final):
22
23
  ps: ta.Sequence[ProviderImpl]
23
24
 
24
25
  @property
25
- def providers(self) -> ta.Iterable[Provider]:
26
+ def providers(self) -> ta.Iterator[Provider]:
26
27
  for p in self.ps:
27
28
  yield from p.providers
28
29
 
29
- def provide(self, injector: Injector) -> ta.Any:
30
+ async def provide(self, injector: AsyncInjector) -> ta.Any:
30
31
  rv = set()
31
32
  for ep in self.ps:
32
- o = ep.provide(injector)
33
+ o = await ep.provide(injector)
33
34
  rv.add(o)
34
35
  return rv
35
36
 
@@ -43,14 +44,14 @@ class MapProviderImpl(ProviderImpl, lang.Final):
43
44
  es: ta.Sequence[Entry]
44
45
 
45
46
  @property
46
- def providers(self) -> ta.Iterable[Provider]:
47
+ def providers(self) -> ta.Iterator[Provider]:
47
48
  for e in self.es:
48
49
  yield from e.v.providers
49
50
 
50
- def provide(self, injector: Injector) -> ta.Any:
51
+ async def provide(self, injector: AsyncInjector) -> ta.Any:
51
52
  rv = {}
52
53
  for e in self.es:
53
- o = e.v.provide(injector)
54
+ o = await e.v.provide(injector)
54
55
  rv[e.k] = o
55
56
  return rv
56
57
 
@@ -58,6 +59,7 @@ class MapProviderImpl(ProviderImpl, lang.Final):
58
59
  def make_multi_provider_impl(p: Provider, es_by_ty: ta.MutableMapping[type, list[Element]]) -> ProviderImpl:
59
60
  if isinstance(p, SetProvider):
60
61
  sbs: ta.Iterable[SetBinding] = es_by_ty.pop(SetBinding, ()) # type: ignore
62
+ check.empty(es_by_ty)
61
63
  return SetProviderImpl([
62
64
  LinkProviderImpl(LinkProvider(sb.dst))
63
65
  for sb in sbs
@@ -65,6 +67,7 @@ def make_multi_provider_impl(p: Provider, es_by_ty: ta.MutableMapping[type, list
65
67
 
66
68
  elif isinstance(p, MapProvider):
67
69
  mbs: ta.Iterable[MapBinding] = es_by_ty.pop(MapBinding, ()) # type: ignore
70
+ check.empty(es_by_ty)
68
71
  return MapProviderImpl([
69
72
  MapProviderImpl.Entry(
70
73
  mb.map_key,
@@ -12,14 +12,14 @@ from ... import lang
12
12
  from ..bindings import Binding
13
13
  from ..eagers import Eager
14
14
  from ..elements import Element
15
- from ..injector import Injector
15
+ from ..injector import AsyncInjector
16
16
  from ..keys import Key
17
17
  from ..privates import Expose
18
18
  from ..privates import Private
19
19
  from ..providers import Provider
20
20
  from ..scopes import Singleton
21
21
  from .elements import ElementCollection
22
- from .injector import InjectorImpl
22
+ from .injector import AsyncInjectorImpl
23
23
  from .providers import InternalProvider
24
24
  from .providers import ProviderImpl
25
25
 
@@ -47,8 +47,8 @@ class PrivateInjectorProviderImpl(ProviderImpl, lang.Final):
47
47
  def providers(self) -> ta.Iterable[Provider]:
48
48
  return ()
49
49
 
50
- def provide(self, injector: Injector) -> ta.Any:
51
- return check.isinstance(injector, InjectorImpl).create_child(self.ec)
50
+ async def provide(self, injector: AsyncInjector) -> ta.Any:
51
+ return check.isinstance(injector, AsyncInjectorImpl).create_child(self.ec)
52
52
 
53
53
 
54
54
  ##
@@ -63,9 +63,9 @@ class ExposedPrivateProviderImpl(ProviderImpl, lang.Final):
63
63
  def providers(self) -> ta.Iterable[Provider]:
64
64
  return ()
65
65
 
66
- def provide(self, injector: Injector) -> ta.Any:
67
- pi = injector.provide(self.pik)
68
- return pi.provide(self.k)
66
+ async def provide(self, injector: AsyncInjector) -> ta.Any:
67
+ pi = await injector.provide(self.pik)
68
+ return await pi.provide(self.k)
69
69
 
70
70
 
71
71
  ##
@@ -82,7 +82,7 @@ class PrivateInfo(lang.Final):
82
82
 
83
83
  @cached.property
84
84
  def pik(self) -> Key:
85
- return Key(InjectorImpl, tag=self.id)
85
+ return Key(AsyncInjectorImpl, tag=self.id)
86
86
 
87
87
  @cached.function
88
88
  def element_collection(self) -> ElementCollection:
@@ -7,15 +7,14 @@ import typing as ta
7
7
 
8
8
  from ... import dataclasses as dc
9
9
  from ... import lang
10
- from ... import reflect as rfl
11
- from ..injector import Injector
10
+ from ..injector import AsyncInjector
12
11
  from ..inspect import KwargsTarget
12
+ from ..providers import AsyncFnProvider
13
13
  from ..providers import ConstProvider
14
14
  from ..providers import CtorProvider
15
15
  from ..providers import FnProvider
16
16
  from ..providers import LinkProvider
17
17
  from ..providers import Provider
18
- from .inspect import build_kwargs_target
19
18
 
20
19
 
21
20
  ##
@@ -28,7 +27,7 @@ class ProviderImpl(lang.Abstract):
28
27
  raise NotImplementedError
29
28
 
30
29
  @abc.abstractmethod
31
- def provide(self, injector: Injector) -> ta.Any:
30
+ def provide(self, injector: AsyncInjector) -> ta.Awaitable[ta.Any]:
32
31
  raise NotImplementedError
33
32
 
34
33
 
@@ -39,8 +38,21 @@ class ProviderImpl(lang.Abstract):
39
38
  class InternalProvider(Provider):
40
39
  impl: ProviderImpl
41
40
 
42
- def provided_ty(self) -> rfl.Type | None:
43
- raise TypeError
41
+
42
+ ##
43
+
44
+
45
+ @dc.dataclass(frozen=True, eq=False)
46
+ class AsyncCallableProviderImpl(ProviderImpl, lang.Final):
47
+ p: AsyncFnProvider
48
+ kt: KwargsTarget
49
+
50
+ @property
51
+ def providers(self) -> ta.Iterable[Provider]:
52
+ return (self.p,)
53
+
54
+ async def provide(self, injector: AsyncInjector) -> ta.Any:
55
+ return await (await injector.inject(self.kt))
44
56
 
45
57
 
46
58
  ##
@@ -55,8 +67,8 @@ class CallableProviderImpl(ProviderImpl, lang.Final):
55
67
  def providers(self) -> ta.Iterable[Provider]:
56
68
  return (self.p,)
57
69
 
58
- def provide(self, injector: Injector) -> ta.Any:
59
- return injector.inject(self.kt)
70
+ async def provide(self, injector: AsyncInjector) -> ta.Any:
71
+ return await injector.inject(self.kt)
60
72
 
61
73
 
62
74
  ##
@@ -70,7 +82,7 @@ class ConstProviderImpl(ProviderImpl, lang.Final):
70
82
  def providers(self) -> ta.Iterable[Provider]:
71
83
  return (self.p,)
72
84
 
73
- def provide(self, injector: Injector) -> ta.Any:
85
+ async def provide(self, injector: AsyncInjector) -> ta.Any:
74
86
  return self.p.v
75
87
 
76
88
 
@@ -85,28 +97,5 @@ class LinkProviderImpl(ProviderImpl, lang.Final):
85
97
  def providers(self) -> ta.Iterable[Provider]:
86
98
  return (self.p,)
87
99
 
88
- def provide(self, injector: Injector) -> ta.Any:
89
- return injector.provide(self.p.k)
90
-
91
-
92
- ##
93
-
94
-
95
- PROVIDER_IMPLS_BY_PROVIDER: dict[type[Provider], ta.Callable[..., ProviderImpl]] = {
96
- FnProvider: lambda p: CallableProviderImpl(p, build_kwargs_target(p.fn)),
97
- CtorProvider: lambda p: CallableProviderImpl(p, build_kwargs_target(p.ty)),
98
- ConstProvider: ConstProviderImpl,
99
- LinkProvider: LinkProviderImpl,
100
- InternalProvider: lambda p: p.impl,
101
- }
102
-
103
-
104
- def make_provider_impl(p: Provider) -> ProviderImpl:
105
- try:
106
- fac = PROVIDER_IMPLS_BY_PROVIDER[type(p)]
107
- except KeyError:
108
- pass
109
- else:
110
- return fac(p)
111
-
112
- raise TypeError(p)
100
+ async def provide(self, injector: AsyncInjector) -> ta.Any:
101
+ return await injector.provide(self.p.k)
@@ -0,0 +1,43 @@
1
+ import typing as ta
2
+
3
+ from ..providers import AsyncFnProvider
4
+ from ..providers import ConstProvider
5
+ from ..providers import CtorProvider
6
+ from ..providers import FnProvider
7
+ from ..providers import LinkProvider
8
+ from ..providers import Provider
9
+ from ..scopes import ScopeSeededProvider
10
+ from .inspect import build_kwargs_target
11
+ from .providers import AsyncCallableProviderImpl
12
+ from .providers import CallableProviderImpl
13
+ from .providers import ConstProviderImpl
14
+ from .providers import InternalProvider
15
+ from .providers import LinkProviderImpl
16
+ from .providers import ProviderImpl
17
+ from .scopes import ScopeSeededProviderImpl
18
+
19
+
20
+ ##
21
+
22
+
23
+ PROVIDER_IMPLS_BY_PROVIDER: dict[type[Provider], ta.Callable[..., ProviderImpl]] = {
24
+ AsyncFnProvider: lambda p: AsyncCallableProviderImpl(p, build_kwargs_target(p.fn)),
25
+ FnProvider: lambda p: CallableProviderImpl(p, build_kwargs_target(p.fn)),
26
+ CtorProvider: lambda p: CallableProviderImpl(p, build_kwargs_target(p.ty)),
27
+ ConstProvider: ConstProviderImpl,
28
+ LinkProvider: LinkProviderImpl,
29
+ InternalProvider: lambda p: p.impl,
30
+
31
+ ScopeSeededProvider: ScopeSeededProviderImpl,
32
+ }
33
+
34
+
35
+ def make_provider_impl(p: Provider) -> ProviderImpl:
36
+ try:
37
+ fac = PROVIDER_IMPLS_BY_PROVIDER[type(p)]
38
+ except KeyError:
39
+ pass
40
+ else:
41
+ return fac(p)
42
+
43
+ raise TypeError(p)
@@ -12,7 +12,6 @@ def _cyclic_dependency_proxy() -> tuple[type, ta.Callable[[ta.Any, ta.Any], None
12
12
  import wrapt # noqa
13
13
 
14
14
  class _CyclicDependencyPlaceholder(lang.Final):
15
-
16
15
  def __init__(self, cls: ta.Any) -> None:
17
16
  super().__init__()
18
17
 
@@ -22,7 +21,6 @@ def _cyclic_dependency_proxy() -> tuple[type, ta.Callable[[ta.Any, ta.Any], None
22
21
  return f'{type(self).__name__}({self.__cls!r})'
23
22
 
24
23
  class _CyclicDependencyProxy(wrapt.ObjectProxy, lang.Final): # noqa
25
-
26
24
  def __init__(self, cls):
27
25
  super().__init__(_CyclicDependencyPlaceholder(cls))
28
26