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
omlish/asyncs/bridge.py DELETED
@@ -1,359 +0,0 @@
1
- """
2
- A system for bridging sync and async code. Supports nesting / reentrancy. Robust, but not the most efficient
3
- implementation - its primary usecase are heavy and init-time ops like lock management and connection establishment, not
4
- so much for packet-level ops.
5
-
6
- ==
7
-
8
- The code is written in a very dumb, simple, explicit style to keep the bookkeeping center-stage and front-of-mind. To
9
- quote kubernetes:
10
-
11
- https://github.com/kubernetes/kubernetes/blob/60c4c2b2521fb454ce69dee737e3eb91a25e0535/pkg/controller/volume/persistentvolume/pv_controller.go#L60-L63
12
-
13
- ==================================================================
14
- PLEASE DO NOT ATTEMPT TO SIMPLIFY THIS CODE.
15
- KEEP THE SPACE SHUTTLE FLYING.
16
- ==================================================================
17
-
18
- ==
19
-
20
- TODO:
21
- - reuse greenlet if nested somehow?
22
- - test cancel
23
-
24
- See:
25
- - https://github.com/sqlalchemy/sqlalchemy/blob/21ea01eebe0350ad1185c7288dca61f363ebd2fe/lib/sqlalchemy/util/concurrency.py
26
- - ( https://gist.github.com/snaury/202bf4f22c41ca34e56297bae5f33fef )
27
- - Baked into sqlalchemy and hard-bound to asyncio.
28
- - https://github.com/oremanj/greenback/blob/ca69b023a9b7b58b715f3b1d78fc116e788a2c9f/greenback/_impl.py
29
- - ( https://gist.github.com/oremanj/f18ef3e55b9487c2e93eee42232583f2 )
30
- - Similar to this, but does horrible things with ctypes and is hard-bound to greenlet.
31
- - https://github.com/fastapi/asyncer/blob/2a4b8ef2540ec687af13d3f361c4ed0cf0cb624d/asyncer/_main.py
32
- - https://github.com/django/asgiref/blob/05ae3eee3fae4005ae4cfb0bb22d281725fabade/asgiref/sync.py
33
- - Both are much heavier weight and hard-bound to threads.
34
- """ # noqa
35
- import functools # noqa
36
- import itertools
37
- import sys # noqa
38
- import types
39
- import typing as ta
40
- import weakref
41
-
42
- from .. import check
43
- from .. import lang
44
- from .. import sync
45
- from ..concurrent import threadlets
46
-
47
-
48
- if ta.TYPE_CHECKING:
49
- import asyncio
50
-
51
- from . import anyio as aiu
52
-
53
- else:
54
- asyncio = lang.proxy_import('asyncio')
55
-
56
- aiu = lang.proxy_import('.anyio', __package__)
57
-
58
-
59
- T = ta.TypeVar('T')
60
-
61
-
62
- ##
63
-
64
-
65
- def trivial_s_to_a(fn):
66
- async def inner(*args, **kwargs):
67
- return fn(*args, **kwargs)
68
- return inner
69
-
70
-
71
- def trivial_a_to_s(fn):
72
- def inner(*args, **kwargs):
73
- return lang.sync_await(fn(*args, **kwargs))
74
- return inner
75
-
76
-
77
- ##
78
- # https://gist.github.com/snaury/202bf4f22c41ca34e56297bae5f33fef
79
-
80
-
81
- _THREADLETS_IMPL = threadlets.GreenletThreadlets
82
- # from ..concurrent.tests.real import RealThreadlets
83
- # _THREADLETS_IMPL = RealThreadlets
84
-
85
- _THREADLETS = sync.LazyFn(lambda: _THREADLETS_IMPL())
86
-
87
-
88
- def _threadlets() -> threadlets.Threadlets:
89
- return _THREADLETS.get()
90
-
91
-
92
- #
93
-
94
-
95
- class BridgeAwaitRequiredError(Exception):
96
- pass
97
-
98
-
99
- class MissingBridgeThreadletError(Exception):
100
- pass
101
-
102
-
103
- class UnexpectedBridgeNestingError(Exception):
104
- def __init__(self, *args, **kwargs):
105
- super().__init__(*args, **kwargs)
106
- # breakpoint()
107
-
108
-
109
- #
110
-
111
-
112
- _DEBUG_PRINT: ta.Callable[..., None] | None = None
113
- # _DEBUG_PRINT = functools.partial(print, file=sys.stderr) # noqa
114
-
115
- _TRACK_TRANSITION_OBJS = False
116
-
117
-
118
- #
119
-
120
-
121
- _BRIDGE_TRANSITIONS_SEQ = itertools.count()
122
-
123
-
124
- class _BridgeTransition(ta.NamedTuple):
125
- seq: int
126
- a_to_s: bool
127
-
128
- obj_cls: type
129
- obj_id: int
130
-
131
- obj: ta.Any
132
-
133
-
134
- def _make_transition(seq: int, a_to_s: bool, obj: ta.Any) -> _BridgeTransition:
135
- return _BridgeTransition(seq, a_to_s, obj.__class__, id(obj), (obj if _TRACK_TRANSITION_OBJS else None))
136
-
137
-
138
- _BRIDGED_TASKS: ta.MutableMapping[ta.Any, list[_BridgeTransition]] = weakref.WeakKeyDictionary()
139
-
140
- _BRIDGE_THREADLET_ATTR = f'__{__package__.replace(".", "__")}__bridge_threadlet__'
141
-
142
-
143
- def _push_transition(a_to_s: bool, l: list[_BridgeTransition], t: _BridgeTransition) -> _BridgeTransition:
144
- l.append(t)
145
- if _DEBUG_PRINT:
146
- _DEBUG_PRINT(f'_push_transition: {a_to_s=} {id(l)=} {t=}')
147
- return t
148
-
149
-
150
- def _pop_transition(a_to_s: bool, l: list[_BridgeTransition]) -> _BridgeTransition:
151
- t = l.pop()
152
- if _DEBUG_PRINT:
153
- _DEBUG_PRINT(f'_pop_transition: {a_to_s=} {id(l)=} {t=}')
154
- return t
155
-
156
-
157
- def _get_transitions() -> list[_BridgeTransition]:
158
- l: list[_BridgeTransition] = []
159
-
160
- if (t := aiu.get_current_backend_task()) is not None:
161
- try:
162
- tl = _BRIDGED_TASKS[t]
163
- except KeyError:
164
- pass
165
- else:
166
- l.extend(tl)
167
-
168
- g = _threadlets().get_current()
169
- try:
170
- gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
171
- except AttributeError:
172
- pass
173
- else:
174
- l.extend(gl)
175
-
176
- l.sort(key=lambda t: (t.seq, t.a_to_s))
177
- return l
178
-
179
-
180
- def is_in_bridge() -> bool:
181
- if _DEBUG_PRINT:
182
- _DEBUG_PRINT(_get_transitions())
183
-
184
- if (t := aiu.get_current_backend_task()) is not None:
185
- try:
186
- tl = _BRIDGED_TASKS[t]
187
- except KeyError:
188
- last_t = None
189
- else:
190
- if tl:
191
- last_t = tl[-1]
192
- else:
193
- last_t = None
194
- else:
195
- last_t = None
196
-
197
- g = _threadlets().get_current()
198
- try:
199
- gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
200
- except AttributeError:
201
- last_g = None
202
- else:
203
- if gl:
204
- last_g = gl[-1]
205
- else:
206
- last_g = None
207
-
208
- if last_t is None:
209
- if last_g is None:
210
- return False
211
- o = last_g
212
- else: # noqa
213
- if last_g is None or last_g.seq < last_t.seq:
214
- o = last_t
215
- else:
216
- o = last_g
217
-
218
- in_a = (t is not None)
219
-
220
- if _DEBUG_PRINT:
221
- _DEBUG_PRINT(f'{o.a_to_s=} {in_a=}')
222
-
223
- return in_a != o.a_to_s
224
-
225
-
226
- def _safe_cancel_awaitable(awaitable: ta.Awaitable[ta.Any]) -> None:
227
- # https://docs.python.org/3/reference/datamodel.html#coroutine.close
228
- if asyncio.iscoroutine(awaitable):
229
- awaitable.close() # noqa
230
-
231
-
232
- def s_to_a_await(awaitable: ta.Awaitable[T]) -> T:
233
- g = _threadlets().get_current()
234
-
235
- if not getattr(g.underlying, _BRIDGE_THREADLET_ATTR, False):
236
- _safe_cancel_awaitable(awaitable)
237
- raise MissingBridgeThreadletError
238
-
239
- return check.not_none(g.parent).switch(awaitable)
240
-
241
-
242
- def s_to_a(fn, *, require_await=False):
243
- @types.coroutine
244
- def outer(*args, **kwargs):
245
- def inner():
246
- try:
247
- return fn(*args, **kwargs)
248
- finally:
249
- if (gl2 := getattr(g.underlying, _BRIDGE_THREADLET_ATTR)) is not gl: # noqa
250
- raise UnexpectedBridgeNestingError
251
- if (cur_g := _pop_transition(False, gl)) is not added_g: # noqa
252
- raise UnexpectedBridgeNestingError
253
- if gl:
254
- raise UnexpectedBridgeNestingError
255
-
256
- seq = next(_BRIDGE_TRANSITIONS_SEQ)
257
-
258
- g = _threadlets().spawn(inner)
259
- setattr(g.underlying, _BRIDGE_THREADLET_ATTR, gl := []) # type: ignore
260
- added_g = _push_transition(False, gl, _make_transition(seq, False, g))
261
-
262
- if (t := aiu.get_current_backend_task()) is not None:
263
- try:
264
- tl = _BRIDGED_TASKS[t]
265
- except KeyError:
266
- tl = _BRIDGED_TASKS[t] = []
267
- added_t = _push_transition(False, tl, _make_transition(seq, False, g))
268
-
269
- try:
270
- result: ta.Any = g.switch()
271
- switch_occurred = False
272
- while not g.dead:
273
- switch_occurred = True
274
- try:
275
- value = yield result
276
- except BaseException as e: # noqa
277
- result = g.throw(e)
278
- else:
279
- result = g.switch(value)
280
-
281
- if require_await and not switch_occurred:
282
- raise BridgeAwaitRequiredError
283
-
284
- return result
285
-
286
- finally:
287
- if t is not None:
288
- if (tl2 := _BRIDGED_TASKS[t]) is not tl: # noqa
289
- raise UnexpectedBridgeNestingError
290
- if (cur_t := _pop_transition(False, tl)) is not added_t: # noqa
291
- raise UnexpectedBridgeNestingError
292
-
293
- return outer
294
-
295
-
296
- def a_to_s(fn):
297
- def inner(*args, **kwargs):
298
- seq = next(_BRIDGE_TRANSITIONS_SEQ)
299
-
300
- if (t := aiu.get_current_backend_task()) is not None:
301
- try:
302
- tl = _BRIDGED_TASKS[t]
303
- except KeyError:
304
- tl = _BRIDGED_TASKS[t] = []
305
- added_t = _push_transition(True, tl, _make_transition(seq, True, t))
306
- else:
307
- added_t = None
308
-
309
- g = _threadlets().get_current()
310
- try:
311
- gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
312
- except AttributeError:
313
- setattr(g.underlying, _BRIDGE_THREADLET_ATTR, gl := [])
314
- added_g = _push_transition(True, gl, _make_transition(seq, True, g))
315
-
316
- try:
317
- ret = missing = object()
318
-
319
- async def gate():
320
- nonlocal ret
321
- ret = await fn(*args, **kwargs)
322
-
323
- cr = gate()
324
- sv = None
325
- he = False
326
- try:
327
- while True:
328
- if not he:
329
- try:
330
- sv = cr.send(sv)
331
- except StopIteration:
332
- break
333
- he = False
334
-
335
- if ret is missing or cr.cr_await is not None or cr.cr_running:
336
- try:
337
- sv = s_to_a_await(sv) # type: ignore
338
- except BaseException as e: # noqa
339
- sv = cr.throw(e)
340
- he = True
341
-
342
- finally:
343
- cr.close()
344
-
345
- finally:
346
- if t is not None:
347
- if (tl2 := _BRIDGED_TASKS[t]) is not tl: # noqa
348
- raise UnexpectedBridgeNestingError
349
- if (cur_t := _pop_transition(True, tl)) is not added_t: # noqa
350
- raise UnexpectedBridgeNestingError
351
-
352
- if (gl2 := getattr(g.underlying, _BRIDGE_THREADLET_ATTR)) is not gl: # noqa
353
- raise UnexpectedBridgeNestingError
354
- if (cur_g := _pop_transition(True, gl)) is not added_g: # noqa
355
- raise UnexpectedBridgeNestingError
356
-
357
- return ret
358
-
359
- return inner
omlish/asyncs/utils.py DELETED
@@ -1,18 +0,0 @@
1
- import contextlib
2
- import typing as ta
3
-
4
-
5
- P = ta.ParamSpec('P')
6
- T = ta.TypeVar('T')
7
-
8
-
9
- ##
10
-
11
-
12
- async def call_with_async_exit_stack(
13
- fn: ta.Callable[ta.Concatenate[contextlib.AsyncExitStack, P], ta.Awaitable[T]],
14
- *args: ta.Any,
15
- **kwargs: ta.Any,
16
- ) -> T:
17
- async with contextlib.AsyncExitStack() as aes:
18
- return await fn(aes, *args, **kwargs)
@@ -1,18 +0,0 @@
1
- from ....text.mangle import StringMangler
2
-
3
-
4
- ##
5
-
6
-
7
- ESCAPED_IDENT_CHARS = ''.join(
8
- chr(i)
9
- for i in range(128)
10
- if not (
11
- chr(i).isalpha() or
12
- chr(i).isdigit() or
13
- chr(i) == '_' or
14
- ord(chr(i)) > 127
15
- )
16
- )
17
-
18
- IDENT_MANGLER = StringMangler.of('_', ESCAPED_IDENT_CHARS)
omlish/defs.py DELETED
@@ -1,216 +0,0 @@
1
- """
2
- A self-awarely unpythonic set of helpers for defining common boilerplate methods (repr, hash_eq, delegates, etc) in
3
- class definitions. Should be used sparingly for methods not directly used by humans (like repr) - @property's should
4
- remain @property's for type annotation, tool assistance, debugging, and otherwise, but these are still nice to have in
5
- certain circumstances (the real-world alternative usually being simply not adding them).
6
- """
7
- # ruff: noqa: ANN201
8
- import abc
9
- import functools
10
- import operator
11
- import threading
12
-
13
- from . import lang
14
-
15
-
16
- ##
17
-
18
-
19
- _repr = repr
20
-
21
- BASICS = {}
22
-
23
-
24
- def _basic(fn):
25
- if fn.__name__ in BASICS:
26
- raise NameError(fn.__name__)
27
-
28
- BASICS[fn.__name__] = fn
29
- return fn
30
-
31
-
32
- @lang.cls_dct_fn()
33
- def basic(cls_dct, *attrs, basics=None):
34
- if basics is None:
35
- basics = BASICS.keys()
36
-
37
- for k in basics:
38
- fn = BASICS[k]
39
- fn(*attrs, cls_dct=cls_dct)
40
-
41
-
42
- _REPR_SEEN = threading.local()
43
-
44
-
45
- def _repr_guard(fn):
46
- @functools.wraps(fn)
47
- def inner(obj, *args, **kwargs):
48
- try:
49
- ids = _REPR_SEEN.ids
50
-
51
- except AttributeError:
52
- ids = _REPR_SEEN.ids = set()
53
- try:
54
- ids.add(id(obj))
55
- return fn(obj, *args, **kwargs)
56
- finally:
57
- del _REPR_SEEN.ids
58
-
59
- else:
60
- if id(obj) in ids:
61
- return f'<seen:{type(obj).__name__}@{hex(id(obj))[2:]}>'
62
- ids.add(id(obj))
63
- return fn(obj, *args, **kwargs)
64
-
65
- return inner
66
-
67
-
68
- @_repr_guard
69
- def build_attr_repr(obj, *, mro=False):
70
- if mro:
71
- attrs = [
72
- attr
73
- for ty in sorted( # noqa
74
- reversed(type(obj).__mro__),
75
- key=lambda _ty: _ty.__dict__.get('__repr_priority__', 0),
76
- )
77
- for attr in ty.__dict__.get('__repr_attrs__', [])
78
- ]
79
-
80
- else:
81
- attrs = obj.__repr_attrs__
82
-
83
- s = ', '.join(f'{a}={"<self>" if v is obj else _repr(v)}' for a in attrs for v in [getattr(obj, a)])
84
- return f'{type(obj).__name__}@{hex(id(obj))[2:]}({s})'
85
-
86
-
87
- @_repr_guard
88
- def build_repr(obj, *attrs):
89
- return (
90
- f'{type(obj).__name__}'
91
- f'@{hex(id(obj))[2:]}'
92
- f'({", ".join(f"{attr}={getattr(obj, attr)!r}" for attr in attrs)})'
93
- )
94
-
95
-
96
- @_basic
97
- @lang.cls_dct_fn()
98
- def repr(cls_dct, *attrs, mro=False, priority=None): # noqa
99
- def __repr__(self): # noqa
100
- return build_attr_repr(self, mro=mro)
101
-
102
- cls_dct['__repr_attrs__'] = attrs
103
- if priority is not None:
104
- cls_dct['__repr_priority__'] = priority
105
-
106
- cls_dct['__repr__'] = __repr__
107
-
108
-
109
- @lang.cls_dct_fn()
110
- def bare_repr(cls_dct, *attrs):
111
- def __repr__(self): # noqa
112
- return lang.attr_repr(self, *attrs)
113
-
114
- cls_dct['__repr__'] = __repr__
115
-
116
-
117
- @lang.cls_dct_fn()
118
- def name_repr(cls_dct):
119
- def __repr__(self): # noqa
120
- return self.__name__
121
-
122
- cls_dct['__repr__'] = __repr__
123
-
124
-
125
- @lang.cls_dct_fn()
126
- def ne(cls_dct):
127
- def __ne__(self, other): # noqa
128
- return not (self == other)
129
-
130
- cls_dct['__ne__'] = __ne__
131
-
132
-
133
- @lang.cls_dct_fn()
134
- def no_order(cls_dct, *, raise_=None):
135
- def fn(self, other):
136
- if raise_ is None:
137
- return NotImplemented
138
- else:
139
- raise raise_
140
-
141
- for att in [
142
- '__lt__',
143
- '__le__',
144
- '__gt__',
145
- '__ge__',
146
- ]:
147
- cls_dct[att] = fn
148
-
149
-
150
- @_basic
151
- @lang.cls_dct_fn()
152
- def hash_eq(cls_dct, *attrs):
153
- def __hash__(self): # noqa
154
- return hash(tuple(getattr(self, attr) for attr in attrs))
155
-
156
- cls_dct['__hash__'] = __hash__
157
-
158
- def __eq__(self, other): # noqa
159
- if type(other) is not type(self):
160
- return False
161
-
162
- for attr in attrs: # noqa
163
- if getattr(self, attr) != getattr(other, attr):
164
- return False
165
-
166
- return True
167
-
168
- cls_dct['__eq__'] = __eq__
169
-
170
- ne(cls_dct=cls_dct)
171
-
172
-
173
- @lang.cls_dct_fn()
174
- def getter(cls_dct, *attrs):
175
- for attr in attrs:
176
- cls_dct[attr] = property(operator.attrgetter('_' + attr))
177
-
178
-
179
- @lang.cls_dct_fn()
180
- def not_implemented(cls_dct, *names, **kwargs):
181
- wrapper = kwargs.pop('wrapper', lambda _: _)
182
- if kwargs:
183
- raise TypeError(kwargs)
184
-
185
- ret = []
186
- for name in names:
187
- @wrapper
188
- def not_implemented(self, *args, **kwargs):
189
- raise NotImplementedError
190
-
191
- not_implemented.__name__ = name
192
- cls_dct[name] = not_implemented
193
- ret.append(not_implemented)
194
-
195
- return tuple(ret)
196
-
197
-
198
- @lang.cls_dct_fn()
199
- def abstract_method(cls_dct, *names):
200
- return not_implemented(cls_dct, *names, wrapper=abc.abstractmethod)
201
-
202
-
203
- @lang.cls_dct_fn()
204
- def abstract_property(cls_dct, *names):
205
- return not_implemented(cls_dct, *names, wrapper=lambda o: property(abc.abstractmethod(o)))
206
-
207
-
208
- @lang.cls_dct_fn()
209
- def abstract_hash_eq(cls_dct):
210
- return not_implemented(
211
- cls_dct,
212
- '__hash__',
213
- '__eq__',
214
- '__ne__',
215
- wrapper=abc.abstractmethod,
216
- )
@@ -1,69 +0,0 @@
1
- import abc
2
- import typing as ta
3
- import weakref
4
-
5
- from .impls import find_impl as default_find_impl
6
-
7
-
8
- T = ta.TypeVar('T')
9
-
10
-
11
- ##
12
-
13
-
14
- class Dispatcher(ta.Generic[T]):
15
- def __init__(self, find_impl: ta.Callable[[type, ta.Mapping[type, T]], T | None] | None = None) -> None:
16
- super().__init__()
17
-
18
- if find_impl is None:
19
- find_impl = default_find_impl
20
- self._find_impl = find_impl
21
-
22
- self._impls_by_arg_cls: dict[type, T] = {}
23
- self._dispatch_cache: dict[ta.Any, T | None] = {}
24
-
25
- def cache_remove(k, self_ref=weakref.ref(self)):
26
- if (ref_self := self_ref()) is not None:
27
- cache = ref_self._dispatch_cache # noqa
28
- try:
29
- del cache[k]
30
- except KeyError:
31
- pass
32
-
33
- self._cache_remove = cache_remove
34
-
35
- self._cache_token: ta.Any = None
36
-
37
- def cache_size(self) -> int:
38
- return len(self._dispatch_cache)
39
-
40
- def register(self, impl: T, cls_col: ta.Iterable[type]) -> T:
41
- for cls in cls_col:
42
- self._impls_by_arg_cls[cls] = impl
43
-
44
- if self._cache_token is None and hasattr(cls, '__abstractmethods__'):
45
- self._cache_token = abc.get_cache_token()
46
-
47
- self._dispatch_cache.clear()
48
- return impl
49
-
50
- def dispatch(self, cls: type) -> T | None:
51
- if self._cache_token is not None and (current_token := abc.get_cache_token()) != self._cache_token:
52
- self._dispatch_cache.clear()
53
- self._cache_token = current_token
54
-
55
- cls_ref = weakref.ref(cls)
56
- try:
57
- return self._dispatch_cache[cls_ref]
58
- except KeyError:
59
- pass
60
- del cls_ref
61
-
62
- impl: T | None
63
- try:
64
- impl = self._impls_by_arg_cls[cls]
65
- except KeyError:
66
- impl = self._find_impl(cls, self._impls_by_arg_cls)
67
-
68
- self._dispatch_cache[weakref.ref(cls, self._cache_remove)] = impl
69
- return impl