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/funcs/guard.py ADDED
@@ -0,0 +1,225 @@
1
+ import abc
2
+ import functools
3
+ import operator
4
+ import typing as ta
5
+
6
+ from .. import check
7
+ from .. import collections as col
8
+ from .. import lang
9
+
10
+
11
+ T = ta.TypeVar('T')
12
+ T_co = ta.TypeVar('T_co', covariant=True)
13
+ U = ta.TypeVar('U')
14
+ P = ta.ParamSpec('P')
15
+
16
+
17
+ ##
18
+
19
+
20
+ class GuardFn(ta.Protocol[P, T_co]):
21
+ def __get__(self, instance, owner=None): ...
22
+
23
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> ta.Callable[[], T_co] | None: ...
24
+
25
+
26
+ ##
27
+
28
+
29
+ @ta.final
30
+ class DumbGuardFn(ta.Generic[P, T]):
31
+ def __init__(self, fn: ta.Callable[P, T]) -> None:
32
+ self._fn = fn
33
+
34
+ def __get__(self, instance, owner=None):
35
+ return DumbGuardFn(self._fn.__get__(instance, owner)) # noqa
36
+
37
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> ta.Callable[[], T]:
38
+ return functools.partial(self._fn, *args, **kwargs)
39
+
40
+
41
+ dumb = DumbGuardFn
42
+
43
+
44
+ ##
45
+
46
+
47
+ class AmbiguousGuardFnError(Exception):
48
+ pass
49
+
50
+
51
+ @ta.final
52
+ class MultiGuardFn(ta.Generic[P, T]):
53
+ def __init__(
54
+ self,
55
+ *children: GuardFn[P, T],
56
+ default: GuardFn[P, T] | None = None,
57
+ strict: bool = False,
58
+ ) -> None:
59
+ self._children, self._default, self._strict = children, default, strict
60
+
61
+ lang.attr_ops(lambda self: (
62
+ self._children,
63
+ self._default,
64
+ self._strict,
65
+ )).install(locals())
66
+
67
+ def __get__(self, instance, owner=None):
68
+ return MultiGuardFn(*map(operator.methodcaller('__get__', instance, owner), self._children), default=self._default.__get__(instance, owner) if self._default is not None else None, strict=self._strict) # noqa
69
+
70
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> ta.Callable[[], T] | None:
71
+ matches = []
72
+ for c in self._children:
73
+ if (m := c(*args, **kwargs)) is not None:
74
+ if not self._strict:
75
+ return m
76
+ matches.append(m)
77
+ if not matches:
78
+ if (dfl := self._default) is not None:
79
+ return dfl(*args, **kwargs)
80
+ else:
81
+ return None
82
+ elif len(matches) > 1:
83
+ raise AmbiguousGuardFnError
84
+ else:
85
+ return matches[0]
86
+
87
+
88
+ multi = MultiGuardFn
89
+
90
+
91
+ ##
92
+
93
+
94
+ class _BaseGuardFnMethod(lang.Abstract, ta.Generic[P, T]):
95
+ def __init__(
96
+ self,
97
+ *,
98
+ strict: bool = False,
99
+ requires_override: bool = False,
100
+ instance_cache: bool = False,
101
+ default: GuardFn[P, T] | None = None,
102
+ ) -> None:
103
+ super().__init__()
104
+
105
+ self._strict = strict
106
+ self._instance_cache = instance_cache
107
+ self._default = default
108
+
109
+ self._registry: col.AttrRegistry[ta.Callable, None] = col.AttrRegistry(
110
+ requires_override=requires_override,
111
+ )
112
+
113
+ self._cache: col.AttrRegistryCache[ta.Callable, None, MultiGuardFn] = col.AttrRegistryCache(
114
+ self._registry,
115
+ self._prepare,
116
+ )
117
+
118
+ _owner: type | None = None
119
+ _name: str | None = None
120
+
121
+ def __set_name__(self, owner, name):
122
+ if self._owner is None:
123
+ self._owner = owner
124
+ if self._name is None:
125
+ self._name = name
126
+
127
+ def register(self, fn: U) -> U:
128
+ check.callable(fn)
129
+ self._registry.register(ta.cast(ta.Callable, fn), None)
130
+ return fn
131
+
132
+ def _prepare(self, instance_cls: type, collected: ta.Mapping[str, tuple[ta.Callable, None]]) -> MultiGuardFn:
133
+ return MultiGuardFn(
134
+ *[getattr(instance_cls, a) for a in collected],
135
+ default=self._default,
136
+ strict=self._strict,
137
+ )
138
+
139
+ @abc.abstractmethod
140
+ def _bind(self, instance, owner):
141
+ raise NotImplementedError
142
+
143
+ def __get__(self, instance, owner=None):
144
+ if instance is None:
145
+ return self
146
+
147
+ if self._instance_cache:
148
+ try:
149
+ return instance.__dict__[self._name]
150
+ except KeyError:
151
+ pass
152
+
153
+ bound = self._bind(instance, owner)
154
+
155
+ if self._instance_cache:
156
+ instance.__dict__[self._name] = bound
157
+
158
+ return bound
159
+
160
+ def _call(self, *args, **kwargs):
161
+ instance, *rest = args
162
+ return self.__get__(instance)(*rest, **kwargs)
163
+
164
+ #
165
+
166
+
167
+ @ta.final
168
+ class GuardFnMethod(_BaseGuardFnMethod[P, T]):
169
+ def _bind(self, instance, owner):
170
+ return self._cache.get(type(instance)).__get__(instance, owner) # noqa
171
+
172
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> ta.Callable[[], T] | None:
173
+ return self._call(*args, **kwargs)
174
+
175
+
176
+ def method(
177
+ *,
178
+ strict: bool = False,
179
+ requires_override: bool = False,
180
+ instance_cache: bool = False,
181
+ default: bool = False,
182
+ ) -> ta.Callable[[ta.Callable[P, T]], GuardFnMethod[P, T]]: # noqa
183
+ def inner(fn):
184
+ return GuardFnMethod(
185
+ strict=strict,
186
+ requires_override=requires_override,
187
+ instance_cache=instance_cache,
188
+ default=fn if default else None,
189
+ )
190
+
191
+ return inner
192
+
193
+
194
+ #
195
+
196
+
197
+ @ta.final
198
+ class ImmediateGuardFnMethod(_BaseGuardFnMethod[P, T]):
199
+ def _bind(self, instance, owner):
200
+ gf = self._cache.get(type(instance)).__get__(instance, owner) # noqa
201
+
202
+ def inner(*args, **kwargs):
203
+ return gf(*args, **kwargs)() # Note: cannot be None due to non-optional default
204
+
205
+ return inner
206
+
207
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> T:
208
+ return self._call(*args, **kwargs)
209
+
210
+
211
+ def immediate_method(
212
+ *,
213
+ strict: bool = False,
214
+ requires_override: bool = False,
215
+ instance_cache: bool = False,
216
+ ) -> ta.Callable[[ta.Callable[P, T]], ImmediateGuardFnMethod[P, T]]: # noqa
217
+ def inner(fn):
218
+ return ImmediateGuardFnMethod(
219
+ strict=strict,
220
+ requires_override=requires_override,
221
+ instance_cache=instance_cache,
222
+ default=(lambda *args, **kwargs: lambda: fn(*args, **kwargs)),
223
+ )
224
+
225
+ return inner
@@ -29,7 +29,7 @@ class Renderer:
29
29
 
30
30
  self._out = out
31
31
 
32
- @dispatch.method
32
+ @dispatch.method(instance_cache=True)
33
33
  def render(self, item: Item) -> None:
34
34
  raise TypeError(item)
35
35
 
omlish/http/all.py CHANGED
@@ -1,53 +1,122 @@
1
- from . import consts # noqa
2
-
3
- from .clients import ( # noqa
4
- BaseHttpResponse,
5
- HttpClient,
6
- HttpClientError,
7
- HttpRequest,
8
- HttpResponse,
9
- HttpxHttpClient,
10
- StreamHttpResponse,
11
- UrllibHttpClient,
12
- client,
13
- close_response,
14
- closing_response,
15
- read_response,
16
- request,
17
- )
18
-
19
- from .cookies import ( # noqa
20
- CookieTooBigError,
21
- dump_cookie,
22
- parse_cookie,
23
- )
24
-
25
- from .dates import ( # noqa
26
- http_date,
27
- parse_date,
28
- )
29
-
30
- from .encodings import ( # noqa
31
- latin1_decode,
32
- latin1_encode,
33
- )
34
-
35
- from .headers import ( # noqa
36
- CanHttpHeaders,
37
- HttpHeaders,
38
- headers,
39
- )
40
-
41
- from .json import ( # noqa
42
- JSON_TAGGER,
43
- JsonTag,
44
- JsonTagger,
45
- json_dumps,
46
- json_loads,
47
- )
48
-
49
- from .multipart import ( # noqa
50
- MultipartData,
51
- MultipartEncoder,
52
- MultipartField,
53
- )
1
+ from .. import lang as _lang
2
+
3
+
4
+ with _lang.auto_proxy_init(globals()):
5
+ ##
6
+
7
+ from .clients.asyncs import ( # noqa
8
+ AsyncStreamHttpResponse,
9
+
10
+ async_close_http_client_response,
11
+ async_closing_http_client_response,
12
+ async_read_http_client_response,
13
+
14
+ AsyncHttpClient,
15
+ )
16
+
17
+ from .clients.base import ( # noqa
18
+ DEFAULT_ENCODING,
19
+ is_success_status,
20
+
21
+ HttpRequest,
22
+
23
+ BaseHttpResponse,
24
+ HttpResponse,
25
+
26
+ HttpClientContext,
27
+
28
+ HttpClientError,
29
+ HttpStatusError,
30
+
31
+ BaseHttpClient,
32
+ )
33
+
34
+ from .clients.default import ( # noqa
35
+ client,
36
+ manage_client,
37
+
38
+ request,
39
+
40
+ async_client,
41
+ manage_async_client,
42
+
43
+ async_request,
44
+ )
45
+
46
+ from .clients.httpx import ( # noqa
47
+ HttpxHttpClient,
48
+
49
+ HttpxAsyncHttpClient,
50
+ )
51
+
52
+ from .clients.middleware import ( # noqa
53
+ HttpClientMiddleware,
54
+ AbstractMiddlewareHttpClient,
55
+
56
+ MiddlewareHttpClient,
57
+ MiddlewareAsyncHttpClient,
58
+
59
+ TooManyRedirectsHttpClientError,
60
+ RedirectHandlingHttpClientMiddleware,
61
+ )
62
+
63
+ from .clients.sync import ( # noqa
64
+ StreamHttpResponse,
65
+
66
+ close_http_client_response,
67
+ closing_http_client_response,
68
+ read_http_client_response,
69
+
70
+ HttpClient,
71
+ )
72
+
73
+ from .clients.syncasync import ( # noqa
74
+ SyncAsyncHttpClient,
75
+ )
76
+
77
+ from .clients.urllib import ( # noqa
78
+ UrllibHttpClient,
79
+ )
80
+
81
+ from . import asgi # noqa
82
+
83
+ from . import consts # noqa
84
+
85
+ from .cookies import ( # noqa
86
+ CookieTooBigError,
87
+ dump_cookie,
88
+ parse_cookie,
89
+ )
90
+
91
+ from .dates import ( # noqa
92
+ http_date,
93
+ parse_date,
94
+ )
95
+
96
+ from .encodings import ( # noqa
97
+ latin1_decode,
98
+ latin1_encode,
99
+ )
100
+
101
+ from .headers import ( # noqa
102
+ CanHttpHeaders,
103
+ DuplicateHttpHeaderError,
104
+ HttpHeaders,
105
+ headers,
106
+ )
107
+
108
+ from .json import ( # noqa
109
+ JSON_TAGGER,
110
+ JsonTag,
111
+ JsonTagger,
112
+ json_dumps,
113
+ json_loads,
114
+ )
115
+
116
+ from .multipart import ( # noqa
117
+ MultipartData,
118
+ MultipartEncoder,
119
+ MultipartField,
120
+ )
121
+
122
+ from . import wsgi # noqa
omlish/http/asgi.py CHANGED
@@ -1,14 +1,14 @@
1
1
  import abc
2
- import logging
3
2
  import typing as ta
4
3
  import urllib.parse
5
4
 
6
5
  from .. import check
7
6
  from .. import lang
7
+ from ..logs import all as logs
8
8
  from . import consts
9
9
 
10
10
 
11
- log = logging.getLogger(__name__)
11
+ log = logs.get_module_logger(globals())
12
12
 
13
13
 
14
14
  ##
@@ -1,34 +0,0 @@
1
- from .base import ( # noqa
2
- DEFAULT_ENCODING,
3
-
4
- is_success_status,
5
-
6
- HttpRequest,
7
-
8
- BaseHttpResponse,
9
- HttpResponse,
10
- StreamHttpResponse,
11
-
12
- close_response,
13
- closing_response,
14
- read_response,
15
-
16
- HttpClientError,
17
- HttpStatusError,
18
-
19
- HttpClient,
20
- )
21
-
22
- from .default import ( # noqa
23
- client,
24
-
25
- request,
26
- )
27
-
28
- from .httpx import ( # noqa
29
- HttpxHttpClient,
30
- )
31
-
32
- from .urllib import ( # noqa
33
- UrllibHttpClient,
34
- )
@@ -0,0 +1,153 @@
1
+ # ruff: noqa: UP043 UP045
2
+ # @omlish-lite
3
+ import abc
4
+ import contextlib
5
+ import dataclasses as dc
6
+ import typing as ta
7
+
8
+ from ...io.readers import AsyncBufferedBytesReader
9
+ from ...lite.abstract import Abstract
10
+ from ...lite.dataclasses import dataclass_shallow_asdict
11
+ from .base import BaseHttpClient
12
+ from .base import BaseHttpResponse
13
+ from .base import BaseHttpResponseT
14
+ from .base import HttpClientContext
15
+ from .base import HttpRequest
16
+ from .base import HttpResponse
17
+ from .base import HttpStatusError
18
+
19
+
20
+ AsyncStreamHttpResponseT = ta.TypeVar('AsyncStreamHttpResponseT', bound='AsyncStreamHttpResponse')
21
+ AsyncHttpClientT = ta.TypeVar('AsyncHttpClientT', bound='AsyncHttpClient')
22
+
23
+
24
+ ##
25
+
26
+
27
+ @ta.final
28
+ @dc.dataclass(frozen=True) # kw_only=True
29
+ class AsyncStreamHttpResponse(BaseHttpResponse):
30
+ _stream: ta.Optional[AsyncBufferedBytesReader] = None
31
+
32
+ @property
33
+ def stream(self) -> 'AsyncBufferedBytesReader':
34
+ if (st := self._stream) is None:
35
+ raise TypeError('No data')
36
+ return st
37
+
38
+ @property
39
+ def has_data(self) -> bool:
40
+ return self._stream is not None
41
+
42
+ #
43
+
44
+ _closer: ta.Optional[ta.Callable[[], ta.Awaitable[None]]] = None
45
+
46
+ async def __aenter__(self: AsyncStreamHttpResponseT) -> AsyncStreamHttpResponseT:
47
+ return self
48
+
49
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
50
+ await self.close()
51
+
52
+ async def close(self) -> None:
53
+ if (c := self._closer) is not None:
54
+ await c() # noqa
55
+
56
+
57
+ #
58
+
59
+
60
+ async def async_close_http_client_response(resp: BaseHttpResponse) -> None:
61
+ if isinstance(resp, HttpResponse):
62
+ pass
63
+
64
+ elif isinstance(resp, AsyncStreamHttpResponse):
65
+ await resp.close()
66
+
67
+ else:
68
+ raise TypeError(resp)
69
+
70
+
71
+ @contextlib.asynccontextmanager
72
+ async def async_closing_http_client_response(resp: BaseHttpResponseT) -> ta.AsyncGenerator[BaseHttpResponseT, None]:
73
+ if isinstance(resp, HttpResponse):
74
+ yield resp
75
+ return
76
+
77
+ elif isinstance(resp, AsyncStreamHttpResponse):
78
+ try:
79
+ yield resp
80
+ finally:
81
+ await resp.close()
82
+
83
+ else:
84
+ raise TypeError(resp)
85
+
86
+
87
+ async def async_read_http_client_response(resp: BaseHttpResponse) -> HttpResponse:
88
+ if isinstance(resp, HttpResponse):
89
+ return resp
90
+
91
+ elif isinstance(resp, AsyncStreamHttpResponse):
92
+ return HttpResponse(**{
93
+ **{k: v for k, v in dataclass_shallow_asdict(resp).items() if k not in ('_stream', '_closer')},
94
+ **({'data': await resp.stream.readall()} if resp.has_data else {}),
95
+ })
96
+
97
+ else:
98
+ raise TypeError(resp)
99
+
100
+
101
+ ##
102
+
103
+
104
+ class AsyncHttpClient(BaseHttpClient, Abstract):
105
+ async def __aenter__(self: AsyncHttpClientT) -> AsyncHttpClientT:
106
+ return self
107
+
108
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
109
+ pass
110
+
111
+ async def request(
112
+ self,
113
+ req: HttpRequest,
114
+ *,
115
+ context: ta.Optional[HttpClientContext] = None,
116
+ check: bool = False,
117
+ ) -> HttpResponse:
118
+ async with async_closing_http_client_response(await self.stream_request(
119
+ req,
120
+ context=context,
121
+ check=check,
122
+ )) as resp:
123
+ return await async_read_http_client_response(resp)
124
+
125
+ async def stream_request(
126
+ self,
127
+ req: HttpRequest,
128
+ *,
129
+ context: ta.Optional[HttpClientContext] = None,
130
+ check: bool = False,
131
+ ) -> AsyncStreamHttpResponse:
132
+ if context is None:
133
+ context = HttpClientContext()
134
+
135
+ resp = await self._stream_request(context, req)
136
+
137
+ try:
138
+ if check and not resp.is_success:
139
+ if isinstance(resp.underlying, Exception):
140
+ cause = resp.underlying
141
+ else:
142
+ cause = None
143
+ raise HttpStatusError(await async_read_http_client_response(resp)) from cause # noqa
144
+
145
+ except Exception:
146
+ await async_close_http_client_response(resp)
147
+ raise
148
+
149
+ return resp
150
+
151
+ @abc.abstractmethod
152
+ def _stream_request(self, ctx: HttpClientContext, req: HttpRequest) -> ta.Awaitable[AsyncStreamHttpResponse]:
153
+ raise NotImplementedError