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
@@ -4,6 +4,7 @@ import typing as ta
4
4
  from .... import lang
5
5
  from ....funcs.genmachine import GenMachine
6
6
  from .errors import JsonStreamError
7
+ from .lexing import CONST_IDENT_VALUES
7
8
  from .lexing import SCALAR_VALUE_TYPES
8
9
  from .lexing import VALUE_TOKEN_KINDS
9
10
  from .lexing import Position
@@ -34,7 +35,7 @@ class EndArray(lang.Marker):
34
35
  pass
35
36
 
36
37
 
37
- JsonStreamParserEvent: ta.TypeAlias = ta.Union[ # noqa
38
+ Event: ta.TypeAlias = ta.Union[ # noqa
38
39
  type[BeginObject],
39
40
  Key,
40
41
  type[EndObject],
@@ -46,7 +47,7 @@ JsonStreamParserEvent: ta.TypeAlias = ta.Union[ # noqa
46
47
  ]
47
48
 
48
49
 
49
- class JsonStreamParserEvents(lang.Namespace):
50
+ class Events(lang.Namespace):
50
51
  BeginObject = BeginObject
51
52
  Key = Key
52
53
  EndObject = EndObject
@@ -58,7 +59,7 @@ class JsonStreamParserEvents(lang.Namespace):
58
59
  ##
59
60
 
60
61
 
61
- def yield_parser_events(obj: ta.Any) -> ta.Generator[JsonStreamParserEvent]:
62
+ def yield_parser_events(obj: ta.Any) -> ta.Iterator[Event]:
62
63
  if isinstance(obj, SCALAR_VALUE_TYPES):
63
64
  yield obj # type: ignore
64
65
 
@@ -94,19 +95,29 @@ class JsonStreamObject(list):
94
95
  return f'{self.__class__.__name__}({super().__repr__()})'
95
96
 
96
97
 
97
- class JsonStreamParser(GenMachine[Token, JsonStreamParserEvent]):
98
- def __init__(self) -> None:
99
- super().__init__(self._do_value())
98
+ class JsonStreamParser(GenMachine[Token, Event]):
99
+ def __init__(
100
+ self,
101
+ *,
102
+ allow_trailing_commas: bool = False,
103
+
104
+ allow_extended_idents: bool = False,
105
+ ) -> None:
106
+ self._allow_trailing_commas = allow_trailing_commas
107
+
108
+ self._allow_extended_idents = allow_extended_idents
100
109
 
101
110
  self._stack: list[ta.Literal['OBJECT', 'KEY', 'ARRAY']] = []
102
111
 
112
+ super().__init__(self._do_value())
113
+
103
114
  #
104
115
 
105
116
  def _next_tok(self):
106
117
  while True:
107
118
  tok = yield None
108
119
 
109
- if tok.kind != 'SPACE':
120
+ if tok.kind != 'SPACE' and tok.kind != 'COMMENT':
110
121
  return tok
111
122
 
112
123
  #
@@ -144,12 +155,23 @@ class JsonStreamParser(GenMachine[Token, JsonStreamParserEvent]):
144
155
  raise JsonStreamParseError('Expected value') from None
145
156
  else:
146
157
  raise
158
+ # except Exception as e:
159
+ # raise
147
160
 
148
161
  if tok.kind in VALUE_TOKEN_KINDS:
149
162
  y, r = self._emit_event(tok.value)
150
163
  yield y
151
164
  return r
152
165
 
166
+ elif tok.kind == 'IDENT':
167
+ try:
168
+ cv = CONST_IDENT_VALUES[tok.value]
169
+ except KeyError:
170
+ raise JsonStreamParseError('Expected value', tok.pos) from None
171
+ y, r = self._emit_event(cv)
172
+ yield y
173
+ return r
174
+
153
175
  elif tok.kind == 'LBRACE':
154
176
  y, r = self._emit_begin_object()
155
177
  yield y
@@ -193,7 +215,7 @@ class JsonStreamParser(GenMachine[Token, JsonStreamParserEvent]):
193
215
  except GeneratorExit:
194
216
  raise JsonStreamParseError('Expected object body') from None
195
217
 
196
- if tok.kind == 'STRING':
218
+ if tok.kind == 'STRING' or (self._allow_trailing_commas and tok.kind == 'IDENT'):
197
219
  k = tok.value
198
220
 
199
221
  try:
@@ -225,7 +247,7 @@ class JsonStreamParser(GenMachine[Token, JsonStreamParserEvent]):
225
247
  raise JsonStreamParseError('Expected continuation') from None
226
248
 
227
249
  if tok.kind == 'COMMA':
228
- return self._do_object_body(must_be_present=True)
250
+ return self._do_object_body(must_be_present=not self._allow_trailing_commas)
229
251
 
230
252
  elif tok.kind == 'RBRACE':
231
253
  y, r = self._emit_end_object()
@@ -258,7 +280,7 @@ class JsonStreamParser(GenMachine[Token, JsonStreamParserEvent]):
258
280
  raise JsonStreamParseError('Expected continuation') from None
259
281
 
260
282
  if tok.kind == 'COMMA':
261
- return self._do_value(must_be_present=True)
283
+ return self._do_value(must_be_present=not self._allow_trailing_commas)
262
284
 
263
285
  elif tok.kind == 'RBRACKET':
264
286
  y, r = self._emit_end_array()
@@ -7,14 +7,14 @@ from .parsing import BeginArray
7
7
  from .parsing import BeginObject
8
8
  from .parsing import EndArray
9
9
  from .parsing import EndObject
10
- from .parsing import JsonStreamParserEvent
10
+ from .parsing import Event
11
11
  from .parsing import Key
12
12
 
13
13
 
14
14
  ##
15
15
 
16
16
 
17
- class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[JsonStreamParserEvent]]):
17
+ class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[Event]]):
18
18
  def __init__(
19
19
  self,
20
20
  *,
@@ -36,7 +36,7 @@ class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[JsonStreamParserEvent]
36
36
  self,
37
37
  o: ta.Any,
38
38
  state: AbstractJsonRenderer.State = AbstractJsonRenderer.State.VALUE,
39
- ) -> ta.Generator[str]:
39
+ ) -> ta.Iterator[str]:
40
40
  if self._style is not None:
41
41
  pre, post = self._style(o, state)
42
42
  yield pre
@@ -52,7 +52,7 @@ class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[JsonStreamParserEvent]
52
52
  if post:
53
53
  yield post
54
54
 
55
- def _render(self, e: JsonStreamParserEvent) -> ta.Generator[str]:
55
+ def _render(self, e: Event) -> ta.Iterator[str]:
56
56
  if self._need_delimit:
57
57
  yield self._delimiter
58
58
  self._need_delimit = False
@@ -124,12 +124,12 @@ class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[JsonStreamParserEvent]
124
124
  else:
125
125
  raise TypeError(e)
126
126
 
127
- def render(self, events: ta.Iterable[JsonStreamParserEvent]) -> ta.Generator[str]:
127
+ def render(self, events: ta.Iterable[Event]) -> ta.Iterator[str]:
128
128
  for e in events:
129
129
  yield from self._render(e)
130
130
 
131
131
  @classmethod
132
- def render_str(cls, i: ta.Iterable[JsonStreamParserEvent], /, **kwargs: ta.Any) -> str:
132
+ def render_str(cls, i: ta.Iterable[Event], /, **kwargs: ta.Any) -> str:
133
133
  out = io.StringIO()
134
134
  for s in cls(**kwargs).render(i):
135
135
  out.write(s)
@@ -1,56 +1,158 @@
1
- import dataclasses as dc
1
+ r"""
2
+ TODO:
3
+ - gson switches
4
+ - Strictness.LEGACY_STRICT
5
+ - JsonReader allows the literals true, false and null to have any capitalization, for example fAlSe or NULL
6
+ - JsonReader supports the escape sequence \', representing a ' (single-quote)
7
+ - JsonReader supports the escape sequence \LF (with LF being the Unicode character U+000A), resulting in a LF within
8
+ the read JSON string
9
+ - JsonReader allows unescaped control characters (U+0000 through U+001F)
10
+ - Strictness.LENIENT
11
+ - In lenient mode, all input that is accepted in legacy strict mode is accepted in addition to the following
12
+ departures from RFC 8259:
13
+ - Streams that start with the non-execute prefix, ")]'\n"}
14
+ - Streams that include multiple top-level values. With legacy strict or strict parsing, each stream must contain
15
+ exactly one top-level value.
16
+ - Numbers may be NaNs or infinities represented by NaN and (-)Infinity respectively.
17
+ - End of line comments starting with // or # and ending with a newline character.
18
+ - C-style comments starting with /* and ending with */. Such comments may not be nested.
19
+ - Names that are unquoted or 'single quoted'.
20
+ - Strings that are unquoted or 'single quoted'.
21
+ - Array elements separated by ; instead of ,.
22
+ - Unnecessary array separators. These are interpreted as if null was the omitted value.
23
+ - Names and values separated by = or => instead of :.
24
+ - Name/value pairs separated by ; instead of ,.
25
+ """
26
+ import itertools
2
27
  import typing as ta
3
28
 
4
29
  from .... import lang
5
30
  from .building import JsonValueBuilder
31
+ from .errors import JsonStreamError
6
32
  from .lexing import JsonStreamLexer
33
+ from .lexing import Token
34
+ from .parsing import Event
7
35
  from .parsing import JsonStreamParser
8
36
 
9
37
 
10
38
  ##
11
39
 
12
40
 
13
- @dc.dataclass(kw_only=True)
14
41
  class JsonStreamValueParser(lang.ExitStacked):
15
- include_raw: bool = False
16
- yield_object_lists: bool = False
42
+ class Machinery(ta.NamedTuple):
43
+ lex: JsonStreamLexer
44
+ parse: JsonStreamParser
45
+ build: JsonValueBuilder
17
46
 
18
- #
47
+ def __init__(self, m: Machinery) -> None:
48
+ super().__init__()
49
+
50
+ self._m = m
19
51
 
20
- _lex: JsonStreamLexer = dc.field(init=False)
21
- _parse: JsonStreamParser = dc.field(init=False)
22
- _build: JsonValueBuilder = dc.field(init=False)
52
+ #
23
53
 
24
54
  def _enter_contexts(self) -> None:
25
- self._lex = JsonStreamLexer(
26
- include_raw=self.include_raw,
27
- )
55
+ self._enter_context(self._m.lex)
56
+ self._enter_context(self._m.parse)
28
57
 
29
- self._parse = JsonStreamParser()
58
+ def feed(self, i: ta.Iterable[str]) -> ta.Iterator[ta.Any]:
59
+ for c in i:
60
+ for t in self._m.lex(c):
61
+ for e in self._m.parse(t):
62
+ for v in self._m.build(e): # noqa
63
+ yield v
30
64
 
31
- self._build = JsonValueBuilder(
32
- yield_object_lists=self.yield_object_lists,
33
- )
65
+ #
66
+
67
+ @classmethod
68
+ def parse_values(
69
+ cls,
70
+ m: Machinery,
71
+ i: ta.Iterable[str],
72
+ ) -> ta.Iterator[ta.Any]:
73
+ with cls(m) as p:
74
+ yield from p.feed(itertools.chain(i, ['']))
75
+
76
+ @classmethod
77
+ def parse_one_value(
78
+ cls,
79
+ m: Machinery,
80
+ i: ta.Iterable[str],
81
+ ) -> ta.Any:
82
+ with cls(m) as p:
83
+ return next(p.feed(itertools.chain(i, [''])))
84
+
85
+ @classmethod
86
+ def parse_exactly_one_value(
87
+ cls,
88
+ m: Machinery,
89
+ i: ta.Iterable[str],
90
+ ) -> ta.Any:
91
+ r: ta.Any
92
+ r = not_set = object()
93
+ with cls(m) as p:
94
+ for v in p.feed(itertools.chain(i, [''])):
95
+ if r is not_set:
96
+ r = v
97
+ else:
98
+ raise JsonStreamError('Unexpected input')
99
+ if r is not_set:
100
+ raise JsonStreamError('No value')
101
+ return r
102
+
103
+
104
+ ##
105
+
106
+
107
+ class DebugJsonStreamValueParser(JsonStreamValueParser):
108
+ def __init__(self, m: JsonStreamValueParser.Machinery) -> None:
109
+ super().__init__(m)
110
+
111
+ self._chars: list[str] = []
112
+ self._tokens: list[Token] = []
113
+ self._events: list[Event] = []
114
+ self._values: list[ta.Any] = []
34
115
 
35
116
  def feed(self, i: ta.Iterable[str]) -> ta.Iterator[ta.Any]:
36
117
  for c in i:
37
- for t in self._lex(c):
38
- for e in self._parse(t):
39
- for v in self._build(e): # noqa
118
+ self._chars.append(c)
119
+ for t in self._m.lex(c):
120
+ self._tokens.append(t)
121
+ for e in self._m.parse(t):
122
+ self._events.append(e)
123
+ for v in self._m.build(e):
124
+ self._values.append(v)
40
125
  yield v
41
126
 
42
127
 
43
- def stream_parse_values(
44
- i: ta.Iterable[str],
45
- **kwargs: ta.Any,
46
- ) -> ta.Generator[ta.Any]:
47
- with JsonStreamValueParser(**kwargs) as p:
48
- yield from p.feed(i)
128
+ ##
129
+
130
+
131
+ def make_machinery(
132
+ *,
133
+ include_raw: bool = False,
134
+ yield_object_lists: bool = False,
135
+ ) -> JsonStreamValueParser.Machinery:
136
+ return JsonStreamValueParser.Machinery(
137
+ JsonStreamLexer(
138
+ include_raw=include_raw,
139
+ ),
140
+
141
+ JsonStreamParser(),
142
+
143
+ JsonValueBuilder(
144
+ yield_object_lists=yield_object_lists,
145
+ ),
146
+ )
147
+
148
+
149
+ def stream_parse_values(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Iterator[ta.Any]:
150
+ return JsonStreamValueParser.parse_values(make_machinery(**kwargs), i)
151
+
152
+
153
+ def stream_parse_one_value(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Any:
154
+ return JsonStreamValueParser.parse_one_value(make_machinery(**kwargs), i)
49
155
 
50
156
 
51
- def stream_parse_one_value(
52
- i: ta.Iterable[str],
53
- **kwargs: ta.Any,
54
- ) -> ta.Any:
55
- with JsonStreamValueParser(**kwargs) as p:
56
- return next(p.feed(i))
157
+ def stream_parse_exactly_one_value(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Any:
158
+ return JsonStreamValueParser.parse_exactly_one_value(make_machinery(**kwargs), i)
@@ -124,7 +124,10 @@ def parse_string_literal(s: str) -> str:
124
124
  def parse_number_literal(s: str) -> int | float:
125
125
  s = s.lower()
126
126
 
127
- if 'x' in s:
128
- return int(s, 16)
129
- else:
130
- return float(s)
127
+ try:
128
+ if 'x' in s:
129
+ return int(s, 16)
130
+ else:
131
+ return float(s)
132
+ except ValueError as e:
133
+ raise Json5Error from e
@@ -1,100 +1,54 @@
1
- # ruff: noqa: N802 N803
2
1
  import typing as ta
3
2
 
4
- from ...text import antlr
5
- from ._antlr.Json5Lexer import Json5Lexer # type: ignore
6
- from ._antlr.Json5Parser import Json5Parser # type: ignore
7
- from ._antlr.Json5Visitor import Json5Visitor # type: ignore
3
+ from ..json.stream.errors import JsonStreamError
4
+ from ..json.stream.utils import DebugJsonStreamValueParser
5
+ from ..json.stream.utils import JsonStreamValueParser
8
6
  from .errors import Json5Error
9
- from .literals import LITERAL_VALUES
10
- from .literals import parse_number_literal
11
- from .literals import parse_string_literal
7
+ from .stream import make_machinery
12
8
 
13
9
 
14
10
  ##
15
11
 
16
12
 
17
- class Json5ParseVisitor(antlr.parsing.StandardParseTreeVisitor, Json5Visitor):
18
- def visitArr(self, ctx: Json5Parser.ArrContext):
19
- return [self.visit(e) for e in ctx.value()]
13
+ def parse(
14
+ buf: str,
15
+ *,
16
+ debug: bool = False,
17
+ ) -> ta.Any:
18
+ m = make_machinery()
20
19
 
21
- def visitKey(self, ctx: Json5Parser.KeyContext):
22
- if (s := ctx.STRING()) is not None:
23
- return parse_string_literal(s.getText())
20
+ if debug:
21
+ vc: type[JsonStreamValueParser] = DebugJsonStreamValueParser
22
+ else:
23
+ vc = JsonStreamValueParser
24
24
 
25
- elif (i := ctx.IDENTIFIER()) is not None:
26
- return parse_string_literal(''.join(['"', i.getText(), '"']))
27
-
28
- elif (l := ctx.LITERAL()) is not None:
29
- return LITERAL_VALUES[l.getText()]
30
-
31
- elif (n := ctx.NUMERIC_LITERAL()) is not None:
32
- return n.getText()
33
-
34
- else:
35
- raise RuntimeError(ctx)
36
-
37
- def visitNumber(self, ctx: Json5Parser.NumberContext):
38
- return parse_number_literal(ctx.getText())
39
-
40
- def visitObj(self, ctx: Json5Parser.ObjContext):
41
- dct: dict[ta.Any, ta.Any] = {}
42
- for pair in ctx.pair():
43
- key, value = self.visit(pair)
44
- dct[key] = value
45
- return dct
46
-
47
- def visitPair(self, ctx: Json5Parser.PairContext):
48
- key = self.visit(ctx.key())
49
- value = self.visit(ctx.value())
50
- return (key, value)
51
-
52
- def visitValue(self, ctx: Json5Parser.ValueContext):
53
- if (s := ctx.STRING()) is not None:
54
- return parse_string_literal(s.getText())
55
-
56
- elif (n := ctx.LITERAL()) is not None:
57
- return LITERAL_VALUES[n.getText()]
58
-
59
- else:
60
- return super().visitChildren(ctx)
61
-
62
-
63
- def _make_parser(buf: str) -> Json5Parser:
64
- return antlr.parsing.make_parser(
65
- buf,
66
- Json5Lexer,
67
- Json5Parser,
68
- silent_errors=True,
69
- )
70
-
71
-
72
- def parse(buf: str) -> ta.Any:
73
25
  try:
74
- root = _make_parser(buf).json5()
26
+ return vc.parse_exactly_one_value(m, buf)
27
+
28
+ except Json5Error:
29
+ raise
75
30
 
76
- except antlr.errors.ParseError as e:
31
+ except JsonStreamError as e:
77
32
  raise Json5Error from e
78
33
 
79
- if antlr.parsing.is_eof_context(root):
80
- raise Json5Error('Empty input')
81
34
 
82
- visitor = Json5ParseVisitor()
83
- return visitor.visit(root)
35
+ def parse_many(
36
+ buf: str,
37
+ *,
38
+ debug: bool = False,
39
+ ) -> ta.Iterator[ta.Any]:
40
+ m = make_machinery()
84
41
 
42
+ if debug:
43
+ vc: type[JsonStreamValueParser] = DebugJsonStreamValueParser
44
+ else:
45
+ vc = JsonStreamValueParser
85
46
 
86
- def parse_many(buf: str) -> ta.Generator[ta.Any]:
87
47
  try:
88
- parser = _make_parser(buf)
89
-
90
- while True:
91
- if parser.getInputStream().LT(1).type == antlr.runtime.Token.EOF:
92
- break
93
-
94
- value = parser.value()
48
+ yield from vc.parse_values(m, buf)
95
49
 
96
- visitor = Json5ParseVisitor()
97
- yield visitor.visit(value)
50
+ except Json5Error:
51
+ raise
98
52
 
99
- except antlr.errors.ParseError as e:
53
+ except JsonStreamError as e:
100
54
  raise Json5Error from e
@@ -0,0 +1,77 @@
1
+ """
2
+ Objects:
3
+ + Object keys may be an ECMAScript 5.1 IdentifierName.
4
+ + Objects may have a single trailing comma.
5
+ Arrays:
6
+ + Arrays may have a single trailing comma.
7
+ Strings:
8
+ + Strings may be single quoted.
9
+ + Strings may span multiple lines by escaping new line characters.
10
+ + Strings may include character escapes.
11
+ Numbers:
12
+ + Numbers may be hexadecimal.
13
+ + Numbers may have a leading or trailing decimal point.
14
+ + Numbers may be IEEE 754 positive infinity, negative infinity, and NaN.
15
+ + Numbers may begin with an explicit plus sign.
16
+ Comments:
17
+ + Single and multi-line comments are allowed.
18
+ White Space:
19
+ + Additional white space characters are allowed.
20
+ """
21
+ import typing as ta
22
+
23
+ from ..json.stream.building import JsonValueBuilder
24
+ from ..json.stream.lexing import JsonStreamLexer
25
+ from ..json.stream.parsing import JsonStreamParser
26
+ from ..json.stream.utils import JsonStreamValueParser
27
+ from .literals import parse_number_literal
28
+ from .literals import parse_string_literal
29
+
30
+
31
+ ##
32
+
33
+
34
+ def make_machinery(
35
+ *,
36
+ include_raw: bool = False,
37
+ yield_object_lists: bool = False,
38
+ ) -> JsonStreamValueParser.Machinery:
39
+ return JsonStreamValueParser.Machinery(
40
+ JsonStreamLexer(
41
+ include_raw=include_raw,
42
+
43
+ allow_extended_space=True,
44
+
45
+ allow_comments=True,
46
+
47
+ allow_single_quotes=True,
48
+ string_literal_parser=parse_string_literal,
49
+
50
+ allow_extended_number_literals=True,
51
+ number_literal_parser=parse_number_literal,
52
+
53
+ allow_extended_idents=True,
54
+ ),
55
+
56
+ JsonStreamParser(
57
+ allow_trailing_commas=True,
58
+
59
+ allow_extended_idents=True,
60
+ ),
61
+
62
+ JsonValueBuilder(
63
+ yield_object_lists=yield_object_lists,
64
+ ),
65
+ )
66
+
67
+
68
+ def stream_parse_values(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Iterator[ta.Any]:
69
+ return JsonStreamValueParser.parse_values(make_machinery(**kwargs), i)
70
+
71
+
72
+ def stream_parse_one_value(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Any:
73
+ return JsonStreamValueParser.parse_one_value(make_machinery(**kwargs), i)
74
+
75
+
76
+ def stream_parse_exactly_one_value(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Any:
77
+ return JsonStreamValueParser.parse_exactly_one_value(make_machinery(**kwargs), i)
omlish/formats/logfmt.py CHANGED
@@ -20,7 +20,10 @@ def logfmt_encode(
20
20
  ) -> str:
21
21
  def encode(s: str) -> str:
22
22
  if _LOGFMT_ENCODE_WS_PAT.search(s) is not None:
23
- return '"' + s.replace('\\', '\\\\').replace('"', '\\"') + '"'
23
+ s = s.replace('\\', '\\\\')
24
+ s = s.replace('\n', '\\n')
25
+ s = s.replace('"', '\\"')
26
+ return f'"{s}"'
24
27
  else:
25
28
  return s
26
29
 
@@ -67,7 +70,10 @@ def logfmt_decode(
67
70
  if s.startswith('"'):
68
71
  if len(s) < 2 or not s.endswith('"'):
69
72
  raise ValueError(s)
70
- s = s[1:-1].replace('\\"', '"').replace('\\\\', '\\')
73
+ s = s[1:-1]
74
+ s = s.replace('\\"', '"')
75
+ s = s.replace('\\n', '\n')
76
+ s = s.replace('\\\\', '\\')
71
77
  return s
72
78
 
73
79
  if value_decoder is None:
@@ -45,7 +45,7 @@ class GenMachine(ta.Generic[I, O]):
45
45
  _gen: MachineGen | None
46
46
 
47
47
  def __repr__(self) -> str:
48
- return f'{self.__class__.__name__}@{hex(id(self))[2:]}<{self.state}>'
48
+ return f'{self.__class__.__name__}@{id(self):x}<{self.state}>'
49
49
 
50
50
  #
51
51
 
@@ -88,7 +88,7 @@ class GenMachine(ta.Generic[I, O]):
88
88
 
89
89
  #
90
90
 
91
- def __call__(self, i: I) -> ta.Iterable[O]:
91
+ def __call__(self, i: I) -> ta.Iterator[O]:
92
92
  if self._gen is None:
93
93
  raise GenMachine.ClosedError
94
94