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
@@ -11,43 +11,39 @@ import threading
11
11
  import typing as ta
12
12
 
13
13
  from .... import reflect as rfl
14
- from ....funcs import match as mfs
15
14
  from ...base.contexts import BaseContext
16
- from ...base.contexts import MarshalContext
17
- from ...base.contexts import UnmarshalContext
15
+ from ...base.contexts import MarshalFactoryContext
16
+ from ...base.contexts import UnmarshalFactoryContext
18
17
  from ...base.types import Marshaler
19
18
  from ...base.types import MarshalerFactory
20
- from ...base.types import MarshalerMaker
21
19
  from ...base.types import Unmarshaler
22
20
  from ...base.types import UnmarshalerFactory
23
- from ...base.types import UnmarshalerMaker
24
21
  from .configs import ModuleImport
25
22
 
26
23
 
27
- R = ta.TypeVar('R')
28
- ContextT = ta.TypeVar('ContextT', bound=BaseContext)
24
+ FactoryT = ta.TypeVar('FactoryT', bound=MarshalerFactory | UnmarshalerFactory)
29
25
 
30
26
 
31
27
  ##
32
28
 
33
29
 
34
- class _ModuleImportingFactory(mfs.MatchFn[[ContextT, rfl.Type], R]):
30
+ class _ModuleImportingFactory(ta.Generic[FactoryT]):
35
31
  def __init__(
36
32
  self,
37
- f: mfs.MatchFn[[ContextT, rfl.Type], R],
33
+ fac: FactoryT,
38
34
  callback: ta.Callable[[], None] | None = None,
39
35
  ) -> None:
40
36
  super().__init__()
41
37
 
42
- self._f = f
38
+ self._fac = fac
43
39
  self._callback = callback
44
40
 
45
41
  self._lock = threading.RLock()
46
- self._has_imported = False
42
+ self._last_mis: ta.Any = None
47
43
 
48
- def _do_import(self, ctx: ContextT) -> None:
44
+ def _do_import(self, ctx: BaseContext, mis: ta.Sequence[ModuleImport]) -> None:
49
45
  c = 0
50
- for mi in ctx.config_registry.get_of(None, ModuleImport):
46
+ for mi in mis:
51
47
  if mi.import_if_necessary():
52
48
  c += 1
53
49
 
@@ -55,60 +51,21 @@ class _ModuleImportingFactory(mfs.MatchFn[[ContextT, rfl.Type], R]):
55
51
  if self._callback is not None:
56
52
  self._callback()
57
53
 
58
- def _import_if_necessary(self, ctx: ContextT) -> None:
59
- # FIXME:
60
- # if not self._has_imported:
61
- # with self._lock:
62
- # if not self._has_imported:
63
- # self._do_import(ctx)
64
- # self._has_imported = True
65
- self._do_import(ctx)
54
+ def _import_if_necessary(self, ctx: BaseContext) -> None:
55
+ if (mis := ctx.configs.get_of(None, ModuleImport)) and mis is not self._last_mis:
56
+ with self._lock:
57
+ if (mis := ctx.configs.get_of(None, ModuleImport)) and mis is not self._last_mis:
58
+ self._do_import(ctx, mis)
59
+ self._last_mis = mis
66
60
 
67
- def guard(self, ctx: ContextT, rty: rfl.Type) -> bool:
68
- self._import_if_necessary(ctx)
69
- return self._f.guard(ctx, rty)
70
61
 
71
- def fn(self, ctx: ContextT, rty: rfl.Type) -> R:
62
+ class ModuleImportingMarshalerFactory(_ModuleImportingFactory[MarshalerFactory], MarshalerFactory):
63
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
72
64
  self._import_if_necessary(ctx)
73
- return self._f(ctx, rty)
74
-
75
-
76
- ##
77
-
78
-
79
- class ModuleImportingMarshalerFactory(MarshalerFactory):
80
- def __init__(
81
- self,
82
- f: MarshalerFactory,
83
- callback: ta.Callable[[], None] | None = None,
84
- ) -> None:
85
- super().__init__()
65
+ return self._fac.make_marshaler(ctx, rty)
86
66
 
87
- self._f = f
88
- self._tcf: _ModuleImportingFactory[MarshalContext, Marshaler] = _ModuleImportingFactory(
89
- f.make_marshaler,
90
- callback,
91
- )
92
67
 
93
- @property
94
- def make_marshaler(self) -> MarshalerMaker:
95
- return self._tcf
96
-
97
-
98
- class ModuleImportingUnmarshalerFactory(UnmarshalerFactory):
99
- def __init__(
100
- self,
101
- f: UnmarshalerFactory,
102
- callback: ta.Callable[[], None] | None = None,
103
- ) -> None:
104
- super().__init__()
105
-
106
- self._f = f
107
- self._tcf: _ModuleImportingFactory[UnmarshalContext, Unmarshaler] = _ModuleImportingFactory(
108
- f.make_unmarshaler,
109
- callback,
110
- )
111
-
112
- @property
113
- def make_unmarshaler(self) -> UnmarshalerMaker:
114
- return self._tcf
68
+ class ModuleImportingUnmarshalerFactory(_ModuleImportingFactory[UnmarshalerFactory], UnmarshalerFactory):
69
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
70
+ self._import_if_necessary(ctx)
71
+ return self._fac.make_unmarshaler(ctx, rty)
@@ -1,15 +1,13 @@
1
1
  import typing as ta
2
2
 
3
3
  from ... import reflect as rfl
4
- from ...funcs import match as mfs
5
- from ..base.contexts import MarshalContext
6
- from ..base.contexts import UnmarshalContext
4
+ from ...funcs import guard as gfs
5
+ from ..base.contexts import MarshalFactoryContext
6
+ from ..base.contexts import UnmarshalFactoryContext
7
7
  from ..base.types import Marshaler
8
8
  from ..base.types import MarshalerFactory
9
- from ..base.types import MarshalerMaker
10
9
  from ..base.types import Unmarshaler
11
10
  from ..base.types import UnmarshalerFactory
12
- from ..base.types import UnmarshalerMaker
13
11
 
14
12
 
15
13
  ##
@@ -18,38 +16,28 @@ from ..base.types import UnmarshalerMaker
18
16
  class MultiMarshalerFactory(MarshalerFactory):
19
17
  def __init__(
20
18
  self,
21
- fs: ta.Iterable[MarshalerFactory],
22
- *,
19
+ *facs: MarshalerFactory,
23
20
  strict: bool = False,
24
21
  ) -> None:
25
22
  super().__init__()
26
23
 
27
- self._fs = list(fs)
28
- self._mmf: mfs.MultiMatchFn[[MarshalContext, rfl.Type], Marshaler] = mfs.MultiMatchFn(
29
- [f.make_marshaler for f in self._fs],
30
- strict=strict,
31
- )
24
+ self._facs = facs
25
+ self._mgf = gfs.multi(*[f.make_marshaler for f in self._facs], strict=strict)
32
26
 
33
- @property
34
- def make_marshaler(self) -> MarshalerMaker:
35
- return self._mmf
27
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
28
+ return self._mgf(ctx, rty)
36
29
 
37
30
 
38
31
  class MultiUnmarshalerFactory(UnmarshalerFactory):
39
32
  def __init__(
40
33
  self,
41
- fs: ta.Iterable[UnmarshalerFactory],
42
- *,
34
+ *facs: UnmarshalerFactory,
43
35
  strict: bool = False,
44
36
  ) -> None:
45
37
  super().__init__()
46
38
 
47
- self._fs = list(fs)
48
- self._mmf: mfs.MultiMatchFn[[UnmarshalContext, rfl.Type], Unmarshaler] = mfs.MultiMatchFn(
49
- [f.make_unmarshaler for f in self._fs],
50
- strict=strict,
51
- )
39
+ self._facs = facs
40
+ self._mgf = gfs.multi(*[f.make_unmarshaler for f in self._facs], strict=strict)
52
41
 
53
- @property
54
- def make_unmarshaler(self) -> UnmarshalerMaker:
55
- return self._mmf
42
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
43
+ return self._mgf(ctx, rty)
@@ -1,61 +1,54 @@
1
1
  import typing as ta
2
2
 
3
- from ... import check
4
- from ... import lang
5
3
  from ... import reflect as rfl
6
- from ...funcs import match as mfs
7
4
  from ..base.contexts import MarshalContext
5
+ from ..base.contexts import MarshalFactoryContext
8
6
  from ..base.contexts import UnmarshalContext
7
+ from ..base.contexts import UnmarshalFactoryContext
9
8
  from ..base.types import Marshaler
10
9
  from ..base.types import MarshalerFactory
11
- from ..base.types import MarshalerMaker
12
10
  from ..base.types import Unmarshaler
13
11
  from ..base.types import UnmarshalerFactory
14
- from ..base.types import UnmarshalerMaker
15
12
  from ..base.values import Value
16
13
 
17
14
 
15
+ FactoryT = ta.TypeVar('FactoryT', bound=MarshalerFactory | UnmarshalerFactory)
18
16
  T = ta.TypeVar('T')
19
- R = ta.TypeVar('R')
20
- C = ta.TypeVar('C')
21
17
 
22
18
 
23
19
  ##
24
20
 
25
21
 
26
- class _RecursiveTypeFactory(mfs.MatchFn[[C, rfl.Type], R]):
22
+ class _RecursiveFactory(ta.Generic[FactoryT]):
27
23
  def __init__(
28
24
  self,
29
- f: mfs.MatchFn[[C, rfl.Type], R],
30
- prx: ta.Callable[[], tuple[R, ta.Callable[[R], None]]],
25
+ fac: FactoryT,
26
+ prx: ta.Callable[[], tuple[ta.Any, ta.Callable[[ta.Any], None]]],
31
27
  ) -> None:
32
28
  super().__init__()
33
29
 
34
- self._f = f
30
+ self._fac = fac
35
31
  self._prx = prx
36
- self._dct: dict[rfl.Type, R] = {}
37
-
38
- def guard(self, ctx: C, rty: rfl.Type) -> bool:
39
- check.isinstance(rty, rfl.TYPES)
40
- return self._f.guard(ctx, rty)
41
-
42
- def fn(self, ctx: C, rty: rfl.Type) -> R:
43
- check.isinstance(rty, rfl.TYPES)
44
- try:
45
- return self._dct[rty]
46
- except KeyError:
47
- pass
48
- p, sp = self._prx()
49
- self._dct[rty] = p
50
- try:
51
- r = self._f(ctx, rty)
52
- sp(r)
53
- return r
54
- finally:
55
- del self._dct[rty]
56
32
 
33
+ self._dct: dict[rfl.Type, ta.Any] = {}
57
34
 
58
- ##
35
+ def _wrap(self, m, rty):
36
+ def inner():
37
+ try:
38
+ return self._dct[rty]
39
+ except KeyError:
40
+ pass
41
+
42
+ p, sp = self._prx()
43
+ self._dct[rty] = p
44
+ try:
45
+ r = m()
46
+ sp(r)
47
+ return r
48
+ finally:
49
+ del self._dct[rty]
50
+
51
+ return inner
59
52
 
60
53
 
61
54
  class _Proxy(ta.Generic[T]):
@@ -77,7 +70,7 @@ class _Proxy(ta.Generic[T]):
77
70
  return (p := cls()), p._set_obj # noqa
78
71
 
79
72
 
80
- ##
73
+ #
81
74
 
82
75
 
83
76
  class _ProxyMarshaler(_Proxy[Marshaler], Marshaler):
@@ -85,19 +78,17 @@ class _ProxyMarshaler(_Proxy[Marshaler], Marshaler):
85
78
  return self._obj.marshal(ctx, o)
86
79
 
87
80
 
88
- class RecursiveMarshalerFactory(MarshalerFactory, lang.Final):
89
- def __init__(self, f: MarshalerFactory) -> None:
90
- super().__init__()
81
+ class RecursiveMarshalerFactory(_RecursiveFactory[MarshalerFactory], MarshalerFactory):
82
+ def __init__(self, fac: MarshalerFactory) -> None:
83
+ super().__init__(fac, _ProxyMarshaler._new) # noqa
91
84
 
92
- self._f = f
93
- self._rtf: _RecursiveTypeFactory[MarshalContext, Marshaler] = _RecursiveTypeFactory(
94
- self._f.make_marshaler, # noqa
95
- _ProxyMarshaler._new, # noqa
96
- )
85
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
86
+ if (m := self._fac.make_marshaler(ctx, rty)) is None:
87
+ return None
88
+ return self._wrap(m, rty)
97
89
 
98
- @property
99
- def make_marshaler(self) -> MarshalerMaker:
100
- return self._rtf
90
+
91
+ #
101
92
 
102
93
 
103
94
  class _ProxyUnmarshaler(_Proxy[Unmarshaler], Unmarshaler):
@@ -105,16 +96,11 @@ class _ProxyUnmarshaler(_Proxy[Unmarshaler], Unmarshaler):
105
96
  return self._obj.unmarshal(ctx, v)
106
97
 
107
98
 
108
- class RecursiveUnmarshalerFactory(UnmarshalerFactory, lang.Final):
109
- def __init__(self, f: UnmarshalerFactory) -> None:
110
- super().__init__()
99
+ class RecursiveUnmarshalerFactory(_RecursiveFactory[UnmarshalerFactory], UnmarshalerFactory):
100
+ def __init__(self, fac: UnmarshalerFactory) -> None:
101
+ super().__init__(fac, _ProxyUnmarshaler._new) # noqa
111
102
 
112
- self._f = f
113
- self._rtf: _RecursiveTypeFactory[UnmarshalContext, Unmarshaler] = _RecursiveTypeFactory(
114
- self._f.make_unmarshaler, # noqa
115
- _ProxyUnmarshaler._new, # noqa
116
- )
117
-
118
- @property
119
- def make_unmarshaler(self) -> UnmarshalerMaker:
120
- return self._rtf
103
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
104
+ if (m := self._fac.make_unmarshaler(ctx, rty)) is None:
105
+ return None
106
+ return self._wrap(m, rty)
@@ -3,109 +3,64 @@ import typing as ta
3
3
 
4
4
  from ... import check
5
5
  from ... import reflect as rfl
6
- from ...funcs import match as mfs
7
- from ..base.contexts import MarshalContext
8
- from ..base.contexts import UnmarshalContext
6
+ from ..base.contexts import MarshalFactoryContext
7
+ from ..base.contexts import UnmarshalFactoryContext
9
8
  from ..base.types import Marshaler
10
9
  from ..base.types import MarshalerFactory
11
- from ..base.types import MarshalerMaker
12
10
  from ..base.types import Unmarshaler
13
11
  from ..base.types import UnmarshalerFactory
14
- from ..base.types import UnmarshalerMaker
15
12
 
16
13
 
17
- R = ta.TypeVar('R')
18
- C = ta.TypeVar('C')
14
+ FactoryT = ta.TypeVar('FactoryT', bound=MarshalerFactory | UnmarshalerFactory)
19
15
 
20
16
 
21
17
  ##
22
18
 
23
19
 
24
- class _TypeCacheFactory(mfs.MatchFn[[C, rfl.Type], R]):
25
- def __init__(self, f: mfs.MatchFn[[C, rfl.Type], R]) -> None:
20
+ class _TypeCacheFactory(ta.Generic[FactoryT]):
21
+ def __init__(self, fac: FactoryT) -> None:
26
22
  super().__init__()
27
23
 
28
- self._f = f
29
- self._dct: dict[rfl.Type, R | None] = {}
30
- self._lock = threading.RLock()
31
-
32
- def guard(self, ctx: C, rty: rfl.Type) -> bool:
33
- check.isinstance(rty, rfl.TYPES)
34
-
35
- try:
36
- return self._dct[rty] is not None
37
- except KeyError:
38
- pass
39
-
40
- with self._lock:
41
- try:
42
- e = self._dct[rty]
24
+ self._fac = fac
43
25
 
44
- except KeyError:
45
- if self._f.guard(ctx, rty):
46
- return True
47
- else:
48
- self._dct[rty] = None
49
- return False
50
-
51
- else:
52
- return e is not None
26
+ self._dct: dict[rfl.Type, ta.Any | None] = {}
27
+ self._lock = threading.RLock()
53
28
 
54
- def fn(self, ctx: C, rty: rfl.Type) -> R:
29
+ def _make(self, rty, dfl):
55
30
  check.isinstance(rty, rfl.TYPES)
56
31
 
57
32
  try:
58
- e = self._dct[rty]
33
+ return self._dct[rty]
59
34
  except KeyError:
60
35
  pass
61
- else:
62
- if e is None:
63
- raise mfs.MatchGuardError(ctx, rty)
64
- else:
65
- return e
66
36
 
67
37
  with self._lock:
68
38
  try:
69
- e = self._dct[rty]
70
-
39
+ return self._dct[rty]
71
40
  except KeyError:
72
- try:
73
- ret = self._f(ctx, rty)
74
- except mfs.MatchGuardError:
75
- self._dct[rty] = None
76
- raise
77
- else:
78
- self._dct[rty] = ret
79
- return ret
80
-
81
- if e is None:
82
- raise mfs.MatchGuardError(ctx, rty)
83
- else:
84
- return e
41
+ pass
85
42
 
43
+ if (m := dfl()) is None:
44
+ self._dct[rty] = None
45
+ return None
86
46
 
87
- ##
88
-
47
+ x = None
89
48
 
90
- class TypeCacheMarshalerFactory(MarshalerFactory):
91
- def __init__(self, f: MarshalerFactory) -> None:
92
- super().__init__()
49
+ def inner():
50
+ nonlocal x
51
+ if x is None:
52
+ x = m()
53
+ return x
93
54
 
94
- self._f = f
95
- self._tcf: _TypeCacheFactory[MarshalContext, Marshaler] = _TypeCacheFactory(f.make_marshaler)
55
+ self._dct[rty] = inner
56
+ return inner
96
57
 
97
- @property
98
- def make_marshaler(self) -> MarshalerMaker:
99
- return self._tcf
100
58
 
59
+ class TypeCacheMarshalerFactory(_TypeCacheFactory[MarshalerFactory], MarshalerFactory):
60
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
61
+ return self._make(rty, lambda: self._fac.make_marshaler(ctx, rty))
101
62
 
102
- class TypeCacheUnmarshalerFactory(UnmarshalerFactory):
103
- def __init__(self, f: UnmarshalerFactory) -> None:
104
- super().__init__()
105
-
106
- self._f = f
107
- self._tcf: _TypeCacheFactory[UnmarshalContext, Unmarshaler] = _TypeCacheFactory(f.make_unmarshaler)
108
63
 
109
- @property
110
- def make_unmarshaler(self) -> UnmarshalerMaker:
111
- return self._tcf
64
+ class TypeCacheUnmarshalerFactory(_TypeCacheFactory[UnmarshalerFactory], UnmarshalerFactory):
65
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
66
+ return self._make(rty, lambda: self._fac.make_unmarshaler(ctx, rty))
@@ -3,63 +3,62 @@ import typing as ta
3
3
  from ... import check
4
4
  from ... import dataclasses as dc
5
5
  from ... import reflect as rfl
6
- from ...funcs import match as mfs
7
- from ..base.contexts import MarshalContext
8
- from ..base.contexts import UnmarshalContext
6
+ from ..base.contexts import MarshalFactoryContext
7
+ from ..base.contexts import UnmarshalFactoryContext
9
8
  from ..base.types import Marshaler
10
9
  from ..base.types import MarshalerFactory
11
- from ..base.types import MarshalerMaker
12
10
  from ..base.types import Unmarshaler
13
11
  from ..base.types import UnmarshalerFactory
14
- from ..base.types import UnmarshalerMaker
15
-
16
-
17
- R = ta.TypeVar('R')
18
- C = ta.TypeVar('C')
19
12
 
20
13
 
21
14
  ##
22
15
 
23
16
 
24
17
  @dc.dataclass(frozen=True)
25
- class _TypeMapFactory(mfs.MatchFn[[C, rfl.Type], R]):
26
- m: ta.Mapping[rfl.Type, R] = dc.field(default_factory=dict)
27
-
28
- def __post_init__(self) -> None:
29
- for k in self.m:
30
- if not isinstance(k, rfl.TYPES):
31
- raise TypeError(k)
32
-
33
- def guard(self, ctx: C, rty: rfl.Type) -> bool:
34
- check.isinstance(rty, rfl.TYPES)
35
- return rty in self.m
36
-
37
- def fn(self, ctx: C, rty: rfl.Type) -> R:
18
+ class TypeMapMarshalerFactory(MarshalerFactory):
19
+ m: ta.Mapping[rfl.Type, Marshaler | MarshalerFactory] = dc.xfield(
20
+ default_factory=dict,
21
+ coerce=lambda d: {
22
+ check.isinstance(k, rfl.TYPES): check.isinstance(v, (Marshaler, UnmarshalerFactory))
23
+ for k, v in d.items()
24
+ },
25
+ )
26
+
27
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
38
28
  check.isinstance(rty, rfl.TYPES)
39
29
  try:
40
- return self.m[rty]
30
+ m = self.m[rty]
41
31
  except KeyError:
42
- raise mfs.MatchGuardError(ctx, rty) # noqa
43
-
32
+ return None
44
33
 
45
- ##
46
-
47
-
48
- @dc.dataclass(frozen=True)
49
- class TypeMapMarshalerFactory(
50
- _TypeMapFactory[MarshalContext, Marshaler],
51
- MarshalerFactory,
52
- ):
53
- @property
54
- def make_marshaler(self) -> MarshalerMaker:
55
- return self # noqa
34
+ if isinstance(m, Marshaler):
35
+ return lambda: m
36
+ elif isinstance(m, MarshalerFactory):
37
+ return m.make_marshaler(ctx, rty)
38
+ else:
39
+ raise TypeError(m)
56
40
 
57
41
 
58
42
  @dc.dataclass(frozen=True)
59
- class TypeMapUnmarshalerFactory(
60
- _TypeMapFactory[UnmarshalContext, Unmarshaler],
61
- UnmarshalerFactory,
62
- ):
63
- @property
64
- def make_unmarshaler(self) -> UnmarshalerMaker:
65
- return self # noqa
43
+ class TypeMapUnmarshalerFactory(UnmarshalerFactory):
44
+ u: ta.Mapping[rfl.Type, Unmarshaler | UnmarshalerFactory] = dc.xfield(
45
+ default_factory=dict,
46
+ coerce=lambda d: {
47
+ check.isinstance(k, rfl.TYPES): check.isinstance(v, (Unmarshaler, UnmarshalerFactory))
48
+ for k, v in d.items()
49
+ },
50
+ )
51
+
52
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
53
+ check.isinstance(rty, rfl.TYPES)
54
+ try:
55
+ u = self.u[rty]
56
+ except KeyError:
57
+ return None
58
+
59
+ if isinstance(u, Unmarshaler):
60
+ return lambda: u
61
+ elif isinstance(u, UnmarshalerFactory):
62
+ return u.make_unmarshaler(ctx, rty)
63
+ else:
64
+ raise TypeError(u)