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
@@ -5,14 +5,12 @@ from ... import check
5
5
  from ... import dataclasses as dc
6
6
  from ... import lang
7
7
  from ... import reflect as rfl
8
- from ...funcs import match as mfs
9
- from ..base.contexts import MarshalContext
10
- from ..base.contexts import UnmarshalContext
8
+ from ..base.contexts import MarshalFactoryContext
9
+ from ..base.contexts import UnmarshalFactoryContext
11
10
  from ..base.types import Marshaler
11
+ from ..base.types import MarshalerFactory
12
12
  from ..base.types import Unmarshaler
13
- from ..base.values import Value
14
- from ..factories.simple import SimpleMarshalerFactory
15
- from ..factories.simple import SimpleUnmarshalerFactory
13
+ from ..base.types import UnmarshalerFactory
16
14
  from .marshal import make_polymorphism_marshaler
17
15
  from .metadata import Impls
18
16
  from .metadata import TypeTagging
@@ -23,98 +21,6 @@ from .unmarshal import make_polymorphism_unmarshaler
23
21
  ##
24
22
 
25
23
 
26
- class MatchUnionMarshaler(Marshaler):
27
- mmf: mfs.MultiMatchFn[[UnmarshalContext, Value], ta.Any]
28
-
29
- def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
30
- try:
31
- m = self.mmf.match(ctx, o)
32
- except mfs.AmbiguousMatchesError:
33
- raise ValueError(o) # noqa
34
- return m.fn(ctx, o)
35
-
36
-
37
- class MatchUnionUnmarshaler(Unmarshaler):
38
- mmf: mfs.MultiMatchFn[[UnmarshalContext, Value], ta.Any]
39
-
40
- def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
41
- try:
42
- m = self.mmf.match(ctx, v)
43
- except mfs.AmbiguousMatchesError:
44
- raise ValueError(v) # noqa
45
- return m.fn(ctx, v)
46
-
47
-
48
- ##
49
-
50
-
51
- PRIMITIVE_UNION_TYPES: tuple[type, ...] = (
52
- float,
53
- int,
54
- str,
55
- )
56
-
57
-
58
- #
59
-
60
-
61
- @dc.dataclass(frozen=True)
62
- class PrimitiveUnionMarshaler(Marshaler):
63
- tys: ta.Sequence[type]
64
-
65
- def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
66
- if type(o) not in self.tys:
67
- raise TypeError(o)
68
- return o
69
-
70
-
71
- @dc.dataclass(frozen=True)
72
- class PrimitiveUnionMarshalerFactory(SimpleMarshalerFactory):
73
- tys: ta.Sequence[type] = PRIMITIVE_UNION_TYPES
74
-
75
- def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
76
- return isinstance(rty, rfl.Union) and all(a in self.tys for a in rty.args)
77
-
78
- def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
79
- args = check.isinstance(rty, rfl.Union).args
80
- return PrimitiveUnionMarshaler([t for t in self.tys if t in args])
81
-
82
-
83
- #
84
-
85
-
86
- @dc.dataclass(frozen=True)
87
- class PrimitiveUnionUnmarshaler(Unmarshaler):
88
- tys: ta.Sequence[type]
89
-
90
- def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
91
- if type(v) not in self.tys:
92
- raise TypeError(v)
93
- return v
94
-
95
-
96
- @dc.dataclass(frozen=True)
97
- class PrimitiveUnionUnmarshalerFactory(SimpleUnmarshalerFactory):
98
- tys: ta.Sequence[type] = PRIMITIVE_UNION_TYPES
99
-
100
- def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
101
- return isinstance(rty, rfl.Union) and all(a in self.tys for a in rty.args)
102
-
103
- def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
104
- args = check.isinstance(rty, rfl.Union).args
105
- return PrimitiveUnionUnmarshaler([t for t in self.tys if t in args])
106
-
107
-
108
- #
109
-
110
-
111
- PRIMITIVE_UNION_MARSHALER_FACTORY = PrimitiveUnionMarshalerFactory()
112
- PRIMITIVE_UNION_UNMARSHALER_FACTORY = PrimitiveUnionUnmarshalerFactory()
113
-
114
-
115
- ##
116
-
117
-
118
24
  @dc.dataclass(frozen=True)
119
25
  class _BasePolymorphismUnionFactory(lang.Abstract):
120
26
  impls: Impls
@@ -126,7 +32,7 @@ class _BasePolymorphismUnionFactory(lang.Abstract):
126
32
  def rtys(self) -> frozenset[rfl.Type]:
127
33
  return frozenset(i.ty for i in self.impls)
128
34
 
129
- def guard(self, ctx: MarshalContext | UnmarshalContext, rty: rfl.Type) -> bool:
35
+ def _guard(self, rty: rfl.Type) -> bool:
130
36
  if not isinstance(rty, rfl.Union):
131
37
  return False
132
38
  if self.allow_partial:
@@ -140,12 +46,16 @@ class _BasePolymorphismUnionFactory(lang.Abstract):
140
46
 
141
47
 
142
48
  @dc.dataclass(frozen=True)
143
- class PolymorphismUnionMarshalerFactory(_BasePolymorphismUnionFactory, SimpleMarshalerFactory):
144
- def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
145
- return make_polymorphism_marshaler(self.get_impls(rty), self.tt, ctx)
49
+ class PolymorphismUnionMarshalerFactory(_BasePolymorphismUnionFactory, MarshalerFactory):
50
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
51
+ if not self._guard(rty):
52
+ return None
53
+ return lambda: make_polymorphism_marshaler(self.get_impls(rty), self.tt, ctx)
146
54
 
147
55
 
148
56
  @dc.dataclass(frozen=True)
149
- class PolymorphismUnionUnmarshalerFactory(_BasePolymorphismUnionFactory, SimpleUnmarshalerFactory):
150
- def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
151
- return make_polymorphism_unmarshaler(self.get_impls(rty), self.tt, ctx)
57
+ class PolymorphismUnionUnmarshalerFactory(_BasePolymorphismUnionFactory, UnmarshalerFactory):
58
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
59
+ if not self._guard(rty):
60
+ return None
61
+ return lambda: make_polymorphism_unmarshaler(self.get_impls(rty), self.tt, ctx)
@@ -7,9 +7,10 @@ from ... import check
7
7
  from ... import lang
8
8
  from ... import reflect as rfl
9
9
  from ..base.contexts import UnmarshalContext
10
+ from ..base.contexts import UnmarshalFactoryContext
10
11
  from ..base.types import Unmarshaler
12
+ from ..base.types import UnmarshalerFactory
11
13
  from ..base.values import Value
12
- from ..factories.simple import SimpleUnmarshalerFactory
13
14
  from .metadata import FieldTypeTagging
14
15
  from .metadata import Impls
15
16
  from .metadata import Polymorphism
@@ -58,12 +59,12 @@ class FieldPolymorphismUnmarshaler(PolymorphismUnmarshaler):
58
59
  def make_polymorphism_unmarshaler(
59
60
  impls: Impls,
60
61
  tt: TypeTagging,
61
- ctx: UnmarshalContext,
62
+ ctx: UnmarshalFactoryContext,
62
63
  ) -> Unmarshaler:
63
64
  m = {
64
65
  t: u
65
66
  for i in impls
66
- for u in [ctx.make(i.ty)]
67
+ for u in [ctx.make_unmarshaler(i.ty)]
67
68
  for t in [i.tag, *i.alts]
68
69
  }
69
70
  if isinstance(tt, WrapperTypeTagging):
@@ -75,13 +76,11 @@ def make_polymorphism_unmarshaler(
75
76
 
76
77
 
77
78
  @dc.dataclass(frozen=True)
78
- class PolymorphismUnmarshalerFactory(SimpleUnmarshalerFactory):
79
+ class PolymorphismUnmarshalerFactory(UnmarshalerFactory):
79
80
  p: Polymorphism
80
81
  tt: TypeTagging = WrapperTypeTagging()
81
82
 
82
- def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
83
- return rty is self.p.ty
84
-
85
- def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
86
- check.is_(rty, self.p.ty)
87
- return make_polymorphism_unmarshaler(self.p.impls, self.tt, ctx)
83
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
84
+ if rty is not self.p.ty:
85
+ return None
86
+ return lambda: make_polymorphism_unmarshaler(self.p.impls, self.tt, ctx)
@@ -5,12 +5,14 @@ import typing as ta
5
5
  from ... import check
6
6
  from ... import reflect as rfl
7
7
  from ..base.contexts import MarshalContext
8
+ from ..base.contexts import MarshalFactoryContext
8
9
  from ..base.contexts import UnmarshalContext
10
+ from ..base.contexts import UnmarshalFactoryContext
9
11
  from ..base.types import Marshaler
12
+ from ..base.types import MarshalerFactory
10
13
  from ..base.types import Unmarshaler
14
+ from ..base.types import UnmarshalerFactory
11
15
  from ..base.values import Value
12
- from ..factories.simple import SimpleMarshalerFactory
13
- from ..factories.simple import SimpleUnmarshalerFactory
14
16
 
15
17
 
16
18
  ##
@@ -24,14 +26,11 @@ class EnumMarshaler(Marshaler):
24
26
  return o.name
25
27
 
26
28
 
27
- class EnumMarshalerFactory(SimpleMarshalerFactory):
28
- def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
29
- return isinstance(rty, type) and issubclass(rty, enum.Enum)
30
-
31
- def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
32
- ty = check.isinstance(rty, type)
33
- check.state(issubclass(ty, enum.Enum))
34
- return EnumMarshaler(ty) # noqa
29
+ class EnumMarshalerFactory(MarshalerFactory):
30
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
31
+ if not (isinstance(rty, type) and issubclass(rty, enum.Enum)):
32
+ return None
33
+ return lambda: EnumMarshaler(rty) # noqa
35
34
 
36
35
 
37
36
  @dc.dataclass(frozen=True)
@@ -42,11 +41,8 @@ class EnumUnmarshaler(Unmarshaler):
42
41
  return self.ty[check.isinstance(v, str)]
43
42
 
44
43
 
45
- class EnumUnmarshalerFactory(SimpleUnmarshalerFactory):
46
- def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
47
- return isinstance(rty, type) and issubclass(rty, enum.Enum)
48
-
49
- def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
50
- ty = check.isinstance(rty, type)
51
- check.state(issubclass(ty, enum.Enum))
52
- return EnumUnmarshaler(ty)
44
+ class EnumUnmarshalerFactory(UnmarshalerFactory):
45
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
46
+ if not (isinstance(rty, type) and issubclass(rty, enum.Enum)):
47
+ return None
48
+ return lambda: EnumUnmarshaler(rty) # noqa
@@ -22,6 +22,10 @@ from .composite.optionals import OptionalMarshalerFactory
22
22
  from .composite.optionals import OptionalUnmarshalerFactory
23
23
  from .composite.special import SequenceNotStrMarshalerFactory
24
24
  from .composite.special import SequenceNotStrUnmarshalerFactory
25
+ from .composite.unions.literals import LiteralUnionMarshalerFactory
26
+ from .composite.unions.literals import LiteralUnionUnmarshalerFactory
27
+ from .composite.unions.primitives import PrimitiveUnionMarshalerFactory
28
+ from .composite.unions.primitives import PrimitiveUnionUnmarshalerFactory
25
29
  from .factories.invalidate import InvalidatableMarshalerFactory
26
30
  from .factories.invalidate import InvalidatableUnmarshalerFactory
27
31
  from .factories.moduleimport.factories import ModuleImportingMarshalerFactory
@@ -36,8 +40,6 @@ from .objects.dataclasses import DataclassMarshalerFactory
36
40
  from .objects.dataclasses import DataclassUnmarshalerFactory
37
41
  from .objects.namedtuples import NamedtupleMarshalerFactory
38
42
  from .objects.namedtuples import NamedtupleUnmarshalerFactory
39
- from .polymorphism.unions import PrimitiveUnionMarshalerFactory
40
- from .polymorphism.unions import PrimitiveUnionUnmarshalerFactory
41
43
  from .singular.datetimes import DATETIME_MARSHALER_FACTORY
42
44
  from .singular.datetimes import DATETIME_UNMARSHALER_FACTORY
43
45
  from .singular.enums import EnumMarshalerFactory
@@ -65,6 +67,7 @@ DEFAULT_STANDARD_FACTORIES = StandardFactories(
65
67
  PRIMITIVE_MARSHALER_FACTORY,
66
68
  NewtypeMarshalerFactory(),
67
69
  OptionalMarshalerFactory(),
70
+ LiteralUnionMarshalerFactory(),
68
71
  PrimitiveUnionMarshalerFactory(),
69
72
  DataclassMarshalerFactory(),
70
73
  NamedtupleMarshalerFactory(),
@@ -84,6 +87,7 @@ DEFAULT_STANDARD_FACTORIES = StandardFactories(
84
87
  PRIMITIVE_UNMARSHALER_FACTORY,
85
88
  NewtypeUnmarshalerFactory(),
86
89
  OptionalUnmarshalerFactory(),
90
+ LiteralUnionUnmarshalerFactory(),
87
91
  PrimitiveUnionUnmarshalerFactory(),
88
92
  DataclassUnmarshalerFactory(),
89
93
  NamedtupleUnmarshalerFactory(),
@@ -115,11 +119,11 @@ def new_standard_marshaler_factory(
115
119
  nonlocal gl
116
120
  gl = DEFAULT_STANDARD_FACTORIES
117
121
 
118
- fi: MarshalerFactory = MultiMarshalerFactory([
122
+ fi: MarshalerFactory = MultiMarshalerFactory(
119
123
  *(first if first is not None else []),
120
124
  *gl.marshaler_factories,
121
125
  *(last if last is not None else []),
122
- ])
126
+ )
123
127
 
124
128
  fi = RecursiveMarshalerFactory(fi)
125
129
 
@@ -148,11 +152,11 @@ def new_standard_unmarshaler_factory(
148
152
  nonlocal gl
149
153
  gl = DEFAULT_STANDARD_FACTORIES
150
154
 
151
- fi: UnmarshalerFactory = MultiUnmarshalerFactory([
155
+ fi: UnmarshalerFactory = MultiUnmarshalerFactory(
152
156
  *(first if first is not None else []),
153
157
  *gl.unmarshaler_factories,
154
158
  *(last if last is not None else []),
155
- ])
159
+ )
156
160
 
157
161
  fi = RecursiveUnmarshalerFactory(fi)
158
162
 
@@ -15,7 +15,7 @@ from ..factories.typemap import TypeMapUnmarshalerFactory
15
15
 
16
16
  class AnyMarshalerUnmarshaler(Marshaler, Unmarshaler):
17
17
  def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
18
- return ctx.make(type(o)).marshal(ctx, o)
18
+ return ctx.marshal_factory_context.make_marshaler(type(o)).marshal(ctx, o)
19
19
 
20
20
  def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
21
21
  return v
@@ -2,45 +2,40 @@ import dataclasses as dc
2
2
  import typing as ta
3
3
 
4
4
  from ... import reflect as rfl
5
- from ...funcs import match as mfs
6
- from ..base.contexts import MarshalContext
7
- from ..base.contexts import UnmarshalContext
5
+ from ..base.contexts import MarshalFactoryContext
6
+ from ..base.contexts import UnmarshalFactoryContext
8
7
  from ..base.errors import ForbiddenTypeError
9
8
  from ..base.types import Marshaler
9
+ from ..base.types import MarshalerFactory
10
10
  from ..base.types import Unmarshaler
11
- from ..factories.simple import SimpleMarshalerFactory
12
- from ..factories.simple import SimpleUnmarshalerFactory
13
-
14
-
15
- C = ta.TypeVar('C')
16
- R = ta.TypeVar('R')
11
+ from ..base.types import UnmarshalerFactory
17
12
 
18
13
 
19
14
  ##
20
15
 
21
16
 
22
17
  @dc.dataclass(frozen=True)
23
- class ForbiddenTypeFactory(mfs.MatchFn[[C, rfl.Type], R]):
18
+ class ForbiddenTypeMarshalerFactoryUnmarshalerFactory(MarshalerFactory, UnmarshalerFactory):
24
19
  rtys: ta.AbstractSet[rfl.Type]
25
20
 
26
- def guard(self, ctx: C, rty: rfl.Type) -> bool:
27
- return rty in self.rtys
21
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
22
+ if rty not in self.rtys:
23
+ return None
28
24
 
29
- def fn(self, ctx: C, rty: rfl.Type) -> R:
30
- raise ForbiddenTypeError(rty)
25
+ def inner():
26
+ raise ForbiddenTypeError(rty)
31
27
 
28
+ return inner
32
29
 
33
- @dc.dataclass(frozen=True)
34
- class ForbiddenTypeMarshalerFactory(
35
- ForbiddenTypeFactory[MarshalContext, Marshaler],
36
- SimpleMarshalerFactory,
37
- ):
38
- pass
30
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
31
+ if rty not in self.rtys:
32
+ return None
39
33
 
34
+ def inner():
35
+ raise ForbiddenTypeError(rty)
40
36
 
41
- @dc.dataclass(frozen=True)
42
- class ForbiddenTypeUnmarshalerFactory(
43
- ForbiddenTypeFactory[UnmarshalContext, Unmarshaler],
44
- SimpleUnmarshalerFactory,
45
- ):
46
- pass
37
+ return inner
38
+
39
+
40
+ ForbiddenTypeMarshalerFactory = ForbiddenTypeMarshalerFactoryUnmarshalerFactory
41
+ ForbiddenTypeUnmarshalerFactory = ForbiddenTypeMarshalerFactoryUnmarshalerFactory
omlish/math/fixed.py CHANGED
@@ -70,8 +70,8 @@ class FixedWidthInt(int, lang.Abstract):
70
70
 
71
71
  #
72
72
 
73
- def __init_subclass__(cls) -> None:
74
- super().__init_subclass__()
73
+ def __init_subclass__(cls, **kwargs: ta.Any) -> None:
74
+ super().__init_subclass__(**kwargs)
75
75
 
76
76
  if lang.is_abstract_class(cls):
77
77
  return
omlish/metadata.py CHANGED
@@ -19,6 +19,8 @@ from . import lang
19
19
 
20
20
  T = ta.TypeVar('T')
21
21
 
22
+ ObjectMetadataT = ta.TypeVar('ObjectMetadataT', bound='ObjectMetadata')
23
+
22
24
 
23
25
  ##
24
26
 
@@ -94,12 +96,32 @@ def append_object_metadata(obj: T, *mds: ObjectMetadata) -> T:
94
96
  _type = type
95
97
 
96
98
 
99
+ @ta.overload
100
+ def get_object_metadata(
101
+ obj: ta.Any,
102
+ *,
103
+ strict: bool = False,
104
+ type: ta.Type[ObjectMetadataT], # noqa
105
+ ) -> ta.Sequence[ObjectMetadataT]:
106
+ ...
107
+
108
+
109
+ @ta.overload
97
110
  def get_object_metadata(
98
111
  obj: ta.Any,
99
112
  *,
100
113
  strict: bool = False,
101
114
  type: ta.Type | tuple[ta.Type, ...] | None = None, # noqa
102
- ) -> ta.Sequence[ObjectMetadata]:
115
+ ) -> ta.Sequence[ta.Any]:
116
+ ...
117
+
118
+
119
+ def get_object_metadata(
120
+ obj,
121
+ *,
122
+ strict=False,
123
+ type=None, # noqa
124
+ ):
103
125
  try:
104
126
  tgt = _unwrap_object_metadata_target(obj)
105
127
  except ObjectMetadataTargetTypeError:
omlish/os/atomics.py CHANGED
@@ -7,11 +7,11 @@ import tempfile
7
7
  import typing as ta
8
8
 
9
9
  from ..lite.abstract import Abstract
10
+ from ..lite.attrops import attr_repr
10
11
  from ..lite.check import check
11
- from ..lite.strings import attr_repr
12
12
 
13
13
 
14
- AtomicPathSwapKind = ta.Literal['dir', 'file']
14
+ AtomicPathSwapKind = ta.Literal['dir', 'file'] # ta.TypeAlias
15
15
  AtomicPathSwapState = ta.Literal['open', 'committed', 'aborted'] # ta.TypeAlias
16
16
 
17
17
 
omlish/os/forkhooks.py CHANGED
@@ -1,5 +1,9 @@
1
1
  # ruff: noqa: UP006 UP007 UP045
2
2
  # @omlish-lite
3
+ """
4
+ TODO:
5
+ - https://github.com/python/cpython/issues/50970
6
+ """
3
7
  import os
4
8
  import threading
5
9
  import typing as ta
omlish/os/journald.py CHANGED
@@ -79,7 +79,7 @@ SD_LOG_LEVEL_MAP: ta.Mapping[int, int] = {
79
79
  }
80
80
 
81
81
 
82
- class JournaldLogHandler(logging.Handler):
82
+ class JournaldLoggingHandler(logging.Handler):
83
83
  """
84
84
  TODO:
85
85
  - fallback handler for when this barfs
@@ -148,7 +148,7 @@ class JournaldLogHandler(logging.Handler):
148
148
  self.handleError(record)
149
149
 
150
150
 
151
- def journald_log_handler_factory(
151
+ def journald_logging_handler_factory(
152
152
  *,
153
153
  no_tty_check: bool = False,
154
154
  no_fallback: bool = False,
@@ -158,6 +158,6 @@ def journald_log_handler_factory(
158
158
  (no_tty_check or not sys.stderr.isatty()) and
159
159
  (no_fallback or sd_try_libsystemd() is not None)
160
160
  ):
161
- return JournaldLogHandler()
161
+ return JournaldLoggingHandler()
162
162
 
163
163
  return logging.StreamHandler()
@@ -25,8 +25,8 @@ import sys
25
25
  import time
26
26
  import typing as ta
27
27
 
28
- from ...diag.lslocks import LslocksCommand
29
- from ...diag.lsof import LsofCommand
28
+ from ...diag.cmds.lslocks import LslocksCommand
29
+ from ...diag.cmds.lsof import LsofCommand
30
30
  from ...lite.abstract import Abstract
31
31
  from ...lite.check import check
32
32
  from ...lite.timeouts import Timeout
omlish/reflect/ops.py CHANGED
@@ -1,3 +1,12 @@
1
+ """
2
+ TODO:
3
+ - visitor / transformer
4
+ - gson had an ObjectNavigator:
5
+ - https://github.com/google/gson/blob/f291c4d33ea5fcc52afcfa5713e519e663378bda/gson/src/main/java/com/google/gson/ObjectNavigator.java
6
+ - removed in 25c6ae177b1ca56db7f3c29eb574bdd032a06165
7
+ - uniform collection isinstance - items() for mappings, iter() for other
8
+ - also check instance type in isinstance not just items lol
9
+ """ # noqa
1
10
  import dataclasses as dc
2
11
  import typing as ta
3
12
 
omlish/reflect/types.py CHANGED
@@ -9,12 +9,9 @@ give it some guiding North Star to make all of its decisions for it, and to add
9
9
  meet, join, solve, ...), but it's quite a bit of work and not a priority at the moment.
10
10
 
11
11
  TODO:
12
- - visitor / transformer
13
- - uniform collection isinstance - items() for mappings, iter() for other
14
- - also check instance type in isinstance not just items lol
15
- - ta.Generic in mro causing trouble - omit? no longer 1:1
16
- - cache this shit, esp generic_mro shit
17
- - cache __hash__ in Generic/Union
12
+ - !!! refactor like a GuardFn - no check_only, return a closure to continue computation !!!
13
+ - !! cache this shit !!
14
+ - especially generic_mro shit
18
15
  """
19
16
  import dataclasses as dc
20
17
  import threading
@@ -22,6 +19,7 @@ import types
22
19
  import typing as ta
23
20
 
24
21
  from ..lite.abstract import Abstract
22
+ from ..lite.dataclasses import dataclass_cache_hash
25
23
 
26
24
 
27
25
  _NoneType = types.NoneType # type: ignore
@@ -51,6 +49,7 @@ if not isinstance(_Protocol, type) or not issubclass(_Protocol, _Generic):
51
49
  ##
52
50
 
53
51
 
52
+ @dataclass_cache_hash()
54
53
  @dc.dataclass(frozen=True)
55
54
  class _Special:
56
55
  name: str
@@ -68,6 +67,7 @@ class _Special:
68
67
  )
69
68
 
70
69
 
70
+ @dataclass_cache_hash()
71
71
  @dc.dataclass(frozen=True)
72
72
  class _LazySpecial:
73
73
  name: str
@@ -226,7 +226,7 @@ def is_simple_generic_alias_type(oty: type) -> bool:
226
226
 
227
227
  def get_params(obj: ta.Any) -> tuple[ta.TypeVar, ...]:
228
228
  if isinstance(obj, type):
229
- if issubclass(obj, ta.Generic): # type: ignore
229
+ if issubclass(obj, ta.Generic):
230
230
  return obj.__dict__.get('__parameters__', ()) # noqa
231
231
 
232
232
  if (ks := _KNOWN_SPECIALS.get_by_origin(obj)) is not None:
@@ -297,6 +297,7 @@ TYPES: tuple[type, ...] = (
297
297
  ##
298
298
 
299
299
 
300
+ @dataclass_cache_hash()
300
301
  @dc.dataclass(frozen=True)
301
302
  class Union(TypeInfo):
302
303
  args: frozenset[Type]
@@ -320,6 +321,7 @@ class Union(TypeInfo):
320
321
  GenericLikeCls = ta.TypeVar('GenericLikeCls')
321
322
 
322
323
 
324
+ @dataclass_cache_hash()
323
325
  @dc.dataclass(frozen=True)
324
326
  class GenericLike(TypeInfo, Abstract, ta.Generic[GenericLikeCls]):
325
327
  cls: GenericLikeCls
@@ -363,6 +365,7 @@ class Protocol(GenericLike[ta.Any]):
363
365
  #
364
366
 
365
367
 
368
+ @dataclass_cache_hash()
366
369
  @dc.dataclass(frozen=True)
367
370
  class NewType(TypeInfo):
368
371
  obj: ta.Any
@@ -372,6 +375,7 @@ class NewType(TypeInfo):
372
375
  #
373
376
 
374
377
 
378
+ @dataclass_cache_hash()
375
379
  @dc.dataclass(frozen=True)
376
380
  class Annotated(TypeInfo):
377
381
  ty: Type
@@ -383,6 +387,7 @@ class Annotated(TypeInfo):
383
387
  #
384
388
 
385
389
 
390
+ @dataclass_cache_hash()
386
391
  @dc.dataclass(frozen=True)
387
392
  class Literal(TypeInfo):
388
393
  args: tuple[ta.Any, ...]
@@ -407,6 +412,25 @@ class ReflectTypeError(TypeError):
407
412
  pass
408
413
 
409
414
 
415
+ _TRIVIAL_TYPES: set[ta.Any] = {
416
+ bool,
417
+ int,
418
+ str,
419
+ float,
420
+ object,
421
+ type(None),
422
+ }
423
+
424
+
425
+ # TODO: speed up is_type: `if obj.__class__ in _NOT_SUBCLASSED_SPECIAL_TYPES: return True`
426
+ # _NOT_SUBCLASSED_SPECIAL_TYPES: set[type] = {
427
+ # type(ta.Any),
428
+ # _UnionGenericAlias,
429
+ # ta.NewType,
430
+ # }
431
+ # TODO: static_init(for t in _NOT_SUBCLASSED_SPECIAL_TYPES: if (sts := t.__subclasses__()): raise TypeError)
432
+
433
+
410
434
  class Reflector:
411
435
  def __init__(
412
436
  self,
@@ -448,12 +472,24 @@ class Reflector:
448
472
  if obj is ta.Any:
449
473
  return ANY
450
474
 
475
+ ##
476
+ # Trivial
477
+
478
+ try:
479
+ if obj in _TRIVIAL_TYPES:
480
+ return obj
481
+ except TypeError:
482
+ pass
483
+
451
484
  ##
452
485
  # Already a Type?
453
486
 
454
487
  if isinstance(obj, (ta.TypeVar, TypeInfo)): # noqa
455
488
  return obj
456
489
 
490
+ ##
491
+ # It's a type
492
+
457
493
  oty = type(obj)
458
494
 
459
495
  ##
@@ -556,7 +592,7 @@ class Reflector:
556
592
  obj,
557
593
  )
558
594
 
559
- if issubclass(obj, ta.Generic): # type: ignore
595
+ if issubclass(obj, ta.Generic):
560
596
  params = get_params(obj)
561
597
  if params:
562
598
  return Generic(
omlish/secrets/marshal.py CHANGED
@@ -54,7 +54,7 @@ def marshal_secret_field(f: dc.Field) -> dc.Field:
54
54
 
55
55
 
56
56
  @lang.static_init
57
- def _install_standard_marshalling() -> None:
57
+ def _install_standard_marshaling() -> None:
58
58
  msh.install_standard_factories(
59
59
  msh.ForbiddenTypeMarshalerFactory({Secret}),
60
60
  msh.ForbiddenTypeUnmarshalerFactory({Secret}),