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/diag/pydevd.py CHANGED
@@ -6,7 +6,7 @@ an already-debugging PyCharm instance to debug PySpark jobs.
6
6
  TODO:
7
7
  - https://www.jetbrains.com/help/pycharm/remote-debugging-with-product.html#
8
8
 
9
- ==
9
+ ====
10
10
 
11
11
  https://www.jetbrains.com/help/pycharm/remote-debugging-with-product.html#remote-debug-config ->
12
12
 
@@ -25,13 +25,34 @@ buf = textwrap.dedent(f'''
25
25
  stderrToServer=True,
26
26
  )
27
27
  ''') + '\n' * 2 + buf
28
+
29
+ ====
30
+
31
+ TODO: monkeypatch:
32
+
33
+ /Applications/PyCharm.app/Contents/plugins/python-ce/helpers/pydev/_pydev_bundle/pydev_monkey.py ::
34
+
35
+ def starts_with_python_shebang(path):
36
+ try:
37
+ with open(path) as f:
38
+ for line in f:
39
+ line = line.strip()
40
+ if line:
41
+ for name in PYTHON_NAMES:
42
+ if line.startswith('#!/usr/bin/env %s' % name):
43
+ return True
44
+ return False
45
+ except (UnicodeDecodeError, IsADirectoryError): # <-- Add catch for `IsADirectoryError`
46
+ return False
47
+ except:
48
+ traceback.print_exc()
49
+ return False
28
50
  """
29
51
  import json
30
52
  import os
31
53
  import sys
32
54
  import tempfile
33
55
  import textwrap
34
- import threading
35
56
  import types
36
57
  import typing as ta
37
58
 
@@ -119,7 +140,19 @@ def _pydevd() -> types.ModuleType | None:
119
140
 
120
141
 
121
142
  def is_present() -> bool:
122
- return _pydevd() is not None
143
+ # FIXME: try to use `lang.can_import('pydevd'), but raises with:
144
+ # INTERNALERROR> File "/Users/spinlock/src/wrmsr/omlish/omlish/lang/imports/resolving.py", line 16, in can_import
145
+ # INTERNALERROR> spec = importlib.util.find_spec(name, package)
146
+ # INTERNALERROR> File "<frozen importlib.util>", line 111, in find_spec
147
+ # INTERNALERROR> ValueError: pydevd.__spec__ is None
148
+ # Really want to avoid actually importing pydevd due to side-effects, slowness, and even a pkg_resources deprecation
149
+ # warning...
150
+ try:
151
+ __import__('pydevd')
152
+ except ImportError:
153
+ return False
154
+ else:
155
+ return True
123
156
 
124
157
 
125
158
  def get_setup() -> dict | None:
@@ -243,23 +276,23 @@ def maybe_reexec(
243
276
  bootstrap_path = os.path.join(tmpdir, 'bootstrap.py')
244
277
  with open(bootstrap_path, 'w') as f:
245
278
  f.write(textwrap.dedent(f"""
246
- import sys
247
- old_paths = set(sys.path)
248
- for new_path in {sys.path!r}:
249
- if new_path not in old_paths:
250
- sys.path.insert(0, new_path)
251
-
252
- _stderr_write = sys.stderr.write
253
- def stderr_write(*args, **kwargs):
254
- code = sys._getframe(1).f_code
255
- if code is not None and code.co_filename and code.co_filename.endswith('/pydev_log.py'):
256
- return
257
- _stderr_write(*args, **kwargs)
258
- sys.stderr.write = stderr_write
259
-
260
- sys.argv = {args[1:]!r}
261
- import runpy
262
- runpy.run_path({args[1]!r}, run_name='__main__')
279
+ import sys
280
+ old_paths = set(sys.path)
281
+ for new_path in {sys.path!r}:
282
+ if new_path not in old_paths:
283
+ sys.path.insert(0, new_path)
284
+
285
+ _stderr_write = sys.stderr.write
286
+ def stderr_write(*args, **kwargs):
287
+ code = sys._getframe(1).f_code
288
+ if code is not None and code.co_filename and code.co_filename.endswith('/pydev_log.py'):
289
+ return
290
+ _stderr_write(*args, **kwargs)
291
+ sys.stderr.write = stderr_write
292
+
293
+ sys.argv = {args[1:]!r}
294
+ import runpy
295
+ runpy.run_path({args[1]!r}, run_name='__main__')
263
296
  """))
264
297
  args = [args[0], bootstrap_path]
265
298
 
@@ -272,29 +305,14 @@ def debug_unhandled_exception(exc_info: ta.Any = None) -> None:
272
305
 
273
306
  try:
274
307
  import pydevd
275
- from pydevd import pydevd_tracing
276
308
 
277
309
  except ImportError:
278
310
  return
279
311
 
280
- exctype, value, traceback = exc_info
281
- frames = []
282
- while traceback:
283
- frames.append(traceback.tb_frame)
284
- traceback = traceback.tb_next
285
-
286
- thread = threading.current_thread()
287
- frames_by_id = {id(frame): frame for frame in frames}
288
- frame = frames[-1]
289
- exception = (exctype, value, traceback)
290
-
291
- if hasattr(thread, 'additional_info'):
292
- thread.additional_info.pydev_message = 'server exception'
293
- try:
294
- debugger = pydevd.debugger # noqa
295
- except AttributeError:
296
- debugger = pydevd.get_global_debugger() # noqa
312
+ et, e, tb = exc_info
297
313
 
298
- pydevd_tracing.SetTrace(None)
314
+ while tb.tb_next is not None:
315
+ tb = tb.tb_next
316
+ original_frame = tb.tb_frame
299
317
 
300
- debugger.stop_on_unhandled_exception(thread, frame, frames_by_id, exception)
318
+ pydevd.settrace(stop_at_frame=original_frame, suspend=True)
@@ -17,7 +17,6 @@ def _attach(repl):
17
17
  import ast
18
18
  import codeop
19
19
  import errno
20
- import logging
21
20
  import socket as sock
22
21
  import sys
23
22
  import threading
@@ -26,9 +25,10 @@ import types
26
25
  import typing as ta
27
26
 
28
27
  from ... import check
28
+ from ...logs import all as logs
29
29
 
30
30
 
31
- log = logging.getLogger(__name__)
31
+ log = logs.get_module_logger(globals())
32
32
 
33
33
 
34
34
  ##
@@ -173,7 +173,7 @@ class InteractiveSocketConsole:
173
173
 
174
174
  # Case 3 (complete)
175
175
  try:
176
- node = ast.parse(source) # type: ignore
176
+ node = ast.parse(source)
177
177
  except (OverflowError, SyntaxError, ValueError):
178
178
  return True
179
179
 
@@ -22,7 +22,6 @@ socat - UNIX-CONNECT:repl.sock
22
22
  """
23
23
  import contextlib
24
24
  import functools
25
- import logging
26
25
  import os
27
26
  import socket as sock
28
27
  import threading
@@ -31,10 +30,11 @@ import weakref
31
30
 
32
31
  from ... import check
33
32
  from ... import dataclasses as dc
33
+ from ...logs import all as logs
34
34
  from .console import InteractiveSocketConsole
35
35
 
36
36
 
37
- log = logging.getLogger(__name__)
37
+ log = logs.get_module_logger(globals())
38
38
 
39
39
 
40
40
  ##
@@ -1,12 +1,18 @@
1
- from .dispatch import ( # noqa
2
- Dispatcher,
3
- )
4
-
5
- from .functions import ( # noqa
6
- function,
7
- )
8
-
9
- from .methods import ( # noqa
10
- install_method,
11
- method,
12
- )
1
+ from .. import lang as _lang
2
+
3
+
4
+ with _lang.auto_proxy_init(globals()):
5
+ ##
6
+
7
+ from .dispatch import ( # noqa
8
+ Dispatcher,
9
+ )
10
+
11
+ from .functions import ( # noqa
12
+ function,
13
+ )
14
+
15
+ from .methods import ( # noqa
16
+ install_method,
17
+ method,
18
+ )
@@ -4,13 +4,11 @@ TODO:
4
4
  - ALT: A.f(super(), ... ? :/
5
5
  - classmethod/staticmethod
6
6
  """
7
- import contextlib
8
7
  import functools
9
8
  import typing as ta
10
- import weakref
11
9
 
12
10
  from .. import check
13
- from .. import lang
11
+ from .. import collections as col
14
12
  from .dispatch import Dispatcher
15
13
  from .impls import get_impl_func_cls_set
16
14
 
@@ -34,9 +32,8 @@ class Method(ta.Generic[P, R]):
34
32
  it must be explicitly `@register`'ed itself. This is a feature, allowing for selective de-registration of
35
33
  implementations in subclasses via name shadowing.
36
34
 
37
- Methods have ability to choose to allow external installation of implementations outside of direct subclasses. This
38
- is to be used *extremely* rarely - basically only in the rare case of externally extensible type hierarchies with
39
- visitors.
35
+ Methods can choose to allow external installation of implementations outside of direct subclasses. This is to be
36
+ used *extremely* rarely - basically only in the rare case of externally extensible type hierarchies with visitors.
40
37
  """
41
38
 
42
39
  def __init__(
@@ -45,6 +42,7 @@ class Method(ta.Generic[P, R]):
45
42
  *,
46
43
  installable: bool = False,
47
44
  requires_override: bool = False,
45
+ instance_cache: bool = False,
48
46
  ) -> None:
49
47
  super().__init__()
50
48
 
@@ -53,9 +51,16 @@ class Method(ta.Generic[P, R]):
53
51
 
54
52
  self._func = func
55
53
  self._installable = installable
56
- self._requires_override = requires_override
54
+ self._instance_cache = instance_cache
57
55
 
58
- self._impls: ta.MutableMapping[ta.Callable, frozenset[type] | None] = weakref.WeakKeyDictionary()
56
+ self._registry: col.AttrRegistry[ta.Callable, Method._Entry] = col.AttrRegistry(
57
+ requires_override=requires_override,
58
+ )
59
+
60
+ self._cache: col.AttrRegistryCache[ta.Callable, Method._Entry, ta.Callable] = col.AttrRegistryCache(
61
+ self._registry,
62
+ self._prepare,
63
+ )
59
64
 
60
65
  # bpo-45678: special-casing for classmethod/staticmethod in Python <=3.9, as functools.update_wrapper doesn't
61
66
  # work properly in singledispatchmethod.__get__ if it is applied to an unbound classmethod/staticmethod
@@ -68,19 +73,12 @@ class Method(ta.Generic[P, R]):
68
73
  self._is_abstractmethod = getattr(func, '__isabstractmethod__', False) # noqa
69
74
  self.update_wrapper(self)
70
75
 
71
- self._dispatch_func_cache: dict[ta.Any, ta.Callable] = {}
72
-
73
- def dispatch_func_cache_remove(k, self_ref=weakref.ref(self)):
74
- if (ref_self := self_ref()) is not None:
75
- cache = ref_self._dispatch_func_cache # noqa
76
- with contextlib.suppress(KeyError):
77
- del cache[k]
78
-
79
- self._dispatch_func_cache_remove = dispatch_func_cache_remove
80
-
81
76
  self._owner: type | None = None
82
77
  self._name: str | None = None
83
78
 
79
+ class _Entry:
80
+ cls_set: frozenset[type]
81
+
84
82
  def __set_name__(self, owner, name):
85
83
  if self._owner is None:
86
84
  self._owner = owner
@@ -102,83 +100,29 @@ class Method(ta.Generic[P, R]):
102
100
 
103
101
  def register(self, impl: T, cls_set: frozenset[type] | None = None) -> T:
104
102
  check.callable(impl)
105
- if impl not in self._impls:
106
- self._impls[impl] = cls_set # type: ignore
107
- self._dispatch_func_cache.clear()
108
-
109
- return impl
110
-
111
- def _is_impl(self, obj: ta.Any) -> bool:
112
- try:
113
- hash(obj)
114
- except TypeError:
115
- return False
116
-
117
- return obj in self._impls
118
103
 
119
- def build_attr_dispatcher(self, instance_cls: type, owner_cls: type | None = None) -> Dispatcher[str]:
120
- if owner_cls is None:
121
- owner_cls = instance_cls
104
+ entry = Method._Entry()
105
+ if cls_set is not None:
106
+ entry.cls_set = cls_set
122
107
 
123
- mro = instance_cls.__mro__[-2::-1]
124
- try:
125
- mro_pos = mro.index(owner_cls)
126
- except ValueError:
127
- raise TypeError(f'Owner class {owner_cls} not in mro of instance class {instance_cls}') from None
108
+ self._registry.register(ta.cast(ta.Callable, impl), entry)
128
109
 
129
- mro_dct: dict[str, list[tuple[type, ta.Any]]] = {}
130
- for cur_cls in mro[:mro_pos + 1]:
131
- for att, obj in cur_cls.__dict__.items():
132
- if att not in mro_dct:
133
- if not self._is_impl(obj):
134
- continue
135
-
136
- try:
137
- lst = mro_dct[att]
138
- except KeyError:
139
- lst = mro_dct[att] = []
140
- lst.append((cur_cls, obj))
141
-
142
- #
110
+ return impl
143
111
 
112
+ def _build_dispatcher(self, collected: ta.Mapping[str, tuple[ta.Callable, _Entry]]) -> Dispatcher[str]:
144
113
  disp: Dispatcher[str] = Dispatcher()
145
114
 
146
- seen: dict[ta.Any, str] = {}
147
- for att, lst in mro_dct.items():
148
- if not lst:
149
- raise RuntimeError
150
- _, obj = lst[-1]
151
-
152
- if len(lst) > 1:
153
- if self._requires_override and not lang.is_override(obj):
154
- raise lang.RequiresOverrideError(
155
- att,
156
- instance_cls,
157
- lst[-1][0],
158
- lst[0][0],
159
- )
160
-
161
- if not self._is_impl(obj):
162
- continue
163
-
164
- cls_set = self._impls[obj]
165
- if cls_set is None:
166
- cls_set = get_impl_func_cls_set(obj, arg_offset=1)
167
- self._impls[obj] = cls_set
168
-
115
+ for a, (f, e) in collected.items():
169
116
  try:
170
- ex_att = seen[obj]
171
- except KeyError:
172
- pass
173
- else:
174
- raise TypeError(f'Duplicate impl: {owner_cls} {instance_cls} {att} {ex_att}')
175
- seen[obj] = att
117
+ cls_set = e.cls_set
118
+ except AttributeError:
119
+ cls_set = e.cls_set = get_impl_func_cls_set(f, arg_offset=1)
176
120
 
177
- disp.register(att, cls_set)
121
+ disp.register(a, cls_set)
178
122
 
179
123
  return disp
180
124
 
181
- def build_dispatch_func(self, disp: Dispatcher[str]) -> ta.Callable:
125
+ def _build_dispatch_func(self, disp: Dispatcher[str]) -> ta.Callable:
182
126
  dispatch = disp.dispatch
183
127
  type_ = type
184
128
  getattr_ = getattr
@@ -190,25 +134,16 @@ class Method(ta.Generic[P, R]):
190
134
  raise TypeError(f'{func_name} requires at least 1 positional argument')
191
135
 
192
136
  if (impl_att := dispatch(type_(args[0]))) is not None:
193
- fn = getattr_(self, impl_att)
194
- return fn(*args, **kwargs)
137
+ return getattr_(self, impl_att)(*args, **kwargs)
195
138
 
196
139
  return base_func.__get__(self)(*args, **kwargs) # noqa
197
140
 
198
141
  self.update_wrapper(__call__)
199
142
  return __call__
200
143
 
201
- def get_dispatch_func(self, instance_cls: type) -> ta.Callable:
202
- cls_ref = weakref.ref(instance_cls)
203
- try:
204
- return self._dispatch_func_cache[cls_ref]
205
- except KeyError:
206
- pass
207
- del cls_ref
208
-
209
- att_disp = self.build_attr_dispatcher(instance_cls)
210
- func = self.build_dispatch_func(att_disp)
211
- self._dispatch_func_cache[weakref.ref(instance_cls, self._dispatch_func_cache_remove)] = func
144
+ def _prepare(self, instance_cls: type, collected: ta.Mapping[str, tuple[ta.Callable, _Entry]]) -> ta.Callable:
145
+ disp = self._build_dispatcher(collected)
146
+ func = self._build_dispatch_func(disp)
212
147
  return func
213
148
 
214
149
  def __get__(self, instance, owner=None):
@@ -216,16 +151,21 @@ class Method(ta.Generic[P, R]):
216
151
  # FIXME: classmethod/staticmethod
217
152
  return self
218
153
 
219
- instance_cls = type(instance)
220
- try:
221
- func = self._dispatch_func_cache[weakref.ref(instance_cls)]
222
- except KeyError:
223
- func = self.get_dispatch_func(instance_cls)
224
- return func.__get__(instance, owner) # noqa
154
+ if self._instance_cache:
155
+ try:
156
+ return instance.__dict__[self._name]
157
+ except KeyError:
158
+ pass
159
+
160
+ bound = self._cache.get(type(instance)).__get__(instance, owner) # noqa
161
+
162
+ if self._instance_cache:
163
+ instance.__dict__[self._name] = bound
164
+
165
+ return bound
225
166
 
226
167
  def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
227
168
  instance, *rest = args
228
- instance_cls = type(instance)
229
169
 
230
170
  # if instance_cls is super:
231
171
  # owner = instance.__self_class__.__mro__[instance.__self_class__.__mro__.index(instance.__thisclass__) + 1]
@@ -233,55 +173,25 @@ class Method(ta.Generic[P, R]):
233
173
  # func = self.build_dispatch_func(att_disp)
234
174
  # return func.__get__(instance, instance.__thisclass__)(*rest, **kwargs)
235
175
 
236
- try:
237
- func = self._dispatch_func_cache[weakref.ref(instance_cls)]
238
- except KeyError:
239
- func = self.get_dispatch_func(instance_cls)
240
- return func.__get__(instance)(*rest, **kwargs) # noqa
176
+ return self.__get__(instance)(*rest, **kwargs)
241
177
 
242
178
 
243
179
  ##
244
180
 
245
181
 
246
- @ta.overload
247
- def method(
248
- func: ta.Callable[P, R],
249
- /,
250
- *,
251
- installable: bool = False,
252
- requires_override: bool = False,
253
- ) -> Method[P, R]: # noqa
254
- ...
255
-
256
-
257
- @ta.overload
258
182
  def method(
259
- func: None = None,
260
- /,
261
183
  *,
262
184
  installable: bool = False,
263
185
  requires_override: bool = False,
186
+ instance_cache: bool = False,
264
187
  ) -> ta.Callable[[ta.Callable[P, R]], Method[P, R]]: # noqa
265
- ...
266
-
267
-
268
- def method(
269
- func=None,
270
- /,
271
- *,
272
- installable=False,
273
- requires_override=False,
274
- ):
275
- kw = dict(
188
+ return functools.partial(
189
+ Method, # type: ignore[arg-type]
276
190
  installable=installable,
277
191
  requires_override=requires_override,
192
+ instance_cache=instance_cache,
278
193
  )
279
194
 
280
- if func is None:
281
- return functools.partial(Method, **kw)
282
-
283
- return Method(func, **kw)
284
-
285
195
 
286
196
  #
287
197
 
@@ -305,7 +215,7 @@ def install_method(
305
215
  if on is None:
306
216
  cls = owner
307
217
  else:
308
- cls = check.issubclass(on, owner)
218
+ cls = check.issubclass(on, owner) # noqa
309
219
 
310
220
  check.arg(not hasattr(cls, a))
311
221
  setattr(cls, a, fn)
omlish/dom/rendering.py CHANGED
@@ -100,7 +100,7 @@ class Renderer:
100
100
 
101
101
  #
102
102
 
103
- @dispatch.method
103
+ @dispatch.method(instance_cache=True)
104
104
  def render(self, o: ta.Any) -> None:
105
105
  raise TypeError(o)
106
106
 
omlish/formats/dotenv.py CHANGED
@@ -27,7 +27,6 @@ import abc
27
27
  import codecs
28
28
  import contextlib
29
29
  import io
30
- import logging
31
30
  import os
32
31
  import pathlib
33
32
  import re
@@ -36,6 +35,7 @@ import tempfile
36
35
  import typing as ta
37
36
 
38
37
  from ..lite.abstract import Abstract
38
+ from ..logs.protocols import LoggerLike
39
39
 
40
40
 
41
41
  ##
@@ -312,7 +312,7 @@ def parse_dotenv_stream(stream: ta.IO[str]) -> ta.Iterator[DotenvBinding]:
312
312
 
313
313
  def _dotenv_with_warn_for_invalid_lines(
314
314
  mappings: ta.Iterator[DotenvBinding],
315
- log: ta.Optional[logging.Logger] = None,
315
+ log: ta.Optional[LoggerLike] = None,
316
316
  ) -> ta.Iterator[DotenvBinding]:
317
317
  for mapping in mappings:
318
318
  if mapping.error:
@@ -337,7 +337,7 @@ class Dotenv:
337
337
  interpolate: bool = True,
338
338
  override: bool = True,
339
339
  env: ta.Optional[ta.Mapping[str, str]] = None,
340
- log: ta.Optional[logging.Logger] = None,
340
+ log: ta.Optional[LoggerLike] = None,
341
341
  ) -> None:
342
342
  super().__init__()
343
343
 
@@ -415,7 +415,7 @@ def dotenv_get_key(
415
415
  key_to_get: str,
416
416
  *,
417
417
  encoding: ta.Optional[str] = 'utf-8',
418
- log: ta.Optional[logging.Logger] = None,
418
+ log: ta.Optional[LoggerLike] = None,
419
419
  ) -> ta.Optional[str]:
420
420
  """
421
421
  Get the value of a given key from the given .env.
@@ -461,7 +461,7 @@ def dotenv_set_key(
461
461
  quote_mode: str = 'always',
462
462
  export: bool = False,
463
463
  encoding: ta.Optional[str] = 'utf-8',
464
- log: ta.Optional[logging.Logger] = None,
464
+ log: ta.Optional[LoggerLike] = None,
465
465
  ) -> ta.Tuple[ta.Optional[bool], str, str]:
466
466
  """
467
467
  Adds or Updates a key/value to the given .env
@@ -511,7 +511,7 @@ def dotenv_unset_key(
511
511
  *,
512
512
  quote_mode: str = 'always',
513
513
  encoding: ta.Optional[str] = 'utf-8',
514
- log: ta.Optional[logging.Logger] = None,
514
+ log: ta.Optional[LoggerLike] = None,
515
515
  ) -> ta.Tuple[ta.Optional[bool], str]:
516
516
  """
517
517
  Removes a given key from the given `.env` file.
@@ -575,7 +575,7 @@ def dotenv_values(
575
575
  interpolate: bool = True,
576
576
  encoding: ta.Optional[str] = 'utf-8',
577
577
  env: ta.Optional[ta.Mapping[str, str]] = None,
578
- log: ta.Optional[logging.Logger] = None,
578
+ log: ta.Optional[LoggerLike] = None,
579
579
  ) -> ta.Dict[str, ta.Optional[str]]:
580
580
  """
581
581
  Parse a .env file and return its content as a dict.
@@ -584,7 +584,7 @@ def dotenv_values(
584
584
  For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in
585
585
  `{"foo": None}`
586
586
 
587
- Parameters:
587
+ Args:
588
588
  path: Absolute or relative path to the .env file.
589
589
  stream: `StringIO` object with .env content, used if `path` is `None`.
590
590
  verbose: Whether to output a warning if the .env file is missing.
@@ -1,3 +1,16 @@
1
+ """
2
+ A generator powered, configurable, mostly fully streaming JSON parser.
3
+
4
+ Regarding the 'streamyness' of the subsystems:
5
+ - Lexing only buffers for string and number literals.
6
+ - Parsing maintains only a stack that scales by nesting depth.
7
+ - Building values will obviously hold everything under the topmost object it's building until it's finished.
8
+
9
+ It's reasonably optimized, but performance is not a primary or even secondary goal: its goal is flexibility. If speed
10
+ matters use a native library.
11
+ """
12
+
13
+
1
14
  from .building import ( # noqa
2
15
  JsonValueBuilder,
3
16
  )
@@ -8,6 +21,7 @@ from .errors import ( # noqa
8
21
 
9
22
 
10
23
  from .lexing import ( # noqa
24
+ IdentTokenKind,
11
25
  ValueTokenKind,
12
26
  VALUE_TOKEN_KINDS,
13
27
  ControlTokenKind,
@@ -22,7 +36,7 @@ from .lexing import ( # noqa
22
36
  Token,
23
37
 
24
38
  CONTROL_TOKENS,
25
- CONST_TOKENS,
39
+ CONST_IDENT_VALUES,
26
40
 
27
41
  JsonStreamLexError,
28
42
  JsonStreamLexer,
@@ -35,8 +49,8 @@ from .parsing import ( # noqa
35
49
  BeginArray,
36
50
  EndArray,
37
51
 
38
- JsonStreamParserEvent,
39
- JsonStreamParserEvents,
52
+ Event,
53
+ Events,
40
54
 
41
55
  yield_parser_events,
42
56
 
@@ -54,4 +68,5 @@ from .utils import ( # noqa
54
68
 
55
69
  stream_parse_values,
56
70
  stream_parse_one_value,
71
+ stream_parse_exactly_one_value,
57
72
  )
@@ -5,8 +5,8 @@ from .parsing import BeginArray
5
5
  from .parsing import BeginObject
6
6
  from .parsing import EndArray
7
7
  from .parsing import EndObject
8
+ from .parsing import Event
8
9
  from .parsing import JsonStreamObject
9
- from .parsing import JsonStreamParserEvent
10
10
  from .parsing import Key
11
11
 
12
12
 
@@ -62,7 +62,7 @@ class JsonValueBuilder:
62
62
  else:
63
63
  raise self.StateError
64
64
 
65
- def __call__(self, e: JsonStreamParserEvent) -> ta.Iterable[ta.Any]:
65
+ def __call__(self, e: Event) -> ta.Iterable[ta.Any]:
66
66
  stk = self._stack
67
67
 
68
68
  #